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

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

实验任务1

task1.c源代码

 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的功能是输出学生的分数所对应的等级,90-100为A级,80-89为B级,70-79为C级,60-69为D,小于60分是E级

形参类型是整型,返回值类型是字符型

问题2:

缺少break语句,这样无论是否符合条件,程序会继续执行下一个分支语句

数据类型不匹配,ABCD上加的是双引号,这样赋给ans的值是它们的ASCLL编码,是一串数字,而ans定义的是字符型变量

 

实验任务2

task2.c源代码

 

 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的功能是将输入数字n的各位的数累加起来

问题2:

能实现同等效果

算法思维区别:前者使用了迭代的思维,即使用循环结构达成目标;后者则使用了递归的思维,即通过调用函数自身达成目标

 

实验任务3

task3.c源代码

 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次方即为xn

问题2:

是递归函数

数学模型:

实验任务4

task4.c源代码

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int is_prime(int n);
 4 int main(){
 5     int i,count=0;
 6     printf("100以内的孪生素数:\n");
 7     for(i=2;i<=100;i++){
 8         if(is_prime(i)==1 && is_prime(i+2)==1){
 9             printf("%d %d\n",i,i+2);
10             count+=1;
11         }
12     }
13     printf("100以内的孪生素数共有%d个\n",count);
14     system("pause");
15     return 0;
16 }
17 
18 int is_prime(int n){
19     int j;
20     for(j=2;j<=n/2;j++){
21         
22         if(n%j==0)
23             return 0;    
24     }
25     return 1;
26 }

 

运行结果截图

 

实验任务5

task5.c源代码

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 void hanoi(unsigned int n,char from,char temp,char to);//递归
 4 void moveplate(unsigned int n,char from,char to);//移动
 5 static int x=0;
 6 int main(){
 7 
 8     unsigned int n;
 9     while(scanf("%u",&n)!=EOF){
10     hanoi(n,'A','B','C');
11     printf("一共移动了%d次\n",x);
12     x=0;
13     }
14     system("pause");
15     return 0;
16 }
17 
18 void hanoi(unsigned int n,char from,char temp,char to){
19     
20     if(n==1)
21         moveplate(n,from,to);
22     else
23     {
24         hanoi(n-1,from,to,temp);
25         moveplate(n,from,to);
26         hanoi(n-1,temp,from,to);
27     }
28     x+=1;
29 }
30 void moveplate(unsigned int n,char from,char to){
31     
32     printf("%u: %c-->%c\n",n,from,to);
33 
34 }

 

运行结果截图

 

实验任务6

task6_1.c源代码(迭代)

 1 #include <stdio.h>
 2 int func(int n, int m);   // 函数声明
 3 
 4 int main() {
 5     int n, m;
 6     int ans;
 7 
 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         
13     return 0;
14 }
15 
16 // 函数定义
17 // 待补足。。。(迭代实现)
18 int func(int n, int m){
19     int temp=1,i;
20     if(m>n){
21         return 0;
22     }
23     for(i=1;i<=n;i++)
24         temp*=i;
25 
26     for(i=1;i<=m;i++)
27         temp/=i;
28 
29     for(i=1;i<=(n-m);i++)
30         temp/=i;
31     return temp;
32 }

 

运行结果截图

 

task6_2.c源代码(递归)

 1 #include <stdio.h>
 2 int func1(int n, int m);   // 函数声明
 3 
 4 int main() {
 5     int n, m;
 6     int ans;
 7 
 8     while(scanf("%d%d", &n, &m) != EOF) {
 9         ans = func1(n, m);   // 函数调用
10         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
11     }
12         
13     return 0;
14 }
15 
16 // 函数定义
17 // 待补足。。。(递归实现)
18 int func1(int n, int m){
19     if(m>n)
20         return 0;
21     if(n==m)
22         return 1;
23     if(m==0)
24         return 1;
25     return func1(n-1,m)+func1(n-1,m-1);
26 }

 

运行结果截图

 

 

实验任务7

task7.c源代码

 1 #include <stdio.h>
 2 int gcd(int a,int b,int c);
 3 // 函数声明
 4 // 待补足....
 5 
 6 
 7 int main() {
 8     int a, b, c;
 9     int ans;
10 
11     while(scanf("%d%d%d", &a, &b, &c) != EOF) {
12         ans = gcd(a, b, c);     // 函数调用
13         printf("最大公约数: %d\n\n", ans);
14     }
15 
16     return 0;
17 }
18 
19 
20 // 函数定义
21 // 待补足...
22 int gcd(int a,int b,int c){
23     int i,min;
24     min = a < b ? a:b;
25     min = min < c ? min:c;
26 
27     for(i=min;i>0;--i)
28         if(a%i==0 && b%i==0 && c%i==0)
29             return i;
30 }

 

运行结果截图

 

 实验总结:

本次实验使我第四章的内容熟练了许多,开拓了编程思路,相同的题目可以从多种编程方法实现。实验任务1巩固了switch的知识,强化了break要记得加的记忆点,实验任务2,3和6加深了对迭代和递归的理解,实验任务4让我注意到程序编写时循环终止条件加不加等号要推敲一下,实验任务5加深了对全局变量的理解,还要注意循环开始前要初始化变量,不然次数会叠加,实验任务7让我捡起了?:语句的知识。

posted @ 2025-04-07 16:42  High_Auditorium  阅读(39)  评论(0)    收藏  举报