实验3
++实验任务1
*源代码
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:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
给输入的分数分级,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 }
没有break,ans一定会被赋值成E;ABCD用了双引号,字符常量应该用单引号
++实验任务2
*源代码
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:函数sum_digits的功能是什么?
把一个数上的每一位数加起来输出
问题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 }
能,第一种用了while循环,每加一次去掉一次个位,将数加到和里
第二种用了递归,递归公式:sum_digits(n/10) + n%10
++实验任务3
*源代码
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: 函数power的功能是什么?
计算x的n次方
问题2:函数power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。 (在纸上写出这个递归模式对应的数学公式,拍照后以图片方式插入道这里;也可使用公式编辑器)

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

++实验任务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 11 return 0; 12 } 13 // 函数定义 14 int func(int n,int m){ 15 if(m<0||m>n) return 0; 16 if(m>n-m){ 17 m=n-m; 18 } 19 20 int result=1; 21 int i; 22 for(i=1;i<=m;i++){ 23 result=result*(n-m+1)/i; 24 } 25 return result; 26 }
*源代码2
浙公网安备 33010602011771号