✔ 最佳答案
首先我想告訴你, 你的 int array a[7][5] 有問題, 這個 array 只有 7 x 5 = 35格, 你怎可以放42個數字入去?
你是想把 42 個學號像洗啤牌那樣洗勻吧? 如果你單純使用 rand()%42+1, 有可能出現相同的號碼. 簡單的洗牌方法有好幾個, 最易寫的是使用 "交換" (swap).
1. 設一個42格的 int array, 填上 1 至 42 號.
2. 隨機選兩格, 把內容互相交換.
3. 重覆第 2 步很多次. (例如 100 次)
4. 把 array 列印出來.
int array[42];
int i, temp, a, b;
srand(time(NULL));
/* 第 1 步 */
for(i=0; i<42; i++)
array[i] = i+1;
/* 第 2 和 第 3 步 */
for(i = 0; i<100; i++)
{
/* 隨機選兩格, 就算相同也沒關係 */
a = rand()%42;
b = rand()%42;
/* 把兩格的內容對調 */
temp = array[a];
array[a] = array[b];
array[b] = temp;
}
/* 第 4 步 */
for(i = 0; i< 42; i++)
{
printf("%2d ", array[i]);
if((i%5 == 0) && (i != 0) && (i != 40))
printf("\n");
}
事實上, 2維的 array 也不需要用. 想把號碼洗得更勻, 把 100 改成 1000 便可以了.
2008-01-25 23:21:38 補充:
回補充:0-5的確有六格, 但你宣告 array 時便要用int a[6] 才可以.宣告了 int a[6] 的話, 你可以用 a[0] (第一格), a[1] (第二格)... 至 a[5] (第六格), 但 a[6] 是不存在的. 所以, 你宣告了 int a[5] 的話, 只能用 0 至 4.
2008-01-25 23:22:00 補充:
雖然那些<全變了&lt;, ”又變了&quot;(可惡的 Yahoo 知識沒有 [code][\code]的功能), 但以上的程式執行後也會像個列表般 print 出來. 在 data 層面 (例如 array) 和用家看到的層面 (print 出畫面) 是分開的, 我們看到是個表格的東西在 data 未必是個表, 相反在 data 是個表的話我們也未必會看到像個表.
2008-01-25 23:22:38 補充:
如果堅持想用二維的陣列的話, 再使用 swap 方法會變得太複雜. 當然可以在「洗牌」完畢後才把 array[] 的內容填到你想要的二維陣列, 例如:
2008-01-25 23:22:55 補充:
/* 開頭加入這些宣告 */int finalArray[8][6];int row, col;/* 把資料填入 */row = 0;col = 0;for(i = 0; i
2008-01-25 23:24:01 補充:
亂碼了./* 開頭加入這些宣告 */int finalArray[8][6];int row, col;/* 把資料填入 */row = 0;col = 0;for(i = 0; i<42; i++){ finalArray[row][col]=array[i]; col++; if((i%5 == 0) && (i != 0) && (i != 40)){row++;col = 0;}}
2008-01-25 23:25:18 補充:
你這個問題中, 最麻煩的是中間的行數全少了一個座位, 導致這個陣列出現了多餘的位置, 這是一個難搞的情形. 如果可以話, 用 struct 來處理會比較好.(呀... 補充限字數太嚴格了. 想多打一些也不能.)