中国大学(慕课)哈工大C语言程序设计精髓练兵区第五周

这篇博客涵盖了哈工大C语言课程的多个编程练习,包括判断整数位数、奖金计算、程序修改与改错、猴子吃桃问题的扩展、密码输入检测等,旨在提升学员的C语言编程能力和问题解决技巧。

1.判断一个整型数据有几位v2.0

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

程序运行结果示例1:
Please enter the number:12226↙12226: 5 bits1: 12: 36: 1
程序运行结果示例2:
Please enter the number:-12243↙-12243: 5 bits1: 12: 23: 14: 1
输入格式: “%d”
输出格式:
输入提示信息:“Please enter the number:\n”
判断该整数共有几位:“%d: %d bits\n”
包含数字0的个数:“0: %d\n”
包含数字1的个数:“1: %d\n”
包含数字2的个数:“2: %d\n”
包含数字3的个数:“3: %d\n”
包含数字4的个数:“4: %d\n”
包含数字5的个数:“5: %d\n”
包含数字6的个数:“6: %d\n”
包含数字7的个数:“7: %d\n”
包含数字8的个数:“8: %d\n”
包含数字9的个数:“9: %d\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int i,number,x;
    int k = 0;
    int array[10] = {0};

    printf("Please enter the number:\n");
    scanf("%d",&number);
    x = fabs(number);  //这一步是给我们输入的数取绝对值
    while(x!=0)    //这里的while是计算number的位数
    {
        for(i=0;i<=9;i++)   //通过for循环来计算每位数字出现的次数
        {
            if(x%10==i){
                array[i]++;
            }
        }
        x/=10;  //把for计数完成的位数去掉
        k++;
    }
    printf("%d: %d bits\n",number,k);
    for(i=0;i<=9;i++)   //循环输出
    {
        if(array[i]!=0)
        {
            printf("包含数字%d的个数:",i);
            printf("%d: %d\n",i,array[i]);
        }
    }

    return 0;
}

此处要说明一点,最后因为图省事用了一个for循环来输出。这是不符合题目要求的 ,朋友们可自行更改为switch来输出答案。

ps:使用一个for循环也可以对数组进行初始化为 0 。而像上面一样将第一位赋值为 0 编译器也会自动帮你把其他的值也初始化为零。

2奖金计算

题目内容:
企业发放的奖金根据利润提成。利润低于或等于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,求应发放奖金总数?

程序运行结果示例1:
789↙
bonus=78
程序运行结果示例2:
789516↙
bonus=36342
输入格式: “%ld”
输出格式:“bonus=%ld\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

#include<stdio.h>
  int main()
  {
    long x;
    double bonus=0;
    scanf("%ld",&x);
    if(x>1000000){
        bonus=bonus+(x-1000000)*0.01;
    }
    if(x>600000){
        x=x>1000000?1000000:x;
        bonus=bonus+(x-600000)*0.015;
    }
    if(x>400000){
        x=x>600000?600000:x;
        bonus=bonus+(x-400000)*0.03;
    }
    if(x>200000){
        x=x>400000?400000:x;
        bonus=bonus+(x-200000)*0.05;
    }
    if(x>100000){
        x=x>200000?200000:x;
        bonus=bonus+(x-100000)*0.075;
    }
    if(x>0){
        x=x>100000?100000:x;
        bonus=bonus+x*0.1;

    }
    printf("bonus=%ld\n",(long)bonus);
    return 0;
}

注意这里的奖金是分阶段计算的,所以要全部使用if条件语句。

3程序修改—1

题目内容:
修改下面这个程序使其快速计算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;
  }

程序运行结果示例1:
5↙
sum = 15
程序运行结果示例2:
6↙
sum = 21
输入格式: “%d”
输出格式: “sum = %d” (注意:等号两侧各有一个空格)
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

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

if条件语句的作用是区分偶数个数字求和与奇数个数字求和
比如:1 2 3 4 5 6 7 8 9 10 11 到最后为6+6 显然是不符合题意的

4程序修改—2

题目内容:
修改下面这个用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;
  }

程序运行结果示例:
Input m:
1↙
sum = 1
Input m:
2↙
sum = 3
Input m:
3↙
sum = 6
Input m:
4↙
sum = 10
Input m:
0↙
输入格式:“%d”
输出格式:
输入提示: “Input m:\n”
输出累加和: “sum = %d\n”(注意:等号两侧各有一个空格)
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

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

题目是想实现 while(m!=0) 时 如果从键盘输入 0 也可以输出数字 0

5程序改错-1

题目内容:
我国古代的《张丘建算经》中有这样一道著名的百鸡问题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”其意为:公鸡每只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;
  }

程序目前的运行结果:
x=0, y=25, z=75
x=3, y=20, z=77
x=4, y=18, z=78
x=7, y=13, z=80
x=8, y=11, z=81
x=11, y=6, z=83
x=12, y=4, z=84
程序正确的运行结果:
x=0, y=25, z=75
x=4, y=18, z=78
x=8, y=11, z=81
x=12, y=4, z=84
输入格式: 无
输出格式:
"x=%d, y=%d, z=%d\n
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

