看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題: (題意請描述清楚) 一個把檔案中奇數與偶數分類並排序的程式 偶數的部分資料尾端會多一個數據 ("0",因為陣列初始值為0) 希望得到的正確結果: 資料中並沒有0這個數字,所以分類排序後應該沒有0 程式跑出來的錯誤結果: 同問題 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 2008 有問題的code: (請善用置底文標色功能) code http://codepad.org/VVnoZpmU input檔案 http://ppt.cc/9QpQ /**** 這是為了分類並排序奇偶摻雜之數字資料的程式 ****/ #include <stdio.h> #include <stdlib.h> #define MAX 500 #define SWAP(x,y) {int t; t = x; x = y; y = t;} void selectionSort(int[], int); //排序用函數 void main() { FILE *f , *f_odd , *f_even ; //讀取原檔,分類成奇數檔\偶數檔 int a[MAX] = {0} ; //陣列大小不確定 約數百個整數 int i ; int count = 0; //計算陣列大小所用 /*** 開啟檔案 ***/ f = fopen("input.txt","r"); f_odd = fopen("odd.txt","w"); f_even = fopen("even.txt","w"); /*** 確定檔案確實開啟 ***/ if(f != NULL) { /**** 初始讀入之紊亂數據 ****/ while(!feof(f)) { fscanf(f,"%d", &a[count]); count++; } /**** 使用選擇排序法排序 ****/ selectionSort(a,count); /**** 奇偶分類: number & 1 等於1者為奇數,其餘為偶數 ****/ for(i = 0 ; i < count ; i++) { if((a[i] & 1) == 1) { fprintf(f_odd,"%d\n",a[i]); } else fprintf(f_even,"%d\n",a[i]); } /**** 關閉檔案 ****/ fclose(f); fclose(f_odd); fclose(f_even); printf("數字排序分類完成!\n"); } /*** 當檔案開啟失敗 ***/ else printf("開啟檔案失敗!"); system("pause"); } /**** 選擇排序法函數部分 ****/ void selectionSort(int b[] , int c) { int k; for(k = 0; k < c; k++) { int m = k; int j; for(j = k+1; j < c; j++) if(b[j] < b[m]) m = j; if(k != m) SWAP(b[k], b[m]) } } 補充說明: 有嘗試做過許多處的小更改,不過還是不知道癥結點在哪裡, 感謝前輩解答。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.75.177
ericinttu:第二個連結似乎有設權限 08/18 12:40
shesee:更改成public了 08/18 12:41
loveme00835:有人跟我一樣程式碼開不起來的嗎? 08/18 12:44
l大感謝提醒,我剛剛用沒事現在自己也開不起來 囧 先把code貼在bbs上,沒有上色會亂一點。
ericinttu:你有試過以下幾種狀況的prior run嗎? 08/18 12:44
ericinttu:1. 輸入資料是空的. 08/18 12:44
ericinttu:2. 輸入資料只有一筆, "1". 08/18 12:45
ericinttu:3. 輸入資料只有一筆, "2". 08/18 12:45
ericinttu:4. 輸入資料有二筆, "1", "3". 08/18 12:46
ericinttu:5. 輸入資料有二筆, "2", "4". 08/18 12:46
ericinttu:6. 輸入資料有二筆, "1", "2". 08/18 12:46
有試過未排序前把input資料直接輸出/分類後輸出, 如果直接用for迴圈指定陣列大小250就不會有這個問題, 但是我想說要是資料量龐大,用人眼算不出來的時候總不能也這樣子XD ※ 編輯: shesee 來自: 140.116.75.177 (08/18 12:50)
ericinttu:假如是我遇到這種情況,通常會回頭檢查最簡單的輸入測試 08/18 12:47
ericinttu:下, 是否會出錯. (當然假如能夠腦內模擬出更好!) 08/18 12:48
ericinttu:上面的test case, 又可分成直接餵資料法/從檔案讀入法 08/18 12:54
ericinttu:根據原PO的回應, 有可能是讀檔最後一筆出的狀況 08/18 12:55
ericinttu:你讀入檔的最後一行是什麼? 資料或是單純的換行? 08/18 12:57
loveme00835:讀資料請用 fscanf(f,"%d", &a[count]) != EOF 當迴圈 08/18 13:09
loveme00835:測試條件, 因為你要判斷的是「能不能成功讀入數字」 08/18 13:10
loveme00835:而不是「能讀就好,但是請給我一個數字」 08/18 13:10
loveme00835:你寫的程式碼屬於後者, 所以並不保證讀出來是可以用的 08/18 13:11
shesee:感謝l大師解答,及e大師提供的簡化問題方法。 08/18 18:34