線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1574
推到 Plurk!
推到 Facebook!

可以麻煩幫我看一下程式哪裡有問題嗎...謝謝

尚未結案
56angela
一般會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-14 19:32:37 IP:59.115.xxx.xxx 未訂閱
這是兩個多項式相加的程式 我找不出錯的地方 可以請大家幫忙一下嗎~感謝嘍     另外,想請教一下,如果是用開檔的方式讀取多項式的數值與指數,應該如何寫呢?(給予兩個已存在且寫入的檔案)        如果a的多項式為:  -4X^15 + 8X^7 + 13X^0 檔案poly_a.txt內容為:    -4        15     8        7     13        0    寫入後poly_a檔案形式變為:    -4        15■8        7■13        0          b的多項式為: 17X^15 - 16X^3 + 5X^1 檔案poly_b.txt內容為:     17        15     -16        3     5        1    寫入後poly_b檔案形式變為:    17        15■-16        3■5        1                     
 
    #include
    #include
    #define MAX_TERMS 100
        
    void padd(int,int,int,int,int,int);
    void attach(float,int);
            
            
    int COMPARE(int a,int b)
    {
    if(a= MAX_TERMS)
    {
    fprintf(stderr,"Too many terms in the polynomial\n");
    exit(1);
    }
    terms[avail].coef = coefficient;
    terms[avail  ].expon = exponent;
    }
         
