2016-10-05 120 views
3

编辑:非常感谢你(大家!)为您的意见!在您的指导下,我能够解决胜利百分比和乱数阵列数。然而,我还没有解决输赢的平均投注数量。我更新了我的代码,现在在下面。For循环和阵列在C

开始原帖:

谢谢你在前进的人谁读取这个或建议达到了!

所以我正在做定型赌博,直到你赢了,或者它已经没有了编程课程的介绍。代码工作得很好,除非我实际上添加了头部或尾部部分 - 那么我的数组可以让投注数量变得混乱。当我使用笔记来隐藏实际的投币部分时,阵列工作正常。当我用掷硬币来运行它时,betArray商店真的是不可思议的数字(负数,十亿中的整数)。

这是迄今为止代码:

如果
#include<stdio.h> 
#include<stdlib.h> /*Enables use of rand()*/ 

int main() { 

    setvbuf(stdout, NULL, _IONBF, 0); /*Allow me to use repl.it*/ 

    /*Enter Gambler's name*/ 

    char gambleName[15] = ""; 
    printf("Enter gambler's name:\n"); 
    scanf("%s", gambleName); 
    printf("\nWelcome, "); 
    printf("%s! \n", gambleName); 

    /*Enter Stakes*/ 
    int availableFunds; 
    int goalFunds; 
    printf("We'll be betting $1 per bet. Enter your available funds:\n"); 
    scanf("%d", &availableFunds); /* Saves stakes as availableFunds */ 
    int seedVal=4; 
    srand(seedVal); 
    /*Butter the gamblers up*/ 
    if(availableFunds>=1) { 
     printf("%d? Wow, %s - that's a great start!\n",availableFunds, gambleName); 
     /*Enter Goal*/ 
     printf("How much do you want to win today? Enter a value up to 10000 with no commas, decimals or spaces:\n"); /*Saves goal as goalFunds*/ 
     scanf("%d",&goalFunds); 
     /*Recognize ambitious gamblers*/ 
     if (goalFunds > 10*availableFunds) { 
      printf("Wow, ambitious! Let's get started.\n"); 
     } 
     else { 
      printf("OK, let's get started!\n"); 
     } 
     printf("\n"); 
     /*begin gambling problem*/ 
     int betArray[1000]={0}; 
     int game = 0; 
     int bet=0; 
     float wins = 0; 
     int losses = 0; 
     for (game=0 ; game<1000; game++) { 
      if (availableFunds>0 && availableFunds<goalFunds) { 
       int toss = rand()%2; 
       bet+=1; 
       /*losing bet*/ 
       if (toss == 0) { 
        availableFunds -= 1; 
        losses += 1; 
       } 
       /*winning bet*/ 
       else { 
        availableFunds += 1; 
        wins += 1; 
       } 
       betArray[game+1] = bet; 
      } 
      else { 
       break; 
      } 
     } 
     int sumBet = 0; 
     for (game=0;game<1000;game++) { 
      sumBet+=betArray[game]; 
     } 
     float betAverage = sumBet/1000; 
     float winOutOfGames = wins/1000; 
     float winPercent = winOutOfGames*100; 
     /*print totals*/ 
     printf("%d games played with:\n",game); 
     printf("%.f goals reached\n",wins); 
     printf("%d down-and-out losses.\n",losses); 
     printf("You won ~%.1f%% of your games.\n",winPercent); 
     printf("On average, it took you %.f bets to win or go broke.\n",betAverage); 
     printf("\n"); 
     printf("Thanks for playing!\n"); 
     for (game = 1; game <= 50; game++) { 
      printf("Bets in game [%d] = %d\n",game,betArray[game]); 
     } 
    } 
    /* Send the broke guys packing*/ 
    else { 
     printf("$%d...? You may need to stop at an ATM... ¯\\_(ツ)_/¯ See you next  time!\n", availableFunds); 
    } 
    return 0; 
} 

对不起的代码是有点乱,我加了一些东西,试图想发送的最新版本。

谢谢!

+1

你使用过调试器吗? – kaylum

+0

