实验3
实验任务1
源代码
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 char score_to_grade(int score) { 17 char ans; 18 19 switch(score/10) { 20 case 10: 21 case 9: ans = 'A'; break; 22 case 8: ans = 'B'; break; 23 case 7: ans = 'C'; break; 24 case 6: ans = 'D'; break; 25 default: ans = 'E'; 26 } 27 28 return ans; 29 }
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 char score_to_grade(int score) { 17 char ans; 18 19 switch(score/10) { 20 case 10: 21 case 9: ans = "A"; 22 case 8: ans = "B"; 23 case 7: ans = "C"; 24 case 6: ans = "D"; 25 default: ans = "E"; 26 } 27 28 return ans; 29 }
运行结果

问题1
功能为将输入成绩转化为对应等级,自定义函数以简化代码
形参类型为数值类型,返回值类型为字符串类型
问题2
1.case后面没有break,将一直进行下去,ans的值一直被覆盖
2.A以及其他的等级均为字符常量而非字符串常量,应该用单引号而非双引号
实验2
源代码
1 #include <stdio.h> 2 3 int sum_digits(int n); 4 5 int main() 6 { 7 int n; 8 int ans; 9 10 while (printf("Enter n: "), scanf("%d", &n) != EOF) 11 { 12 ans = sum_digits(n); 13 printf("n = %d, ans = %d\n\n", n, ans); 14 } 15 16 return 0; 17 } 18 19 int sum_digits(int n) 20 { 21 int ans = 0; 22 23 while (n != 0) 24 { 25 ans += n % 10; 26 n /= 10; 27 } 28 29 return ans; 30 }
运行结果

问题1
函数功能为把输入数字各位上的数字加起来得到一个新的数
问题2
能,第一种是迭代思维,通过循环来进行;第二种是递归思维,通过将大问题简化为小问题来实现
实验任务3
源代码
1 #include <stdio.h> 2 3 int power(int x, int n); 4 5 int main() 6 { 7 int x, n; 8 int ans; 9 10 while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) 11 { 12 ans = power(x, n); 13 printf("n = %d, ans = %d\n\n", n, ans); 14 } 15 16 return 0; 17 } 18 19 int power(int x, int n) 20 { 21 int t; 22 23 if (n == 0) 24 return 1; 25 else if (n % 2) 26 return x * power(x, n - 1); 27 else { 28 t = power(x, n / 2); 29 return t * t; 30 } 31 }
运行结果

问题1
功能为求x的n次方
问题2
是递归函数,递归模式数学公式模型为:
n=0时,t=1
n%2!=0时,t=x*x*x*'''(n个x)
n%2=0时,将运算分为两半再相乘
实验任务4
源代码
1 #include <stdio.h> 2 3 int is_prime(int n) 4 { 5 if (n <= 1) 6 { 7 return 0; 8 } 9 int i=2; 10 for (i; i <= n/2; i++) 11 { 12 if (n % i == 0) 13 { 14 return 0; 15 } 16 } 17 return 1; 18 } 19 20 int main() 21 { 22 printf("100以内的孪生数:\n"); 23 int cnt = 0; 24 25 int n = 2; 26 27 for (n; n <= 98; n++) 28 { 29 if (is_prime(n)==1 && is_prime(n + 2)==1) 30 { 31 printf("%d %d\n", n, n + 2); 32 cnt++; 33 } 34 } 35 36 printf("100以内的孪生数有%d个\n", cnt); 37 38 return 0; 39 }
运行结果

实验任务5
源代码
1 #include <stdio.h> 2 int func(int n, int m); 3 4 int main() 5 { 6 int n, m; 7 int ans; 8 9 while (scanf("%d%d", &n, &m) != EOF) 10 { 11 ans = func(n, m); 12 printf("n=%d,m=%d,ans=%d\n\n", n, m, ans); 13 } 14 return 0; 15 } 16 17 func(int n,int m) 18 { 19 if (m > n) 20 { 21 return 0; 22 } 23 24 if (m == 0 || n == 0) 25 { 26 return 1; 27 } 28 29 long long up=1, down=1; 30 int i = 1; 31 for (i; i <= m; i++) 32 { 33 up *= (n - m + i); 34 down *= i; 35 } 36 return up / down; 37 }
1 #include <stdio.h> 2 int func(int n, int m); 3 4 int main() 5 { 6 int n, m; 7 int ans; 8 9 while (scanf("%d%d", &n, &m) != EOF) 10 { 11 ans = func(n, m); 12 printf("n=%d,m=%d,ans=%d\n\n", n, m, ans); 13 } 14 return 0; 15 } 16 17 func(int n,int m) 18 { 19 if (m > n) 20 { 21 return 0; 22 } 23 24 if (m == 0 || n == 0) 25 { 26 return 1; 27 } 28 29 return func(n - 1, m) + func(n - 1, m - 1); 30 }
运行结果


实验任务6
源代码
1 #include <stdio.h> 2 3 int gcd(int a, int b, int c); 4 5 int main() 6 { 7 int a, b, c; 8 int ans; 9 10 while (scanf("%d%d%d", &a, &b, &c) != EOF) 11 { 12 ans = gcd(a, b, c); 13 printf("最大公约数:%d\n\n", ans); 14 } 15 return 0; 16 } 17 18 int gcd(int a, int b, int c) 19 { 20 int min = a; 21 if (a > b) 22 { 23 min = b; 24 if (b > c) 25 { 26 min = c; 27 } 28 } 29 30 if (a % min == 0 && b % min == 0 && c % min == 0) 31 { 32 return min; 33 } 34 35 for (min; min >= 1; min--) 36 { 37 if (a % min == 0 && b % min == 0 && c % min == 0) 38 { 39 return min; 40 } 41 } 42 43 return 1; 44 }
运行结果

实验任务7
源代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void print_charman(int n); 5 6 int main() { 7 int n; 8 9 printf("Enter n: "); 10 scanf_s("%d", &n); 11 print_charman(n); 12 13 return 0; 14 } 15 16 void print_charman(int n) 17 { 18 int i; 19 int j; 20 int k; 21 22 for (i = 1; i <= n; i++) 23 { 24 for (j = i - 1; j > 0; j--) 25 { 26 printf("\t"); 27 } 28 29 for (k = 1; k <= 2 * (n - i) + 1; k++) 30 { 31 printf(" O \t"); 32 } 33 34 printf("\n"); 35 36 for (j = i - 1; j > 0; j--) 37 { 38 printf("\t"); 39 } 40 41 for (k = 1; k <= 2 * (n - i) + 1; k++) 42 { 43 printf("<H>\t"); 44 } 45 46 printf("\n"); 47 48 for (j = i - 1; j > 0; j--) 49 { 50 printf("\t"); 51 } 52 53 for (k = 1; k <= 2 * (n - i) + 1; k++) 54 { 55 printf("I I\t"); 56 } 57 58 printf("\n"); 59 } 60 }
运行结果



浙公网安备 33010602011771号