真的希望大家的幫忙...對於開檔的部分...尤其是這種已經寫入的檔案我真的不知道該如何處理,曾試著用fscanf但還是失敗...最下策只好如以上程式所寫的...把數值跟指數直接打出來,而沒有開檔...但是還是有錯誤...> <...卻不知道哪裡有問題...所以希望有高手們幫忙解答...感激不盡 發表人 - 56angela 於 2005/11/14 20:06:15
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-14 21:16:01 IP:221.169.xxx.xxx 未訂閱
編譯的錯誤訊息: [C Warning] Unit1.cpp(52): W8004 'avail' is assigned a value that is never used [C Error] Unit1.cpp(57): E2451 Undefined symbol 'avail' [C Error] Unit1.cpp(60): E2451 Undefined symbol 'terms' [C Error] Unit1.cpp(87): E2451 Undefined symbol 'avail' [C Error] Unit1.cpp(92): E2451 Undefined symbol 'terms' 錯誤訊息就如同上面寫的 avail跟terms沒有定義 你這兩個變數都在main()函式內定義,但是離開main函式後,就看不到了 因此應該把這兩個變數的宣告移到global區域去 另外, ==================================== 檔案poly_a.txt內容為: -4 15 8 7 13 0 寫入後poly_a檔案形式變為: -4 15■8 7■13 0 ==================================== 是什麼意思?poly_a檔案的內容到底是哪個?? 也把你讀取的程式貼上來,讓大家幫忙看看問題在哪吧
56angela
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-15 00:29:28 IP:59.115.xxx.xxx 未訂閱
錯誤訊息就如同上面寫的 avail跟terms沒有定義 你這兩個變數都在main()函式內定義,但是離開main函式後,就看不到了 因此應該把這兩個變數的宣告移到global區域去    另外, ==================================== 檔案poly_a.txt內容為: -4 15 8 7 13 0    寫入後poly_a檔案形式變為: -4 15■8 7■13 0  ==================================== 是什麼意思?poly_a檔案的內容到底是哪個??    也把你讀取的程式貼上來,讓大家幫忙看看問題在哪吧     
引言: 將avail的變數宣告我移到global區域了...不過該怎麼將terms的變數定義 移到global呢? 還有,這是poly_a跟poly_b的txt檔內容 謝謝你的回覆,我將檔案po上來了 [/quote]
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-15 21:48:36 IP:221.169.xxx.xxx 未訂閱
將avail的變數宣告我移到global區域了...不過該怎麼將terms的變數定義 移到global呢? 你的avail怎麼移過去,terms就怎麼跟著移過去呀... 還有,你的poly_b.txt檔是怎麼寫的?
56angela
一般會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-15 23:42:56 IP:59.115.xxx.xxx 未訂閱
引言: 你的avail怎麼移過去,terms就怎麼跟著移過去呀... 還有,你的poly_b.txt檔是怎麼寫的?
引言: 我移過去了,不過還是有錯誤... 還有...poly_b的檔我有把圖放上去了... 我再貼一次好了...可能有點亂...你沒注意到 至於原文的部分...我修改過...將avail跟terms移到global... 但不知道對不對...還請指點一下...謝謝^^ 9 C:\Documents and Settings\userd\桌面\add orz.cpp parse error before `[' C:\Documents and Settings\userd\桌面\add orz.cpp [Warning] In function `int main()': 33 C:\Documents and Settings\userd\桌面\add orz.cpp `terms' undeclared (first 33 C:\Documents and Settings\userd\桌面\add orz.cpp (Each undeclared 64 C:\Documents and Settings\userd\桌面\add orz.cpp:41 empty character constant
發表人 - 56angela 於 2005/11/15 23:49:17
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-16 00:19:30 IP:218.168.xxx.xxx 未訂閱
56angela您好: 請為您的問題取一個有意義的標題    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
RedSnow
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-16 00:28:45 IP:59.115.xxx.xxx 未訂閱
56angela 妳好:    給妳兩點建議,請參考一下:
  1. 除非是有絕對的必要,否則請盡量不要重複的將前文內容修改掉,因為這樣子會不好對照,他人會看不懂整篇討論的來龍去脈。
  2. 程式碼貼上來之前,最好做一下縮排處理,這樣子能提高程式碼的易讀性,同時也有利於瀏覽。
另外我將妳的程式碼做了縮排處理,並作了些修正,妳試試看吧:
#include
#include
#define MAX_TERMS 100
    
void padd(int starta, int finisha, int startb, int finishb, int *startd, int *finishd);
void attach(float coefficient, int exponent);    typedef struct {
    float coef;
    int expon;
} polynomial;    int avail;
polynomial terms[MAX_TERMS];    int COMPARE(int a, int b)
{
    if (a < b)
        return -1;
    else if (a == b)
        return 0;
    else
        return 1;
}
    
int main(void)
{
    int a, b, i;        avail = 0;
    terms[0].coef= -4;    terms[0].expon=15;
    terms[1].coef=  8;    terms[1].expon= 7;
    terms[2].coef= 13;    terms[2].expon= 0;
    terms[3].coef= 17;    terms[3].expon=15;
    terms[4].coef=-16;    terms[4].expon= 3;
    terms[5].coef=  5;    terms[5].expon= 1;        padd(0, 2, 3, 5, &a, &b);        for (i=a; i<=b; i  )
        printf(" %.0fX^%d%c", terms[i].coef, terms[i].expon, i==b ? ' ' : ' ');        system("pause");
    return 0;
}    void padd(int starta, int finisha, int startb, int finishb, int *startd, int *finishd)
{
    float coefficient;
    *startd = avail;
  
    while ( starta <= finisha && startb <= finishb)
        switch (COMPARE(terms[starta].expon, terms[startb].expon)) {
            case -1:
                attach(terms[startb].coef, terms[startb].expon);
                startb  ;
                break;
            case 0:
                coefficient = terms[starta].coef   terms[startb].coef;
                if (coefficient)
                    attach(coefficient, terms[starta].expon);
                starta  ;
                startb  ;
                break;
            case 1:
                attach(terms[starta].coef, terms[starta].expon);
                starta  ;
        }         for(; starta <= finisha; starta  )
        attach(terms[starta].coef, terms[starta].expon);
    for(; startb <= finishb; startb  )
        attach(terms[startb].coef, terms[startb].expon);
    *finishd = avail-1;
}
    
void attach(float coefficient, int exponent)
{
    if (avail >= MAX_TERMS) {
        fprintf(stderr, "Too many terms in the polynomial\n");
        exit(1);
    }
    terms[avail].coef = coefficient;
    terms[avail  ].expon = exponent;
}
7 天天敲鍵盤 v 時時按滑鼠 8
56angela
一般會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-16 00:52:04 IP:59.115.xxx.xxx 未訂閱
引言: 不好意思...我會把他改回來的6^^
justdo
高階會員


發表:2
回覆:359
積分:222
註冊:2004-08-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-16 20:34:01 IP:221.169.xxx.xxx 未訂閱
迴圈用法錯了
for(starta=0; starta<=5; starta  )
{
  for(startb=0; startb<=5; startb  )
  {
    fscanf(fptr1,"%d %d\n", &terms[starta].coef, &terms[starta].expon);
    printf("fptr1:terms[%d].coef is %d, terms[%d].expon is %d\n", starta, terms[starta].coef, starta, terms[starta].expon);
    fscanf(fptr2,"%d %d\n", &terms[startb].coef, &terms[startb].expon);
    printf("fptr2:terms[%d].coef is %d, terms[%d].expon is %d\n", startb, terms[startb].coef, startb, terms[startb].expon);
  }
}
改成
for(starta=0; starta<=2; starta  )
  {
    fscanf(fptr1,"%d %d\n", terms[starta].coef, terms[starta].expon);
    printf("fptr1:terms[%d].coef is %d, terms[%d].expon is %d\n", starta, terms[starta].coef, starta, terms[starta].expon);
  }                
for(starta=3; starta<=5; starta  )
  {
    fscanf(fptr2,"%d %d\n", terms[starta].coef, terms[starta].expon);
    printf("fptr2:terms[%d].coef is %d, terms[%d].expon is %d\n", starta, terms[starta].coef, starta, terms[starta].expon);
  }
紅色的地方是除錯用的,會寫出你讀到的值(不過我沒實際測試,可能會不完整... ^^") 看了之後應該就知道你的問題在哪兒了 不過還是要問,你那兩個檔案到底怎麼產生的,為何會有黑色方塊存在? 發表人 - justdo 於 2005/11/16 20:52:48
RedSnow
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-16 23:00:00 IP:61.230.xxx.xxx 未訂閱
56angela 妳好:    有兩個問題請教一下:
  1. 妳的程式中的 padd() 函式是在做多項式相加的處理嗎?那麼以妳目前舉的例子而言,terms 陣列在呼叫該函式之後,依照妳的預期應該有何種變化?我追蹤後的結果有點看不太懂....。
  2. 妳預期的輸出結果是怎麼樣的一個結果?是運算後的結果,還是像妳第一篇所寫的那樣子 (將檔案內讀出的數字資料套入運算式來顯示而已): -4X^15 8X^7 13X^0 17X^15 - 16X^3 5X^1
7 天天敲鍵盤 v 時時按滑鼠 8
56angela
一般會員


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-16 23:04:15 IP:59.115.xxx.xxx 未訂閱
引言: 謝謝justdo...我試過你的方法...不過...出現錯誤視窗 關於為什麼有黑色方框...我下載那個檔案的時候就有了... 我以為是用程式將資料寫入檔案後的結果,才會出現方黑框的 如果不能用那個檔的話,用下面這兩個檔案要怎麼讀取做多項式相加呢?
發表人 - 56angela 於 2005/11/16 23:05:32
56angela
一般會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-16 23:12:18 IP:59.115.xxx.xxx 未訂閱
引言: 有兩個問題請教一下:
  1. 妳的程式中的 padd() 函式是在做多項式相加的處理嗎?那麼以妳目前舉的例子而言,terms 陣列在呼叫該函式之後,依照妳的預期應該有何種變化?我追蹤後的結果有點看不太懂....。
  2. 妳預期的輸出結果是怎麼樣的一個結果?是運算後的結果,還是像妳第一篇所寫的那樣子 (將檔案內讀出的數字資料套入運算式來顯示而已): -4X^15 8X^7 13X^0 17X^15 - 16X^3 5X^1
引言: TO: RedSnow (1) padd函式是在做多項式相加沒錯 (2)預期輸出結果是以下兩個檔案裡的多項式相加,將a,b檔案內的多項式的係數 與指數讀出做相加,我想請教的是...該怎麼將兩個檔的係數與指數分別讀出 並做相加 -4X^15 8X^7 13X^0...a檔案 17X^15 - 16X^3 5X^1...b檔案 結果輸出 13X^15 8X^7 -16X^3 5X^1 13X^0
不好意思可能我表達的不太好...不過,很謝謝你幫我想這個問題^^ 發表人 - 56angela 於 2005/11/16 23:13:34 發表人 - 56angela 於 2005/11/16 23:20:44
RedSnow
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-11-16 23:24:25 IP:59.115.xxx.xxx 未訂閱
56angela 妳好:    妳讀檔的問題應該是出在資料型態未配合好,請將原先讀取資料的敘述修改如下:
fscanf(fptr1,"%f %d\n", &terms[starta].coef, &terms[starta].expon);
fscanf(fptr2,"%f %d\n", &terms[startb].coef, &terms[startb].expon);
但是妳為何要用兩到迴圈去讀檔案資料?看起來怪怪的,我將整個 main() 修改如下,妳參考一下吧:
int main(void)
{
    int a, b, i,starta, startb;
    FILE *fptr1, *fptr2;
    avail = 0;        fptr1 = fopen("poly_a.txt","r");
    fptr2 = fopen("poly_b.txt","r");
    if (fptr1 != NULL && fptr2 != NULL)
    {
        puts("poly_a.txt:");
        for (starta=0; starta<3; starta  )
        {
            fscanf(fptr1,"%f %d\n", &terms[starta].coef, &terms[starta].expon);
            printf("%.0f %d\n", terms[starta].coef, terms[starta].expon);
        }            puts("\npoly_b.txt:");
        for(startb=3; startb<6; startb  )
        {
            fscanf(fptr2,"%f %d\n", &terms[startb].coef, &terms[startb].expon);
            printf("%.0f %d\n", terms[startb].coef, terms[startb].expon);
        }
        fclose(fptr1);
        fclose(fptr2);            padd(0, 2, 3, 5, &a, &b);            puts("====================\n");
/*
        for (i=0; i<6; i  ) {
            printf("%.0fX^%d", terms[i].coef, terms[i].expon);
            if (i != 2 && i != 5) {
                if (terms[i 1].coef >= 0.0) printf("%c", ' ');
            } else if (i == 2){
                puts("\n");
            }
        }
*/
        for(i=0; i<=5; i  ){
            printf("%.0fX^%d", terms[i].coef, terms[i].expon);
            if (i != 5) {
                if (terms[i 1].coef >= 0.0) printf("%c", ' ');
            }
        }
    }        puts("\n");
    system("pause");
    return 0;
}
請注意!因為未能確認妳的相關需求 (我前一篇的問題),由呼叫 padd() 函式開始以下的敘述尚有待斟酌。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/11/16 23:48:39
56angela
一般會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-11-17 01:07:50 IP:59.115.xxx.xxx 未訂閱
引言: 我run過這個程式...不過...跑出來的結果好像不對
RedSnow
版主


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-11-17 02:18:28 IP:61.230.xxx.xxx 未訂閱
56angela 妳好:    1. 我前一篇裡的程式碼貼上後有做過一次修改,以綠色標示的那一段以及其後的程式碼是修改過的,該段是將輸出結果恢復成妳原先的設定方式 (有稍加修飾)。    2. 我在前一篇的結尾處有特別註明 "請注意!因為未能確認妳的相關需求 (我前一篇的問題),由呼叫 padd() 函式開始以下的敘述尚有待斟酌。"。 3. 請先確認讀檔問題是否已經解決?然後再來研究輸出結果為何會不正確? 7 天天敲鍵盤 v 時時按滑鼠 8
56angela
一般會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-11-17 22:23:14 IP:61.216.xxx.xxx 未訂閱
引言: 謝謝RedSnow,^^我會再自己試著找找看問題在哪,至於讀檔是沒問題了, 剩下就是如何讓所輸出的運算結果是正確的了 目前輸出結果為:13X^15-16X^3 5X^1-16X^3 5X^1 5X^1 這幾天我會努力想想的,很謝謝你,當然,還有感謝Justdo的幫忙
系統時間:2024-05-11 2:15:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!