為要讓我們做多項式的除法
以下這是我參考課本所做的一個小程式
大家可以看看,不過因為時間的關係可能還有一些小BUG沒除去,大家自己在注意一下
程式碼:
#include<stdio.h>#include<conio.h>#include<stdlib.h>#define MAX_TERMS 100/*宣告資料最大項為MAX_TERMS其值設為*/typedef struct/*結構宣告,取用的變數為polynmial*/{float coef;int expon;}Polynomial;/*input函數接收一個polynomial結構陣列及一整數變數*avail後加以運算此函數內*avail所指記憶體內的值會被+1會以scanf()要求輸入兩個數值:浮點數的c及整數的e後將結構polynomial陣列內的codf設為輸入的cexpon則設為e但不可為否則將為違法運算(應是除數不得為的關係)*/void input(Polynomial p[], int *avail){float c;int e;int i,j,k,l,m;do{printf(" 係數 指數=");/*列出要求輸入訊息*/scanf("%f %d",&c, &e);/*接受輸入兩值*/if(e<0) break;/*當e輸入時跳出迴路*/p[*avail].coef = c;/*將c設給polynomial結構的coef*/p[*avail].expon = e;;/*將e設給polynomial結構的expon*/(*avail)++;/*將*avail所指記憶體內的值步進*//*塞係數*/if(*avail>=3){if(p[*avail-1].expon!=p[*avail-2].expon-1){m=p[*avail-1].coef;l=p[*avail-1].expon;k=p[*avail-2].expon-p[*avail-1].expon-1;for(j=p[*avail-2].expon-2;j<k;l--){p[*avail].coef = 0;p[*avail].expon =j;(*avail)++;}p[*avail].coef=m;p[*avail].expon=l;(*avail)++;}
}}while(e>=0);printf("\n您輸入的為: ");for (i=0; i<*avail; i++){printf("+( %.2fx^%d)", p[i].coef, p[i].expon);}printf("\n");}/*output()含數接收結構polynomial陣列p[]及變數avail後將polynomial陣列p[]顯示出來*/void output(Polynomial p[], int avail){int i;
if (avail == 0) printf("0");/*avail不得為否則只要顯示即可*/else/*將結構陣列p[]顯示出來*/{if (p[0].coef > 0) printf(" %.2fx%d", p[0].coef, p[0].expon);else printf(" - %.2fx%d", -p[0].coef, p[0].expon);for (i=1; i<avail; i++)if (p[i].coef > 0) printf(" + %.2fx%d", p[i].coef, p[i].expon);else printf(" - %.2fx%d", -p[i].coef, p[i].expon);}printf("\n");}/*與input()函數差不多主要設定結構Polynomial p[]不過此函數是接收兩值後設過去input()是要使用者輸入兩個值*/void attach(Polynomial p[], int *avail, float c, int e){p[*avail].coef = c;p[*avail].expon = e;(*avail)++;}/*程式開始*/void main(){again:/*結構變數Polynomial宣告成陣列a,b,q,r,t大小是MAX_TERMS目前為*/Polynomial a[MAX_TERMS], b[MAX_TERMS], q[MAX_TERMS], r[MAX_TERMS], t[MAX_TERMS];int aav=0, bav=0, qav=0, rav, tav;int i;int ai, ti;int count=0;float ccc;printf("【使用方法】:\n1.請輸入方程式的係數與X得次方,一次輸入兩個,用空格分開\n");printf("2.次方數請由大至小排列\n輸入完之後,請輸入-1 -1表示完成\n\n");printf("舉例:\n2X^4-3X^2+5X^1-1\n則請輸入:\n 2 4\n -3 2\n 5 1\n -1 0\n -1 -1\n\n");printf("請注意被除數不可以比除數小\n");// 輸入a(x)printf("\n被除數(x) = \n\n");input(a, &aav);/*叫用input()函數...使用a結構陣列;input函數主要是接受使用者輸入兩個值*/// 輸入b(x)printf("\n除數(x) = \n\n");input(b, &bav);/*叫用input()函數...使用b結構陣列;input函數主要是接受使用者輸入兩個值*/for(i=0;i<bav-1;i++){while(a[i].coef==b[i].coef && a[0].expon==b[0].expon){count++;if(count=bav-1)goto over;}}
while (a[0].expon >= b[0].expon)/*比較兩個結構陣列內expon的值;a必須大於等於b的expon*/{// 計算商式q(x) 之一項attach(q, &qav, a[0].coef/b[0].coef, a[0].expon-b[0].expon);// 計算中間式t(x) = - q(x) 之一項* b(x)tav = 0;for (i=0;i<=bav-1;i++)attach(t, &tav, -b[i].coef*q[qav-1].coef, b[i].expon+q[qav-1].expon);// 以下是padd, 計算r(x) = a(x) - t(x)ai = ti = 0;rav = 0;while (ai < aav && ti < tav)if (a[ai].expon == t[ti].expon){ccc = a[ai].coef + t[ti].coef;if (ccc != 0) attach(r, &rav, ccc, a[ai].expon);ai++;ti++;}else if (a[ai].expon < t[ti].expon){attach(r, &rav, t[ti].coef, t[ti].expon);ti++;}else{attach(r, &rav, a[ai].coef, a[ai].expon);ai++;}for (; ai < aav; ai++)attach(r, &rav, a[ai].coef, a[ai].expon);for (; ti < tav; ti++)attach(r, &rav, t[ti].coef, t[ti].expon);// assign a(x) = r(x)for (i=0; i<rav; i++)a[i] = r[i];aav = rav;}//輸出商式q(x)printf("\n\n商式q(x)= ");output(q, qav);//輸出餘式a(x) r(x)printf("餘式r(x)=");output(a, aav);
do{printf("\n如要重新執行,請按下兩下空白鍵,即將重新執行\n");system("pause");}while(getch()!=32);system("cls");goto again;
over:printf("\n\n商式q(x)=1");printf("\n餘式r(x)=0");do{printf("\n如要重新執行,請按下兩下空白鍵,即將重新執行\n");system("pause");}while(getch()!=32);system("cls");goto again;
}
至於BUG有哪些我就不說了,大家自己試一下。轉貼請先經由作者同意。
沒有留言:
張貼留言
俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!