English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

讀取的資料有小數  像是A    M    N    O    PA1  2.6  3.2  1.2  5.9A2  0.2  .    2.3  2.6A3  .    2.6  0.2  .想計算有幾個遺漏值"."  上面有3個該怎麼計次我用ch=fgetc(file); if(ch == \'.\') P++;算出來有12個應該怎麼修改謝謝 

2006-07-14 19:40:40 · 3 個解答 · 發問者 Anonymous in 電腦與網際網路 程式設計

如果想知道遺漏值的位置
該怎麼寫?
ex (A2,N)

2006-07-14 20:05:09 · update #1

每個數都是小數 = =

2006-07-14 20:43:52 · update #2

遺漏值是指前後都沒數字 只有 .
前沒:c=fgetc(f); if (c!='.') p=c; else if (isdigit(p)) P++;
後沒:c=fgetc(f); if (c=='.') ; if (isdigit(c)) P++;
看不太懂是什麼意思...

2006-07-14 21:10:56 · update #3

我改成
ch=fgetc(f);
if(isdigit(ch)==0) P++;
不過跑出來不太對
(c!='.')該怎麼加

2006-07-14 21:47:09 · update #4

請問Jacob Lee
為什麼要寫
if (!isdigit(p_w)) p_w為什麼不可以用ch代替
後面才看到p_w = Word;
這樣不是很奇怪
不太懂p_w在裡面的作用
可以請教一下嗎
謝謝

2006-07-15 10:15:20 · update #5

3 個解答

遺漏值的定義是啥?
是前面沒有數字?是後面沒有數字?是前後都沒有數字?
前沒:c=fgetc(f); if (c!='.') p=c; else if (isdigit(p)) P++;
後沒:c=fgetc(f); if (c=='.') {c=fgetc(f); if (isdigit(c)) P++;
這樣,〝前後沒〞該怎麼寫,會了?

要知道位置,那就要對原始文字檔做點限制,程式會比較好寫。
如:不可有 tab。
你可以用
fseek(f, 算出第幾列第幾個是從哪個byte開始, SEEK_SET); //SEEK_SET是從檔頭開始算的意思
來開始,在你定義的 field_width 裡找〝遺漏值〞

算出第幾列第幾個是從哪個byte開始:Ax 第 y 欄(共 z 欄)( x, y 從 0 算起, z 從 1 算起)
( x * z + y ) * field_width
就可以了。

2006-07-15 02:55:03 補充:
isdigit(c) == 1 if 0 <= c <=9otherwise == 0所以, if (isdigit(c)) P++; 就夠了, 不要加 ==0

2006-07-15 05:04:49 補充:
遺漏值是指前後都沒數字 只有 . 前沒 ( . 或 .0):後沒 ( . 或 0.):都沒 ( 只有 .  。  .0 或 0. 都不算)

2006-07-15 12:04:11 補充:
#include #include int main(){ int tot, row, col; char word, p_w; FILE *f; p_w = tot = row = col = 0; f = fopen("b.txt", "r"); while ((word=fgetc(f)) != EOF) { if (word =='\n') row++, col=0; if (word == ' ' && p_w != ' ') col++; // 不是連續空白

2006-07-15 12:04:54 補充:
if (word == '.') if (!isdigit(p_w)) // 前一字不是數字 { printf("The %d row %d col misses a value.\n", row, col); tot++; } p_w = word; } printf("Total missed: %d\n", tot); return 0;}

2006-07-15 14:56:05 補充:
p_w Previous Word 應該是 Previous Character 才對,當時想睡覺,用錯字了!你的題目一定要檢查連續的 2 個字:這個和下個,或這個和上個。我不想用下個(compiler 常用的方法),我想用上個。而 p_w 在一開始設為 0 ,沒有 字碼是 0 的文字。所以,iteration 1 時不會誤判。iteration 2 起,p_w就真的是 previous word 了。而且,它會 skip 連續空白,最後一個字元是〝.〞也不會出錯。所以,這個程式是〝前沒 ( . 或 .0)〞版。你若是要後沒、都沒,會改了吧!?

2006-07-15 14:58:57 補充:
if (word == '.') // 如果這個字是〝.〞if (!isdigit(p_w)) // 而前一字不是數字(管它是啥,字母、空白、換列……,它就是不是 〝數字.〞)

2006-07-14 20:45:19 · answer #1 · answered by ? 7 · 0 0


圖片參考:http://img301.imageshack.us/img301/9993/0715hc8.jpg
#includevoid main(){    FILE *fp; fp=fopen("bb.txt","r"); char f[10]; //此陣列用來裝一個單字。 int sum=0; //將遺失數值做計數。 int i=0,s,num=0,line=1; //line記錄目前是第幾行,num記錄目前是第幾個位置。 while((s=fgetc(fp))!=EOF) {  if(s==' '||s=='\n') //因為單字和單字之間有一個空格或換行,所用此當區別。  {   num++;   f[i++]='\0';   if(s=='\n') {line++;num=0;} //讀到換行,表示行數又要加1了,且位置要歸0了。   if(f[0]=='.')   {printf("數值遺失在第 %d 行位置 %d\n",line,num);sum++;}   i=0; // i歸0的原因是,當儲滿一個單字時,我把他又從陣列0的位置開始放。然後繼續儲滿下一個單字。  }  else   f[i++]=s; } printf("\n遺失的數值有 %d 個\n",sum);}ps..其實我覺得這個題目用內建函數strtok()來寫,程式碼會更精簡。

2006-07-15 07:21:38 · answer #2 · answered by Almond 6 · 0 0

每個數都是小數嗎??

2006-07-14 20:39:31 · answer #3 · answered by 無聊的青蛙 5 · 0 0

fedest.com, questions and answers