首页 > 解决方案 > 在某些条件下(例如使用 input()、output())编码“猜测 C 中的随机数”时的一些问题

问题描述

我尝试超越仅仅猜测随机数。条件如下:

  1. 使用input()从 1 到 100 使用的数字,如果插入的数字超出此范围,则显示一行以重新输入数字

  2. 用于output()显示输出(但显示最后一行```你在第 N 次尝试时做对了!“在 main() 上)

  3. 使插入的数字继续显示在下一行。

基本上,程序应该显示如下:

insert a number : 70
bigger than 0 smaller than 70.
insert a number : 35
bigger than 35 smaller than 70.
insert a number : 55
bigger than 55 smaller than 70.
insert a number : 60
bigger than 55 smaller than 60.
insert a number : 57
You got it right on your 5th try!

我已经为此工作了 6 个小时......(因为我是初学者)......谢天谢地,我已经能够设法获得基本结构,以便程序至少能够显示数字是大于插入的数字还是小于插入的数字。

问题是,我无法让数字继续显示在线。例如,我不能插入的号码70一直显示在smaller than 70.

此外,我无法找出如何获得已尝试的次数。我首先尝试将其放入 input() 中,count = 0 ... count++;但在输出中失败。然后我尝试输入输出(),但输出不会返回count所以我再次失败。

我希望得到关于这个问题的建议。

以下是我编写的代码,没有错误,但问题在于它与最终结果的条件不匹配。(顺便说一句,我目前正在使用 Visual Studio 2017,这就是为什么有一行#pragma warning (disable : 4996), 而myflush不是fflush。)

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#pragma warning (disable : 4996)

int input();
int random(int);
void myflush();
void output(int, int);

int main()
{
    int num;
    int i;
    int ran;

    srand((unsigned int)time(NULL));
    i = 0;
    while (i < 1) {
        ran = 1 + random(101);  
        ++i;
    }

    num = input();
    output(ran, num);

    printf("You got it right on your    th try!");a

    return 0;
}

int input()
{
    int num;
    printf("insert a number : ");
    scanf("%d", &num);
    while (num < 1 || num > 100 || getchar() != '\n') {
        myflush();
        printf("insert a number : ");
        scanf("%d", &num);
    }
    return num;
}


int random(int n)
{
    int res;
    res = rand() % n;
    return res;
}

void myflush()
{
    while (getchar() != '\n') {
        ;
    }
    return;
}


void output(int ran, int num) {
    while (1) {
        if (num != ran){
            if (num < ran) {
            printf("bigger than %d \n", num);  // 
            }
            else if (num > ran) {
                printf("smaller than %d.\n", num);
            }
            printf("insert a number : ");
            scanf("%d", &num);
        }
        else {
            break;
        }
    }
    return;
}

标签: crandominputoutput

解决方案


这段代码有很多问题和可能的简化。

  • 用于fgets读取一行然后读取scanf该行内容。这避免了myflush无法正常工作的需要。
  • random不需要该函数,因为选择随机数是一个简单的表达式。
  • 如果随机数的范围是 [1,100],则应使用1+rand()%100.
  • output由于它是主程序的核心,因此不需要该功能。然而,该input功能很好地保持封装输入。
  • 您应该测试的返回值,scanf因为输入可能并不总是包含一个数字。

这是提供所需输出的简化代码。

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#pragma warning (disable : 4996)

int input() {
    char line[100];
    int num, nVal;
    printf("insert a number : ");
    fgets(line, sizeof line, stdin);    
    nVal = sscanf(line, "%d", &num);
    while (nVal != 1 || num < 1 || num > 100) {
        printf("insert a number : ");
        fgets(line, sizeof line, stdin);    
        nVal = sscanf(line, "%d", &num);
    }
    return num;
}

int main()
{
    int cnt = 0, lowerLimit = 0, upperLimit = 101;

    srand((unsigned int)time(NULL));

    // pick a random number in the range [1,100]
    int ran = 1 + rand()%100;

    while(1) {
        cnt++;
        int num = input();
        if (num == ran)
            break;
        if (num > lowerLimit && num < upperLimit) {
            if (num < ran)
                lowerLimit = num;
            else
                upperLimit = num;           
        }
        printf("bigger than %d and smaller than %d\n", lowerLimit, upperLimit);
    }
    printf("You got it right on your %dth try!\n", cnt);
    return 0;
}

推荐阅读