实验3
实验三
实验任务1
-
task1.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;
}

-
回答问题:
-
问题1:
①功能是传入参数并输出相对应的等级
②形参类型为整数形,返回值是字符类型
-
问题2:
①返回值为char,此处双引号是字符串类型,会导致返回类型错误
②每个case没有break,会导致穿透,当满足一个条件后下面的条件也会一直执行到break(实际并没有)结束
实验任务2
-
回答问题:
-
问题1:
功能是将输入数字的所有位加起来求和
-
问题2:
①能实现
②第一种是迭代思想,第二种是递归思想
实验任务3
-
问题1:
功能是实现一个数的n次方计算
-
问题2:
①是递归
②
\[power(x, n) =
\begin{cases}
1, & n = 0 \quad \\
x \cdot power(x, n - 1), & n \text{ 为奇数} \\
[power(x, n/2)]^2, & n \text{ 为偶数}
\end{cases}
\]
-
问题3::
①正确,此处仅把t还原为表达式
②修改后的性能不如修改前,原来的写法是把值赋予到t中再求t的平方,仅计算了一次,修改后的写法要把每个值都重复计算一遍,每一步比之前步数都多
例如:
原写法power(3,16)调用1次→power(3,8)调用一次→power(3,4)调用一次→power(3,2)调用一次→power(3,1)调用一次→power(3,0),一共调用6次
新写法power(3,16)调用1次产生俩个power(3,8),然后每个power(3,8)又产生俩个power(3,4),以此类推最后调用了1+2+4+8+16+16=47次
实验任务4
-
task4.c源代码及运行截图
#include <stdio.h>
int classify_triangle(int a, int b, int c);
int main() {
int a, b, c;
while (scanf("%d %d %d", &a, &b, &c) != EOF) {
int result = classify_triangle(a, b, c);
switch (result) {
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;
}
if (a == b && b == c) {
return 2;
}
if (a == b || a == c || b == c) {
return 3;
}
if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
return 4;
}
return 1;
}

实验任务5
-
task5.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==m){
return 1;
}
int i,a=1,b=1,c=1;
for(i=1;i<=n;i++){
a=a*i;
}
for(i=1;i<=m;i++){
b=b*i;
}
for(i=1;i<=(n-m);i++){
c=c*i;
}
return a/(b*c);
}

-
task5.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);
}

实验任务6
-
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 test[] = {a,b,c};
int min=a,i;
for(i=0;i<3;i++){
if(test[i]<min){
min = test[i];
}
}
for(i=min;i>0;i--){
if(a%i==0&&b%i==0&&c%i==0){
return i;
}
}
return 1;
}

实验任务7
-
task7.c源代码及截图
#include <stdio.h>
#include <stdlib.h>
int print_charman(int n);
int none(int n);
int main() {
int n;
printf("Enter n: ");
scanf("%d", &n);
print_charman(n); // 函数调用
return 0;
}
int print_charman(int n){
int i,j,m;
m=n;
for(j=1;j<=n;j++){
none(j);
for(i=2*m-1;i>0;i--){
printf(" O\t");
}
printf("\n");
none(j);
for(i=2*m-1;i>0;i--){
printf("<H>\t");
}
printf("\n");
none(j);
for(i=2*m-1;i>0;i--){
printf("I I\t");
}
printf("\n");
m--;
}
}
int none(int n){
int i;
for(i=0;i<n-1;i++){
printf("\t");
}
}

实验总结
通过测试和编写程序,我意识到了函数在程序中的作用,让代码可读性更强,让代码修复起来更加的容易

浙公网安备 33010602011771号