实验3
1.实验任务1
源代码
#include <stdio.h>
char score_to_grade(int score); //函数声明
int main() {
int score;
char grade;
while(scanf("%d", &score) != EOF) {
grade = score_to_grade(score); // 函数调用
printf("分数: %d, 等级: %c\n\n", score, grade);
}
return 0;
}
// 函数定义
char score_to_grade(int score) {
char ans;
switch(score/10) {
case 10:
case 9: ans = 'A'; break;
case 8: ans = 'B'; break;
case 7: ans = 'C'; break;
case 6: ans = 'D'; break;
default: ans = 'E';
}
return ans;
}
运行结果截图:

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?答1:功能是计算输入的分数属于哪一种等级,并返回等级给主函数。形参类型是int,返回值类型是char。
问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。
1 switch(score/10) { 2 case 10: 3 case 9: ans = "A"; 4 case 8: ans = "B"; 5 case 7: ans = "C"; 6 case 6: ans = "D"; 7 default: ans = 'E'; 8 }
答2:字符应该用单引号,而不是双引号。同时ans=' '(空格为ABCD)后缺少break;
2.实验任务2
源代码
#include <stdio.h>
int sum_digits(int n); // 函数声明
int main() {
int n;
int ans;
while(printf("Enter n: "), scanf("%d", &n) != EOF) {
ans = sum_digits(n); // 函数调用
printf("n = %d, ans = %d\n\n", n, ans);
}
return 0;
}
// 函数定义
int sum_digits(int n) {
int ans = 0;
while(n != 0) {
ans += n % 10;
n /= 10;
}
return ans;
}
运行结果截图:

问题1:函数sum_digits的功能是什么?答1:将主函数输入的n的每一位数字相加为ans,返回ans。
问题2:如果把函数sum_digits定义成如下实现方式,能实现同样的输出吗? 如果能,说明两种实现方式的算法思维区别;如果不能,分析原因
1 int sum_digits(int n) { 2 if(n < 10) 3 return n; 4 return sum_digits(n/10) + n%10; 5 }
答2:不能实现。如果n不只有个位数和十位数时,计算的就不是每一位相加了,例如输入2049,这个错误代码会输出204+9=213,而正确应该是15。
3.实验任务3
源代码
1 #include <stdio.h> 2 int power(int x, int n); // 函数声明 3 int main() { 4 int x, n; 5 int ans; 6 while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 7 ans = power(x, n); // 函数调用 8 printf("n = %d, ans = %d\n\n", n, ans); 9 } 10 11 return 0; 12 } 13 // 函数定义 14 int power(int x, int n) { 15 int t; 16 if(n == 0) 17 return 1; 18 else if(n % 2) 19 return x * power(x, n-1); 20 else { 21 t = power(x, n/2); 22 return t*t; 23 } 24 }
运行结果截图:

问题1: 函数 power 的功能是什么?答1:功能是计算 x 的 n 次幂(n ≥ 0 的整数)。
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。 (在纸上写出这个递归模式对应的数学公式,拍照后以图片方式放到这里;也可使用公式编辑器(如果 会使用))答2:是递归函数,数学公式如下

4.实验任务4
源代码
1 #include <stdio.h> 2 int classify_triangle(int a, int b, int c); // 函数声明 3 int main() { 4 int a,b,c; 5 while( scanf("%d%d%d", &a, &b,&c) != EOF) 6 { 7 classify_triangle(a,b,c); // 函数调用 8 switch(classify_triangle(a,b,c)){ 9 case 4:printf("直角三角形\n");break; 10 case 3:printf("等腰三角形\n");break; 11 case 2:printf("等边三角形\n");break; 12 case 1:printf("普通三角形\n");break; 13 case 0:printf("不能构成三角形\n");break; 14 } 15 } 16 return 0; 17 } 18 int classify_triangle(int a, int b, int c) // 函数定义 19 { 20 if(a<=0||b<=0||c<=0) 21 return 0; 22 if(!(a+b>c&&b+c>a&&a+c>b)) 23 return 0; 24 if(a==b&&b==c) 25 return 2; 26 if(a==b||b==c||a==c) 27 return 3; 28 if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) 29 return 4; 30 else if(a+b>c||b+c>a||a+c>b) 31 return 1; 32 }
运行结果截图:

5.实验任务5
用递归函数实现
源代码:
1 #include <stdio.h> 2 int func(int n, int m); // 函数声明 3 int main() { 4 int n,m; 5 int ans; 6 while(scanf("%d%d", &n, &m) != EOF) { 7 ans = func(n, m); // 函数调用 8 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 9 } 10 return 0; 11 } 12 int func(int n, int m) // 函数定义 13 { 14 if(m<0||m>n) 15 return 0; 16 if(m==0||m==n) 17 return 1; 18 return func(n-1,m)+func(n-1,m-1); 19 }
运行结果截图:

用迭代方式实现
源代码:
1 #include <stdio.h> 2 int func(int n, int m); // 函数声明 3 int main() { 4 int n,m; 5 int ans; 6 while(scanf("%d%d", &n, &m) != EOF) { 7 ans = func(n, m); // 函数调用 8 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 9 } 10 return 0; 11 } 12 int func(int n, int m) // 函数定义 13 { 14 if (m < 0 || m > n) 15 return 0; 16 if (m == 0 || m == n) 17 return 1; 18 if (m > n - m) 19 m = n - m; 20 int res = 1; 21 for (int i = 1; i <= m; i++) { 22 res = res * (n - m + i) / i; 23 } 24 return res; 25 }
运行结果截图:

6.实验任务6
源代码:
1 #include <stdio.h> 2 int func(int n, int m); // 函数声明 3 int main() { 4 int a, b, c; 5 int ans; 6 while(scanf("%d%d%d", &a, &b, &c) != EOF) { 7 ans = gcd(a, b, c); // 函数调用 8 printf("最大公约数: %d\n\n", ans); 9 } 10 return 0; 11 } 12 int gcd(int a, int b, int c) // 函数定义 13 { 14 int i; 15 if(a<b&&a<c) 16 i=a; 17 if(b<a&&b<c) 18 i=b; 19 if(c<a&&c<b) 20 i=c; 21 for(;i>=1;i--) 22 if(a%i==0&&b%i==0&&c%i==0) 23 return i; 24 }
运行结果截屏:

7.实验任务7
源代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 void print_charman(n);//函数声明 4 int main() { 5 int n; 6 printf("Enter n: "); 7 scanf("%d", &n); 8 print_charman(n); // 函数调用 9 return 0; 10 } 11 void print_charman(n){ //函数print_charman定义 12 int i,j,k,n; 13 for(i=0;i<=n;i++) 14 for(j=0;j<i;j++) 15 printf("\t"); 16 for(k=0;k<=(n(n-1)-1);k++) 17 printf("O\t"); 18 printf("\n"); 19 20 for(j=0;j<i;j++) 21 printf("\t"); 22 for(k=0;k<=(n(n-1)-1);k++) 23 printf("<H>\t"); 24 printf("\n"); 25 26 for(j=0;j<i;j++) 27 printf("\t"); 28 for(k=0;k<=(n(n-1)-1);k++) 29 printf("I I\t"); 30 printf("\n"); 31 }
浙公网安备 33010602011771号