实验3 C语言函数应用编程

实验3 C语言函数应用编程

task1

实验程序task1.c

#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';
	}

输出结果

image

问题回答

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
答:将分数转化为文本,形参类型是int,返回值类型是int
问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。

switch(score/10) {
case 10:
case 9: ans = "A";
case 8: ans = "B";
case 7: ans = "C";
case 6: ans = "D";
default: ans = 'E';
}

答:该循环不会停止

task2

实验程序task2.c

#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;
}

输出结果

image

问题回答

问题1:函数 sum_digits 的功能是什么?
答:构建函数
问题2:如果保持 main 代码和函数 sum_digits 声明不变,把函数 sum_digits 定义成如下实现方式,能实现同
等的效果吗?
如果不能实现同等效果,分析原因。
如果能实现同等效果,说明两种实现方式背后的算法思维区别。

int sum_digits(int n) {
	if(n < 10)
		return n;
	return sum_digits(n/10) + n%10;
}

task3

实验程序task3.c

#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;
    }
}

输出结果

image

问题回答

问题1: 函数 power 的功能是什么?
答:模块化编程
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
(如果不会使用公式编辑方式,请在纸上写出这个递归模式对应的数学公式模型,然后拍照,以图片方式上传)
答:是,可以计算x^n

task4

实验程序task4.c

#include <stdio.h>

int is_prime(int x); 
int main()
{
	int k;
	int s;
	for (k = 2; k < 100; k++)
	{
		s = k + 2;
		if (is_prime(k) == 1 && is_prime(s) == 1)
			printf("%d %d\n", k, s);

	}
}
int is_prime(int x) {
	int i;
	for (i = 2; i <= x / 2; i++)
	{
		if (x % i == 0)
		{
			return 0;
		}
	}
	return 1;

}

输出结果

image

task5

实验程序task5.c

#include <stdio.h>
int count = 0;
void hanoi(int n, char from, char temp, char to) {
    if (n == 1) {
        count++;
        printf("%d: %c --> %c\n", 1, from, to);
    } else {
        hanoi(n - 1, from, to, temp);
        count++;
        printf("%d: %c --> %c\n", n, from, to);
        hanoi(n - 1, temp, from, to);
    }
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        count = 0;
        hanoi(n, 'A', 'B', 'C');
        printf("一共移动了%d次.\n", count);
    }
    return 0;
}

输出结果

image

task6

实验程序task6.c

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);
}

输出结果

image

task7

实验程序task7.c

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

输出结果

image

posted @ 2025-04-09 14:38  pengzhenyu  阅读(22)  评论(0)    收藏  举报