实验任务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;
}
运行结果
![3task1]()
问题1:函数score_to_grade的功能是根据输入的分数score将其转换为对应的等级ABCDE,形参类型是数值类型,返回值类型是字符串类型
问题2:缺少break语句会继续执行后面的case,导致无法得到对应等级。单引号变为双引号,字符串类型与字符类型不统一,可能导致类型错误
实验任务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;
}
运行结果
![3task2]()
问题1:函数sum_digits的功能是计算一个整数各个数位上的数字之和
问题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;
}
}
运行结果
![3task3]()
问题1:函数power的功能是计算一个数的幂次结果
问题2:函数power是递归函数,递归模式:
![3task3]()
实验任务4
源代码
#include<stdio.h>
#include<math.h>
int is_prime(int n){
if(n<=1){
return 0;
}
int i;
for(i=2;i<=sqrt(n);i++){
if(n%i==0){
return 0;
}
}
return 1;
}
int main(){
int count=0;
printf("100以内的孪生素数:\n");
int n;
for(n=2;n<=98;n++){
if(is_prime(n)&&is_prime(n+2)){
printf("%d %d\n",n,n+2);
count++;
}
}
printf("100以内的孪生素数共有%d个.\n",count);
return 0;
}
运行结果
![3task4]()
实验任务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){
if(m>n)
return 0;
if(m==0||m==n)
return 1;
if(m>n-m)
m=n-m;
long long numerator=1;
long long denominator=1;
int i;
for(i=1;i<=m;i++){
numerator*=(n-m+i);
denominator*=i;
}
return numerator/denominator;
}
运行结果
![3task5_1]()
源代码(递归)
#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(m>n)
return 0;
if(m==0||m==n)
return 1;
return func(n-1,m)+func(n-1,m-1);
}
运行结果
![3task5_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 min_num=a;
if(b<min_num){
min_num=b;
}
if(c<min_num){
min_num=c;
}
int i;
for(i=min_num;i>=1;i--){
if(a%i==0&&b%i==0&&c%i==0){return i;
}
}
return 1;
}
运行结果
![3task6]()
实验任务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){
int k=n*2-1;
int i,s,j;
for(i=0;i<n;++i){
for(s=0;s<i;++s){
printf("\t");
}
for(j=0;j<k;++j){
printf(" 0 ");
printf("\t");
}
printf("\n");
for(s=0;s<i;++s){
printf("\t");
}
for(j=0;j<k;++j){
printf("<H>");
printf("\t");
}
printf("\n");
for(s=0;s<i;++s){
printf("\t");
}
for(j=0;j<k;++j){
printf("I I");
printf("\t");
}
k-=2;
printf("\n");
}
}
运行结果
![3task7]()