实验三
任务一
源代码tack1.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;
}
运行测试截图

回答问题
问题一:将整数型的分数转换成字符型的等级;形参类型:整型;返回值:字符型;
问题二:A,B,C,D,E都用双引号,成字符串了,不能赋值给字符型变量ans;并且缺少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;
}
运行测试截图

回答问题
问题一:计算整数n的个位数字之和。
问题二:能;原版是迭代思想,用while循环一步步取出n的每一位,手动累加,依靠循环变量更新;
新版是递归思想,不断调用自己,终止条件是数字是个位数。
任务三
源代码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;
}
}
运行测试截图

回答问题
问题一:计算x的n次幂
问题二:是,对应的数学公式模型:

问题三:①依然正确,计算结果与原来一致;
②原写法将子问题结果存入变量t,子问题只计算一次,递归次数少;修改后连续两次调用相同子问 题,子问题重复计算,递归调用次数大幅增加,性能明显下降。
任务四
源代码task4.c
#include<stdio.h>
int classify_triangle(int a,int b,int c);
int main()
{
int a,b,c;
int ans;
while(scanf("%d%d%d",&a,&b,&c)!=EOF)
{
ans=classify_triangle(a,b,c);
switch(ans)
{
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;
}
int classify_triangle(int a,int b,int c)
{
if(a+b<=c||a+c<=b||b+c<=a)
{
return 0;
}
else
{
if(a==b&&b==c)
{
return 2;
}
else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a)
{
return 4;
}
else if(a==b||b==c||a==c)
{
return 3;
}
else
{
return 1;
}
}
}
运行测试截图

任务五
源代码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>n)
{
return 0;
}
if(m==0||n==0)
{
return 1;
}
int i;
long long a=1,b1=1,b2=1;
for(i=1;i<=n;++i)
{
a*=i;
}
for(i=1;i<=m;++i)
{
b1*=i;
}
for(i=1;i<=n-m;++i)
{
b2*=i;
}
return a/(b1*b2);
}
运行测试截图

源代码task5_2.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>n)
{
return 0;
}
if(m==0||m==n)
{
return 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 i;
if(a>b&&b>c)
{
i=c;
}
else if(a>c&&c>b)
{
i=b;
}
else
{
i=a;
}
for(;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>
// 函数声明
// 待补足
// xxx
void print_charman(int n);
int main() {
int n;
printf("Enter n: ");
scanf("%d", &n);
print_charman(n); // 函数调用
return 0;
}
// 函数print_charman定义
// 待补足
// xxx
void print_charman(int n)
{
int k, j,s;
for(k = 1; k <= n; k++)
{
for(s = 1; s <= k-1; s++)
{
printf(" ");
}
int cnt = 2*(n - k + 1) - 1;
for(j = 1; j <= cnt; j++)
{
printf(" O ");
}
printf("\n");
for(s = 1; s <= k-1; s++)
{
printf(" ");
}
for(j = 1; j <= cnt; j++)
{
printf(" <H> ");
}
printf("\n");
for( s = 1; s <= k-1; s++)
{
printf(" ");
}
for(j = 1; j <= cnt; j++)
{
printf(" I I ");
}
printf("\n");
}
}
运行测试截图



浙公网安备 33010602011771号