MOOC哈工大2020C语言程序设计精髓练兵区编程题第五周

1 判断一个整型数据有几位v2.0(4分)

题目内容:

从键盘输入一个整型数据(int型),编写程序判断该整数共有几位,并输出包含各个数字的个数。例如,从键盘输入整数16644,该整数共有5位,其中有1个1,2个6,2个4。

int main(){
    int n,m,count = 0,i;
    int a[10]={0};
    printf("Please enter the number:\n");
    scanf("%d",&n);
    m = n>0?n:-n;
    while(m!=0)
    {
        a[m%10]++;
        m = m/10;
        count++;
    }
    printf("%d: %d bits\n",n,count);
    for(i = 0;i <10;i++)
    {
        if(a[i]!=0)printf("%d: %d\n",i,a[i]);
    }
   return 0;
}

2 奖金计算(6分)

题目内容:

企业发放的奖金根据利润提成。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时,高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润i,求应发放奖金总数?

int main(){
    long int profit,bonus;
    scanf("%ld",&profit);
    if(profit > 0 && profit <= 100000){
        bonus = profit * 0.1;
    } else if(profit < 200000){
        bonus = (profit - 100000) * 0.075 + (100000 * 0.1);
    } else if(profit < 400000){
        bonus = (profit - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    } else if(profit < 600000){
        bonus = (profit - 400000) * 0.03 + (400000 - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    } else if(profit < 1000000){
        bonus = (profit - 600000) * 0.015 + (600000 - 400000) * 0.03 + (400000 - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    } else{
        bonus = (profit - 1000000) * 0.01 + (1000000 - 600000) * 0.015 + (600000 - 400000) * 0.03 + (400000 - 200000) * 0.05 + (200000 - 100000) * 0.075 + (100000 * 0.1);
    }
    printf("bonus=%ld\n",bonus);
    return 0;
}

3 程序修改—1(4分)

题目内容:

修改下面这个程序使其快速计算1+2+3……+n的值,n从键盘输入。并按照下面给出的运行示例检查程序。

#include  <stdio.h>
  int main()
  { 
    int i, j, sum = 0, n=100; 
    for (i=1,j=n; i<=j; i++,j--) 
    {
        sum = sum + i + j;
    }
    printf("sum = %d", sum);
    return 0;
  }

思路:源程序多加了一次中间数,减掉就行

#include  <stdio.h>
  int main()
  {
    int i, j, n ,sum = 0;
    scanf(" %d",&n);
    for (i=1,j=n; i<=j; i++,j--)
    {
        sum = sum + i + j;
            if(i==j){
                //减j减i都行
                sum=sum-i;
              }
    }
    printf("sum = %d", sum);
    return 0;
  }

重写实现功能也行

int main()
{
    int sum = 0, n;
    scanf("%d",&n);
    for (int i = 1; i <= n; ++i) {
        sum += i;
    }
    printf("sum = %d", sum);
    return 0;
}

4 程序修改—2(4分)

题目内容:

修改下面这个用do-while语句实现的程序,改用while语句实现,并对比其优缺点。

#include  <stdio.h>
  int main()
  { 
      int sum = 0, m;
      do{
          printf("Input m:\n");
          scanf("%d", &m);
          sum = sum + m;
          printf("sum = %d\n", sum);
      }while (m != 0);
      return 0;
  }

修改后

int main()
{
    int sum = 0, m = 1;
    while (m != 0){
        printf("Input m:\n");
        scanf("%d", &m);
        //等于0要立即退出,不然会出现结果错误
        if(m == 0) break;
        sum = sum + m;
        printf("sum = %d\n", sum);
    }
    return 0;
}

5 程序改错-1(4分)

题目内容:

我国古代的《张丘建算经》中有这样一道著名的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:公鸡每只5元,母鸡每只3元,小鸡3只1元。用100元买100只鸡,问公鸡、母鸡和小鸡各能买多少只?目前程序运行结果有误,请问为什么会比正确答案多出三个解?不仅要找出错误和修正错误,还要求利用以前学过的知识分析错误的原因。

#include <stdio.h>
  int main()
  {
      int x, y, z;
      for (x=0; x<=20; x++)
      {
          for (y=0; y<=33; y++)
          {
              z = 100 - x - y;
              if (5*x + 3*y + z/3 == 100)
              {
                  printf("x=%d, y=%d, z=%d\n", x, y, z);
              }
          }
      }
      return 0;
  }

修改后

int main()
{
    int x, y, z;
    for (x=0; x<=20; x++)
    {
        for (y=0; y<=33; y++)
        {
            z = 100 - x - y;
            //整数修改成浮点数,原因是整数类型除法会舍弃小数部分
            if (5*x + 3*y + z/3.0 == 100)
            {
                printf("x=%d, y=%d, z=%d\n", x, y, z);
            }
        }
    }
    return 0;
}

6 程序改错-2(5分)

题目内容:

从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“Yes!”,否则输出“No!”。已知负数、0和1都不是素数。请找出下面程序的错误并改正之,同时按照给出的运行示例检查修改后的程序。

#include <stdio.h>
   #include <math.h>
   int main()
   {
     int n, i;
     printf("Input n:\n");
     scanf("%d", &n);
     for (i=2; i<=sqrt(n); i++)
     {
       if (n % i = 0)
       {
         printf("No!\n");
       }
    }
    printf("Yes!\n");
    return 0;
  }

修改后

int main()
{
    int n, i,flag;
    printf("Input n:\n");
    scanf("%d", &n);
    if(n <= 1){
        printf("No!\n");
    } else {
        for (i=2; i<=sqrt(n);i++) {
            if (n % i == 0) {
                flag = 0;
            } else {
                flag = 1;
            }
        }
        if(flag == 1){
            printf("Yes!\n");
        } else{
            printf("No!\n");
        }
    }
    return 0;
}

7 程序改错-3(4分)

题目内容:

从键盘任意输入两个符号各异的整数,直到输入的两个整数满足要求为止,然后打印这两个数。请通过测试找出下面这个程序存在的问题(不止一个问题哦),并改正。同时用下面给出的运行结果示例检查修改后的程序。

#include <stdio.h>
  int main()
  {
    int x1, x2;
    do{
      printf("Input x1, x2:");
      scanf("%d,%d", &x1, &x2);
    }while (x1 * x2 > 0);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
  }

修改后

int main()
{
    int x1, x2,n,flag = 0;
    do{
        printf("Input x1, x2:\n");
        n = scanf("%d,%d", &x1, &x2);
        if(n == 2){
            if(x1 * x2 >= 0){
                flag = 1;
            } else{
                flag = 0;
            }
        } else{
            while(getchar() != '\n');
            flag = 1;
        }
    }while (flag);
    printf("x1=%d,x2=%d\n", x1, x2);
    return 0;
}

8 猴子吃桃程序_扩展1(4分)

题目内容:

猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。

int main(){
    int day,peach=1;
    printf("Input days:\n");
    scanf("%d",&day);
    for (int i = 1; i < day; ++i) {
        peach =  2 * (peach + 1);
    }
    printf("x=%d\n",peach);
    return 0;
}

9 猴子吃桃程序_扩展2(4分)

题目内容:

猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。同时还要增加对用户输入数据的合法性验证(如:不允许输入的天数是0和负数)

int main(){
    int day,peach=1,n;
    do{
        printf("Input days:\n");
        n = scanf("%d",&day);
        if(n == 1 && day > 0) {
            for (int i = 1; i < day; ++i) {
                peach = 2 * (peach + 1);
            }
            printf("x=%d\n", peach);
        } else{
            getchar();
        }

    }while (n == 0 || day <= 0);
    return 0;
}

10 6位密码输入检测(4分)

题目内容:

从键盘输入6位数字0~9组成的密码。用户每输入一个密码并按回车键后,程序给出判断:如果是数字,则原样输出该数字,并提示用户目前已经输入了几位密码,同时继续输入下一位密码;否则,程序提示"error",并让用户继续输入下一位密码。直到用户输入的密码全部是数字为止。

int main(){
    char c;
    int count = 0;
    printf("Input your password:\n");
    while (1){
        if(count == 6) break;
        scanf(" %c",&c);
        if(c >= '0' && c <= '9'){
            printf("%c, you have enter %d-bits number\n",c,count + 1);
            count++;
        } else{
            printf("error\n");
        }

    }
    return 0;
}

11 判断一个整型数据有几位v1.0(4分)

题目内容:

从键盘输入一个整型数据(int型),编写程序判断该整数共有几位。例如,从键盘输入整数16644,该整数共有5位。

int main() {
    int x,temp,count = 0;
    printf("Please enter the number:\n");
    scanf("%d", &x);
    temp = fabs(x);
    while (1){
        temp = temp /10;
        count ++;
        if(temp == 0){
            break;
        }
    }
    printf("%d: %d bits\n", x, count);
}

12 检测输入数据中奇数和偶数的个数(4分)

题目内容:

从键盘输入一系列正整数,输入-1表示输入结束(-1本身不是输入的数据)。编写程序判断输入数据中奇数偶数个数。如果用户输入的第一个数据就是-1,则程序输出"over!"。否则。用户每输入一个数据,输出该数据是奇数还是偶数,直到用户输入-1为止,分别统计用户输入数据中奇数和偶数的个数。

int main(){
    int num,odd_total = 0,even_total = 0;
    printf("Please enter the number:\n");
    while(1) {
        scanf("%d", &num);
        if (num == -1) {
            if(odd_total == 0 && even_total == 0){
                printf("over!\n");
            }
            printf("The total number of odd is %d\n",odd_total);
            printf("The total number of even is %d\n",even_total);
            break;
        } else if(num % 2 == 0){
            even_total++;
            printf("%d:even\n",num);
        } else{
            odd_total++;
            printf("%d:odd\n",num);
        }
    }

    return 0;
}

13 计算球的反弹高度(4分)

题目内容:

一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下并反弹......,求它在第5次10次落地时,分别共经过了多少米第5次第10次反弹分别是多高?要求计算结果保留到小数点后3位。用户从键盘输入想要计算的第n次(n<=15)。程序中所有浮点数的数据类型均为float。

int main(){
    int n;
    float m = 100,sum = 0;
    printf("Input:\n");
    scanf("%d",&n);
    if(n > 0 && n <=15){
        for (int i = 1; i <= n; ++i) {
            sum = sum +  m;
            m = m / 2;
        }
        printf("%d times:\n",n);
        printf("%.3f\n",sum * 2 - 100);
        printf("%.3f\n",m);
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值