实验三

实验任务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:score_to_grade是自己定义的一个函数,他可以将百分制的分数转化成ABCDE的等级,输入的score类型是整数型,输出的等级是字符型。

问题2:缺少了break也会使运行结果出现问题,例如输入100会一直向下运行到default,使所有输入值都输出E等级。

 

实验任务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:结果是一样的。第一种程序使用的是循环语句,即按个十百千万的位数顺序依次求出各个位数上的数并求和;第二种是函数的循环调用,每求出一位数就将n/10作为n再带入函数。

 

实验任务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:power的功能是求x的n次方

问题2:

 

 

实验任务4

程序:

#include <stdio.h>

int is_prime(int n);

int main(){
	int n;
	int sum = 0;

	printf("100以内的孪生素数:");
	printf("\n");

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

	return 0;
}

int is_prime(int n){
	int i = 2;
	
	while(i < n){
		if(n % i == 0)
			return 0;
		else
			++i;
	}
	return 1;
}

  运行截图:

 

实验任务5

 程序:

#include <stdio.h>

int time = 0;

void hanoi(unsigned int n,char from, char temp, char to);
void moveplate(unsigned int n,char from,  char to);

int main(){
	unsigned int n;

	while(scanf("%u",&n) != EOF){
		time = 0;
		
		hanoi(n,'A','B','C');
		printf("一共移动了%d次\n",time);
	}
	return 0;
}

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

void moveplate(unsigned int n,char from,  char to){
	printf("%u:%c-->%c\n",n,from,to);
	time = time + 1;
}

  运行截图:

 

实验任务6

程序:

#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 a = 1, b = 1;
	
	if(m > n){
		return 0;
	}
	if(m == 0 || m == n){
		return 1;
	}
	for(int i = 1; i <= m; ++i){
		a *= (n-m+i);
		b *= i;
	}
	return a / b;
}

  运行截图:

 

实验任务7

程序:

 #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 = a;
	int ans;
	
	if(min > b){
		min = b;
	}
	
	if(min > c){
		min = c;
	}
	
	for(int i = min; i >= 1; i--){
		if(a % i == 0 && b % i == 0 && c % i == 0){
			return i;
		}
	}
	return 1;
}

  运行截图

 

实验总结:

1.孪生素数的n要从2开始赋初值,要不然会多出一组1 3;

2.汉诺塔的time每次循环都要重新赋初值为0;

3.实验任务7的比较最小值可以直接按照顺序写if,不用使用if套if的结构。

posted @ 2025-04-06 17:21  一剑江湖114514  阅读(28)  评论(0)    收藏  举报