[問題] 陣列 數據會多一筆

看板C_and_CPP (C/C++)作者 (秘密)時間15年前 (2010/08/18 12:29), 編輯推噓2(2018)
留言20則, 3人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 一個把檔案中奇數與偶數分類並排序的程式 偶數的部分資料尾端會多一個數據 ("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

08/18 12:40, , 1F
第二個連結似乎有設權限
08/18 12:40, 1F

08/18 12:41, , 2F
更改成public了
08/18 12:41, 2F

08/18 12:44, , 3F
有人跟我一樣程式碼開不起來的嗎?
08/18 12:44, 3F
l大感謝提醒,我剛剛用沒事現在自己也開不起來 囧 先把code貼在bbs上,沒有上色會亂一點。

08/18 12:44, , 4F
你有試過以下幾種狀況的prior run嗎?
08/18 12:44, 4F

08/18 12:44, , 5F
1. 輸入資料是空的.
08/18 12:44, 5F

08/18 12:45, , 6F
2. 輸入資料只有一筆, "1".
08/18 12:45, 6F

08/18 12:45, , 7F
3. 輸入資料只有一筆, "2".
08/18 12:45, 7F

08/18 12:46, , 8F
4. 輸入資料有二筆, "1", "3".
08/18 12:46, 8F

08/18 12:46, , 9F
5. 輸入資料有二筆, "2", "4".
08/18 12:46, 9F

08/18 12:46, , 10F
6. 輸入資料有二筆, "1", "2".
08/18 12:46, 10F
有試過未排序前把input資料直接輸出/分類後輸出, 如果直接用for迴圈指定陣列大小250就不會有這個問題, 但是我想說要是資料量龐大,用人眼算不出來的時候總不能也這樣子XD ※ 編輯: shesee 來自: 140.116.75.177 (08/18 12:50)

08/18 12:47, , 11F
假如是我遇到這種情況,通常會回頭檢查最簡單的輸入測試
08/18 12:47, 11F

08/18 12:48, , 12F
下, 是否會出錯. (當然假如能夠腦內模擬出更好!)
08/18 12:48, 12F

08/18 12:54, , 13F
上面的test case, 又可分成直接餵資料法/從檔案讀入法
08/18 12:54, 13F

08/18 12:55, , 14F
根據原PO的回應, 有可能是讀檔最後一筆出的狀況
08/18 12:55, 14F

08/18 12:57, , 15F
你讀入檔的最後一行是什麼? 資料或是單純的換行?
08/18 12:57, 15F

08/18 13:09, , 16F
讀資料請用 fscanf(f,"%d", &a[count]) != EOF 當迴圈
08/18 13:09, 16F

08/18 13:10, , 17F
測試條件, 因為你要判斷的是「能不能成功讀入數字」
08/18 13:10, 17F

08/18 13:10, , 18F
而不是「能讀就好,但是請給我一個數字」
08/18 13:10, 18F

08/18 13:11, , 19F
你寫的程式碼屬於後者, 所以並不保證讀出來是可以用的
08/18 13:11, 19F

08/18 18:34, , 20F
感謝l大師解答,及e大師提供的簡化問題方法。
08/18 18:34, 20F
文章代碼(AID): #1CQs6vIh (C_and_CPP)
文章代碼(AID): #1CQs6vIh (C_and_CPP)