2011-11-27 44 views
0

我想確定爲什麼向數組寫入隨機值導致問題。爲什麼在向數組寫入值時出現錯誤?

其實我問[R and() 1至10個之間產生的數字(rand() %10 +1,與srand(time(NULL))前)和第一個值始終高於10:這是一個隨機過,我真的不知道該怎麼10和20之間。以解決這個問題,因爲它看起來像是randsrand函數的問題。不過這是我的代碼:

編輯:正確的代碼,現在

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define SIZEA 100 
#define SIZEFREQ 10 

int main() 
{ 
    int a[SIZEA]={0},frequency[SIZEFREQ]={0}; 
    int i,temp,gothrough; 

    srand(time(NULL)); 

    for(i=0;i<=SIZEA-1;i++) 
    { 
     a[i]=rand() %10 +1; 
     ++frequency[a[i]-1]; 
    } 

    printf("These are the elements in the vector:\n"); 
    for(i=0;i<=SIZEA-1;i++) 
    { 
     printf("%3d,",a[i]); 
    } 

    printf("\nLet's try to put them in order\n"); 
    for(gothrough=0;gothrough<=SIZEA-1;gothrough++) 
    { 
     for(i=0;i<=SIZEA-2;i++) 
    { 
     if (a[i]>a[i+1]) 
     { 
      temp=a[i]; 
      a[i]=a[i+1]; 
      a[i+1]=temp; 
     } 
    } 
} 

for(i=0;i<=SIZEA-1;i++) 
{ 
    printf("%3d,",a[i]); 
} 

printf("\n\nValue Frequency\n"); 
for(i=0;i<=SIZEFREQ-1;i++) 
{ 
    printf("%5d%10d\n",i+1,frequency[i]); 
} 

return 0; 
}` 
+0

'rand()%10 + 1'可以返回'[1; 10]'區間之外的值。我已經運行了你的代碼,它似乎工作得很好。 – NPE

+0

最後一個循環將輸出未定義行爲的頻率[11]。這可能是你困惑的根源嗎? – 2011-11-27 16:36:34

+0

當您添加新代碼*爲什麼*您保留了不正確的版本?如果任何人想看看曾經在那裏的東西,他們可以看看編輯歷史記錄(點擊它表示「已編輯的時間戳」的時間)。 – dmckee

回答

1

原因很簡單。

a[i]爲1和10之間,因此當你寫:

++frequency[a[i]+1]; 
您正在填充索引2到的 frequency 11。但是, frequency僅具有索引0至10.因此,您正在檢查數組 frequency和數組 a並寫入 a[0]。當 a[i]爲10時會發生這種情況。由於有100個數字,所以有10%的機率得到10,你增加 a[0](增加 frequency[11])約10倍。由於第一個值也是1到10之間,終值獲取編輯10和20

之間

出於同樣的原因,你的索引 a從0到 SIZE-1,你也應該指數 frequency從0到10。你正在做的是創建1到10的指數, 也+1他們!例如,這在這裏:

for(i=1;i<=10;i++) 
    printf("%5d%10d\n",i,frequency[i+1]); 

應該i而不是i+1

或者,你可以有

for(i=0;i<10;i++) 
    printf("%5d%10d\n",i,frequency[i]); 

通知從0這兩個出發,不會10,和索引frequency

for(i=1;i<=10;i++) 
    printf("%5d%10d\n",i,frequency[i-1]); 

that inde xes frequency通過i-1使索引正確。

+0

我現在已更正了我的源代碼,如下所示:http://pastebin.com/evtivzRv – user1068051

+0

好。在您的代碼中,請記得將'%10'更改爲'%SIZEFREQ';) – Shahbaz

0

我編譯你的代碼,並生成1到10之間是沒有辦法克服的範圍0-9(或1 - 10帶+1),使用%,因爲一旦它達到10,那就意味着/會更高,並且模必須從0開始。編輯:你不能將30除以10並且說它是2,餘數爲10,因爲這個餘數將轉化爲十分之一的+1,即30除以10 = 3並且餘數爲0.

相關問題