第三次作业
task 1
1 #include<stdio.h> 2 3 char score_to_grade(int score); 4 5 int main() 6 { 7 int score; 8 char grade; 9 10 while(scanf("%d",&score) !=EOF){ 11 grade=score_to_grade(score); 12 printf("分数: %d, 等级: %c\n\n", score, grade); 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 return ans; 29 }
运行结果
问题1:score_to_grade 输入分数可以得到一个等第:;形式参数 int;返回值类型char;
问题2:有问题,类型错误,[Warning] assignment makes integer from pointer without a cast
task 2
1 #include<stdio.h> 2 3 int sum_digits(int n); 4 5 int main() 6 { 7 int n; 8 int ans; 9 10 while(printf("Enter n:"),scanf("%d",&n) !=EOF){ 11 ans=sum_digits(n); 12 printf("n=%d,ans=%d\n\n",n,ans); 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 return ans; 23 } 24
图片
回答
问题1:计算每一位求和的ans;
问题2:能实现一样的效果,一个是迭代的思维,一个是递归的思维;
task 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 return 0; 14 } 15 16 int power(int x,int n){ 17 int t; 18 if(n==0) 19 return 1; 20 else if(n%2) 21 return x*power(x,n-1); 22 else{ 23 t=power(x,n/2); 24 return t*t; 25 } 26 }
图片
回答
问题1:power函数的功能是计算一个数的n次方;
power函数是递归函数,
task 4.
#include<stdio.h> int is_prime(int n); int main() { int i; int cnt=0; printf("100以内的孪生素数:\n"); for(i=1;i<=98;i++) { if(is_prime(i)+is_prime(i+2)==2) { printf("%d %d\n",i,i+2); cnt++; } } printf("100以内的孪生素数一共有%d个",cnt); return 0; } int is_prime(int n) { int j; if(n==1) return 0; for(j=2;j<n;j++){ if(n%j==0) return 0; }return 1; }
图片
task5
1 #include<stdio.h> 2 int cnt=0; 3 void hanoi(unsigned int n,char from,char temp,char to); 4 void moveplate(unsigned int n,char from,char to); 5 6 int main() 7 { 8 unsigned int n; 9 while(scanf("%d",&n) !=EOF) 10 { 11 cnt=0; 12 hanoi(n,'A','B','C'); 13 printf("一共移动了%d次\n",cnt); 14 } 15 16 return 0; 17 } 18 19 void hanoi(unsigned int n,char from,char temp,char to) 20 { 21 22 if(n==1) 23 moveplate(n,from ,to); 24 else 25 { 26 hanoi(n-1,from,to,temp); 27 moveplate(n,from,to); 28 hanoi(n-1,temp,from,to); 29 } 30 } 31 32 void moveplate(unsigned int n,char from,char to) 33 { 34 printf("%u:%c--->%c\n",n,from,to); 35 cnt++; 36 }
图片
task6
迭代
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 { 18 int s,k,t; 19 int i,j; 20 for(i=n;i>=n-m+1;i--) 21 k*=i; 22 for(j=1;j<=m;j++) 23 t*=j; 24 s=k/t; 25 return s; 26 }
图片
递归
int func(int n,int m)
{
if(n!=0&&m!=0)
return func(n-1,m)+func(n-1,m-1);
else if(n==m||m==0)
return 1;
}
task7
1 #include <stdio.h> 2 #include <stdlib.h> 3 void print_charman(int n); 4 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 16 void print_charman(int n) 17 { 18 int i,j,t,k; 19 t=n; 20 for(j=0;j<t;j++) 21 { 22 23 24 for(i=0;i<j;i++) 25 { 26 printf("\t"); 27 28 } 29 for(i=1;i<=2*n-1;i++) 30 { 31 printf(" o \t"); 32 33 } 34 printf("\n"); 35 for(i=0;i<j;i++) 36 { 37 printf("\t"); 38 39 } 40 for(i=1;i<=2*n-1;i++) 41 { 42 printf("<H>\t"); 43 } 44 printf("\n"); 45 for(i=0;i<j;i++) 46 { 47 printf("\t"); 48 49 } 50 for(i=1;i<=2*n-1;i++) 51 { 52 printf("I I\t"); 53 } 54 printf("\n"); 55 n--; 56 57 } 58 }
图片
感受,task7写的过于复杂,先打印全填满的小人,再考虑每行减少两个,最后考虑开头的\t