在某些情况下(例如,使用input(),output()在编码“ C中猜测随机数”时出现一些问题

问题描述 投票:0回答:3

我尝试了不仅仅猜测随机数。条件是这些:

  1. 使用从1到100的数字,如果插入的数字不在此范围内,则显示重新输入数字的行

  2. 使用input()显示输出(但显示最后一行`在main()上显示“ N次尝试正确!”

  3. 使插入的号码继续显示在下一行。

基本上,该程序应显示为这样:

output()

我已经研究了6个小时了...(因为我是一个初学者)...而且值得庆幸的是,我已经能够设法获得基本结构,因此该程序至少可以能够显示该数字是否大于插入的数字,小于小于插入的数字。

问题是,我无法获得要在线显示的数字。例如,我无法在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! 上继续显示插入的数字70

而且,我无法找出如何获得尝试次数。我首先尝试将其作为smaller than 70放在input()中,但是在输出中失败了。然后,我尝试放入output(),但输出不会返回count = 0 ... count++;,因此再次失败。

我希望就此问题寻求建议。

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

fflush
c random input output
3个回答
1
投票

我无法找出如何获得尝试的次数。

#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; } 功能从output更改为void,以便它可以返回计数值,并为其他更改添加注释注释:

int

然后输入int output(int ran, int num) {//changed from void to int int count = 0;//create a variable to track tries while (1) { if (num != ran){ count++;//increment tries here and... 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 { count++;//... here break; } } return count;//return value for accumulated tries }

main

经过这些修改,您的代码按上述方式运行。(但是,对于第一次,第二次或第三次尝试,//declare count int count = 0; ... count = output(ran, num); printf("You got it right on your %dth try!", count); 的工作效果并不理想)


1
投票

如果您希望程序始终显示低于随机数(“大于”)的最高输入数字,而高于随机数(“小于”)的最低输入数字,则您的程序必须记住这两个数字,以便可以根据需要进行更新和打印。

在函数th中,您可以声明以下两个整数:

main

这些变量必须进入函数int bigger_than, smaller_than;,因为在程序的整个过程中都必须记住这些数字。函数main是唯一在整个程序中运行的函数,所有其他函数仅在短时间内运行。一种替代方法是将这两个变量声明为全局变量。但是,这被认为是不好的编程风格。

您可以将这两个变量初始化为值-1,以将其标记为无效(因为用户尚未输入任何数字)。当用户输入新数字时,当然必须更新这些变量。

每次调用时,这两个int必须传递给函数main,该函数的参数数量从2增加到4。

[如果您希望计数器对输入的数字进行计数,则还必须记住该值在函数main中(或作为全局变量)并将其传递给函数output。这会将函数的参数数量增加到5。

如果不想传递太多参数来输出,则可以将函数outputoutput的内容合并到函数input中。但是,我建议您先尝试解决该问题,而不要这样做。

[但是,无论哪种方式,您都必须将大多数“小于”和“大于”逻辑从函数main移至函数output,因为更改新的“ bigger_than”需要该逻辑以及属于函数main的int变量“ smaller_than”。函数main应该只包含实际的打印逻辑。

尽管从技术上可以从函数output内更改属于函数main的这两个变量,但我不建议这样做,因为那样会很麻烦。这将需要您将几个指针传递给函数output,这将允许该函数更改属于函数output的变量。]​​>


0
投票

此代码中有很多问题,可能还会简化。

© www.soinside.com 2019 - 2024. All rights reserved.