实验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的功能是将分数转换为对应的等级制。形参的类型是int型,返回值的类型是char型

问题2:每个case语句后面缺少break,执行完一个之后还会再继续执行下一条

 

实验任务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:求正整数各个数位之和

问题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:计算x的n次方

问题2:是递归

 

实验任务4

task4.c源代码

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

运行结果:

 

实验任务5

task5.c源代码

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

运行结果:

 

实验任务6

task6.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 int func(int n, int m)
17 {
18     int z,i;
19     if(n>m)
20     {
21         if(m==0)
22             return 1;
23         else
24             return func(n-1,m)+func(n-1,m-1);
25     }
26     else
27         return 0;
28 }

运行结果:

task6.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 int func(int n, int m)
17 {
18     int ans1=1,ans2=1;
19     if(n<m)
20         return 0;
21     if(n=m)
22         return 1;
23     else{
24         int i;
25         for(i=m;i>0;i--)
26         {ans1=ans1*(n-i+1);
27         ans2=ans2*i;}
28         return(ans1/ans2);
29     }
30 
31 }

运行结果:

 

实验任务7

task7.c源代码

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

实验截图:

 

posted @ 2025-04-09 22:14  runjizhao  阅读(7)  评论(0)    收藏  举报