实验3
任务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:根据分数打等第,形参是int,返回值是char;
问题2:首先应该用‘A‘ 而不是“A”,其次缺少break不会主动跳出程序,导致ans被其他值覆盖;
任务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:计算n所有位数的和
问题2:可以,原本的是迭代,修改的是递归
任务3
截图

代码
#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次方;
问题2:是

问题三,算法逻辑仍然正常,因为只是将t等于X的N/2次方带进去
原写法性能更好,原写法调用6次,改后调用63次
任务4
截图

代码
#include <stdio.h>
int classify_triangle(int a, int b, int c);
int main(){
int a,b,c;
int t;
while (scanf("%d %d %d",&a,&b,&c) == 3)
{
t = classify_triangle(a,b,c);
switch (t)
{
case 1: printf("普通三角形\n"); break;
case 2: printf("等边三角形\n"); break;
case 3: printf("等腰三角形\n"); break;
case 4: printf("直角三角形\n"); break;
default:printf("不能构成\n"); break;
}
}
return 0;
}
int classify_triangle(int a, int b, int c)
{
if (a + b > c &&
a + c > b &&
b + c > a)
{
if (a == b && b == c)
return 2;
else if (a == b || b == c || a == c)
return 3;
else if (a*a+b*b==c*c ||
a*a+c*c==b*b ||
b*b+c*c==a*a)
return 4;
else {return 1;}
}
else{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(n<m)
{
return 0;
}
else if(n == m || m == 0)
{
return 1;
}
else
{
int i,sum1=1,sum2=1;
for(i=n;i>=m;i--)
{
sum1 =sum1 * i;
}
for ( i = 1; i <= m; i++)
{
sum2 = sum2 * i;
}
int ans = sum1 / sum2;
return ans;
}
}
递归法
截图

代码
#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(n<m)
{
return 0;
}
else if(n == m || m == 0)
{
return 1;
}
else
{
return func(n-1,m)+func(n-1,m-1);
}
}
任务6
截图

代码
#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 min,i;
min = a;
if (min>b)
{
min = b;
}
if (min > c)
{
min = c;
}
for(i = min; i>0; 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(void)
{
int n;
printf("Enter n: ");
scanf("%d", &n);
print_charman(n);
return 0;
}
void print_charman(int n)
{
for (int r = 0; r < n; r++)
{
int count = 2 * (n - r) - 1;
for (int s = 0; s < r; s++)
{
putchar('\t');
}
for (int k = 0; k < count; k++)
{
printf(" O");
if (k < count - 1)
{
putchar('\t');
}
}
putchar('\n');
for (int s = 0; s < r; s++)
{
putchar('\t');
}
for (int k = 0; k < count; k++)
{
printf("<H>");
if (k < count - 1)
{
putchar('\t');
}
}
putchar('\n');
for (int s = 0; s < r; s++)
{
putchar('\t');
}
for (int k = 0; k < count; k++)
{
printf("I I");
if (k < count - 1)
{
putchar('\t');
}
}
putchar('\n');
if (r < n - 1)
{
putchar('\n');
}
}
}

浙公网安备 33010602011771号