明解C语言中级篇练习题第四章

练习4-1

#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TRY_NO 3
/*--- 生成4个不同数字的组合并存入数组x ---*/
void make4digits(int x[])
{
	int i, j, val;
	for (i = 0; i < 4; i++) {
		do {
			val = rand() % 10;			/* 0~9的随机数 */
			for (j = 0; j < i; j++)		/* 是否已获得此数值 */
				if (val == x[j])
					break;
		} while (j < i);		/* 循环直至获得不重复的数值 */
		x[i] = val;
	}
}
/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
	int i, j;
	if (strlen(s) != 4)			/* 字符串长度不为4 */
		return 1;
	for (i = 0; i < 4; i++) {
		if (!isdigit(s[i]))
			return 2;			/* 包含了除数字以外的字符 */
		for (j = 0; j < i; j++)
			if (s[i] == s[j])
				return 3;		/* 含有相同数字 */
	}
	return 0;					/* 字符串有效 */
}
/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int *hit, int *blow)
{
	int i, j;
	*hit = *blow = 0;
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			if (s[i] == '0' + no[j])	/* 数字一致 */
				if (i == j)
					(*hit)++;			/* hit(位置也一致)*/
				else
					(*blow)++;			/* blow(位置不一致)*/
		}
	}
}
/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
	if (spos == 4)
		printf("回答正确!!");
	else if (snum == 0)
		printf("    这些数字里没有答案数字。\n");
	else 
	{
		printf("    这些数字里包括%d个答案数字。\n", snum);
		if (spos == 0)
			printf("    但是数字的位置都不一致。\n");
		else
			printf("    其中有%d个数字的位置是一致的。\n", spos);
	}
	putchar('\n');
}

int main(void)
{
	int try_no = 0;		/* 输入次数 */
	int chk;			/* 已输入的字符串的检查结果 */
	int hit;			/* 位置和数字都正确的数字个数 */
	int blow;			/* 数字正确但位置不正确的数字个数 */
	int no[4];			/* 要猜的数字串 */
	char buff[10];		/* 用于存放读取的数字串的字符串 */
	clock_t	start, end;				/* 开始时间/结束时间 */
	srand(time(NULL));				/* 设定随机数种子 */
	puts("■ 来玩珠玑妙算吧。");
	puts("■ 请猜4个数字。");
	puts("■ 其中不包含相同数字。");
	puts("■ 请像4307这样连续输入数字。");
	puts("■ 不能输入空格字符。");
	printf("最多输入%d次。\n", MAX_TRY_NO);
	make4digits(no);					/* 生成4个数字各不相同的数字串 */
	start = clock();					/* 开始计算 */
	do 
	{
		do 
		{
			printf("请输入:");
			scanf("%s", buff);			/* 读取为字符串 */

			chk = check(buff);			/* 检查读取到的字符串 */

			switch (chk)
			{
				case 1: puts("\a请确保输入4个字符。"); break;
				case 2: puts("\a请不要输入除了数字以外的字符。"); break;
				case 3: puts("\a请不要输入相同的数字。"); break;
			}
		} while (chk != 0);
		try_no++;
		if (try_no == MAX_TRY_NO)
		{
			printf("到达最大输入次数。\n");
			break;
		}	
		judge(buff, no, &hit, &blow);	/* 判断 */
		print_result(hit + blow, hit);	/* 显示判断结果 */
	} while (hit < 4);
	end = clock();						/* 计算结束 */
	printf("用了%d次。\n用时%.1f秒。\n",
		try_no, (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}
练习4-2
#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int no[4];/* 要猜的数字串 */
/*给出提示*/
void showclue(void)
{
	puts("提示方式为");
	puts("提示开头第一个字符");
	printf("开头第一个字符为%d\n",no[0]);
	return;
}
/*--- 生成4个不同数字的组合并存入数组x ---*/
void make4digits(int x[])
{
	int i, j, val;
	for (i = 0; i < 4; i++) {
		do {
			val = rand() % 10;			/* 0~9的随机数 */
			for (j = 0; j < i; j++)		/* 是否已获得此数值 */
				if (val == x[j])
					break;
		} while (j < i);		/* 循环直至获得不重复的数值 */
		x[i] = val;
	}
}
/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
	int i, j;
	if ((s[0] == 'c') && (s[1] == 'l') && (s[2] == 'u') && (s[3] == 'e'))
		return 4;//show clue
	if (strlen(s) != 4)			/* 字符串长度不为4 */
		return 1;
	for (i = 0; i < 4; i++) {
		if (!isdigit(s[i]))
			return 2;			/* 包含了除数字以外的字符 */
		for (j = 0; j < i; j++)
			if (s[i] == s[j])
				return 3;		/* 含有相同数字 */
	}
	return 0;					/* 字符串有效 */
}

/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int *hit, int *blow)
{
	int i, j;
	*hit = *blow = 0;
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			if (s[i] == '0' + no[j])	/* 数字一致 */
				if (i == j)
					(*hit)++;			/* hit(位置也一致)*/
				else
					(*blow)++;			/* blow(位置不一致)*/
		}
	}
}

