我想编写一个简单的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个插槽。这是一个缓冲区溢出错误。

10-04 20:48