gpt4 book ai didi

c - 高尔顿箱/ bean 机-C

转载 作者:行者123 更新时间:2023-11-30 18:38:47 26 4
gpt4 key购买 nike

我想编写一个简单的 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 在循环开始处有一个垃圾值来打印 #s.

因此,我在调试器中运行了您的代码,并在它开始打印大量哈希值时暂停了它。我检查了 y 的值,果然这是一个不可行的高数字。

然后我检查了 y 来自哪里,发现你从 slotarray 获取它。我在调试器中打印它,发现其中的所有值都高得不可行或大为负数。显然,slotarray 没有正确初始化,所以我寻找它的初始化位置并宾果游戏!

堆栈变量(slotarray 就是其中之一)必须在 C 中显式初始化。我通过调用 memset 修复了您的代码。

我刚刚概述的整个调试过程花费了不到一分钟的时间。

预计到达时间@EOF指出,还有另一个错误,slotarray 被定义为包含 9 个槽(索引为 0 - 8),但您允许人们输入 10 个槽。这是一个缓冲区溢出错误。

关于c - 高尔顿箱/ bean 机-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32499709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com