我想编写一个简单的bean机器程序。该程序将接受用户输入的球数和插槽数,并计算每个球的路径。每个插槽中的球数也将打印为直方图。
我尽力使代码简短而甜美,但我管理的最佳长度是112行。运行代码时,我没有收到任何错误。但是,输出似乎遇到了某种无限循环(用于表示直方图中数字的“#”符号由于我不知道的某些原因而一直永久打印)。
显然,我的逻辑有些地方不对……或者是语法上的一个愚蠢的小错误(但是它会显示为错误,不是吗?)……简而言之,我无法弄清楚到底是什么问题。 (我试图从头到尾遍历整个代码过程,但是我的头脑一直纠结在代码中间的某个地方,也没有接近代码结尾的地方)。
我的逻辑到底出了什么问题?(或者我对整个问题采取了错误的方法?)我不想知道正确的代码,因此我可以在重新编辑代码的整个过程中学习。
非常感谢您提供任何帮助(希望仅提供模型代码的答案),即使只是一个注释也是如此! :)
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <stdbool.h>
#include <time.h>
//Pls excuse my extensive use of libraries even though I don't really use them
int intchecker(float x)
{
if (floor(x)==x && ceilf(x)==x)
{
return 0;
}
else {
return 1;
}
}
int main(){
char line[] = " +----+----+----+----+----+----+----+----+----+----+---+";
char numbers[] = " 0 5 10 15 20 25 30 35 40 45 50";
float balls,slots;
int slotarry[9],tlevel,ballnum,column,lcounter=0,slotsduplicate=1,y;//tlevel-number of levels in the triangle
srand(time(NULL));
int r;
printf("==========================================================\nGalton Box Simulation Machine\n==========================================================\n");
printf("Enter the number of balls [5-100]: ");
scanf("%f",&balls);
while (balls>100 || balls<5) {
printf("\nInput is not within the range. Please try again.");
printf("\nEnter the number of balls [5-100]: ");
scanf("%f",&balls);
}
while (intchecker(balls)==1) {
printf("\nInput is not an integer. Please try again.");
printf("\nEnter the number of balls [5-100]: ");
scanf("%f",&balls);
}
printf("Enter the number of slots [2-10] : ");
scanf("%f",&slots);
while (slots>10 || slots<2) {
printf("\nInput is not within the range. Please try again.");
printf("\nEnter the number of slots [2-10] : ");
scanf("%f",&slots);
}
while (intchecker(slots)==1) {
printf("\nHow can there be a fraction of a slot? Please re-enter slot number.");
printf("\nEnter the number of slots [2-10] : ");
scanf("%f",&slots);
}
tlevel=slots-1;
for(ballnum=1,column=0;balls>0;balls--,ballnum++,column++){
if (column%5==0){
printf("\n");
}
if (ballnum<10){
printf("[0%d]",ballnum);
}
else{
printf("[%d]",ballnum);
}
for(;tlevel>0;tlevel--){
r = rand() % 2;
if (r==0){
printf("R");
}
else {
printf("L");
lcounter++;
}
}
slotarry[lcounter]++;
tlevel=slots-1;
lcounter=0;
printf(" ");
}
printf("\n\n%s",numbers);
printf("%s",line);
char line2[] = "\n +----+----+----+----+----+----+----+----+----+----+---+";
for(;slotsduplicate<=slots;slotsduplicate++){
if (slotsduplicate<10){
printf("0%d|",slotsduplicate);
}
else{
printf("%d|",slotsduplicate);
}
y=slotarry[slotsduplicate];
if (y==0){
printf(" 0");
}
else{
for (;y>0;y--){
printf("#");
}
printf(" %d",slotarry[slotsduplicate]);
}
printf("%s",line2);
}
return 0;
}
注意:这并非完全没有错误。这只是我的初稿。我只想找出为什么存在无限循环。
最佳答案
这是我发现问题的方式。首先,我认为在初始赋值部分中有一个for循环而没有任何内容的代码有点怪味。加上似乎永远打印#
的事实,并且看起来y
在循环开始时有一个垃圾值来打印#
。
因此,我在调试器中运行了您的代码,并在它开始打印大量哈希值时将其暂停。我检查了y
的值,并确定它是一个太大的数字。
然后我检查了y
的来源,发现您是从slotarray
那里获得的。我在调试器中打印了它,发现其中的所有值都是不可行的高数值或负整数。显然,slotarray
没有正确初始化,所以我寻找了它的初始化位置和宾果游戏!
堆栈变量(slotarray
是其中的一个)必须在C中显式初始化。我通过调用memset
修复了代码。
我刚刚概述的整个调试过程花费了不到一分钟的时间。
ETA正如@EOF指出的那样,还有一个错误,就是slotarray
定义为包含9个插槽(索引为0-8),但是您允许人们输入10个插槽。这是一个缓冲区溢出错误。