/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
	if (spos == 4)
		printf("回答正确!!");
	else if (snum == 0)
		printf("    这些数字里没有答案数字。\n");
	else {
		printf("    这些数字里包括%d个答案数字。\n", snum);
		if (spos == 0)
			printf("    但是数字的位置都不一致。\n");
		else
			printf("    其中有%d个数字的位置是一致的。\n", spos);
	}
	putchar('\n');
}

int main(void)
{
	int try_no = 0;		/* 输入次数 */
	int chk;			/* 已输入的字符串的检查结果 */
	int hit;			/* 位置和数字都正确的数字个数 */
	int blow;			/* 数字正确但位置不正确的数字个数 */
	char buff[10];		/* 用于存放读取的数字串的字符串 */
	clock_t	start, end;				/* 开始时间/结束时间 */
	srand(time(NULL));				/* 设定随机数种子 */
	puts("■ 来玩珠玑妙算吧。");
	puts("■ 请猜4个数字。");
	puts("■ 其中不包含相同数字。");
	puts("■ 请像4307这样连续输入数字。");
	puts("■ 不能输入空格字符。\n");
	make4digits(no);					/* 生成4个数字各不相同的数字串 */
	start = clock();					/* 开始计算 */
	do 
	{
		do 
		{
			printf("请输入:");
			scanf("%s", buff);			/* 读取为字符串 */
			chk = check(buff);			/* 检查读取到的字符串 */
			switch (chk) 
			{
				case 1: puts("\a请确保输入4个字符。"); break;
				case 2: puts("\a请不要输入除了数字以外的字符。"); break;
				case 3: puts("\a请不要输入相同的数字。"); break;
				case 4: puts("给出提示。\n"); showclue(); break;
			}
		} while ((chk != 0)&&(chk != 4));
		try_no++;
		if (chk != 4)
		{
			judge(buff, no, &hit, &blow);	/* 判断 */
			print_result(hit + blow, hit);	/* 显示判断结果 */
		}
	} while (hit < 4);
	end = clock();						/* 计算结束 */
	printf("用了%d次。\n用时%.1f秒。\n",try_no, (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}
练习4-3
#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TRY_NO 100
#define MAX_DIGIT_NUM 10
int digit_num;
int no[MAX_DIGIT_NUM];			/* 要猜的数字串 */
/*--- 生成4个不同数字的组合并存入数组x ---*/
void makeNdigits(int x[])
{
	int i, j, val;
	for (i = 0; i < digit_num; i++) {
		do {
			val = rand() % 10;			/* 0~9的随机数 */
			for (j = 0; j < i; j++)		/* 是否已获得此数值 */
				if (val == x[j])
					break;
		} while (j < i);		/* 循环直至获得不重复的数值 */
		x[i] = val;
	}
}
/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
	int i, j;
	if (strlen(s) != digit_num)			/* 字符串长度不为digit_num */
		return 1;
	for (i = 0; i < digit_num; i++) {
		if (!isdigit(s[i]))
			return 2;			/* 包含了除数字以外的字符 */
		for (j = 0; j < i; j++)
			if (s[i] == s[j])
				return 3;		/* 含有相同数字 */
	}
	return 0;					/* 字符串有效 */
}
/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int *hit, int *blow)
{
	int i, j;
	*hit = *blow = 0;
	for (i = 0; i < digit_num; i++) {
		for (j = 0; j < digit_num; j++) {
			if (s[i] == '0' + no[j])	/* 数字一致 */
				if (i == j)
					(*hit)++;			/* hit(位置也一致)*/
				else
					(*blow)++;			/* blow(位置不一致)*/
		}
	}
}
/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
	if (spos == digit_num)
		printf("回答正确!!");
	else if (snum == 0)
		printf("    这些数字里没有答案数字。\n");
	else 
	{
		printf("    这些数字里包括%d个答案数字。\n", snum);
		if (spos == 0)
			printf("    但是数字的位置都不一致。\n");
		else
			printf("    其中有%d个数字的位置是一致的。\n", spos);
	}
	putchar('\n');
}

