实验3
task1
#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 的功能:该函数的作用是依据输入的分数来判定对应的等级。分数范围在 90 - 100 为 'A',80 - 89 为 'B',70 - 79 为 'C',60 - 69 为 'D',60 分以下为 'E'。
形参类型:int 类型,意味着接收一个整数作为输入的分数。返回值类型:char 类型,即返回一个字符来表示对应的等级。
问题2:
类型不匹配:ans 被定义为 char 类型,然而 "A"、"B"、"C"、"D" 属于字符串常量(类型为 const char*),把字符串常量赋值给 char 类型的变量会引发类型不匹配的错误。这里应当使用字符常量 'A'、'B'、'C'、'D'。
缺少 break 语句:在每个 case 分支里都没有 break 语句,这会造成一旦匹配到某个 case,程序就会继续执行后续的 case 分支,直至遇到 break 或者 switch 语句结束。这样就无法正确实现依据不同分数范围来确定等级的功能。
task2
#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 函数的功能是计算整数 n 的各位数字之和。原实现通过 while 循环,不断取 n 最后一位数字累加,再去掉该位,直至 n 为 0。
问题 2
两种实现能达到同等效果。原实现运用迭代思维,用 while 循环逐步缩小问题规模。新实现采用递归思维,将问题分解为 n/10 和 n % 10 两部分,当 n 小于 10 时终止递归,二者本质都是计算 n 的各位数字之和。
task3
#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
函数 power 是递归函数。递归函数指的是在函数的定义里调用自身的函数,power 函数在其定义中就调用了自身。
递归模式
当 n 等于 0 时,函数直接返回 1。
当 n 为奇数(即 n % 2 为真)时,power(x, n) 等于 x 乘以 power(x, n - 1)。
当 n 为偶数(即 n % 2 为假)时,先计算 power(x, n / 2) 的结果并赋值给 t,然后返回 t * t。
数学公式模型
设 P(x,n)表示 power(x, n) 的计算结果,该递归模式对应的数学公式模型如下:

task4
#include <stdio.h>
int is_prime(int n) {
if (n <= 1) {
return 0;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int count = 0;
printf("100以内的孪生素数有:\n");
for (int 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;
}

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

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

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

浙公网安备 33010602011771号