实验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:函数score_to_grade的功能是什么?形参类型,返回值和类型是什么?

答:将得分按>=90为A,>=80为B,>=70为C,>=60为D,<60为E进行转化;形参类型为int, 返回值类型为char。

问题2:如果line21-28以下形式,代码存在哪些问题?请逐一指出。

答:每个case执行后没有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:函数sum_digits的功能是什么?

答:求正整数n各位数值之和。

如果保持main代码和函数sum_digits声明不变,把函数sum_digits定义成如下实现方式,能实现同等的效果吗?

如果不能实现同等效果,分析原因。

如果能实现同等效果,说明两种实现方式背后的算法思维区别。

答:可以实现同等效果。上图代码用递归调用函数sum_digits,以n<10为出口,求得每位数字,并求和。

 

 

实验任务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;
    }
}

 

运行结果:

 

 问题1:函数power的功能是什么?

答:计算x的n次幂。

问题2:函数power是递归函数吗?如果是,找出递归模式,写出这个递归模式对应的数学公式模型。

是。

 

实验任务4

代码:

#include <stdio.h>

int is_prime(int n);
int main()
 {
    int i, n, x, count;
    printf("100以内的孪生素数:\n");

    for(count=0, i=2, n=100;i+2<n; ++i)
    {
        x=i+2;
        if( is_prime(i)==1 && is_prime(x)==1)
            {
                printf("%d,%d\n", i,x);
                count+=1;
            }
    }
    printf("100以内的孪生素数共有%d个", count);
    return 0;
 }
int is_prime(int n)
{

        int a=2, b=0;
        for(; a<n; ++a)
        {
            b = n%a;
            if(b==0)
                break;

        }
        if(b==0)
            return 0;
        else
            return 1;

}

 

运行结果:

 实验任务5

代码:

 

#include <stdio.h>

int hanoi(unsigned int n, char from, char temp, char to);
void moveplate(unsigned int n, char from, char to);

int main()
{
    unsigned int n;
    while(scanf("%u", &n) != EOF)
    {
        int count = hanoi(n, 'A', 'B', 'C');
        printf("一共移动了%d次\n\n", count);
    }
    return 0;
}

int hanoi(unsigned int n, char from, char temp, char to)
{
    int count = 0;

    if(n == 1)
    {
        moveplate(n, from, to);
        count++;
    }
    else
    {
        count += hanoi(n-1, from, to, temp);
        moveplate(n, from, to);
        count++;
        count += hanoi(n-1, temp, from, to);
    }
    return count;
}

void moveplate(unsigned int n, char from, char to)
{
    printf("%u: %c --> %c\n", n, from, to);
}

 

运行结果:

 

 

实验任务6

代码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 z, i;
  double t;
  if(n>=m)
  {
  if(m==0)
  return 1;
  else
  {
  for(i=1, z=1, t=n-1; i<=m; ++i,--t)
  {
  z*=t/i;//此处应注意避免整数除法取整,造成计算错误
}
  return z+func(n-1, m-1);
  }
}
  else
  return 0;

}

 

代码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)
{
    int z, i;
    if(n>=m)
    {
        if(m==0)
            return 1;
        else
            return +func(n-1,m)+func(n-1, m-1);
        
    }
    else
        return 0;

}

 

运行结果:

 实验任务7

代码:

#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;
    if(i>b)
        i=b;
    if(i>c)
        i=c;
    for(;i>1;--i)
    {
        if( a%i==0 && b%i==0 && c%i==0)
            break;
    }
    return i;

}

 

运行结果:

 

posted @ 2025-04-06 16:27  By_Harry  阅读(16)  评论(0)    收藏  举报