int main(void)
{
	int try_no = 0;		/* 输入次数 */
	int chk;			/* 已输入的字符串的检查结果 */
	int hit;			/* 位置和数字都正确的数字个数 */
	int blow;			/* 数字正确但位置不正确的数字个数 */
	//int no[4];			/* 要猜的数字串 */
	char buff[10];		/* 用于存放读取的数字串的字符串 */
	clock_t	start, end;				/* 开始时间/结束时间 */
	srand(time(NULL));				/* 设定随机数种子 */
	puts("■ 来玩珠玑妙算吧。");
	//puts("■ 请猜4个数字。");
	printf("设成几位数?");
	scanf("%d",&digit_num);
	puts("■ 其中不包含相同数字。");
	puts("■ 请连续输入数字。");
	puts("■ 不能输入空格字符。");
	printf("最多输入%d次。\n", MAX_TRY_NO);
	makeNdigits(no);					/* 生成4个数字各不相同的数字串 */
	start = clock();					/* 开始计算 */
	do 
	{
		do 
		{
			printf("请输入:");
			scanf("%s", buff);			/* 读取为字符串 */

			chk = check(buff);			/* 检查读取到的字符串 */

			switch (chk)
			{
				case 1: printf("\a请确保输入%d个字符。",&digit_num); break;
				case 2: puts("\a请不要输入除了数字以外的字符。"); break;
				case 3: puts("\a请不要输入相同的数字。"); break;
			}
		} while (chk != 0);
		try_no++;
		if (try_no == MAX_TRY_NO)
		{
			printf("到达最大输入次数。\n");
			break;
		}	
		judge(buff, no, &hit, &blow);	/* 判断 */
		print_result(hit + blow, hit);	/* 显示判断结果 */
	} while (hit < digit_num);
	end = clock();						/* 计算结束 */
	printf("用了%d次。\n用时%.1f秒。\n",
		try_no, (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}
练习4-4
#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*--- 生成4个数字的组合并存入数组x ---*/
void make4digits(int x[])
{
	int i;
	for (i = 0; i < 4; i++) 
	{
		x[i] = rand() % 10;
	}
	return;
}
/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
	int i, j;
	if (strlen(s) != 4)			/* 字符串长度不为4 */
		return 1;
	for (i = 0; i < 4; i++) {
		if (!isdigit(s[i]))
			return 2;			/* 包含了除数字以外的字符 */
	}
	return 0;					/* 字符串有效 */
}
/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int *hit, int *blow)
{
	int i, j;
	*hit = *blow = 0;
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			if (s[i] == '0' + no[j])	/* 数字一致 */
				if (i == j)
					(*hit)++;			/* hit(位置也一致)*/
				else
					(*blow)++;			/* blow(位置不一致)*/
		}
	}
}
/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
	if (spos == 4)
		printf("回答正确!!");
	else if (snum == 0)
		printf("    这些数字里没有答案数字。\n");
	else {
		printf("    这些数字里包括%d个答案数字。\n", snum);
		if (spos == 0)
			printf("    但是数字的位置都不一致。\n");
		else
			printf("    其中有%d个数字的位置是一致的。\n", spos);
	}
	putchar('\n');
}

int main(void)
{
	int try_no = 0;		/* 输入次数 */
	int chk;			/* 已输入的字符串的检查结果 */
	int hit;			/* 位置和数字都正确的数字个数 */
	int blow;			/* 数字正确但位置不正确的数字个数 */
	int no[4];			/* 要猜的数字串 */
	char buff[10];		/* 用于存放读取的数字串的字符串 */
	clock_t	start, end;				/* 开始时间/结束时间 */
	srand(time(NULL));				/* 设定随机数种子 */
	puts("■ 来玩珠玑妙算吧。");
	puts("■ 请猜4个数字。");
	puts("■ 请像4307这样连续输入数字。");
	puts("■ 不能输入空格字符。\n");
	make4digits(no);					/* 生成4个数字的数字串 */
	start = clock();					/* 开始计算 */
	do 
	{
		do 
		{
			printf("请输入:");
			scanf("%s", buff);			/* 读取为字符串 */
			chk = check(buff);			/* 检查读取到的字符串 */
			switch (chk) {
			case 1: puts("\a请确保输入4个字符。"); break;
			case 2: puts("\a请不要输入除了数字以外的字符。"); break;
			//case 3: puts("\a请不要输入相同的数字。"); break;
			}
		} while (chk != 0);
		try_no++;
		judge(buff, no, &hit, &blow);	/* 判断 */
		print_result(hit + blow, hit);	/* 显示判断结果 */
	} while (hit < 4);
	end = clock();						/* 计算结束 */
	printf("用了%d次。\n用时%.1f秒。\n",
		try_no, (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}
练习4-5
#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*--- 生成4个不同颜色代号的组合并存入数组x ---*/
void make4digits(int x[])
{
	int i, j, val;
	for (i = 0; i < 4; i++) {
		do {
			val = rand() % 8 + 1;			/* 1~8的随机数 */
			for (j = 0; j < i; j++)		/* 是否已获得此数值 */
				if (val == x[j])
					break;
		} while (j < i);		/* 循环直至获得不重复的数值 */
		x[i] = val;
	}
}
/*--- 检查已输入的字符串s的有效性 ---*/
int check(const char s[])
{
	int i, j;
	if (strlen(s) != 4)			/* 字符串长度不为4 */
		return 1;
	for (i = 0; i < 4; i++) {
		if (!isdigit(s[i]))
			return 2;			/* 包含了除数字以外的字符 */
		for (j = 0; j < i; j++)
			if (s[i] == s[j])
				return 3;		/* 含有相同数字 */
	}
	return 0;					/* 字符串有效 */
}
/*--- hit和blow的判断 ---*/
void judge(const char s[], const int no[], int *hit, int *blow)
{
	int i, j;

	*hit = *blow = 0;
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			if (s[i] == '0' + no[j])	/* 数字一致 */
				if (i == j)
					(*hit)++;			/* hit(位置也一致)*/
				else
					(*blow)++;			/* blow(位置不一致)*/
		}
	}
}
/*--- 显示判断结果 ---*/
void print_result(int snum, int spos)
{
	if (spos == 4)
		printf("回答正确!!");
	else if (snum == 0)
		printf("    这些颜色代号里没有答案颜色代号。\n");
	else {
		printf("    这些颜色代号里包括%d个答案颜色代号。\n", snum);

		if (spos == 0)
			printf("    但是颜色代号的位置都不一致。\n");
		else
			printf("    其中有%d个颜色代号的位置是一致的。\n", spos);
	}
	putchar('\n');
}

