实验三
实验任务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 }
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 }
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 }
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 }
输出结果:

实验任务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 }
输出结果:

实验任务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 }
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 }
输出结果:
迭代法:

递归法:

实验任务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 }
输出结果:

实验总结:这次的实验侧重点还是在函数上,不同于最近学的数组,函数定义更侧重于对要求的理解,理解了要
干什么,任务就会变的简单,编写函数的过程就是理解函数的过程。但是这次实验中也出现了一些导致程序出错
的小错误如:int 与 double误用导致小数部分删去,无法得到想要的数值。
posted on 2025-04-06 19:58 A0809-lemon 阅读(16) 评论(0) 收藏 举报
浙公网安备 33010602011771号