实验3 C语言函数应用编程

实验任务一

源代码

 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 }

运行截图

QQ截图20260415220345

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

运行截图

2

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

运行截图

3

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

答:求出x的n次方

问题2:函数power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。

答:是。

a5ac30a2f13975dc43c8b037942a305e

 

实验任务四

源代码

 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 }

运行截图

QQ截图20260415215718

 实验任务五

源代码(迭代)

 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 }

运行截图

5

源代码(递归)

 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 }

运行截图

333

实验任务六

源代码

 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     }

运行截图

6

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

运行截图

333333333333333

44444444444

 

posted @ 2026-04-18 10:49  code_000  阅读(0)  评论(0)    收藏  举报