int main(void)
{
	int try_no = 0;		/* 输入次数 */
	int chk;			/* 已输入的字符串的检查结果 */
	int hit;			/* 位置和数字都正确的数字个数 */
	int blow;			/* 数字正确但位置不正确的数字个数 */
	int no[4];			/* 要猜的数字串 */
	char buff[8];//char buff[10];		/* 用于存放读取的数字串的字符串 */
	clock_t	start, end;				/* 开始时间/结束时间 */
	srand(time(NULL));				/* 设定随机数种子 */
	puts("■ 来玩珠玑妙算吧。");
	puts("颜色版");
	puts("1-白色");
	puts("2-黑色");
	puts("3-红色");
	puts("4-蓝色");
	puts("5-黄色");
	puts("6-绿色");
	puts("7-橙色");
	puts("8-褐色");
	puts("■ 请猜4种颜色。");
	puts("■ 请像4317这样连续输入颜色代号。");
	puts("■ 其中不包含相同颜色代号。");
	puts("■ 请像4317这样连续输入颜色代号。");
	puts("■ 不能输入空格字符。\n");
	make4digits(no);					/* 生成4个数字各不相同的数字串 */
	start = clock();					/* 开始计算 */
	do {
		do {
			printf("请输入:");
			scanf("%s", buff);			/* 读取为字符串 */
			chk = check(buff);			/* 检查读取到的字符串 */
			switch (chk) {
			case 1: puts("\a请确保输入4个字符。"); break;
			case 2: puts("\a请不要输入除了数字以外的字符。"); break;
			case 3: puts("\a请不要输入相同的数字。"); break;
			}
		} while (chk != 0);
		try_no++;
		judge(buff, no, &hit, &blow);	/* 判断 */
		print_result(hit + blow, hit);	/* 显示判断结果 */
	} while (hit < 4);
	end = clock();						/* 计算结束 */
	printf("用了%d次。\n用时%.1f秒。\n",
		try_no, (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}
练习4-6 待做

练习4-7

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int i, j, val;
	int no;		/* 读取的值 */
	int ans[3];	/* 目标数字 */
	int ansnum;
	srand(time(NULL));		/* 设定随机数的种子 */
	for (i = 0; i < 3; i++)
	{
		do 
		{
			val = rand() % 10;
			for (j = 0; j < i; j++)
				if (val == ans[j])
					break;
		} while (j < i);
		ans[i] = val;
	}
	ansnum = ans[0] * 100 + ans[1] * 10 + ans[2] * 1;
	//ans = rand() % 1000;	/* 生成0~999的随机数 */
	printf("请猜一个0~999的整数,各位数字不重复。\n\n");
	do {
		printf("是多少呢:");
		scanf("%d", &no);
		if (no > ansnum)
			printf("\a再小一点。\n");
		else if (no < ansnum)
			printf("\a再大一点。\n");
	} while (no != ansnum);					/* 重复到猜对为止 */
	printf("回答正确。\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wofreeo/article/details/80762887