全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:14263
推到 Plurk!
推到 Facebook!

請問如何從讀取的檔案裡的數字再計算(用visual c++或Dev c++的語法寫)

尚未結案
56angela
一般會員


發表:12
回覆:13
積分:5
註冊:2005-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-01 23:46:52 IP:61.216.xxx.xxx 未訂閱
麻煩各位c語言高手,幫我解答這個問題: 我目前在寫一個程式,是有關算平均的 例如:       學號  數學  英文        1     90    89        2     76    69        :      :    :        :      :    :       36     87    88 (以上是txt檔) 如果要計算所開啟檔案裡的數字該怎麼寫呢? p.s.要算個人平均 以及 單科全班平均    希望各位能幫幫忙> <    以下是我目前寫的程式: #include #include int main(void) { FILE *fptr; char ch; if((fptr=fopen("c:\\score.txt","r"))!=NULL) { while((ch=getc(fptr))!=EOF) printf("%c",ch); } else printf("檔案開啟失敗!"); fclose(fptr); system("pause"); return 0; } 我目前只會做到開檔而已...
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-02 01:41:15 IP:59.115.xxx.xxx 未訂閱
56angela 妳好:    請注意程式碼的縮排整理並參考下列連結頁面內的說明,然後透過 "修改文章" 的功能重新張貼妳的程式碼,以便他人瀏覽: 【公告】程式碼張貼規則與方法 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57538 【公告】重申版規與作業問題說明 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58991 7 天天敲鍵盤 v 時時按滑鼠 8
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-02 14:53:56 IP:59.115.xxx.xxx 未訂閱
56angela 妳好:    依據妳原先的程式結構,給妳一個範例如下,我盡可能在各個處理步驟都加上註解,希望對妳的學習能有所幫助:

#include 
#include     int main(void)
{
    FILE *fptr;
    char ch;
    int step = 1;  // 處理對象索引 (1=學號, 2=數學, 3=英文)
    int cnt  = 0;  // 讀入的資料筆數 (文字檔內的資料行數)
    int no[36] = {0};  // 存放學號的陣列
    int s1[36] = {0};  // 存放數學成績的陣列
    int s2[36] = {0};  // 存放英文成績的陣列
    float sum1 = 0;  // 數學成績總和
    float sum2 = 0;  // 英文成績總和
    int tmp = 0;  // 組合數字之用的暫存變數
    int i;
    if ((fptr = fopen("score.txt","r")) != NULL) {
        while ((ch=getc(fptr)) != EOF) {
            if (ch == ' ') {  // 如果是空格就準備擷取下一組數字
                step  ;  // 指向下一組處理對象
                tmp = 0;  // 數字暫存變數歸零
            } else if (ch == 0x0A) { // 如果是換行字元
                step = 1;  // 指向第一組處理對象 (學號)
                cnt  ;  // 累加資料總筆數 (行數)
                tmp = 0;  // 數字暫存變數歸零
            } else if (ch >= '0' && ch <= '9') {
                tmp = (tmp*10)   (ch-'0');  // 數字暫存變數乘以 10 再加上這次讀入的數字
                if (step == 1) {  // 如果處理對象是學號
                    no[cnt] = tmp;
                } else if (step == 2) {  // 如果處理對象是數學成績
                    s1[cnt] = tmp;
                } else if (step == 3) {  // 如果處理對象是英文成績
                    s2[cnt] = tmp;
                }
            }
        }
        printf("\n\n學號\t數學\t英文\n");
        for (i=0; i
上述程式仍有簡化的空間,妳不妨自己試試看。 <> <>> 天天敲鍵盤 <>> 時時按滑鼠 <>>
56angela
一般會員


發表:12
回覆:13
積分:5
註冊:2005-10-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-02 18:53:34 IP:59.115.xxx.xxx 未訂閱
不好意思... 想請問為什麼需要乘以10,還有為何一定要減去'0'
 
tmp = (tmp*10)   (ch-'0');  
還有...為什麼要讓tmp=0(當遇到空格或換行時) 謝謝6^^
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-02 20:46:39 IP:61.230.xxx.xxx 未訂閱
56angela 妳好:
引言:想請問為什麼需要乘以10,還有為何一定要減去'0'
tmp = (tmp*10)   (ch-'0');
首先妳必須了解一個觀念性的問題:程式所讀入的 ch 是數字字元而不是實際的數字,直接拿來計算的話,會變成在計算 ch 所代表那個字元的 ASCII 碼,'0' 至 '9' 字元的 ASCII 碼是 48 (0x30) 至 57 (0x39) 而不是 0 至 9,如果不減掉 '0' (48) 的話,所有計算出來的數字都會不正確。 其次回答妳第一個問題:因為程式是逐個字元讀取的,如果不將前一個乘以 10,我們就無法正確取得整組文字碼所代表的數字,以 "89" 這組數字為例,程式在讀到 '8' 這個字元時,代入上述妳引出的計算式中,會變成 tmp = (0*10) (56-48),因此 tmp 會存入 8 這個數字,接著程式會讀到 '9' 這個字元,代入前述的計算式後,會變成 tmp = (8*10) (57-48),因此 tmp 會存入 89,這就是將字元的 "89" 轉為實際的數字 89 的動作。
引言:還有...為什麼要讓tmp=0(當遇到空格或換行時)
各組數字都是以空格分隔的,每行最後一組數字與下一行資料間則是以換行符號做分隔,tmp 變數是拿來組合各組數字之用的 (請參考前一個問題中講到的那一個計算式),不歸零的話,計算出來的數字會不正確。 7 天天敲鍵盤 v 時時按滑鼠 8
56angela
一般會員


發表:12
回覆:13
積分:5
註冊:2005-10-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-02 23:20:51 IP:59.115.xxx.xxx 未訂閱
引言: 謝謝^^
系統時間:2024-05-10 9:14:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!