实验三
实验1
-
代码
#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
功能是将100以内的整数转化为相对应的等级(A~E),形参类型是int整数型,返回值是char字符型。
-
问题2
修改后的“”是字符串常量,而char应该用‘’,是单字符类型。
修改后每个case后面没有加break,程序会一直执行,无法得到正确等级。
实验2
-
代码
#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
能实现。修改前是用while循环,从个位开始相加,然后再用n%10把十位变成个位,用n/10去掉个位,再相加,如此循环得到各个位的和。
修改后是递归方法,从高位分解,再从低位合并相加。
实验3
#include <stdio.h> 1
int classify_triangle(int a, int b, int c);
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
是递归函数
实验4
-
代码
#include <stdio.h>
#include <windows.h>
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 || a == c || b == c)
return 3;
else
return 1;
}
}
int main() {
int a, b, c;
int type;
printf("输入三角形边长:\n");
while(scanf("%d %d %d", &a, &b, &c)!=EOF) {
type = classify_triangle( a, b, c);
switch (type){
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;
}
}
system("pause");
return 0;
}
-
截图

实验5
-
迭代代码
#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<0 || m>n)
return 0;
if(m==n || m==0)
return 1;
if(m>n-m)
m=n-m;
long long up =1, down = 1;
for(int i=1; i<=m; i++){
up*=(n-i+1);
down*=i;
}
return up/down;
}
-
递归代码
#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<0 || m>n)
return 0;
if(m==n || m==0)
return 1;
else
return func(n-1, m) + func(n-1, m-1);
}
-
截图

实验6
-
代码
#include <stdio.h> 1
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 min =a;
if(b<min)
min =b;
if(c<min)
min =c;
for(int i= min; i>=1; i--){
if(a%i ==0 && b%i ==0 && c%i ==0)
return i;
}
return 1;
}
-
截图

实验7
-
代码
#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 layer = 0; layer < n; layer++) {
int group = 2*(n -layer) -1;
int indent = layer;
for (int row = 0; row < 3; row++) {
for (int i = 0; i < indent; i++)
printf("\t");
for (int i = 0; i < group; i++) {
switch (row) {
case 0: printf(" O"); break;
case 1: printf("<H>"); break;
case 2: printf("I I"); break;
}
if (i != group - 1)
printf("\t");
}
printf("\n");
}
}
}
-
截图


浙公网安备 33010602011771号