#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&&z%3==0){
                printf("x=%d, y=%d, z=%d\n", x, y, z);
            }
         }
      }
          return 0;
}

6程序改错-2

题目内容:
从键盘任意输入一个正整数,编程判断它是否是素数,若是素数,输出“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;
  }

程序的运行结果示例1:
Input n:
-3↙
No!
程序的运行结果示例2:
Input n:
0↙
No!
程序的运行结果示例3:
Input n:
1↙
No!
程序的运行结果示例4:
Input n:
6↙
No!
程序的运行结果示例5:
Input n:
7↙
Yes!
输入格式: “%d”
输出格式:
输入提示信息: “Input n:\n”
是素数: “Yes!\n”
不是素数: “No!\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。

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

7程序改错-3

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

#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;
  }

输入格式: “%d,%d”

输出格式:

输入提示信息:“Input x1, x2:\n”

输出: “x1=%d,x2=%d\n”

#include <stdio.h>
int main()
{
    int x1, x2, n, i;
    do
    {
        i = 0;
        printf("Input x1, x2:\n");
        n = scanf("%d,%d", &x1, &x2);
        switch (n)
        {
        case 0:
            while (getchar() != '\n');  //把缓冲区中所有东西都读掉,直到读到输入的最后一个换行符后继续执行下一行语句。
            i = 1;
            break;
        case 1:
            while (getchar() != '\n');  //同上
            i = 1;
            break;
        default:
            if (x1 * x2 >= 0){
                i = 1;
                }
            else
                i = 0;
            break;
        }
    } while (i == 1);{
    printf("x1=%d,x2=%d\n", x1, x2);
    }
    return 0;
}
while (getchar() != '\n');  //这一步是非常重要的,如果没有这个getchar()会让程序陷入死循环中,感兴趣的朋友可以注释掉单步调试一下,就很清楚了。

8猴子吃桃程序_扩展1

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

程序的运行结果示例1:
Input days:
5↙
x=46
程序的运行结果示例2:
Input days:
10↙
x=1534

#include<stdio.h>
int main(){
    int n,x=1;
    printf("Input days:\n");
    scanf("%d",&n);
    for(int i=1;i<n;i++)
        x=(x+1)*2;
    printf("x=%d\n",x);
    return 0;
}

9猴子吃桃程序_扩展2

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

#include<stdio.h>
int main(){
    int n,x=1,k=1;
    do{
        if(k!=1){
            while(getchar()!='\n');
        }
        else 
        k=0;
        printf("Input days:\n");
        scanf("%d",&n);
    }while(n<=0);
    for(int i=1;i<n;i++){
        x=(x+1)*2;
        }
    printf("x=%d\n",x);
    return 0;
}

添加了一个 do while 循环和变量 k 来控制输入数据的合法性。

106位密码输入检测

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

#include<stdio.h>
int main() {
    char i, k = 6;
    printf("Input your password:\n");
    while (k!=0) {
        scanf(" %c", &i);  //注意%c前的空格
        if (i <= '9' && i >= '0') {
            k--;
            printf("%c, you have enter %d-bits number\n", i, 6 - k);
        }
        else {
            printf("error\n");
        }
    }
    return 0;
}

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

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

#include<stdio.h>
#include<math.h>
int main()
{
    int n,m;
    int i = 0;
    printf("Please enter the number:\n");
    scanf("%d",&n);
    m = abs(n);
    while(m!=0)
    {
       m = m/10;
       i++;
    }
    printf("%d: %d bits\n",n,i);
    return 0;
}

12检测输入数据中奇数和偶数的个数

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

#include<stdio.h>
int main()
{
	int i,a=0,b=0;
	printf("Please enter the number:\n");
		do
		{
			scanf("%d", &i);
			if (i == -1)
			{
				if (a == 0||b == 0)
				{
					printf("over!\n");
				}
				else {
					break;
				}
			}
			else if (i == 1)
			{
				printf("%d:odd\n", i);
				a++;
			}
			else if (i % 2 == 0)
			{
				printf("%d:even\n", i);
				b++;
			}
			else
			{
				printf("%d:odd\n", i);
				a++;
			}
		} while (i != -1);
	
	printf("The total number of odd is %d\n", a);
	printf("The total number of even is %d\n", b);

	return 0;

}

13计算球的反弹高度

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

#include<stdio.h>
#include<math.h>
int main()
{
    int n, k = 1;
    float sum = 0, hight = 0;
    printf("Input:\n");
    scanf("%d", &n);  
    while (k <= n)
    {
        if (k == 1) {
            sum += 100;
        }           
        else {
            sum += 2 * 100 * pow(0.5, k - 1);
        }
        k++;
    }
    hight = 100 * pow(0.5, n);
    printf("%d times:\n", n);
    printf("%.3f\n", sum);
    printf("%.3f\n", hight);
    return 0;
}

pow(x,y) 其作用是计算x的y次方(不要忘记添加头文件 #include<math.h>)

*写的比较匆忙,如有错误还请各位朋友及时指正。(●’◡’●)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值