一放假真的就看不进书了害
而且这章习题真的好难!超级无敌巨难!!!
4-6想了好久还是没想出来 哭哭( •̥́ ˍ •̀ू )
练习4-1
//编写一个限制玩家可以输入次数的“珠玑妙算”程序。
#include <time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void make4digit (int x[])
{
int i, j, val;
for (i=0; i<4; i++) {
do {
val = rand()%10;
for (j=0; j<i; j++)
if (val == x[j])
break;
} while (j<i);
x[i] = val;
}
}
int check (const char s[])
{
int i, j;
if (strlen(s) != 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;
}
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)++;
else
(*blow)++;
}
}
}
void printf_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,blow;
int no[4];
char buff[10];
clock_t start,end;
int times = 10; //限制次数
srand( time(NULL) );
puts("■ 来玩珠玑妙算吧。");
puts("■ 请猜4个数字。");
puts("■ 其中不包含相同数字。");
puts("■ 请像4307这样连续输入数字。");
puts("■ 不能输入空格字符。\n");
make4digit(no);
start = clock();
do {
if (times == 0) {
printf("□GAME OVER!\n");
break;
}
printf("□你只有%d次机会了噢~\n\n",times);
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++;
times--;
judge(buff, no, &hit, &blow);
printf_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>
#include <math.h>
int no[4]; //把目标数字变为全局变量,因为在不同函数中都有用到
int hint = 4; //最多提示次数
int hint_bit = 1; //提示的位数
int hint1 = -1;
int hint2 = -1;
void make4digit (int x[])
{
int i, j, val;
for (i=0; i<4; i++) {
do {
val = rand()%10;
for (j=0; j<i; j++)
if (val == x[j])
break;
} while (j<i);
x[i] = val;
}
/*
for (i=0; i<4; i++) 检查答案
printf("%d ",x[i]);
puts("\n");
*/
}
int check (const char s[])
{
int i, j;
if (strlen(s) != 4)
return 1;
for (i=0; i<4; i++) {
if (!isdigit(s[i]))
return 2;
for (j=0; j<i; j