实验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 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的功能是判断输入成绩的等级,形参类型为整型,返回值类型为字符型。
问题2:有问题。(1)在ans = “”的后面缺少break,返回值会是当前分数及以下对应的所有等级。(2)返回的"A""B""C""D"不是字符型。。
任务2
源代码
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:函数sum_digits的功能是求输入数字所有位上的数字之和
问题2:能实现,第一种方式是迭代,第二种方式是递归。
任务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 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:函数power的功能是根据输入的x和n求出x的n次方。
问题2:是递归函数
任务4
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 int is_prime(int n); 4 int main(){ 5 int n, t = 0; 6 printf("100以内的孪生素数:\n"); 7 for(n = 1; n <= 100; n++){ 8 if(is_prime(n) && is_prime(n+2)){ 9 printf("%d %d\n", n, n + 2); 10 t++; 11 } 12 } 13 printf("100以内的孪生素数共有%d个", t); 14 15 return 0; 16 17 } 18 19 int is_prime(int n){ 20 int i; 21 if(n < 2) 22 return 0; 23 24 for(i = 2; i <= n/2; i++) 25 if(n % i == 0) 26 return 0; 27 28 return 1; 29 }
任务5
源代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 void hanoi(unsigned int n, char from, char temp, char to); 4 void moveplate(unsigned int n, char from, char to); 5 int t = 0; 6 int main() 7 { 8 unsigned int n; 9 while(scanf("%u", &n) != EOF){ 10 11 hanoi(n, 'A', 'B', 'C'); 12 printf("一共移动了%d次\n", t); 13 } 14 return 0; 15 } 16 void hanoi(unsigned int n,char from, char temp, char to) 17 { 18 if(n == 1) 19 moveplate(n, from, to); 20 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 void moveplate(unsigned int n, char from, char to) 29 { 30 printf("%u:%c-->%c\n",n,from,to); 31 t += 1; 32 }
任务6
源代码
迭代
1 #include <stdio.h> 2 #include <stdlib.h> 3 int func(int n, int m); // 函数声明 4 5 int main() { 6 int n, m; 7 int ans; 8 9 while(scanf("%d%d", &n, &m) != EOF) { 10 ans = func(n, m); // 函数调用 11 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 12 } 13 14 return 0; 15 } 16 17 int func(int n, int m){ 18 int i, p = 1, x = 1; 19 20 if(n < m){ 21 return 0; 22 } 23 24 if(m == 0){ 25 return 1; 26 } 27 28 if(m == n){ 29 return 1; 30 } 31 32 for(i = 0; i < m; i++){ 33 x *= n; 34 n -= 1; 35 } 36 37 for(; m > 0;m--){ 38 p *= m; 39 } 40 41 return x/p; 42 }
递归
1 #include <stdio.h> 2 #include <stdlib.h> 3 int func(int n, int m); // 函数声明 4 5 int main() { 6 int n, m; 7 int ans; 8 9 while(scanf("%d%d", &n, &m) != EOF) { 10 ans = func(n, m); // 函数调用 11 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 12 } 13 14 return 0; 15 } 16 17 int func(int n, int m){ 18 if(n < m){ 19 return 0; 20 } 21 22 if(m == 0){ 23 return 1; 24 } 25 26 if(m == n){ 27 return 1; 28 } 29 return func(n - 1, m) + func(n - 1, m - 1); 30 31 }
任务7
源代码
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 }