作者shesee (秘密)
看板C_and_CPP
標題[問題] 陣列 數據會多一筆
時間Wed Aug 18 12:29:40 2010
遇到的問題: (題意請描述清楚)
一個把檔案中奇數與偶數分類並排序的程式
偶數的部分資料尾端會多一個數據 ("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