实验三
任务一:
源代码:
#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:功能是根据输入的成绩评相应等级;形参类型是整数,返回值类型是字符
问题2:修改代码后运行结果为:

没有了break代码跳出判断,发生穿透,一直执行ans的赋值直到ans='E'结束,不论输入多少分,评级都为E
任务二:
源代码:
#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:函数功能是求一个数每个数位上数的和
问题2:可以实现同样的输出,去别是修改后的函数运用了递归的思维
任务三:
源代码:
#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:功能是计算X的n次方的值
问题2:是递归函数,
问题3:正确,因为t*t和power()*power()等价
性能上修改后的函数有重复计算,而原写法没有;power(3,16)原写法调用5次,修改后调用31次,性能下降
任务四:
源代码:
#include<stdio.h> int main(){ int n,a,b,c; int classify_triangle(int a,int b,int c); while(scanf("%d %d %d",&a,&b,&c)!=EOF){ n = classify_triangle(a,b,c); if (n == 0) printf("不能构成三角形\n"); else if (n==1) printf("普通三角形\n"); else if (n==2) printf("等边三角形\n"); else if (n==3) printf("等腰三角形\n"); else printf("直角三角形\n"); } return 0; } int classify_triangle(int a,int b,int c){ if (a+b<=c || b+c<=a || a+c<=b) return 0; if (a == b && b == c) return 2; else if (a*a + b*b == c*c ||b*b + c*c == a*a ||a*a + c*c == b*b) return 4; else if (a==b || a==c || b==c) return 3; else return 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 N=1,M=1; int i,j; for (i=n;i>=(n-m+1);i--){ N = N*i; } for (j = 1;j<=m;j++){ M = M*j; } return N/M; }
测试截图:

递归
源代码:
#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); }
测试截图:

任务六:
源代码:
#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 && a<=c) i=a; else if (b<=a && b<=c) i=b; else i=c; for (i;;i--){ if (a%i==0 && b%i==0 && c%i==0) return i; } }
测试截图:

任务七:
源代码:
#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) { for (int k = 1;k <= n;k++) { int s = 2 * (n - k + 1) - 1; int t = k - 1; for (int m = 0;m < t;m++) { printf("\t"); } for (int i = 0;i < s;i++) { printf(" o \t"); } printf("\n"); for (int m = 0;m < t;m++) { printf("\t"); } for (int i = 0;i < s;i++) { printf("<H>\t"); } printf("\n"); for (int m = 0;m < t;m++) { printf("\t"); } for (int i = 0;i < s;i++) { printf("I I\t"); } printf("\n"); } }
测试截图:



浙公网安备 33010602011771号