实验3
实验任务1
#include<stdio.h> char score_to_grade(int score); int main() { int score; char grade; while(scanf("%d",&score)!=EOF){ grade=score_to_grade(score); printf("分数:%d,等级:%c\n\n",score,grade); } return 0; } char score_to_grade(int score){ char ans; switch(score/10){ case 10: case 9: ans='A';break; case 8: ans='B';break; case 7: ans='C';break; case 6: ans='D';break; default:ans='E'; } return ans; }

问题1:将分数转化为等第,形参类型int,返回值类型char
问题2:语法错误:char类型为字符常量,不是字符串;逻辑错误:缺少break,每个等第都会输出。
实验任务2
#include<stdio.h> int sum_digits(int n); int main() { int n; int ans; while(printf("Enter n:"),scanf("%d",&n)!=EOF){ ans=sum_digits(n); printf("n=%d,ans=%d\n\n",n,ans); } return 0; } int sum_digits(int n){ int ans=0; while(n!=0){ ans+=n%10; n/=10; } return ans; }

问题1:计算输入数字的各位数字之和。
问题2:能实现。前者用迭代,这里用递归函数。
实验任务3
#include<stdio.h> int power(int x,int n); int main(){ int x,n; int ans; while(printf("Enter x and n: "),scanf("%d%d",&x,&n)!=EOF){ ans=power(x,n); printf("n=%d,ans=%d\n\n",n,ans); } return 0; } int power(int x,int n){ int t; if(n==0) return 1; else if(n%2) return x*power(x,n-1); else{ t=power(x,n/2); return t*t; } }

问题1:计算x的n次方。
问题2:是递归函数。
x 的0次方返回1。
若n为偶数,则返回x 的(n-1)次方。
若n为奇数,则n整除2,计算t,返回t*t,这样指数就变为偶数了。
实验任务4
#include<stdio.h> #include<math.h> int is_prime(int n); int main() { printf("100以内的孪生素数:\n"); int cnt=0; for(int x=1;x<=100;x++){ if(is_prime(x)&&is_prime(x+2)){ printf("%d %d",x,x+2); printf("\n"); cnt++; } } printf("100以内孪生素数共有%d个",cnt); return 0; } int is_prime(int n){ if(n==2) return 1; if(n==1) return 0; if(n!=2&&n%2==0) return 0; for (int i=3;i<=sqrt(n);i+=2){ if(n%i==0) return 0; } return 1; }

实验任务5
#include<stdio.h> int func(int n,int m); int main(){ int n,m; int ans; while(scanf("%d%d",&n,&m)!=EOF){ ans=func(n,m); printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); } return 0; } int func(int n,int m){ int ans; int s1=1,s2=1; for(int x=n-m+1;x<=n;x++) s1=s1*x; for(int y=1;y<=m;y++) s2=s2*y; ans=s1/s2; return ans; }
#include<stdio.h> int func(int n,int m); int main(){ int n,m; int ans; while(scanf("%d%d",&n,&m)!=EOF){ ans=func(n,m); printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); } return 0; } int func(int n,int m){ if(n<m) return 0; if(m==0) return 1; return func(n-1,m)+func(n-1,m-1); return func(n,m); }
5.1迭代

5.2递归

实验任务6
#include<stdio.h> int gcd(int a,int b,int c); int main() { int a,b,c; int ans; while(scanf("%d%d%d",&a,&b,&c)!=EOF){ ans=gcd(a,b,c); printf("最大公约数:%d\n\n",ans); } return 0; } int gcd(int a,int b,int c){ int ans; int min=a; if(b<min) min=b; if(c<min) min=c; for(int i=min;i>=1;i--){ if(a%i==0&&b%i==0&&c%i==0){ ans=i; break; } } return ans; }

实验任务7
#include<stdio.h> #include<stdlib.h> void print_charman(int n); int main() { int n; printf("Enter n: "); scanf("%d",&n); print_charman(n); return 0; } void print_charman(int n){ for(int i = 0; i < n; i++){ for(int k=0;k<i;k++){ printf("\t"); } for(int j = 0;j<2*(n-i)-1; j++){ printf(" o \t"); } printf("\n"); for(int k=0;k<i;k++){ printf("\t"); } for(int j = 0;j<2*(n-i)-1; j++){ printf("<H>\t"); } printf("\n"); for(int k=0;k<i;k++){ printf("\t"); } for(int j = 0;j<2*(n-i)-1; j++){ printf("I I\t"); } printf("\n"); } system("pause"); return print_charman(n); }


浙公网安备 33010602011771号