C语言程序与设计第四版课后习题 - 第五章(二)

5.5 弹弹弹

题目概述:

1个球从 100m 高度自由落下,每次落地后反跳回原高度的一半,再落下,再反弹,求它在第 10 次落地时,共经过了多少米?第 10 次反弹多高?

题目思路:
  • 根据题意划出图解
    在这里插入图片描述

    • ps:具体小球是怎么样下落反弹的请自行想象,本题只是做一个拆解,不代表他就是这样下落的。
  • 本题需要注意,一个球一直跳回原高度的一半,肯定会出现小数,所以要用浮点型来进行计算

  • 然后我们循环进行每次小球的距离即可

    • 计算小球从高处下落到地上的距离
    • 然后在计算反弹的距离
    • 然后再把下落和反弹的距离加上,就是本次小球经过的米数
代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	double high = 100.0;
	double meter = 0.0;
	int i = 0;

	for (i = 1; i <= 10; i++)
	{
		meter += high;		//小球从高处下落到地上的距离
		high /= 2;			//小球从地上反弹的距离
		meter += high;		//小球从该次从高处下落+地上到从地上反弹的距离
	}

	meter -= high;			//减去反弹的距离,就是题目第十次到地上的距离

	printf("high is : %lf\n", high);
	printf("meter is : %lf\n", meter);


	return 0;
}

运行结果如下:
在这里插入图片描述

  • 本题需要注意读题的细节,题目问的是第10次落地时,共经过了多少米,而没有说第十次反弹经过了多少米,所以我们在计算完之后要记得减去第10次反弹的高度

5.6 输出菱形图案

题目概述:

输出一下图案
在这里插入图片描述

题目思路:

本题我们可以做一个通用的打印菱形
我们把菱形分成这样
在这里插入图片描述

然后分成上半和下半,开始找规律

先看上半
在这里插入图片描述

i空格数量星号
031
123
215
307
推出公式line - 1 - i2 * i + 1
  • line表示多少行。

得出上半部分代码

	for (i = 0; i < line; i++)
	{
		for (j = 0; j < (line - 1 - i); j++)
		{
			printf(" ");
		}
		
		for (j = 0; j < (2 * i + 1); j++)
		{
			printf("*");
		}
		printf("\n");
	}

运行结果如下:
在这里插入图片描述

再看下半
在这里插入图片描述

i空格数量星号
015
123
231
推出公式i + 12*(line-1-i)-1

得出下半部分代码:

	for (i = 0; i < (line - 1); i++)
	{
		for (j = 0; j < (i + 1); j++)
		{
			printf(" ");
		}
		for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}

运行结果如下:
在这里插入图片描述

然后分别打印出上下半即可。

代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0;
	int line = 0;
	int j = 0;

	scanf("%d", &line);

	for (i = 0; i < line; i++)
	{
		for (j = 0; j < (line - 1 - i); j++)
		{
			printf(" ");
		}
		
		for (j = 0; j < (2 * i + 1); j++)
		{
			printf("*");
		}
		printf("\n");
	}

	for (i = 0; i < (line - 1); i++)
	{
		for (j = 0; j < (i + 1); j++)
		{
			printf(" ");
		}
		for (j = 0; j < 2 * (line - 1 - i) - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}



	return 0;
}

运行结果如下:
在这里插入图片描述

  • 以上是通用输入菱形,对于本题来说,输入4行,那么就能打印出本题要求的菱形。
  • 如果不需要输入直接打印,那么上半有4行,我们把line=4,代入本题条件即可,具体如下。
本题代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int i = 0;
	int line = 0;
	int j = 0;


	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < (3 - i); j++)
		{
			printf(" ");
		}
		
		for (j = 0; j < (2 * i + 1); j++)
		{
			printf("*");
		}
		printf("\n");
	}

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < (i + 1); j++)
		{
			printf(" ");
		}
		for (j = 0; j < 2 * (3 - i) - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}

	return 0;
}
  • 只需要修改一下循环条件即可完成本题。

5.7 找球手

题目概述:

两个乒乓球队进行比赛,各出3 人。甲队为 A、B、C 3 人,乙队为 X、Y、Z 3 人。已抽签决定比赛名单。有人向队员打听比赛的名单,A 说他不和 X 比,C 说他不和 X、Z 比,请编写程序找出 3 对赛手的名单。

题目思路:
  • 由题意得,画图得出以下关系
    在这里插入图片描述

  • 然后我们还得知道,由于这个比赛都是1v1,不可能出现A又要打X又要打Y的情况,所以还得出了一个条件是
    A != B && A!=C && B!=C

  • 用A、B、C一一列举对手,直到满足判断条件为止即可。

代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int A = '0';	
	int B = '0';
	int C = '0';
	
	//整型和字符型是可以相互转换的,所以int和char皆可。这里用int,因为要用来执行判断条件
	for (A = 'X'; A <= 'Z'; A++)
	{
		for (B = 'X'; B <= 'Z'; B++)
		{
			for (C = 'X'; C <= 'Z'; C++)
			{
				if (A != B && A != C && B != C && A != 'X' && C != 'X' && C != 'Z')
				{
					printf("A VS %c\n", A);
					printf("B VS %c\n", B);
					printf("C VS %c\n", C);
				}
			}
		}
	}


	return 0;
}

运行结果如下:
在这里插入图片描述

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值