实验3 C语言函数应用编程
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';
}
return ans;
}

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型分别是什么?
回答1:功能:将输入的整数分数(score)转换为对应的等级字符。形参类型:int(接收一个整数分数)。返回值类型:char(返回对应的等级字符)。
问题2:存在以下两处关键问题:1)类型不匹配:原代码中使用字符常量(如'A')给char类型的ans赋值,而修改后使用字符串常量(如"A")2)缺少 break 语句导致逻辑错误。
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;
}

问题1:函数 sum_digits 的功能是什么?
回答1:函数
sum_digits 的功能是计算输入整数 n 的各位数字之和。问题2:如果把函数 sum_digits 定义成如下实现方式,能实现同样的输出吗?
回答2:能实现同样的输出。递归版本的逻辑是:若
n < 10(即 n 是个位数),直接返回 n(本身就是各位和);否则,返回 n 去掉最后一位后的数字的各位和(sum_digits(n/10))加上 n 的最后一位(n%10)。其与原循环版本完全一致,都是通过分解数字并累加各位,因此对于任意整数 n(包括正数、负数、0),两者的计算结果完全相同。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; } }

问题1: 函数 power 的功能是什么?
回答1:在多数编程场景中,power函数的功能是计算一个数的幂。例如,若函数定义为power(x, n),则其功能通常是返回x的n次幂(即x^n,其中x为底数,n为指数,且n通常为非负整数)。
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
回答2:是递归函数。

task4.c
#include <stdio.h> // 判断一个正整数n是否是素数,是则返回1,否则返回0 int is_prime(int n) { if (n <= 1) { // 小于等于1的数不是素数 return 0; } if (n == 2) { // 2是素数 return 1; } if (n % 2 == 0) { // 偶数(除2外)不是素数 return 0; } int i; // 检查从3到sqrt(n)的奇数是否能整除n for (i = 3; i * i <= n; i += 2) { if (n % i == 0) { return 0; } } return 1; } int main() { int count = 0; // 统计孪生素数的对数 printf("100以内的孪生素数对:\n"); int n; // 遍历可能的n,n+2需≤100,因此n≤98 for (n = 2; n <= 98; n++) { // 若n和n+2都是素数,则为孪生素数对 if (is_prime(n) && is_prime(n + 2)) { printf("%d %d\n", n, n + 2); count++; } } printf("100以内孪生素数的总数为:%d\n", count); return 0; }

task5-1.c
#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 < 0 || m > n) { return 0; } // 边界条件:取0个或取n个元素,组合数为1 if (m == 0 || m == n) { return 1; } if (m > n - m) { m = n - m; } int i; int numerator = 1; // 分子 int denominator = 1; // 分母 for (i = 1; i <= m; i++) { numerator *= (n - m + i); denominator *= i; } return numerator / denominator; }

#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 < 0 || m > n) { return 0; } // 边界条件:取0个或取n个元素,组合数为1 if (m == 0 || m == n) { return 1; } // 递归公式:C(n,m) = C(n-1,m) + C(n-1,m-1) return func(n - 1, m) + func(n - 1, m - 1); }

task6.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_val = a; if (b < min_val) { min_val = b; } if (c < min_val) { min_val = c; } int i; // 从最小值开始向下穷举,寻找最大公约数 for (i = min_val; i >= 1; i--) { if (a % i == 0 && b % i == 0 && c % i == 0) { return i; // 找到最大公约数,立即返回 } } return 1; }

task7.c
#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,s,j; for (i = n; i >= 1; i--) { int count = 2 * i - 1; // 每行小人的数量(奇数,随i递减) int space = n - i; // 每行前的缩进制表符数量(随i递减而增加) // 打印头部行(" O \t") for (s = 0; s < space; s++) printf("\t"); for (j = 0; j < count; j++) printf(" O \t"); printf("\n"); // 打印身体行("<H>\t") for (s = 0; s < space; s++) printf("\t"); for (j = 0; j < count; j++) printf("<H>\t"); printf("\n"); // 打印腿部行("I I\t") for (s = 0; s < space; s++) printf("\t"); for (j = 0; j < count; j++) printf("I I\t"); printf("\n\n"); } }



浙公网安备 33010602011771号