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

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型分别是什么?
答:功能是将分数转换为相应的等级,形参类型为整形,返回值类型为整形
问题2:如果line21-28改成以下写法,代码存在哪些问题?请逐一指出。
答:每条case语句后面没有相应的break,导致无论输入什么成绩,最后都对应等级E;ans是char类型,应该对应单字符
实验任务二
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 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 system("pause"); 14 return 0; 15 } 16 //函数定义 17 int sum_digits(int n){ 18 int ans=0; 19 20 while(n!=0){ 21 ans+=n%10; 22 n/=10; 23 } 24 return ans; 25 }
运行截图

问题1:函数 sum_digits 的功能是什么?
答:求一个数字的各个位上的数字之和
问题2:如果把函数sum_digits定义成如下实现方式,能实现同样的输出吗?如果能,说明两种实现方式的算法思维区别;如果不能,分析原因。
答:可以。原版是不断变换n的值,用ans加上输入数的各个位。修改后是用sum_digits递归 ,最终直接返回各个位之和。
实验任务三
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int power(int x,int n); 4 int main(){ 5 int x,n; 6 int ans; 7 8 while(printf("Enter x and n: "),scanf("%d%d",&x,&n)!=EOF){ 9 ans = power(x,n);//函数调用 10 printf("n=%d,ans=%d\n\n",n,ans); 11 } 12 system("pause"); 13 return 0; 14 } 15 //函数定义 16 int power(int x,int n){ 17 int t; 18 19 if(n==0) 20 return 1; 21 else if(n%2) 22 return x*power(x,n-1); 23 else{ 24 t=power(x,n/2); 25 return t*t; 26 } 27 }
运行截图

问题1: 函数power的功能是什么?
答:求出x的n次方
问题2:函数power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
答:是。

实验任务四
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int a,b,c; 4 int classify_triangle(int a,int b,int c); 5 int type; 6 int main(){ 7 while(scanf("%d %d %d",&a,&b,&c)!= EOF) 8 { 9 type=classify_triangle(a,b,c); 10 switch(type) 11 { 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 case 4:printf("直角三角形\n");break; 17 } 18 } 19 system("pause"); 20 return 0; 21 } 22 int classify_triangle(int a,int b,int c) 23 { 24 if((a+b<c)||(b+c<a)||(a+c<b)) 25 return 0; 26 if(a==b&&b==c) 27 return 2; 28 if((a==b)||(b==c)||(a==c)) 29 return 3; 30 if((a*a+b*b==c*c)||(b*b+c*c==a*a)||(a*a+c*c==b*b)) 31 return 4; 32 return 1; 33 34 }
运行截图

实验任务五
源代码(迭代)
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 while (scanf("%d%d", &n, &m) != EOF) { 9 ans = func(n, m);//函数调用 10 printf("n=%d,m=%d,ans=%d\n\n", n, m, ans); 11 } 12 system("pause"); 13 return 0; 14 } 15 int func(int n, int m) { 16 int ans = 1; 17 if (m == 0 || m == n) 18 return 1; 19 if (m > n) 20 return 0; 21 if (m == 1) 22 return n; 23 else 24 { 25 for (int i = 1; i <= m; ++i) 26 ans = ans * (n - m + i) / i; 27 return ans; 28 } 29 }
运行截图

源代码(递归)
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 while (scanf("%d%d", &n, &m) != EOF) { 9 ans = func(n, m);//函数调用 10 printf("n=%d,m=%d,ans=%d\n\n", n, m, ans); 11 } 12 system("pause"); 13 return 0; 14 } 15 int func(int n, int m) { 16 if(m>n) 17 return 0; 18 if(m==n||m==0) 19 return 1; 20 return func(n-1,m)+func(n-1,m-1); 21 }
运行截图

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

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


