Social Icons

twitterfacebookgoogle plusrss feedemail

4/23/2010

資料結構-Do Not Hand-In Exercises-- Exercises:多項式除法

此為趙老師在資料結構課堂上面要我們做的第二份不用交的作業
為要讓我們做多項式的除法
以下這是我參考課本所做的一個小程式
大家可以看看,不過因為時間的關係可能還有一些小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設為輸入的c
expon則設為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必須大於等於bexpon*/
{
// 計算商式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
看過文章之後歡迎留下您寶貴的意見喔!

 
 
无觅相关文章插件,迅速提升网站流量