实验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 }
实验截图: