实验3
实验结论
任务一
源代码:
1 #include <stdio.h> 2 3 char score_to_grade(int score); // 函数声明 4 5 int main() { 6 int score; 7 char grade; 8 9 while(scanf("%d", &score) != EOF) { 10 grade = score_to_grade(score); // 函数调用 11 printf("分数: %d, 等级: %c\n\n", score, grade); 12 } 13 14 return 0; 15 } 16 17 // 函数定义 18 char score_to_grade(int score) { 19 char ans; 20 21 switch(score/10) { 22 case 10: 23 case 9: ans = 'A'; break; 24 case 8: ans = 'B'; break; 25 case 7: ans = 'C'; break; 26 case 6: ans = 'D'; break; 27 default: ans = 'E'; 28 } 29 30 return ans; 31 }
运行截图:

问题1:根据用户输入的成绩按照已定好的规则分级,并将等级赋值给“ans”,然后返回“ans”;
形参类型是整型,返回值类型是字符型
问题2:① line3~line6,后面缺少break,那么当这个值比较大的时候,将会执行下面所有情况
② line3~line6,ABCD用的是双引号,这样的话,将赋不了值给ans,将会报错
任务二
源代码:
1 #include <stdio.h> 2 3 int sum_digits(int n); // 函数声明 4 5 int main() { 6 int n; 7 int ans; 8 9 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 10 ans = sum_digits(n); // 函数调用 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 // 函数定义 18 int sum_digits(int n) { 19 int ans = 0; 20 21 while(n != 0) { 22 ans += n % 10; 23 n /= 10; 24 } 25 26 return ans; 27 }
运行截图:

问题1:把用户输入的数字的每一位相加,并返回最后的结果
问题2:可以,原来的是利用循环算出每一位的值,并把它加到ans,改后的版本则是利用递归调用,把一个比较大的数拆分成更小的,在本题中就像小数点不断向更高位挪动,一直调用自己重复计算
任务三
源代码:
1 #include <stdio.h> 2 3 int power(int x, int n); // 函数声明 4 5 int main() { 6 int x, n; 7 int ans; 8 9 while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 10 ans = power(x, n); // 函数调用 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 // 函数定义 18 int power(int x, int n) { 19 int t; 20 21 if(n == 0) 22 return 1; 23 else if(n % 2) 24 return x * power(x, n-1); 25 else { 26 t = power(x, n/2); 27 return t*t; 28 } 29 }
运行截图:

问题1:计算整数x的n(n>=0)次方
问题2:是,x^n=x*x*(n-1),n为奇数和x^n=[x^(n/2)]^2,n为偶数
任务四
源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int classify_triangle(int a,int b,int c); 4 int main() 5 { 6 int a,b,c,d; 7 printf("请输入三角形的三边长:\n"); 8 while(scanf("%d%d%d",&a,&b,&c)!=EOF) 9 { 10 d=classify_triangle(a,b,c); 11 switch(d){ 12 case 0:printf("不能构成三角形\n");break; 13 case 1:printf("普通三角形\n");break; 14 case 2:printf("等边三角形\n");break; 15 case 3:printf("等腰三角形\n");break; 16 default:printf("直角三角形\n"); 17 } 18 printf("请输入三角形的三边长:\n"); 19 } 20 21 22 system("pause"); 23 return 0; 24 } 25 26 27 int classify_triangle(int a,int b,int c) 28 { 29 30 31 if (a + b > c && a + c > b && b + c > a) 32 { 33 if (a == b || a == c || b == c) 34 { 35 if (a == b && a == c) 36 return 2; 37 38 else 39 return 3; 40 } 41 else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) 42 return 4; 43 else 44 return 1; 45 } 46 else 47 return 0; 48 49 }
运行截图:

任务五
迭代方式源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int func(int n,int m); 4 int main() 5 { 6 int n,m; 7 int ans; 8 9 while(scanf("%d%d",&n,&m)!=EOF) 10 { 11 ans=func(n,m); 12 printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); 13 } 14 system("pause"); 15 return 0; 16 } 17 int func(int n,int m) 18 { 19 int i,j; 20 int a=1,b=1; 21 for(i=1;i<=m;i++) 22 { 23 a=a*i; 24 } 25 for(j=n;j>=n-m+1;j--) 26 { 27 b=b*j; 28 } 29 return b/a; 30 }
迭代方式运行截图:

递归方式源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int func(int n,int m); 5 6 int main() 7 { 8 int n,m; 9 int ans; 10 11 while(scanf("%d%d",&n,&m)!=EOF) 12 { 13 ans=func(n,m); 14 printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); 15 16 } 17 system("pause"); 18 return 0; 19 } 20 21 int func(int n,int m) 22 { 23 if(n==1) 24 return 1; 25 if(n==2) 26 { 27 if(m==2||m==0) 28 return 1; 29 if(m==1) 30 return 2; 31 } 32 if(m==0) 33 return 1; 34 return func(n-1,m)+func(n-1,m-1); 35 }
递归方式运行截图:

任务六
源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int gcd(int a,int b,int c); 4 int main() 5 { 6 int a,b,c; 7 int ans; 8 9 while(scanf("%d%d%d",&a,&b,&c)!=EOF) 10 { 11 ans=gcd(a,b,c); 12 printf("最大公约数:%d\n\n",ans); 13 } 14 15 system("pause"); 16 return 0; 17 } 18 19 int gcd(int a,int b,int c) 20 { 21 int i,m,q,w,e; 22 q=a; 23 w=b; 24 e=c; 25 if(a>=b) 26 { 27 if(b>=c) 28 m=c; 29 else 30 m=b; 31 } 32 else 33 { 34 if(a>=c) 35 m=c; 36 else 37 m=a; 38 } 39 for(i=m;i>=1;i--) 40 { 41 if(q%i==0&&w%i==0&&e%i==0) 42 return i; 43 } 44 }
运行截图:

任务七
源代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 void print_charman(int n); 4 int main() 5 { 6 int n; 7 printf("Enter n: "); 8 scanf("%d",&n); 9 print_charman(n); 10 11 system("pause"); 12 return 0; 13 } 14 void print_charman(int n) 15 { 16 int i,j,k; 17 for(i=1;i<=n*4;i++) 18 { 19 if((i-1)/4>0) 20 { 21 for(k=1;k<=(i-1)/4;k++) 22 printf(" \t"); 23 24 } 25 for(j=1;j<=2*(n-(i-1)/4)-1;j++) 26 { 27 28 if(i%4==1) 29 printf(" O \t"); 30 if(i%4==2) 31 printf("<H>\t"); 32 if(i%4==3) 33 printf("I I\t"); 34 35 } 36 printf("\n"); 37 } 38 }
运行截图:

实验总结
1. 任务5,对于递归调用出口有了全新的认识——就是分到算不了为止,像x的n次方,最后就是n=0是结束,还有本任务中,出口就是一些分不了的组合数(m-1>0,n>2之类的)
2.任务7,复杂的东西要一步一步改,不断地根据运行结果去修改代码,同时理解每一行的作用,并逐步向给定结果靠拢
浙公网安备 33010602011771号