我感觉不好,但我不知道这意味着什么。我在Mac OSX上,调试器上的任何建议? –

+1

里面的if(availableFunds> 0 && availableFunds

回答

2

C编译没有任何警告,正如你的那样,仍然可以包含许多内存问题,会导致奇怪和难以重现的行为。要找到它们,请使用内存检查程序,如Valgrind

用Valgrind的运行你的游戏揭示了一个问题...

... 
Bets in game [27] = 28 
==27110== Conditional jump or move depends on uninitialised value(s) 
==27110== at 0x1001F08A7: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1002166C0: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x100216952: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EC381: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EA21B: printf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x100000CAB: main (test.c:75) 
==27110== 
==27110== Conditional jump or move depends on uninitialised value(s) 
==27110== at 0x1001F0E90: __ultoa (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EE364: __vfprintf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1002166C0: __v2printf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x100216952: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EC381: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EA21B: printf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x100000CAB: main (test.c:75) 
==27110== 
==27110== Syscall param write(buf) points to uninitialised byte(s) 
==27110== at 0x1002F7612: write$NOCANCEL (in /usr/lib/system/libsystem_kernel.dylib) 
==27110== by 0x1001EB1F9: _swrite (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001E3724: __sflush (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x100216966: __xvprintf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EC381: vfprintf_l (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x1001EA21B: printf (in /usr/lib/system/libsystem_c.dylib) 
==27110== by 0x100000CAB: main (test.c:75) 
==27110== Address 0x104800e14 is on thread 1's stack 
==27110== in frame #3, created by __xvprintf (???:) 
==27110== 
Bets in game [28] = 0 
... 

这些都是堆栈跟踪。你通常从下往上阅读它们来找出问题的根源在哪里。 Valgrind的检测到你传递一个未初始化值printf上线75

test.c的线74-76此:

for (game = 0; game < 50; game++) { 
    printf("Bets in game [%d] = %d\n",game,betArray[game]); 
} 

问题是betArray。看看它初始化的位置就会发现问题。

int betArray[1000]; 

这只分配内存,但它不会初始化它。 betArray包含发生在该内存位置的任何垃圾。因此你的数字。你必须初始化它。以下for循环应该设置每个元素,但它不会。

for (game=0 ; game<1000 ; game++) { 
    if (availableFunds>0 && availableFunds<goalFunds) { 
     ...blah blah blah... 
     betArray[game] = bet; 
    } 
    else if (availableFunds == 0 || availableFunds >= goalFunds) { 
    } 
} 

但你for仅环有时betArray初始化。其他时间没有。看起来你打算填写更多的代码,但决定尝试一下。所以你只剩下部分初始化的betArray

简单的解决方案是在声明它时立即初始化betArray

int betArray[1000] = {0}; 

This will initialize all elements to 0并修复你的数字问题。

1

正如您在对问题的评论中提到的那样,目前的问题似乎是整数除法。在C中,当你除以两个整数时,例如,489/1000 = 0,但是489 % 1000 = 489给出余数。当在C中使用整数类型时,/是整数除法,并且%是模数运算符。您尝试分隔两个ints这里:

int winRatio = wins/game; 

所以winRatio将是0,除非玩家赢得每场比赛,你应该改变winRatiofloat,你可能想winPercent是(或更多的比赛比的玩法!)浮子:

float winRatio = (1.0 * wins)/game; 
float winPercent = winRatio * 100; 

在第一条语句,而winsgameint s时,表达(1.0 * wins)float,因为乘法瓦特的ith float文字1.0。出于同样的原因,整个表达式的类型为float,并且该值可以分配给float变量winRatio。这被称为“类型强制”或“类型转换”。由于winRatiofloat,因此表达式winRatio * 100的值也是float,可以指定为float winPercent

你不计算betAverage,我不确定你在这里计算什么。最后,正如在评论中也指出的那样,bet随着每场比赛而递增,但每场比赛的支出为1美元。您可能希望保持每场1美元的赌注,但也许您想增加支出以跟上增加的赌注。

+0

这帮了很多,谢谢。我认为在我的第一个if(availableFunds> 0 && availableFunds