实验3
task1:
源代码:
1 #include <stdio.h> 2 char score_to_grade(int score); // 函数声明 3 int main() { 4 int score; 5 char grade; 6 while (scanf_S("%d", &score) != EOF) { 7 grade = score_to_grade(score); // 函数调用 8 printf("分数: %d, 等级: %c\n\n", score, grade); 9 } 10 return 0; 11 } 12 // 函数定义 13 char score_to_grade(int score) { 14 char ans; 15 switch (score / 10) { 16 case 10: 17 case 9: ans = 'A'; break; 18 case 8: ans = 'B'; break; 19 case 7: ans = 'C'; break; 20 case 6: ans = 'D'; break; 21 default: ans = 'E'; 22 } 23 return ans; 24 }
测试截图:
问题一:作为自己创造的函数用来封存方法,进而方便调用,避免重复,形参类型是int 返回值类型为char。
问题二:有问题,没有break,会导致返回值多余
task2:
源代码:
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_s("%d", &n) != EOF) { 7 ans = sum_digits(n); // 函数调用 8 printf("n = %d, ans = %d\n\n", n, ans); 9 } 10 return 0; 11 } 12 // 函数定义 13 int sum_digits(int n) { 14 int ans = 0; 15 while (n != 0) { 16 ans += n % 10; 17 n /= 10; 18 } 19 return ans; 20 }
测试截图:
问题1:将所输入的数的各个单位的数字相加并返回
问题2:可以实现同等效果,第一种是循环的思想,第二种是函数递归的思想
task3:
源代码:
1 #include <stdio.h> 2 int power(int x, int n); // 函数声明 3 int main() { 4 int x, n; 5 int ans; 6 while (printf("Enter x and n: "), scanf_s("%d%d", &x, &n) != EOF) { 7 ans = power(x, n); // 函数调用 8 printf("n = %d, ans = %d\n\n", n, ans); 9 } 10 return 0; 11 } 12 // 函数定义 13 int power(int x, int n) { 14 int t; 15 if (n == 0) 16 return 1; 17 else if (n % 2) 18 return x * power(x, n - 1); 19 else { 20 t = power(x, n / 2); 21 return t * t; 22 } 23 }
测试结果:
问题1:计算整数x
的n
次幂
问题2:是递归函数。当n == 0
时,返回 1。当n
为奇时,返回x * power(x, n - 1)
。当n
为偶,先计算t = power(x, n / 2)
,返回t * t
。
数学模型:对于power(x,n)
,当n = 0
时,power(x,0)=1
。n>0时 ,n
是奇数,power(x,n)=x*power(x,n - 1)
。n
是偶数,power(x,n)=power(x,n/2)*power(x,n/2)
。
task4:
源代码:
1 #include <stdio.h> 2 3 int is_prime(int n) { 4 if (n <= 1) return 0; 5 for (int i = 2; i <= n/2; i++) { 6 if (n % i == 0) 7 return 0; 8 } 9 return 1; 10 } 11 12 int main() { 13 int count = 0; 14 printf("100 以内的孪生素数:\n"); 15 for (int n = 1; n < 100; n++) { 16 if (is_prime(n) && is_prime(n + 2)) { 17 printf("%d %d\n", n, n + 2); 18 count++; 19 } 20 } 21 printf("100 以内的孪生素数共有 %d 个\n", count); 22 return 0; 23 }
测试结果:
task5:
源代码:
1 #include<stdio.h> 2 3 void Hanoi(int n, char from, char to, char temp); 4 5 int count; 6 7 int main() 8 { 9 int n; 10 11 scanf_s("%d", &n); 12 13 Hanoi(n, 'A', 'C', 'B'); 14 15 printf("一共移动了%d次", count); 16 17 return 0; 18 } 19 20 void Hanoi(int n, char from, char to, char temp) 21 { 22 if (n == 1) 23 { 24 printf("%d : %c --> %c\n", n, from, to); 25 count++; 26 } 27 else 28 { 29 count++; 30 Hanoi(n - 1, from, temp, to); 31 printf("%d : %c --> %c\n", n, from, to); 32 Hanoi(n - 1, temp, to, from); 33 } 34 }
测试结果:
task6:
源代码:
方法一:
1 #include <stdio.h> 2 int func(int n, int m) ; // 函数声明 3 int main() { 4 int n, m; 5 int ans; 6 while (scanf_s("%d%d", &n, &m) != EOF) { 7 ans = func(n, m); // 函数调用 8 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 9 } 10 return 0; 11 } 12 int func(int n, int m) { 13 if (m > n || m < 0) return 0; 14 int a = 1; 15 int b= 1; 16 for (int i = n; i > n - m; i--) { 17 a *= i; 18 } 19 for (int i = 1; i <= m; i++) { 20 b *= i; 21 } 22 return a / b; 23 }
方法二:
1 #include <stdio.h> 2 int func(int n, int m) ; // 函数声明 3 int main() { 4 int n, m; 5 int ans; 6 while (scanf_s("%d%d", &n, &m) != EOF) { 7 ans = func(n, m); // 函数调用 8 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 9 } 10 return 0; 11 } 12 int func(int n, int m) { 13 if (m == 0 || m == n) return 1; 14 if (m > n || m < 0) return 0; 15 return func(n - 1, m) + func(n - 1, m - 1); 16 }
测试结果:
task7:
源代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 void print_charman(int n); 4 int main() { 5 int n; 6 printf("Enter n: "); 7 scanf_s("%d", &n); 8 print_charman(n); // 函数调用 9 return 0; 10 } 11 void print_charman(int n) 12 { 13 int i, j; 14 for (i = 0; i < n; i++) 15 { 16 for (j = 0; j < i; j++) 17 { 18 printf("\t"); 19 } 20 for (j = 0; j < n - i; j++) 21 { 22 printf(" O \t"); 23 } 24 for (j = 0; j < n - i - 1; j++) 25 { 26 printf(" O \t"); 27 } 28 printf("\n"); 29 30 for (j = 0; j < i; j++) 31 { 32 printf("\t"); 33 } 34 for (j = 0; j < n - i; j++) 35 { 36 printf("<H>\t"); 37 } 38 for (j = 0; j < n - i - 1; j++) 39 { 40 printf("<H>\t"); 41 } 42 printf("\n"); 43 44 for (j = 0; j < i; j++) 45 { 46 printf("\t"); 47 } 48 for (j = 0; j < n - i; j++) 49 { 50 printf("I I\t"); 51 } 52 for (j = 0; j < n - i - 1; j++) 53 { 54 printf("I I\t"); 55 } 56 printf("\n\n"); 57 } 58 59 }
测试结果: