明解C语言中级篇_第1章_猜数游戏

前言

本文为业余学习《明解C语言中级篇》的记录,包含代码清单和练习题。
开始学习时间:2022年12月14日
+++++++++++++++++++++++++++++++
第1章 猜数游戏
+++++++++++++++++++++++++++++++

1-1 猜数判定

list 1-1

//猜数游戏(其一:测试版)

#include <stdio.h>

int main()
{
	int no;
	int ans=7;

	printf("请猜一个0~9的整数。\n\n");

	printf("是多少呢:");
	scanf("%d",&no);

	if(no>ans)
	{
		printf("\a再小一点。\n");
	}
	else if(no<ans)
	{
		printf("\a再大一点。\n");
	}
	else
	{
		printf("\a回答正确。\n");
	}

	return 0;
}

1-2 重复到猜对为止

list 1-2

//猜数游戏(其二:重复到猜对为止——利用do语句)

#include <stdio.h>

int main()
{
	int no;
	int ans=7;

	printf("请猜一个0~9的整数。\n\n");

	do
	{
		printf("是多少呢:");
		scanf("%d",&no);

		if(no<ans)
		{
			printf("\a再大一点。\n");
		}
		else if(no>ans)
		{
			printf("\a再小一点。\n");
		}
	}while(no != ans);

	printf("\a回答正确。\n");

	return 0;
}

list 1-3

//猜数游戏(另一种解法):重复到猜对为止——利用while语句

#include <stdio.h>

int main()
{
	int no;
	int ans=7;

	printf("请猜一个0~9的整数。\n\n");

	while(1)
	{
		printf("是多少呢:");
		scanf("%d",&no);

		if(no<ans)
		{
			printf("\a再大一点。\n");
		}
		else if(no>ans)
		{
			printf("\a再小一点。\n");
		}
		else
		{
			break;
		}
	}

	printf("\a回答正确。\n");

	return 0;
}

1-3 随机设定目标数字

list 1-4

//生成随机数(其一)

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

int main()
{
	int retry;

	printf("在这个编程环境中能够生成0~%d的随机数。\n",RAND_MAX);
	do
	{
		printf("\n生成了随机数%d。\n",rand());

		printf("再运行一次?…(0)否(1)是:");
		scanf("%d",&retry);
	}while(retry == 1);

	return 0;
}

list 1-5

//生成随机数(其二:根据当前时间设定随机数的种子)

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

int main()
{
	int retry;

	srand(time(NULL));

	printf("在这个编程环境中能够生成0~%d的随机数。\n",RAND_MAX);

	do
	{
		printf("\n生成了随机数%d。\n",rand());

		printf("再运行一次?…(0)否(1)是:");
		scanf("%d",&retry);
	}while(retry == 1);

	return 0;
}

list 1-6

//猜数游戏(其三:目标数字是0~999的随机数)

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

int main()
{
	int no;
	int ans;

	srand(time(NULL));
	ans=rand() % 1000;

	printf("请猜一个0~999的整数。\n\n");

	do
	{
		printf("是多少呢:");
		scanf("%d",&no);

		if(no>ans)
		{
			printf("\a再小一点。\n");
		}
		else if(no<ans)
		{
			printf("\a再大一点。\n");
		}
	}while(no != ans);

	printf("回答正确。\n");

	return 0;
}

list 1-7

//猜数游戏(其四:限制输入次数)

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

int main()
{
	int no;
	int ans;
	const int max_stage = 10;
	int remain = max_stage;

	srand(time(NULL));
	ans = rand() % 1000;

	printf("请猜一个0~999的整数。\n\n");

	do
	{
		printf("还剩%d次机会。是多少呢:",remain);
		scanf("%d",&no);

		remain--;

		if (no > ans)
		{
			printf("\a再小一点。\n");
		}
		else if (no < ans)
		{
			printf("\a再大一点。\n");
		}
	}while (no != ans && remain > 0);

	if (no != ans)
	{
		printf("\a很遗憾,正确答案是%d。\n",ans);
	}
	else
	{
		printf("\a回答正确。\n");
		printf("您用了%d次猜中了。\n",max_stage - remain);
	}

	return 0;
}

1-4 保存输入记录

list 1-8

//猜数游戏(其五:显示输入记录)

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

#define MAX_STAGE 10

int main()
{
	int no;
	int ans;
	int num[MAX_STAGE];
	int stage;
	int i;

	srand(time(NULL));
	ans = rand() % 1000;

	printf("请猜一个0~999的整数。\n\n");

	stage = 0;
	do
	{
		printf("还剩%d次机会。是多少呢:",MAX_STAGE - stage);
		scanf("%d",&no);
		num[stage++] = no;

		if (no > ans)
		{
			printf("再小一点。\n");
		}
		else if (no < ans)
		{
			printf("再大一点。\n");
		}
	}while (no != ans && stage < MAX_STAGE);

	if (no != ans)
	{
		printf("很遗憾,正确答案是%d。\n",ans);
	}
	else
	{
		printf("回答正确。\n");
		printf("您用了%d次猜中了。\n",stage);
	}

	puts("\n--- 输入记录 ---");
	for (i=0;i<stage;i++)
	{
		printf("%2d : %4d %+6d\n",i + 1,num[i],num[i] - ans);
	}

	return 0;
}

list 1-9

//显示数组的元素个数和各个元素的值

#include <stdio.h>

int main()
{
	int i;
	int a[] = {1,2,3,4,5};
	int na = sizeof (a) / sizeof (a[0]);

	printf("数组a的元素个数是%d。\n",na);

	for (i = 0; i < na ; i++)
	{
		printf("a[%d] = %d\n", i, a[i]);
	}

	return 0;
}

自由演练

练习 1-1

//练习1-1 抽签程序

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

int main()
{
	int no;
	char arr[][5] = {"大吉","中吉","小吉","吉","末吉","凶","大凶"};

	srand(time(NULL));
	no = rand() % 7;

	printf("您抽中了第%d签,是%s签。\n", no + 1, arr[no]);

	return 0;
}

练习 1-2

//改写练习1-1代码,使“末吉”、“凶”、“大凶”的概率减小

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

int main()
{
	int no;
	char arr[][5] = {"大吉","中吉","小吉","吉","末吉","大吉","凶","中吉","大凶","小吉","吉"};

	srand(time(NULL));
	no = rand() % 11;

	printf("您抽中了第%d签,是%s签。\n", no + 1, arr[no]);

	return 0;
}

练习 1-3

//编写“猜数游戏”,使目标数字是一个在-999和999之间的整数,考虑输入次数定多少合适

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

#define MAX_STAGE 11	//MAX_STAGE = 2为底1999的对数(约等于11)(-999至999共1999个整数)

int main()
{
	int no;
	int stage;
	int ans;
	int num[MAX_STAGE];
	int i;

	srand(time(NULL));
	ans = rand() % 1999 - 999;	//rand() % 1999的范围为0~1998
	stage = 0;

	do
	{
		printf("还剩%d次机会。是多少呢:",MAX_STAGE - stage);
		scanf("%d", &no);
		num[stage++] = no;

		if (no > ans)
		{
			printf("再小一点。\n");
		}
		else if (no < ans)
		{
			printf("再大一点。\n");
		}
	}while (no != ans && stage < MAX_STAGE);

	if (no != ans)
	{
		printf("很遗憾,正确答案是%d。\n", ans);
	}
	else
	{
		printf("回答正确。\n");
		printf("您用了%d次猜中了。\n", stage);
	}

	printf("\n--- 输入记录 ---\n");
	for (i = 0; i < stage; i++)
	{
		printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
	}

	return 0;
}

练习 1-4

/*
编写“猜数游戏”。
一、使目标数字是一个在3和999之间3的倍数
二、考虑输入次数定多少合适
三、提供两种功能:
	1.输入值不是3的倍数时直接退出游戏;
	2.输入值不是3的倍数时,不显示比较结果,直接让玩家再次输入新的值,不计算次数。
*/

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

// 999 / 3 = 333,MAX_STAGE = 2为底333的对数为8.3(取9)
#define MAX_STAGE 9	

int main()
{
	int no;
	int stage = 0;
	int ans;
	int model;

	srand(time(NULL));
	ans = (rand() % 333 + 1) * 3;

	do
	{
		printf("请选择游戏模式【当输入值不是3的倍数时:1…结束游戏,2…重新输入】:");
		scanf("%d", &model);
	}while (model < 1 || model > 2);

	printf("请猜一个3~999之间的整数。\n");

	switch (model)
	{
		case 1 : 
			do
			{
				printf("还剩%d次机会。是多少呢:",MAX_STAGE - stage);
				scanf("%d", &no);
				stage++;
				if (no % 3 != 0)
				{
					puts("您猜了不是3的倍数的值,GAME OVER!");
					return 0;
				}
				else if (no < ans)
				{
					printf("再大一点。\n");
				}
				else if (no > ans)
				{
					printf("再小一点。\n");
				}
			}while (no != ans && stage < MAX_STAGE);

			if (no != ans)
			{
				printf("很遗憾,超次数了。正确答案是%d。\n", ans);
			}
			else
			{
				printf("回答正确。\n");
				printf("您用了%d次猜中了。\n", stage);
			}
			break;

		case 2 : 
			do
			{
				printf("是多少呢:");
				scanf("%d", &no);
				stage++;
				if (no == ans)
				{
					printf("恭喜你猜对了,你用了%d次猜中了。\n",stage);
					return 0;
				}
			}while (no % 3 != 0 || no != ans);
			break;
	}

	return 0;
}

练习 1-5

/*
编写“猜数游戏”。
目标范围运行时的随机数决定。
自动选定一个合适的值作为最多输入的次数。
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
    int i;
    int stage = 0;
    int no;
    int ans;
    int BeginNum;
    int EndNum;
    int MAX_STAGE;
    //因目标范围随机,无法提前计算合适的次数,按RAND_MAX=32767计算,最大为2的15次方
	int num[15];

	srand(time(NULL));

    BeginNum = rand();
    EndNum = rand();

    if (BeginNum > EndNum)
    {
        int temp = BeginNum;
        BeginNum = EndNum;
        EndNum = temp;
    }

	ans = rand() % (EndNum - BeginNum + 1) + BeginNum;
    MAX_STAGE = (int)ceil(log(EndNum - BeginNum) / log(2)); //合适的猜测次数

    printf("请猜一个%d至%d之间的整数。\n", BeginNum, EndNum);

	do
	{
		printf("还有%d次机会,是多少呢:",MAX_STAGE - stage);
		scanf("%d", &no);
		num[stage++] = no;

		if (no < ans)
		{
			printf("再大一点。\n");
		}
		else if (no > ans)
		{
			printf("再小一点。\n");
		}

	}while (no != ans && stage<MAX_STAGE);

	if (no != ans)
	{
		printf("真遗憾,答案是%d。\n", ans);
	}
	else
	{
		printf("恭喜你,你用了%d次猜中!\n", stage);
	}

	printf("\n--- 输入记录 ---\n");
	for (i = 0; i < stage; i++)
	{
		printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
	}

    return 0;
}

练习 1-6

//编写“猜数游戏”,让玩家选择游戏等级

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

int main()
{
	int i;
	int no;
	int ans;
	int stage;
	int choose;
	int num[15];
	int max_stage;
	
	puts("----难度等级----");
	puts("[1] 1~9");
	puts("[2] 1~99");
	puts("[3] 1~999");
	puts("[4] 1~9999");
	puts("----------------");

	do
	{
		printf("请选择:");
		scanf("%d", &choose);
	}while (choose < 1 || choose > 4);

	srand(time(NULL));
	stage = 0;

	putchar('\n');

	switch (choose)
	{
		case 1 :
			ans = 1 + rand() % 9;
			max_stage = (int) ceil(log(9) / log(2));
			do
			{
				printf("还剩%d次机会,是多少呢:", max_stage - stage);
				scanf("%d", &no);
				num[stage++] = no;
				if (no < ans)
				{
					printf("再大一点。\n");
				}
				else if (no > ans)
				{
					printf("再小一点。\n");
				}
			}while (no != ans && stage < max_stage);
			break;
		case 2 :
			ans = 1 + rand() % 99;
			max_stage = (int) ceil(log(99) / log(2));
			do
			{
				printf("还剩%d次机会,是多少呢:", max_stage - stage);
				scanf("%d", &no);
				num[stage++] = no;
				if (no < ans)
				{
					printf("再大一点。\n");
				}
				else if (no > ans)
				{
					printf("再小一点。\n");
				}
			}while (no != ans && stage < max_stage);
			break;
		case 3 :
			ans = 1 + rand() % 999;
			max_stage = (int) ceil(log(999) / log(2));
			do
			{
				printf("还剩%d次机会,是多少呢:", max_stage - stage);
				scanf("%d", &no);
				num[stage++] = no;
				if (no < ans)
				{
					printf("再大一点。\n");
				}
				else if (no > ans)
				{
					printf("再小一点。\n");
				}
			}while (no != ans && stage < max_stage);
			break;
		case 4 :
			ans = 1 + rand() % 9999;
			max_stage = (int) ceil(log(9999) / log(2));
			do
			{
				printf("还剩%d次机会,是多少呢:", max_stage - stage);
				scanf("%d", &no);
				num[stage++] = no;
				if (no < ans)
				{
					printf("再大一点。\n");
				}
				else if (no > ans)
				{
					printf("再小一点。\n");
				}
			}while (no != ans && stage < max_stage);
			break;
	}

	if (no != ans)
	{
		printf("真遗憾,答案是%d。\n", ans);
	}
	else
	{
		printf("恭喜你猜对了!你用了%d次猜中答案。\n", stage);
	}

	printf("\n----输入记录----\n");
	for (i = 0; i < stage; i++)
	{
		printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
	}

	return 0;
}

练习 1-7

//改进List1-8程序,让差值0不带符号

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

#define MAX_STAGE 10

int main()
{
	int no;
	int ans;
	int num[MAX_STAGE];
	int stage;
	int i;

	srand(time(NULL));
	ans = rand() % 1000;

	printf("请猜一个0~999的整数。\n\n");

	stage = 0;
	do
	{
		printf("还剩%d次机会。是多少呢:", MAX_STAGE - stage);
		scanf("%d", &no);
		num[stage++] = no;

		if (no > ans)
		{
			printf("再小一点。\n");
		}
		else if (no < ans)
		{
			printf("再大一点。\n");
		}
	}while (no != ans && stage < MAX_STAGE);

	if (no != ans)
	{
		printf("很遗憾,正确答案是%d。\n", ans);
	}
	else
	{
		printf("回答正确。\n");
		printf("您用了%d次猜中了。\n", stage);
	}

	puts("\n--- 输入记录 ---");
	for (i = 0; i < stage; i++)
	{
		printf("%2d : %4d ", i + 1, num[i]);
		if ((num[i] - ans) != 0)
		{
			printf("%+6d\n", num[i] - ans);
		}
		else
		{
			printf("%6d\n", num[i] - ans);
		}
	}

	return 0;
}

练习 1-8

//把list1-8里的do语句改写成for语句

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

#define MAX_STAGE 10

int main()
{
	int no;
	int ans;
	int num[MAX_STAGE];
	int stage;
	int i;

	srand(time(NULL));
	ans = rand() % 1000;

	printf("请猜一个0~999的整数。\n\n");

	stage = 0;
	for (; stage < MAX_STAGE; )
	{
		printf("还剩%d次机会。是多少呢:", MAX_STAGE - stage);
		scanf("%d", &no);
		num[stage++] = no;

		if (no == ans)
		{
			break;
		}

		if (no > ans)
		{
			printf("再小一点。\n");
		}
		else if (no < ans)
		{
			printf("再大一点。\n");
		}
	}

	if (no != ans)
	{
		printf("很遗憾,正确答案是%d。\n", ans);
	}
	else
	{
		printf("回答正确。\n");
		printf("您用了%d次猜中了。\n", stage);
	}

	puts("\n--- 输入记录 ---");
	for (i = 0; i < stage; i++)
	{
		printf("%2d : %4d ", i + 1, num[i]);
		if ((num[i] - ans) != 0)
		{
			printf("%+6d\n", num[i] - ans);
		}
		else
		{
			printf("%6d\n", num[i] - ans);
		}
	}

	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值