实验3
实验3
四、任务结论
1.实验任务1
- task1.c源代码,及,运行测试截图
- 回答实验任务1中提出的问题
问题1:函数score_to_grade 的功能是什么?形参类型、返回值类型是什么?
问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。
#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;
}

- Q1 评定分数对应等级;int;char;
- Q2 缺少break语句,所有输出都是E;
2.实验任务2
- task2.c源代码,及,运行结果截图
- 回答问题
问题1:函数sum_digits 的功能是什么?
问题2:如果把函数sum_digits 定义成如下实现方式,能实现同样的输出吗?
如果能,说明两种实现方式的算法思维区别;如果不能,分析原因。
#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;
}

- Q1 求x各数位数字之和;
- Q2 可以;前者直接求和;后者采用了递归调用的方式求和;
3.实验任务3
- task3.c源代码,及,运行结果截图
- 回答问题
问题1: 函数power 的功能是什么?
问题2:函数power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
(在纸上写出这个递归模式对应的数学公式,拍照后以图片方式放到这里;也可使用公式编辑器(如果
会使用))
#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;
}
}

- Q1 求x的n次方;
- Q2 是;
\[f(x, n) =
\begin{cases}
1 & n = 0 \\
x \cdot f(x, n-1) & n \equiv 1 \pmod 2 \\
f(x, n/2)^2 & n \equiv 0 \pmod 2
\end{cases}
\]
4.实验任务4
- task4.c源代码,及,运行结果截图
#include <stdio.h>
char classify_triangle(int a, int b, int c){
if (a + b > c && a + c > b && b + c > a) {
if (a * a == b * b + c * c || b * b == a * a + c * c || c * c == a * a + b * b) {
return 4;
}
else if (a == b && b == c) {
return 2;
}
else if (a == b || b == c || a == c) {
return 3;
}
else {
return 1;
}
}
else {
return 0;
}
}
int main() {
int a, b, c;
while (scanf(" %d %d %d", &a, &b, &c) == 3) {
switch(classify_triangle(a, b, c)){
case 0 : printf("不能构成三角形\n");break;
case 1 : printf("普通三角形\n");break;
case 2 : printf("等边三角形\n");break;
case 3 : printf("等腰三角形\n");break;
case 4 : printf("直角三角形\n");break;
}
}
return 0;
}

5.实验任务5
- 用迭代方式实现计算组合数func() 的完整源代码task5_1.c,及,运行测试截图
#include <stdio.h>
int func(int n, int m){
if(n < m){
return 0;
}
long long ans = 1;
for (int i = n - m + 1; i <= n; i++){
ans *= i;
}
for (int i = 1; i <= m; i++){
ans /= i;
}
return ans;
} // 函数声明
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() 的完整源代码task5_2.c,及,运行测试截图
#include <stdio.h>
int func(int n, int m){
if(n < m){
return 0;
}
if(m == 0){
return 1;
}
if(n == m){
return 1;
}
int ans = func(n - 1, m) + func(n - 1, m - 1);
return ans;
} // 函数声明
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;
}

6.实验任务6
- task6.c源代码,及,运行结果截图
#include <stdio.h>
#include<math.h>
int gcd(int a, int b, int c){
int k = fmin(fmin(a, b), fmin(a, c));
int ans = 1;
for (int i = 1; i <= k; i++){
if(a % i == 0 && b % i == 0 && c % i == 0){
ans = i;
}
}
return ans;
}
// 函数声明
// 待补足....
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;
}

7.实验任务7
- task7.c源代码,及,运行结果截图
#include <stdio.h>
#include <stdlib.h>
void one_line(int spacenum, int mannum){
for (int i = 1; i <= spacenum; i++){
printf(" ");
}
for (int i = 1; i <= mannum; i++){
printf(" o ");
}
printf("\n");
for (int i = 1; i <= spacenum; i++){
printf(" ");
}
for (int i = 1; i <= mannum; i++){
printf("<H> ");
}
printf("\n");
for (int i = 1; i <= spacenum; i++){
printf(" ");
}
for (int i = 1; i <= mannum; i++){
printf("I I ");
}
printf("\n");
}
void print_charman(int n){
for (int linenum = n; linenum >= 1; linenum--){
int spacenum = n - linenum;
int mannum = 2 * linenum - 1;
one_line(spacenum, mannum);
}
}
// 函数声明
// 待补足
// xxx
int main() {
int n;
printf("Enter n: ");
scanf("%d", &n);
print_charman(n); // 函数调用
return 0;
}

文章已结束:)
浙公网安备 33010602011771号