实验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 }

*运行结果截图

QQ20260418-132825

 

问题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 }

*运行结果截图

QQ20260418-133001

问题1: 函数power的功能是什么?

计算x的n次方

问题2:函数power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。 (在纸上写出这个递归模式对应的数学公式,拍照后以图片方式插入道这里;也可使用公式编辑器)

qq_pic_merged_1776495902510

++实验任务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 }

*运行截图

QQ20260418-151544

++实验任务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

 

posted @ 2026-04-19 23:07  _Vulcan  阅读(6)  评论(0)    收藏  举报