A-0809-lemon

导航

实验三

实验任务1
源代码:

 1 #include <stdio.h>
 2 char score_to_grade(int score); // 函数声明
 3 int main() {
 4 int score;
 5 char grade;
 6 while(scanf("%d", &score) != EOF) {
 7 grade = score_to_grade(score); // 函数调用
 8 printf("分数: %d, 等级: %c\n\n", score, grade);
 9 }
10 return 0;
11 }
12 char score_to_grade(int score) {
13 char ans;
14 switch(score/10) {
15 case 10:
16 case 9: ans = 'A'; break;
17 case 8: ans = 'B'; break;
18 case 7: ans = 'C'; break;
19 case 6: ans = 'D'; break;
20 default: ans = 'E';
21 }
22 return ans;
23 }
实验任务1

Q1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
A1:将分数转换成其所对应的成绩等第并输出;形参为整数型;返回值为字符型。
Q2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。
A2:缺少了break这一个使程序跳出循环的环节,则当score/10无论得到何值的时候,都会继续向下输出,最后输出值一定是E。

输出结果:

 

 

实验任务2
源代码:

 1 #include <stdio.h>
 2 int sum_digits(int n); // 函数声明
 3 int main() {
 4 int n;
 5 int ans;
 6 while(printf("Enter n: "), scanf("%d", &n) != EOF) {
 7 ans = sum_digits(n); // 函数调用
 8 printf("n = %d, ans = %d\n\n", n, ans);
 9 } 
10 return 0;
11 }
12 int sum_digits(int n) {
13 int ans = 0;
14 while(n != 0) {
15 ans += n % 10;
16 n /= 10;
17 }
18 return ans;
19 }
实验任务2

Q1:函数 sum_digits 的功能是什么?

 A1:将每一位上的数字实行累加,并输出结果。

Q2:如果保持 main 代码和函数 sum_digits 声明不变,把函数 sum_digits 定义成如下实现方式,能实现同

等的效果吗? 如果不能实现同等效果,分析原因。
如果能实现同等效果,说明两种实现方式背后的算法思维区别。

A2:能实现等同的效果,第一种是通过循环的方式来实现在n不为0时候将各位数化为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 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

Q1:函数 power 的功能是什么?

A1:求得并输出x的整数n次方所对应的值。

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

A2:当n=0时,power(x)=0;当n为奇数时,power(x)=x*power(x-1);当n为偶数时,power(x)=power(x/2)*power(x/2)

输出结果:

 

实验任务4
源代码:

 1 #include <stdio.h>
 2 int is_prime(int n)
 3 {
 4 
 5         int i=2, r=0;
 6         for(; i<n; ++i)
 7         {
 8             r = n%i;
 9             if(r==0)
10                 break;
11 
12         }
13         if(r==0)
14             return 0;
15         else
16             return 1;
17 
18 }
19 
20 int main()
21  {
22     int t1, t2, n, num;
23     printf("100以内的孪生素数:\n");
24 
25     for(num=0, t1=2, n=100;t1+2<n; ++t1)
26     {
27         t2=t1+2;
28         if( is_prime(t1)==1 && is_prime(t2)==1)
29             {
30                 printf("%d,%d\n", t1,t2);
31                 num+=1;
32             }
33     }
34     printf("100以内的孪生素数共有%d个", num);
35     return 0;
36  }
实验任务4

输出结果:

 

 

实验任务5
源代码:

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

输出结果:

 

实验任务6
源代码:

 1 #include <stdio.h>
 2 int func(int n, int m);   
 3 
 4 int main() {
 5     int n, m;
 6     int ans;
 7     printf("请依次输入n和m:");
 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 int func(int n, int m)
16 {
17     double a=n-m+1,b=1;
18     double s,s1=1,s2=1;
19     for(;a<=n;++a)
20         s1*=a;
21     for(;b<=m;++b)
22         s2*=b;
23     s=s1/s2;
24 return s;
25 }
实验任务6(迭代法):
 1 #include <stdio.h>
 2 int func(int n, int m);   
 3 
 4 int main() {
 5     int n, m;
 6     int ans;
 7     printf("请依次输入n和m:");
 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 int func(int n, int m)
16 {
17     if(m==0||m==n)
18         return 1;
19     if(m<0||m>n)
20         return 0;
21     return func(n-1,m-1)+func(n-1,m);
22 }
实验任务6(递归法)

输出结果:

 迭代法:

 递归法:

 

实验任务7
源代码:

 1 #include <stdio.h>
 2 int gcd(int a,int b);
 3 int main() {
 4     int a, b, c;
 5     int ans;
 6     printf("请输入a,b,c的值分别为:");
 7     while(scanf("%d%d%d", &a, &b, &c) != EOF) {
 8         ans=gcd(a, b);
 9         ans=gcd(ans,c);
10         printf("最大公约数: %d\n\n", ans);
11     }
12 
13     return 0;
14 }
15 
16 int gcd(int a,int b){
17     int r;
18     do{
19     r=a%b;
20     a=b;
21     b=r;
22     }
23         while(r!=0);
24     return a;
25 }
实验任务7

输出结果:

 

 

实验总结:这次的实验侧重点还是在函数上,不同于最近学的数组,函数定义更侧重于对要求的理解,理解了要

干什么,任务就会变的简单,编写函数的过程就是理解函数的过程。但是这次实验中也出现了一些导致程序出错

的小错误如:int 与 double误用导致小数部分删去,无法得到想要的数值。

posted on 2025-04-06 19:58  A0809-lemon  阅读(16)  评论(0)    收藏  举报