C语言进阶——珠玑妙算,ctype.h的使用

17 篇文章 1 订阅

由于我比较懒所以就直接写代码里了

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

#define max 100

//珠玑妙算:
//以计算机作为出题者,你作为答题者
//出题者从0—9中随机选出4个不同的数字进行排列组合
//答题者则去重复猜测直到答对为止
//答题过程中出题者会在答题者每次回答后给出线索

//由于要生成4个不同的数字下面的方法不行
void randnum1()
{
	int arr[4];
	srand(time(NULL));
	for (int i = 0; i < 4; i++)
	{
		arr[i] = rand() % 10;
	}
}

//生成4个不同的数字排列
void randnum2(int arr[])
{
	int exist;
	int i, j;
	//srand(time(NULL));
	for (i = 0; i < 4; i++)
	{
		do
		{
			exist = rand() % 10;
			for (j = 0; j < i; j++)//第一次的时候不执行
			{
				if (arr[j] == exist)//有相同数字出现就会跳出循环
				{
					break;
				}
			}
		} while (j < i);
		arr[i] = exist;
	}
}

//生成4个不同的数字排列2
void randnum3(int arr[])
{
	int i, j;
	//srand(time(NULL));
	for (i = 0; i < 4; i++)
	{
		do
		{
			arr[i] = rand() % 10;
			for (j = 0; j < i; j++)
			{
				if (arr[i] == arr[j])
				{
					break;
				}
			}
		} while (j < i);
	}
}

//使用atoi()/atol()/atof():把字符串转换为数值
// atoi函数:
// 头文件:<stdlib.h>
// 格式:int atoi(const char *arr)
// 返回值:返回值用int型表示,无法则做未定义处理(取决于编程环境)
//把读取到的字符串型的数值转化为数值型(整数型)
void exchange_int()
{
	char arr[max];
	printf("请输入整数:");
	scanf_s("%s", &arr, max);
	printf("你输入了:%d\n", atoi(arr));
}

// atol函数:
// 头文件:<stdlib.h>
// 格式:long atol(const char *arr)
// 返回值:返回值用long型表示,无法则做未定义处理(取决于编程环境)
void exchange_long()
{
	char arr[max];
	printf("请输入整数:");
	scanf_s("%s", &arr, max);
	printf("你输入了:%d\n", atol(arr));
}

// atof函数:
// 头文件:<stdlib.h>
// 格式:double atof(const char *arr)
// 返回值:返回值用double型表示,无法则做未定义处理(取决于编程环境)
void exchange_double()
{
	char arr[max];
	printf("请输入整数:");
	scanf_s("%s", &arr, max);
	printf("你输入了:%f\n", atof(arr));
}

//使用atoi,atol,atof函数进行转化时无法判断是否是由0转化的还是由错误转化形成的
//在将字符串转化为数值时要用strtoul,strtol,strtod以便调用方区别

//检查已读取字符串的有效性:
//1.是否为四个字符
//2.是否含有非数字字符
//3.是否含有重复数值
int check(const char str[])
{
	if (strlen(str) != 4)
	{
		printf("error!\n");
		return 1;
	}
	for (int i = 0; i < 4; i++)
	{
		if (!isdigit(str[i]))//判断是否仅为数值
		{
			printf("error!\n");
			return 2;
		}
		for (int j = 0; j < i; j++)
		{
			if (str[i] == str[j])
			{
				printf("error!\n");
				return 3;
			}
		}
	}
	return 0;
}

//isdigit:判断是否为数值isdigit(s)也可以用'0'<=x&&x<='9'来判断
//iscntrl:判断是否为控制字符iscntrl(s)
// isprint:判断是否为显示字符isprint(s)
// isgraph:判断是否为不包含空白字符的显示字符 isgraph(s)
//isupper:判断是否全为大写英文字符isupper(s)-->toupper(s)
//islower:判断是否全为小写英文字符islower(s)-->tolower(s)
//isalpha:判断是否为英文字符isalpha(s)
//isalnum:判断是否为英文字符或十进制数字isalnum(s)
//ispunct:判断是否为非空白字符且数字字符且非英文字符的显示字符ispunct(s)
//isxdigit:判断是否为十六进制数字字符isxdigit(s)
//isspace:判断是否为空白字符即:" ",\t,\n,\f,\r,\v->垂直制表符

//hit和blow的判断
//str[]是玩家输入,no[]是计算机生成的字符串用于存放题目的答案
void judge(const char str[],const int no[], int* hit, int* blow)
{
	*hit = *blow = 0;
	for (int i = 0; i < 4; i++)//从头开始依次遍历字符串str
	{
		for (int j = 0; j < 4; j++)//检查str和no是否相同
		{
			if (str[i] == '0' + no[j])
			{
				if (i == j)
				{
					(*hit)++;
				}
				else
				{
					(*blow)++;
				}
			}
		}
	}
}

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

int main()
{
	int try = 0;
	int chk;
	int hit;
	int blow;
	int no[4];
	char exist[max];
	clock_t start;
	clock_t end;
	srand(time(NULL));
	printf("\t珠玑妙算现在开始\n");
	printf("\t请猜四个数字\n");
	printf("\t其中四个数字不重复出现\n");
	printf("\t请连续输入数字\n");
	printf("\t数字中不要加空格\n");
	randnum2(no);
	start = clock();
	do
	{
		do
		{
			printf("请输入:");
			scanf_s("%s", exist, max);
			chk = check(exist);
			switch (chk)
			{
			case 1:puts("请确保输入4个字符"); break;
			case 2:puts("请不要输入除数字以外的其他字符"); break;
			case 3:puts("请不要输入相同的数字"); break;
			default:
				break;
			}
		} while (chk!=0);
		try++;
		judge(exist, no, &hit, &blow);
		showresult(hit + blow, hit);
	} while (hit < 4);
	end = clock();
	printf("用了%d次\n用时:%f秒\n", try, (double)(end - start) / CLOCKS_PER_SEC);
	return 0;
}

程序展示:
在这里插入图片描述
这玩起来太累了原谅我就不玩下去了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值