实验三
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_garde功能:根据分数整除10后的结果,判断成绩的等第;
- 形参类型:整型int;
- 返回值类型:字符型char
问题2:
- 没有break,情况符合时,执行完程序,并不会跳出switch,而继续执行,导致ans的值一直为“E”
- “A”等为字符串,而ans为字符型,不能进行赋值
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功能:计算整数各个位上的数字的和
问题2:
能
- 方案一:迭代,一次次求出余数,再累加
- 方案二:递归,函数不断递归调用自己,直到递归出口
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:
- 是

问题3:
- ①:正确,因为先算出power(x,n/2),再平方,与直接调用两次power(x,n/2)结果一样
- ②:从性能角度分析,方案一更好。方案一,子问题只调用一次,power(3,16)调用5次。方案二:子问题重复调用,power(3,16)调用31次
task4
源代码
点击查看代码
#include <stdio.h>
int classify_triangle(int a,int b,int c);
int main(){
int a,b,c,t;
while(scanf("%d%d%d",&a,&b,&c)!=EOF){
t = classify_triangle(a,b,c);
switch(t){
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;
default :break;
}
}
return 0;
}
int 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;
}
}

task5
task5_1
源代码
点击查看代码
#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){
int t=1,i,j;
for(i=1;i<=m;++i){
t = t*n;
n -= 1;
}
for(i=1;i<=m;++i){
t = t / i;
}
return t;
}

task5_2
源代码
点击查看代码
#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(n==m||m==0){
return 1;
}
return func(n-1,m) + func(n-1,m-1);
}

task6
源代码
点击查看代码
#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 = a,j;
if(a>b){
i = b;
}
if(i>c)
i = c;
for(j=i;j>=1;--j){
if(a%j==0&&b%j==0&&c%j==0){
return j;
}
}
}

task7
源代码
点击查看代码
#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,t,j,k;
for(i=n;i>=1;--i){
t = 2*i - 1;
for(k=1;k<=(n-i);++k){
printf("\t");
}
for(j=1;j<=t;++j){
printf(" o\t");
}
printf("\n");
for(k=1;k<=(n-i);++k){
printf("\t");
}
for(j=1;j<=t;++j){
printf("<H>\t");
}
printf("\n");
for(k=1;k<=(n-i);++k){
printf("\t");
}
for(j=1;j<=t;++j){
printf("I I\t");
}
printf("\n\n");
}
}


浙公网安备 33010602011771号