//4-3把读到的字符串形式的整数转换为数值显示
#include<stdio.h>
#include<stdlib.h>
int main(){
char temp[20];
printf("请输入整数:");
scanf("%s", temp);
printf("你输入了%d。\n", atoi(temp));
return 0;
}
//4-6珠玑妙算
#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() % 10;
for(j = 0; j < i; j++)
if(val == x[j])
break;
}while(j < i); //只有不相同j才会等于i
x[i] = val;
}
}
//检查已输入的字符串s的有效性
int check(const char s[]){
int i, j;
if(strlen(s) != 4)
return 1; //错误码1, 字符串长度不为4
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)++; //位置一致
else
(*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(){
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("* 不能输入空格字符。\n");
make4digits(no);
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(blow + hit, hit);
}while(hit < 4);
end = clock();
printf("用了%d次。\n用时%.1f秒。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}