实验3
1 #include <stdio.h> 2 char score_to_grade(int score); 3 int main(){ 4 int score; 5 char grade; 6 while(scanf("%d",&score)!=EOF){ 7 grade=score_to_grade(score); 8 printf("分数:%d,等级:%c\n\n",score,grade); 9 } 10 return 0;} 11 char score_to_grade(int score){ 12 char ans; 13 switch(score/10){ 14 case 10: 15 case 9: ans='A' ; break; 16 case 8: ans='B'; break; 17 case 7: ans='C'; break; 18 case 6: ans='D'; break; 19 default: ans='E'; 20 } return ans; 21 }
任务1
问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
将分数对应转变为各个等级,int char
问题2:如果line21-28以下形式,有问题吗?如果有,指出有哪些问题?
有问题,没有break,语句会一直进行下去,最后都会变成E。
switch(score/10) {
case 10:
case 9: ans = "A";
case 8: ans = "B";
case 7: ans = "C";
case 6: ans = "D";
default: ans = 'E';
}
任务2:
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("%d",&n)!=EOF){ 7 ans=sum_digits(n); 8 printf("n=%d,ans=%d\n\n",n,ans); 9 } return 0; 10 } 11 int sum_digits(int n){ 12 int ans=0; 13 while(n!=0){ 14 ans+=n%10; 15 n/=10; 16 } return ans; 17 }
问题1:函数 sum_digits 的功能是什么?
将数字的各个数位上的数字相加
问题2:如果保持 main 代码和函数 sum_digits 声明不变,把函数 sum_digits 定义成如下实现方
式,能实现同等的效果吗?
如果不能实现同等效果,分析原因。
如果能实现同等效果,说明两种实现方式背后的算法思维区别
可以,第二种方法为递归
任务3:
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("%d%d",&x,&n)!=EOF){ 7 ans=power(x,n); 8 printf("n=%d,ans=%d\n\n",n, ans); 9 } return 0; 10 } 11 int power(int x,int n){ 12 int t; 13 if(n==0) 14 return 1; 15 else if(n%2) 16 return x*power(x,n-1); 17 else{ 18 t=power(x,n/2); 19 return t*t; 20 } 21 }
问题1: 函数 power 的功能是什么? 算出x的n次幂的值
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模
型。
是递归
任务4:
1 #include<stdio.h> 2 int is_prime(int x){ 3 int i; 4 int rex; 5 if(x<2) return 0; 6 for(i=2;i<x;i++){ 7 if(x%i==0){ 8 rex=0; break; 9 }else{ 10 rex=1; 11 } 12 } return rex; 13 } 14 int main(){ 15 printf("100以内的孪生素数:\n"); 16 int cnt=0; 17 int j=1; 18 while(j<98){ 19 int rex; 20 int rix; 21 rex=is_prime(j); 22 rix=is_prime(j+2); 23 if(rex==1 && rix==1){ 24 printf("%d %d\n",j,j+2); 25 cnt++; 26 } 27 j++; 28 } 29 printf("100以内的孪生素数共有%d个\n",cnt); 30 return 0; 31 }
任务5:
1 #include <stdio.h> 2 int count=0; 3 void hanoi(int n, char from, char temp, char to); 4 void moveplate(int n, char from, char to); 5 int main() { 6 int n; 7 while(scanf("%u", &n)!=EOF){ 8 hanoi(n, 'A', 'C', 'B'); 9 printf("一共移动了%d次\n",count); 10 count=0; 11 } 12 return 0; 13 } 14 void hanoi(int n, char from, char temp, char to) { 15 if (n == 1) { 16 moveplate(n, from, to); 17 } 18 else { 19 hanoi(n - 1, from, to, temp); 20 moveplate(n, from, to); 21 hanoi(n - 1, temp, from, to); 22 } 23 } 24 void moveplate(int n, char from, char to) { 25 printf("%u:%c-->%c\n", n, from, to); 26 count++; 27 28 }
任务6:
1 #include<stdio.h> 2 int CQW(int c){ 3 int rex=1; 4 for(int j=1;j<=c;j++){ 5 rex*=j; 6 } return rex; 7 } 8 int func(int n, int m){ 9 int rex,rix,rmx; 10 int ans; 11 int l=n-m; 12 rex=CQW(n); 13 rix=CQW(m); 14 rmx=CQW(l); 15 ans=rex/(rix*rmx); 16 return ans; 17 } 18 int main(){ 19 int x,y; 20 while(scanf("%d%d", &x, &y) != EOF){ 21 int ans; 22 if(y>x||x==0||y==0){ 23 ans=0; 24 }else if(x==y){ 25 ans=1; 26 } 27 else{ 28 ans=func(x,y); 29 } 30 printf("x = %d, y = %d, ans = %d\n\n", x, y, ans); 31 } return 0;}
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 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 }
任务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 }