明解C语言中级篇练习代码------第三章

本文详细解析了C语言中级篇第三章的多个练习,包括练习3-1到练习3-8,涵盖了该章节的重点和难点,旨在帮助读者巩固和深化C语言的知识。
摘要由CSDN通过智能技术生成

练习3-1

//编写一个程序,把List 3-9程序中的函数count_no和disp_result整合成一个函数,然后讨论更改前和更改后的程序。

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

int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */

char *hd[] = {
   "石头", "剪刀", "布"};		/* 手势 */

/*--- 初始处理 ---*/
void initialize(void)
{
   
	win_no  = 0;		/* 胜利次数 */
	lose_no = 0;		/* 失败次数 */
	draw_no = 0;		/* 平局次数 */

	srand(time(NULL));	/* 设定随机数种子 */

	printf("猜拳游戏开始!!\n");
}

/*--- 运行猜拳游戏(读取/生成手势)---*/
void jyanken(void)
{
   
	int i;

	comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/

	do {
   
		printf("\n\a石头剪刀布 ···");
		for (i = 0; i < 3; i++)
			printf(" (%d)%s", i, hd[i]);
		printf(":");
		scanf("%d", &human);		/* 读取玩家的手势 */
	} while (human < 0 || human > 2);
}

/*--- 更新胜利/失败/平局次数 并显示结果---*/
void count_no_result(int result)
{
   
	switch (result) {
   
	 case 0: draw_no++;	 puts("平局。");   break;						/* 平局 */
	 case 1: lose_no++;	 puts("你输了。");  break;						/* 失败 */
	 case 2: win_no++;   puts("你赢了。");  break;						/* 胜利 */
	}
}

/*--- 确认是否再次挑战 ---*/
int confirm_retry(void)
{
   
	int x;

	printf("再来一次吗···(0)否 (1)是:");
	scanf("%d", &x);

	return x;
}

int main(void)
{
   
	int judge;				/* 胜负 */
	int retry;				/* 再来一次?*/

	initialize();						/* 初始处理 */

	do {
   
		jyanken();						/* 运行猜拳游戏 */

		/* 显示计算机和玩家的手势 */
		printf("我出%s,你出%s。\n", hd[comp], hd[human]);

		judge = (human - comp + 3) % 3;	/* 判断胜负 */

		count_no_result(judge);

		retry = confirm_retry();		/* 确认是否再次挑战 */

	} while (retry == 1);

	printf("%d胜%d负%d平。\n", win_no, lose_no, draw_no);

	return 0;
}

练习3-2

//把List 3-10中的猜赢3次拳泛化为猜赢n次拳。在游戏一开始就问“要猜赢几次?”,让玩家来输入n的值。

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

int human;		/* 玩家的手势 */
int comp;		/* 计算机的手势 */
int win_no;		/* 胜利次数 */
int lose_no;	/* 失败次数 */
int draw_no;	/* 平局次数 */

char *hd[] = {
   "石头", "剪刀", "布"};		/* 手势 */

/*--- 初始处理 ---*/
void initialize(void)
{
   
	win_no	= 0;		/* 胜利次数 */
	lose_no	= 0;		/* 失败次数 */
	draw_no	= 0;		/* 平局次数 */

	srand(time(NULL));	/* 设定随机数种子 */

	printf("猜拳游戏开始!!\n");
}

/*--- 运行猜拳游戏(读取/生成手势) ---*/
void jyanken(void)
{
   
	int i;

	comp = rand() % 3;		/* 用随机数生成计算机的手势(0~2)*/

	do {
   
		printf("\n\a石头剪刀布 ···");
		for (i = 0; i < 3; i++)
			printf(" (%d)%s", i, hd[i]);
		printf(":");
		scanf("%d", &human);		/* 读取玩家的手势 */
	} while (human < 0 || human > 2);
}

/*--- 更新胜利/失败/平局次数 ---*/
void count_no(int result)
{
   
	switch (result) {
   
	 case 0: draw_no++;	 break;						/* 平局 */
	 case 1: lose_no++;	 break;						/* 失败 */
	 case 2: win_no++;   break;						/* 胜利 */
	}
}

/*--- 显示判断结果 ---*/
void disp_result(int result)
{
   
	switch (result) {
   
	 case 0: puts("平局。");	 break;	 /* 平局 */
	 case 1: puts("你输了。");   break;	 /* 失败 */
	 case 2: puts("你赢了。");   break;	 /* 胜利 */
	}
}

int main(void)
{
   
	int judge;				/* 胜负 */
	int n;

	initialize();						/* 初始处理 */

	printf("\n要猜赢几次?");
	scanf("%d",&n);

	do {
   
		jyanken();						/* 运行猜拳游戏 */

		/* 显示计算机和玩家的手势 */
		printf("我出%s,你出%s。\n", hd[comp], hd[human])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值