实验3
task1
1 #include<stdio.h> 2 3 char score_to_grade(int score); 4 int main(){ 5 int score; 6 char grade; 7 8 while(scanf("%d",&score)!= EOF){ 9 grade = score_to_grade(score); 10 printf("分数:%d, 等级:%c\n\n",score,grade); 11 } 12 13 return 0; 14 } 15 16 char score_to_grade(int score){ 17 char ans; 18 switch(score/10){ 19 case 10: 20 case 9: ans = 'A';break; 21 case 8: ans = 'B';break; 22 case 7: ans = 'C';break; 23 case 6: ans = 'D';break; 24 default: ans = 'E'; 25 } 26 return ans; 27 }
Q1:score_to_grade是一个自己定义的函数,方便我们将得分进行等级评定然后封存在字符中,方便后续调用。形参类型是int,返回值类型是char
Q2:有问题,如果没有break,那么会从满足的case开始之后的返回值都会多余且单字符不应该用双引号“”
task2
1 #include<stdio.h> 2 int sum_digits(int n); 3 int main() 4 { 5 int n; 6 int ans; 7 8 while(printf("Enter n:"),scanf("%d",&n) !=EOF){ 9 ans = sum_digits(n); 10 printf("n = %d,ans = %d\n\n",n,ans); 11 } 12 13 return 0; 14 } 15 int sum_digits(int n){ 16 int ans = 0; 17 while(n != 0){ 18 ans += n % 10; 19 n /= 10; 20 } 21 return ans; 22 }
Q1:sum_digits是我们自行定义的一个函数,计算各数位上数字相加之和,方便后续调用
Q2:能实现同等效果,原代码的思维是循环的思维,改后的思维是函数递归的思维。
task3
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 }
Q1:power是我们自己定义的一个函数,可以计算x的n次幂;且当n为0时结果为1
Q2:是递归函数,其对应的递归模式如图
task4
1 #include <stdio.h> 2 3 int is_prime(int); //函数声明 4 5 int main() { 6 int n, twn; 7 int count = 0; 8 printf("100以内的孪生素数:\n"); 9 for (n = 2; n > 1 && n < 98; ++n) { 10 twn = n + 2; 11 if (is_prime(n) == 1 && is_prime(twn) == 1) { //函数调用 12 printf("%d %d\n", n, twn); 13 count++; 14 } 15 } 16 printf("100以内的孪生素数共有%d个", count); 17 return 0; 18 } 19 20 int is_prime(int x) { //函数定义 21 int i; 22 if (x < 2) return 0; 23 for (i = 2; i * i <= x; ++i) { 24 if (x % i == 0) 25 return 0; 26 } 27 return 1; 28 }
task5
1 #include<stdio.h> 2 void Hanoi(int n, char from, char to, char temp); 3 int count; 4 int main() 5 { 6 int n; 7 scanf_s("%d", &n); 8 Hanoi(n, 'A', 'C', 'B'); 9 printf("一共移动了%d次", count); 10 return 0; 11 } 12 void Hanoi(int n, char from, char to, char temp) 13 { 14 if (n == 1){ 15 printf("%d : %c --> %c\n", n, from, to); 16 count++; 17 } 18 else{ 19 count++; 20 Hanoi(n - 1, from, temp, to); 21 printf("%d : %c --> %c\n", n, from, to); 22 Hanoi(n - 1, temp, to, from); 23 } 24 }
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("%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 13 int func(int n,int m){ // 函数定义 14 if(m==0||m==n) 15 return 1; 16 else if(m>n) 17 return 0; 18 else 19 return func(n - 1, m) + func(n - 1, m - 1); 20 //递归方式 21 }
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 int i,x,y,z; 18 x=1,y=1,z=1; 19 for(i=1;i<=n;i++){ 20 x*=i; 21 } 22 for(i=1;i<=m;i++){ 23 y*=i; 24 } 25 for(i=1;i<=(n-m);i++){ 26 z*=i; 27 } 28 return x/y/z; 29 } 30 //迭代方式
task7
1 #include <stdio.h> 2 #include <stdlib.h> 3 int print_charman(int n); 4 int r; 5 int main(){ 6 int n; 7 printf("Enter n:"); 8 scanf("%d",&n); 9 r=n; 10 print_charman(n); 11 return 0; 12 } 13 int print_charman(n){ 14 if(n>0){ 15 int s,z; 16 for(s=2*n-1;s>0;s--) printf(" o \t"); 17 printf("\n"); 18 for(z=r-n;z>0;z--) printf("\t"); 19 for(s=2*n-1;s>0;s--) printf("<H>\t"); 20 printf("\n"); 21 for(z=r-n;z>0;z--) printf("\t"); 22 for(s=2*n-1;s>0;s--) printf("I I\t"); 23 printf("\n\n"); 24 for(z=r-n+1;z>0;z--) printf("\t"); 25 print_charman(n-1); 26 } 27 }