猿问

运用数组解决的猜数问题

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

void MakeDigit(int a[]);

int InputGuess(int b[]);

int IsRightPosition(int magic[], int guess[]);

int IsRightDigit(int magic[], int guess[]);

int main()

{

int a[10]; /* 记录计算机所想的数 */

int b[4]; /* 记录人猜的数 */

    int count; /* 记录已经猜的次数 */

int rightDigit; /* 猜对的数字个数 */

int rightPosition; /* 数字和位置都猜对的个数 */

int level; /* 最多允许猜的次数 */

    srand(time(NULL));

MakeDigit(a);       /* 随机生成一个各位相异的4位数 */    

printf("How many times do you want to guess?");

scanf("%d", &level);

count = 0;

do{

printf("No.%d of %d times:\n", count+1, level);

printf("Please input a number:");

if (InputGuess(b) != 0) /* 读入用户的猜测 */

{

count++;

rightPosition = IsRightPosition(a, b);/*数字和位置都猜对的个数*/

rightDigit = IsRightDigit(a, b);   /*用户猜对的数字个数*/

rightDigit = rightDigit - rightPosition;

printf("%dA%dB\n", rightPosition, rightDigit);

}

}while (count < level && rightPosition != 4);

if (rightPosition == 4)

printf("Congratulations, you got it at No.%d\n", count);  

else

printf("Sorry, you haven't got it, see you next time!\n");

printf("Correct answer is:%d%d%d%d\n", a[0], a[1], a[2], a[3]);

return 0;

}

/* 函数功能: 随机生成一个各位相异的4位数 */

void MakeDigit(int a[])

{

int j, k, temp;

    for (j=0; j<10; j++) 

{

a[j] = j;     

}

for (j=0; j<10; j++)

{

k = rand() % 10;

temp = a[j];

a[j]  = a[k];

a[k] = temp;

}

/* 函数功能: 读用户猜的数,读入失败返回0,否则非0 */

int InputGuess(int b[])

{

int i, ret = 1;

for (i=0; i<4; i++)

{

ret = scanf("%1d", &b[i]);

if (ret != 1)           /* 如果输入非法 */

{

printf("Input Data Type Error!\n");

while (getchar() != '\n'); /* 清除输入缓冲区中的内容 */

return 0;

}

}

if (b[0] == b[1] || b[0] == b[2] || b[0] == b[3] ||

b[1] == b[2] || b[1] == b[3] || b[2] == b[3])

{

printf("The digits must be different from each other!\n");

return 0;

}

else

{

return 1;

}

}

/* 函数功能: 统计guess和magic数字和位置都一致的个数 */

int IsRightPosition(int magic[],int guess[]) 

{

int rightPosition = 0;

int j;

for (j=0; j<4; j++)

{

if (guess[j] == magic[j]) 

rightPosition = rightPosition + 1;

}

return rightPosition;

}

/* 函数功能:统计guess和magic数字一致(不管位置是否一致)的个数 */

int IsRightDigit(int magic[],int guess[]) 

{

int rightDigit = 0;

int j, k;

for (j=0; j<4; j++)

{

for (k=0; k<4; k++)

{

if (guess[j] == magic[k])

rightDigit = rightDigit + 1;

}

}

return rightDigit;

}

我搞不懂为什么能将用户输入的一个四位数字转化为一个含有四个元素的数组的,inputguess函数里明明没有导入用户所输入的数啊,求解释运行原理。。

Leo也叫做夹子
浏览 1925回答 1
1回答

这都不会

for (i=0; i<4; i++) {     ret = scanf("%1d", &b[i]);     if (ret != 1)           /* 如果输入非法 */     {         printf("Input Data Type Error!\n");         while (getchar() != '\n'); /* 清除输入缓冲区中的内容 */         return 0;     } }原因在于InputGuess函数中的这些代码。其中scanf("%1d", &b[i])表示每次读入1个数字,%1d表示读入一个数字。若输入1234则为4个数字,会通过for循环读入4次。scanf函数的返回值为成功读入变量的个数。因为每次读入一个数字,若成功读取,必返回1。因此ret = scanf("%1d", &b[i]);表示每次读入一个数字赋值到数组中的元素,如果读入成功则将1赋值给ret。后面的if是来处理没有读入成功(即用户输入非数字字符)的。下次贴代码能不能给点缩进啊,就像我上面改的一样,要不看着真的费劲,层次不清晰。
随时随地看视频慕课网APP
我要回答