c - 在某些条件下(例如使用 input()、output())编码“猜测 C 中的随机数”时的一些问题
问题描述
我尝试超越仅仅猜测随机数。条件如下:
使用
input()
从 1 到 100 使用的数字,如果插入的数字超出此范围,则显示一行以重新输入数字用于
output()
显示输出(但显示最后一行```你在第 N 次尝试时做对了!“在 main() 上)使插入的数字继续显示在下一行。
基本上,程序应该显示如下:
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;
}
解决方案
这段代码有很多问题和可能的简化。
- 用于
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;
}
推荐阅读
- r - R在一个时间序列中删除多个季节性
- mysql - 每个工厂的前 10 名高产量
- ios - TableViewCell 中的 TableView 与 RxSwift 绑定
- r - 使用 ggplot2 和 grid.arrange 均衡多图图中的面板高度
- c++ - std::cout 内的三元条件运算符
- python - 根据Python中的索引列表从位数组中提取位?
- javascript - Outlook 加载项中是否有取消会议功能,例如发送时
- python - 为什么 TensorFlow 2.1 不能识别我的 GPU?
- swift - 错误:执行被中断,原因:信号 SIGABRT。在快速的操场上
- vue.js - nginx反向代理背后的Nuxt.js应用程序一次加载多个页面