实验3 C语言函数应用编程
1. 实验任务1
#include <stdio.h> char score_to_grade(int score); int main(){ int score; char grade; while(scanf("%d",&score)!= EOF){ grade = score_to_grade(score); printf("分数:%d,等级:%c\n\n",score,grade); } return 0; } char score_to_grade(int score){ char ans; switch(score/10){ case 10: case 9: ans = 'A'; break; case 8: ans = 'B'; break; case 7: ans = 'C'; break; case 6: ans = 'D'; break; default: ans = 'E'; } return ans; }
问题1:函数score_to_grade的功能是什么?形参类型、返回值类型是什么?
判断成绩的等级;形参类型、返回值类型是整形;字符型
问题2:如果line21-28以下形式,有问题吗?如果有,指出有哪些问题?
有,无论成绩多少都是E。
2. 实验任务
#include <stdio.h> int sum_digits(int n); int main(){ int n; int ans; while(printf("Enter n:"),scanf("%d",&n)!= EOF){ ans = sum_digits(n); printf("n = %d,ans = %d\n\n",n,ans); } return 0; } int sum_digits(int n){ int ans = 0; while(n != 0){ ans += n% 10; n /= 10; } return ans; }
问题1:函数sum_digits的功能是什么?
问题2:如果保持main代码和函数sum_digits声明不变,把函数sum_digits定义成如下实现方式能实现同等的效果吗? 如果不能实现同等效果,分析原因。 如果能实现同等效果,说明两种实现方式背后的算法思维区别。
1:计算各个位数的和
2:能
1是迭代,2是递归
3. 实验任务
#include<stdio.h> int power(int x,int n); int main(){ int x,n; int ans; while(printf("Enter x and n:"),scanf("%d%d",&x,&n)!= EOF){ ans = power(x,n); printf("n = %d,ans = %d\n\n",n,ans); } return 0; } int power(int x,int n){ int t; if(n == 0) return 1; else if(n%2) return x*power(x,n-1); else{ t = power(x,n/2); return t*t; } }
问题1: 函数power的功能是什么?
问题2:函数power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模 型。
4. 实验任务4
#include<stdio.h> #include<math.h> int is_prime(int n); int main() { int m, count = 0; for (m = 2; m <= 100 - 2; m++) { // 注意这里的上限,避免越界访问 if (is_prime(m) && is_prime(m + 2)) { count++; printf("%d %d\n", m, m + 2); } } printf("100以内的孪生素数有%d个", count); return 0; } int is_prime(int n){ int i; for(i=2;i<=n/2;i++){ if(n%i == 0) return 0; } return 1; }
5. 实验任务
#include<stdio.h> int count = 0; void hanoi(unsigned n,char from,char temp,char to); void moveplate(unsigned nth,char from,char to); int main(){ int n; char from = 'A',temp = 'B',to = 'C'; printf("输入n:"); while(scanf("%d",&n)!= EOF){ count = 0; hanoi(n,from,temp,to); printf("一共移动%d\n",count); } return 0; } void hanoi(unsigned n,char from,char temp,char to){ if(n == 1) moveplate(n,from,to); else{ hanoi(n-1,from,to,temp); moveplate(n,from,to); hanoi(n-1,temp,from,to); } } void moveplate(unsigned nth,char from,char to){ printf("%u: %c --> %c\n",nth, from, to); count++; }
6. 实验任务
#include <stdio.h> int func(int n, int m); // 函数声明 int main() { int n, m; int ans; while(scanf("%d%d", &n, &m) != EOF) { ans = func(n, m); // 函数调用 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); } return 0; } int func(int n,int m){ int i1,ans,i2; int ans1 = 1,ans2 = 1; if(n < m){ ans = 0; return ans; } else if(n > m&&m !=0){ for(i1 = n-m+1;i1 <= n;i1++){ ans1 *= i1; } for(i2 = 1;i2 <= m;i2++){ ans2 *= i2; } ans = ans1 / ans2; return ans; } else if(n == m) return 1; else if(m == 0) return 1; }
#include <stdio.h> int func(int n, int m); // 函数声明 int main() { int n, m; int ans; while(scanf("%d%d", &n, &m) != EOF) { ans = func(n, m); // 函数调用 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); } return 0; } int func(int n, int m){ int ans; if(n == m||m == 0){ ans = 1; return 1; } else if(n < m){ ans = 0; return ans; } else{ ans = func(n-1,m) + func(n-1,m-1); return ans; } }
7. 实验任务
#include <stdio.h> #include<stdlib.h> void print_charman(int n); int main() { int n; printf("Enter n: "); scanf("%d", &n); print_charman(n); return 0; } void print_charman(int n){ int t = 0; int i,j; for(i = n; i >= 1; i--){ for(j = 0; j < t; j++) printf("\t"); for(j = 0; j < 2 * i - 1; j++) printf(" o\t"); printf("\n"); for(j = 0; j < t; j++) printf("\t"); for(j = 0; j < 2 * i - 1; j++) printf("<H>\t"); printf("\n"); for(j = 0; j < t; j++) printf("\t"); for(j = 0; j < 2 * i - 1; j++) printf("I I\t"); printf("\n"); t++; } }