2014-11-02 36 views
0

所以我創建隨機值的彩票,然後分類整理。我不擔心分揀技術,因爲老師是不是找這個任務類等,以及但是它的工作原理,我生產我的票值 - 儘管使用函數srand(時間(0)),然後後來蘭特()%40 + 1 - 我認爲應該使我的隨機數在1-40之間...但mainTicket [0]總是等於0.任何想法?對格式的抱歉,讓我添加額外的空間,並搞亂我的注意力。問題與C++函數srand值

#include <iostream> 
#include <cstdlib> 
#include <time.h> 

using namespace std; 

void mainLotto (int main[]); 
void lottoSort (int ticketArr[]); 

int main() 
{ 
int mainTicket[5]; 

srand (time(0)); 

mainLotto(mainTicket); 

do 
{ 
    lottoSort(mainTicket); 
} while (mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2] || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4] || mainTicket[4] > mainTicket[5]); 

for (int i = 0; i < 5; i++) 
{ 
    cout << mainTicket[i] << "\n\n"; 
} 

return 0; 
} 

/// 
/// <> Creates the actual lottery ticket 
/// 
void mainLotto (int main[]) 
{ 
// Creating the ticket 
for (int i = 0; i < 5; i++) 
{ 
    main[i] = rand() % 40 + 1; 
} 
} 

/// 
/// <> Sorts the actual lottery ticket 
/// 
void lottoSort (int ticketArr[]) 
{ 
// Sorting the ticket 
for (int j = 0; j < 5; j++) 
{ 
    if (ticketArr[j] > ticketArr[j+1]) 
    { 
     int temp; 

     temp = ticketArr[j+1]; 

     ticketArr[j+1] = ticketArr[j]; 

     ticketArr[j] = temp; 
    } 
} 
} 
+1

'ticketArr [J + 1]'去出界 – Galik 2014-11-02 00:57:30

+0

的只是一個提示需要進一步考慮:儘量限制自己的理智線長度像80左右,尤其是在你的代碼發佈到網上。 Focing讀者水平滾動是非常糟糕的魔咒。此外,適當的縮進(選擇常用樣式之一,如K&R)始終適用,這不僅在這裏,而且對您自己也很有幫助。 – Deduplicator 2014-11-02 01:09:57

+0

我使用縮進的恆定形式,但我不縮進最重要的東西,這是我對編碼在這裏做。不過,我可以開始做這件事,以備將來使用,謝謝你的提示! – ldehart 2014-11-02 01:18:45

回答

2

我看到正在訪問的兩個問題,你的數組越界:

這裏:

int main() 
{ 
    int mainTicket[5]; 

    srand(time(0)); 

    mainLotto(mainTicket); 

    do 
    { 
     lottoSort(mainTicket); 
    } 
    while(mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2] 
     || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4]); 
//  || mainTicket[4] > mainTicket[5]); // OUT OF BOUNDS!!! 

    for(int i = 0; i < 5; i++) 
    { 
     cout << mainTicket[i] << "\n\n"; 
    } 

    return 0; 
} 

這裏:

void lottoSort(int ticketArr[]) 
{ 
    // Sorting the ticket 
    for(int j = 0; j < 4; j++) // j < 4 NOT 5!!! <== WAS OUT OF BOUNDS 
    { 
     if(ticketArr[j] > ticketArr[j + 1]) 
     { 
      int temp; 

      temp = ticketArr[j + 1]; 

      ticketArr[j + 1] = ticketArr[j]; 

      ticketArr[j] = temp; 
     } 
    } 
} 

可能的排序過程從數組邊界外拖出一個零。

+0

哇,我錯過了條件語句,以及...它就像現在的魅力,謝謝你們! – ldehart 2014-11-02 01:06:09

2

我剛剛打印你自稱是始終爲零的項目,在mainLotto()後,它產生了30

我懷疑問題出在那裏,你告訴我們不要看。 :)

在排序功能你做:

for (int j = 0; j < 5; j++) { 
    if (ticketArr[j] > ticketArr[j + 1]) { 

數組的大小爲5,你的j將最終等於4

然後你做ticketArr[j + 1]的值,這實際上是出境出入境。

修復的方法是去,直到4在你的循環,而不是5

正如Galik說,mainTicket[4] > mainTicket[5]也是一個出界訪問和閱讀我的答案後,你應該能夠理解爲什麼。 :)

+0

啊,我完全錯過了!關於如何重寫它以確保我永遠不會超出範圍的任何建議?嘗試j和j-1的組合,但我沒有太大的成功。 – ldehart 2014-11-02 01:02:29

+0

你的循環應該去,直到4,不是5 @ldehart – gsamaras 2014-11-02 01:04:26