实验三
实验任务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 char score_to_grade(int score) { 18 char ans; 19 20 switch(score/10) { 21 case 10: 22 case 9: ans = 'A'; break; 23 case 8: ans = 'B'; break; 24 case 7: ans = 'C'; break; 25 case 6: ans = 'D'; break; 26 default: ans = 'E'; 27 } 28 29 return ans; 30 }
图片
问题
功能为通过成绩计算等第
类型为字符型
更改后会按顺序输出E,而不是对应的等第
实验任务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 int sum_digits(int n){ 17 int ans = 0; 18 while(n != 0){ 19 ans += n % 10; 20 n /= 10; 21 } 22 23 return ans;
图片
问题
功能 得出这个数每位相加的值
能实现
原代码是ans每次加上n个位上的数,n再去掉个位的数,直至n为0
更改后为n每次除以10后n个位的数相加,如果只剩2位数,就能实现十位个位直接相加,因为n变为个位数了,所以停止,返回n了。
实验任务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 int power(int x, int n){ 18 int t; 19 if(n==0) 20 return 1; 21 else if(n % 2) 22 return x * power(x, n-1); 23 else{ 24 t = power(x, n/2); 25 return t*t; 26 } 27 }
图片
问题
功能为求x的n次方
当n=0时,x的0次=1
当n>0时,x的n次=x*x的n-1次
实验任务4
源代码
1 #include <stdio.h> 2 3 int is_prime(int n); 4 int main(){ 5 printf("100以内的孪生素数:\n"); 6 int i,s=0; 7 for(i=2;i<100;i++){ 8 if(is_prime(i)==1&&is_prime(i+2)==1){ 9 printf("%d %1d\n",i ,i+2); 10 s++;} 11 } 12 printf("100以内的孪生素数共有 %d",s); 13 } 14 15 int is_prime(int n){ 16 if(n<=1) 17 return 0; 18 for(int j=2;j<=n/2;j++){ 19 if(n%j==0) 20 return 0; 21 } 22 return 1; 23 }
图片
实验任务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 static int s = 0; 6 int main(){ 7 unsigned int n; 8 while(scanf("%u",&n) != EOF){ 9 hanoi(n,'A','B','C'); 10 printf("一共移动了%d次\n",s); 11 s = 0; 12 } 13 system("pause"); 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 s++; 21 } 22 else 23 { 24 hanoi(n-1,from,to,temp); 25 moveplate(n,from,to); 26 hanoi(n-1,temp,from,to); 27 s++; 28 } 29 } 30 void moveplate(unsigned int n,char from,char to) 31 { 32 printf("%u: %c-->%c\n",n, from, to); 33 }
图片
实验任务6
源代码1(迭代)
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 int func(int n, int m){ 16 int i,s=1; 17 18 if(n-m<0) 19 return 0; 20 21 if(m>(n-m)) 22 m=n-m; 23 24 for(i=0;i<m;i++) 25 s = s*(n-i)/(i+1); 26 27 return s; 28 }
图片
源代码2(递归)
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 int func(int n, int m){ 16 int s; 17 18 if(m==0||n==m) 19 return 1; 20 else if(m>n) 21 return 0; 22 else 23 s = func(n-1,m)+func(n-1,m-1); 24 25 return s; 26 }
图片
实验任务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("%d", &n); 11 print_charman(n); 12 13 return 0; 14 } 15 void print_charman(int n){ 16 int i,j,s=0; 17 while(n>0) 18 { 19 for (j = 0; j < s ; j++) 20 printf("\t"); 21 for(i=1;i<=2*n-1;i++){ 22 printf(" O "); 23 } 24 printf("\n"); 25 26 for (j = 0; j < s ; j++) 27 printf("\t"); 28 for(i=1;i<=2*n-1;i++){ 29 printf(" <H> "); 30 } 31 printf("\n"); 32 33 for (j = 0; j < s ; j++) 34 printf("\t"); 35 for(i=1;i<=2*n-1;i++){ 36 printf(" I I "); 37 } 38 printf("\n"); 39 40 n -= 1; 41 s++; 42 43 } 44 }
图片