由于我比较懒所以就直接写代码里了
#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;
}
程序展示:
这玩起来太累了原谅我就不玩下去了