实验三

任务一

源代码:

#include <stdio.h>

char score_to_grade(int score);

int main(){
    int score;
    char garde;
    
    while(scanf("%d",&score) != EOF){
        garde = score_to_grade(score);
        printf("分数:%d,等级:%c\n\n",score,garde);
    }
    
    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:将输入的分数进行等级划分,整型,字符型

问题2:缺少break终止语句导致case穿透,最终导致输出结果中含有后续情况的输出结果。且case6到10的输出结果不是字符型,导致程序运行错误。

任务二

源代码:

#include <stdio.h>

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:将输入的n各分位的数相加

问题2:可以实现同样的效果,第一个是将n/10放入while循环中,而第二个则是将n/10放入sum_digits函数中进行循环

任务三

源代码:

#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:是递归函数

数学公式模型:

 

任务四

源代码:

#include<stdio.h>
#include<math.h>
int is_prime(int x)
{
    int i, k;
    k = sqrt(x);
    for(i=2;i<=k;i++)
    if(x%i==0)
        return 0;
    if(i>k)
        return 1;
}
int main(){
    printf("100以内的孪生素数:\n");

    int n=100;
    int m=0;
    int j;
    for(j=2;j<=n;j++){
    if(is_prime(j)&&is_prime(j+2)){
    m++;
    printf("%d %d\n",j,j+2);
        }
    }
    printf("100以内的孪生素数共有%d个\n",m);
    
   
    
    return 0;
}

运行结果:

任务五

源代码:

#include<stdio.h>
#include<stdlib.h>
void hanoi(unsigned int n, char from,char temp, char to);
void moveplate(unsigned int n ,char from, char to);
int total=0;
int main()
{
    unsigned int n;
    while (scanf("%u",&n)!=EOF){
    total = 0;
    hanoi(n, 'A', 'B', 'C');
    printf("一共移动%d次",total);
    }
    
 return 0;
}

 void hanoi(unsigned int n, char from,char temp, char to)
{
 if(n==1)
{
    moveplate(n, from, to);
    total++;
}
    else
    {
    hanoi(n-1, from, to, temp);
    moveplate(n, from, to);
    hanoi(n-1,temp, from,to);
    total++;
    }
}
 void moveplate(unsigned int n,char from, char to)
 {

    
    printf("%u:%c-->%c\n",n, from, to);
}

运行结果;

任务六

迭代法:

#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;
}
func(int n, int m)
{
    int i, j;
    int p=1, q=1;
    for(i=n-m+1;i<=n;i++){
    p*=i;}
    for(j=1;j<=m;j++){
    q*=j;}
    return p/q;
}

递归法:

#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;
}
func(int n, int m)
{
    if(m>n)
    return 0;
    else if(m==n||m==0)
    return 1;
    else
    return func(n-1, m)+func(n-1,m-1);
    
}

任务七

源代码:

#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 i,j,k;
    for(i=n;i>0;i--){
        for(k=1;k<=n-i;k++){
            printf("   \t");
        }
            j=2*i-1;
            for(j;j>0;j--){
                printf(" O \t");
            }
            printf("\n");
        
        for(k=1;k<=n-i;k++){
            printf("   \t");
        }
            j=2*i-1;
            for(j;j>0;j--){
                printf("<H>\t");
            }
            printf("\n");
        for(k=1;k<=n-i;k++){
            printf("   \t");
        }
            j=2*i-1;
            for(j;j>0;j--){
                printf("I I\t");
            }printf("\n");
    }
}

运行结果:

输入3:

 

 输入4:

 

posted @ 2024-10-27 12:49  林子龙  阅读(12)  评论(0编辑  收藏  举报