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

问题回答
问题一: 1.功能是:依据分数,按一定标准,将分数分为A,B,C,D,E五等.
2.形参类型:整型;
返回值类型:字符型.
问题二: 如果没有break,那么,将只会输出E.
当switch函数中没有break,那么,ans的值将会被一路覆盖,直到执行default,最终被赋值E输出.
任务二
源代码
1 #include<stdio.h> 2 3 int sum_digits(int n); 4 int main(){ 5 int n; 6 int ans; 7 8 while(printf("Enter n:"),scanf("%d",&n)!=EOF){ 9 ans=sum_digits(n); 10 printf("n=%d,ans=%d\n\n",n,ans); 11 } 12 13 return 0; 14 } 15 16 int sum_digits(int n){ 17 int ans = 0; 18 19 while(n!=0){ 20 ans+=n%10; 21 n/=10; 22 } 23 24 return ans; 25 }
测试结果截图

问题回答
问题一:输出输入数字的每一项的和;
问题二:可以
原代码的算法思维是迭代,通过一个个加输入数字的每一项的数获得结果;而更改后,是递归,递归出口是n<10,通过一次次调用函数,得到结果.
任务三
源代码
1 #include<stdio.h> 2 3 4 int power(int x,int n); 5 6 int main(){ 7 int x,n; 8 int ans; 9 10 while(printf("Enter x and n:"),scanf("%d%d",&x,&n)!=EOF){ 11 ans=power(x,n); 12 printf("n=%d,ans=%d\n\n",n,ans); 13 } 14 15 return 0; 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 }
测试结果截图

问题回答
问题一:输出x的n次方
问题二:是递归函数;

任务四
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int classify_triangle(int a,int b,int c); 4 5 int main(){ 6 int a,b ,c; 7 int ans; 8 while(scanf("%d%d%d",&a,&b,&c)!=EOF) 9 { 10 ans=classify_triangle(a,b,c); 11 switch(ans){ 12 case 1:printf("等边三角形");break; 13 case 2:printf("直角三角形");break; 14 case 3:printf("等腰三角形");break; 15 case 4:printf("普通三角形");break; 16 case 5:printf("不能构成三角形");break; 17 } 18 } 19 system("pause"); 20 return 0; 21 } 22 23 int classify_triangle(int a,int b,int c){ 24 if(a+b>c&&a+c>b&&b+c>a) 25 { 26 if(a==b&&b==c) 27 return 1; 28 else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) 29 return 2; 30 else if(((a==b)&&(b!=c))||((a==c)&&(c!=b))||((b==c)&&(c!=a))) 31 return 3; 32 else 33 return 4; 34 } 35 else 36 return 5; 37 }
测试结果截图

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

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

任务六
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int gcd(int a,int b,int c); 4 int main(){ 5 int a; 6 int b; 7 int c; 8 int ans; 9 while(scanf("%d%d%d",&a,&b,&c)!=EOF){ 10 ans=gcd(a,b,c); 11 printf("最大公约数:%d\n\n",ans); 12 } 13 14 system("pause"); 15 return 0; 16 } 17 18 int gcd(int a,int b,int c){ 19 int min; 20 min=a; 21 if(min>b) 22 min=b; 23 if(min>c) 24 min=c; 25 while(min!=0) 26 { 27 if((a%min==0)&&(b%min==0)&&(c%min==0)) 28 return min; 29 else 30 min=min-1; 31 } 32 }
测试结果截图

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


实验总结
对复杂的代码编写还不熟练,比如实验七,我是参考了其他同学的思维和写法,后面还需要继续的学习。
浙公网安备 33010602011771号