多項式【資料結構課設一枚,671原創】

來源:互聯網
上載者:User

幫別人寫的。。先是在網上找了一個。。但是發現錯誤百出。。然後又找不到更好的。。於是就改了下。。。將就著看。。。完全c語言,。。。木有任何c++~~~~不過倒是很彆扭。。。學了java之後。。。感覺自己被面向過程殘害匪淺。。。。物件導向和多線程的思路完全屢不清頭緒。。。。哎。。。ACM害我一生麼難道?

主要實現了以下功能

           1.多項式建立 
 
           2.多項式相加    
           3.多項式相減    
           4.多項式相乘    
           5.多項式求導    
           6.代數求值      
           7.積分計算      
           8.列印多項式    
           9.清空多項式    

以下是代碼:

#include <stdlib.h>#include <stdio.h>#include <iostream.h>#include <math.h>#define NULL 0#define MAXSIZE 20//定義線性表最大容量//定義多項式項資料類型typedef struct{float coef;//係數int expn;//指數 }term,elemType;typedef struct{term terms[MAXSIZE];//線性表中數組元素int last;//指向線性表中最後一個元素位置 }SeqList;typedef SeqList polynomial;void printPloyn(polynomial*p);int PloynStatus(polynomial*p)//判斷多項式的狀態 {if(p==NULL){return -1;}else if(p->last==-1){return 0;}else{return 1;}}polynomial* Init_Polynomial()//初始化空的多項式{polynomial*P;P=new polynomial;if(P!=NULL){P->last=-1;return P;}else{return NULL;}}void Reset_Polynomial(polynomial*p){if(PloynStatus(p)==1){p->last=-1;}}int Location_Element(polynomial*p,term x)//在多項式p中尋找與x項指數相同的項是否存在{int i=0;if(PloynStatus(p) == -1)return 0;while(i<=p->last && p->terms[i].expn!=x.expn){i++;}if(i > p->last){return 0;}else{return 1;}}int Insert_ElementByOrder(polynomial*p,term x)//在多項式p中插入一個指數項x{int j;if(PloynStatus(p)==-1)return 0;if(p->last==MAXSIZE-1){printf("The polym is full!\n");return 0;}j=p->last;while(p->terms[j].expn<x.expn && j>=0){p->terms[j+1]=p->terms[j];j--;}p->terms[j+1]=x;p->last++;return 1;}int CreatePolyn(polynomial *P, int m)//輸入m項係數和指數,建立表示一元多項式的有序表p{float coef;int expn;term x;if(PloynStatus(P) == -1)return 0;if(m > MAXSIZE){printf("順序表溢出\n");return 0;}else{printf("請依次輸入%d對係數和指數...\n",m);for(int i=0;i<m;i++){scanf("%f%d",&coef,&expn);x.coef = coef;x.expn = expn;if(!Location_Element(P,x)){Insert_ElementByOrder(P,x);}}}return 1;}char compare(term term1,term term2)//比較指數項term1和指數項term2{if(term1.expn>term2.expn){return'>';}else if(term1.expn<term2.expn){return'<';}else{return'=';}}polynomial*addPloyn(polynomial*p1,polynomial*p2)//將多項式p1和多項式p2相加,產生一個新的多項式{int i=0, j=0, k=0;if((PloynStatus(p1)==-1)||(PloynStatus(p2)==-1)){return NULL;}polynomial*p3 = Init_Polynomial();while(i <= p1->last && j <= p2->last){switch(compare(p1->terms[i], p2->terms[j])){case'>':p3->terms[k++] = p1->terms[i++];p3->last++;break;case'<':p3->terms[k++] = p2->terms[j++];p3->last++;break;case'=':if(p1->terms[i].coef + p2->terms[j].coef != 0){p3->terms[k].coef = p1->terms[i].coef + p2->terms[j].coef;p3->terms[k].expn = p1->terms[i].expn;k++;p3->last++;}i++;j++;}}while(i<=p1->last){p3->terms[k++] = p1->terms[i++];p3->last++;}while(j<=p2->last){p3->terms[k++] = p2->terms[j++];p3->last++;}return p3;}polynomial*subStractPloyn(polynomial*p1,polynomial*p2)//多項式p1和多項式p2相減,產生一個新的多項式{int i=0;if((PloynStatus(p1)!=1)||(PloynStatus(p2)!=1)){return NULL;}polynomial*p3=Init_Polynomial();p3->last=p2->last;for(i=0;i<=p2->last;i++){p3->terms[i].coef=-p2->terms[i].coef;p3->terms[i].expn=p2->terms[i].expn;}p3=addPloyn(p1,p3);return p3;}polynomial* mulitPloyn(polynomial*p1,polynomial*p2)//多項式p1和多項式p2相乘,產生一個新的多項式{int i=0, j, k;if((PloynStatus(p1)!=1)||(PloynStatus(p2)!=1)){return NULL;}polynomial*p3=Init_Polynomial();polynomial**p=new polynomial*[p2->last+1];for(k=0; k<=p2->last; k++){p[k]=Init_Polynomial();p[k]->last=p1->last;for(j=0; j<=p1->last; j++){p[k]->terms[j].coef = p1->terms[j].coef * p2->terms[k].coef;p[k]->terms[j].expn = p1->terms[j].expn + p2->terms[k].expn;}p3=addPloyn(p[k], p3);}return p3;}void printPloyn(polynomial*p)//輸出在順序儲存結構的多項式p{int i;for(i=0;i<=p->last;i++){if(p->terms[i].coef>0 && i>0)printf("+%.2f", p->terms[i].coef);elseprintf("%.2f", p->terms[i].coef);printf("x^%d", p->terms[i].expn);}puts("");}void menu(){printf("\n\t\t*******資料結構綜合性實驗*********\n");printf("\t\t***一、多項式的加、減、乘法運算***\n");printf("\t\t*******  1.多項式建立    *********\n");printf("\t\t*******  2.多項式相加    *********\n");printf("\t\t*******  3.多項式相減    *********\n");printf("\t\t*******  4.多項式相乘    *********\n");printf("\t\t*******  5.多項式求導    *********\n");printf("\t\t*******  6.代數求值      *********\n");printf("\t\t*******  7.積分計算      *********\n");printf("\t\t*******  8.列印多項式    *********\n");printf("\t\t*******  9.清空多項式    *********\n");printf("\t\t*******  0.退出系統      *********\n");printf("\t\t******   請選擇(0-9)      ********\n");printf("\t\t**********************************\n");}polynomial* derivative(polynomial* p1)//多項式求導{int i=0, k;if((PloynStatus(p1)!=1)){return NULL;}polynomial*p3=Init_Polynomial();polynomial*tmp;for(k=0; k<=p1->last; k++){tmp=Init_Polynomial();tmp->last = 0;if (p1->terms[k].expn != 0){tmp->terms[0].coef = p1->terms[k].expn * p1->terms[k].coef;tmp->terms[0].expn = p1->terms[k].expn - 1;p3=addPloyn(tmp, p3);}}return p3;}polynomial* Rederivative(polynomial* p1)//多項式原函數(積分要用)。。。。。太麻煩了 *.*||{int i=0, k;if((PloynStatus(p1)!=1)){return NULL;}polynomial*p3=Init_Polynomial();polynomial*tmp;for(k=0; k<=p1->last; k++){tmp=Init_Polynomial();tmp->last = 0;tmp->terms[0].coef = p1->terms[k].coef / (float)(p1->terms[k].expn + 1);tmp->terms[0].expn = p1->terms[k].expn + 1;p3=addPloyn(tmp, p3);}return p3;}double getanswer(polynomial* p1, double x)//求值{double ans = 0.0;;int i=0, k;if((PloynStatus(p1)!=1)){return NULL;}for(k=0; k<=p1->last; k++){ans += pow(x, p1->terms[k].expn) * p1->terms[k].coef;}return ans;}int choose()//選擇。。方便省代碼。。{int tmp;printf("\n請輸入要操作的多項式編號(1/2):");scanf("%d", &tmp);if (tmp != 1 && tmp != 2){puts("輸入有誤,結束操作。\n");return 0;}return tmp;}void main(){int sel, tmp;double ans;polynomial*p1=NULL;polynomial*p2=NULL;polynomial*p3=NULL;while(1){menu();printf("\t\t*請選擇(0-9):");scanf("%d", &sel);switch(sel){case 1:p1=Init_Polynomial();p2=Init_Polynomial();int m;printf("請輸入第一個多項式的項數:\n");scanf("%d",&m);CreatePolyn(p1,m);printf("第一個多項式的運算式為p1=");printPloyn(p1);printf("請輸入第二個多項式的項數:\n");scanf("%d",&m);CreatePolyn(p2,m);printf("第二個多項式的運算式為p2=");printPloyn(p2);break;case 2:printf("p1+p2=");if((p3 = addPloyn(p1,p2)) != NULL)printPloyn(p3);break;case 3:printf("\np1-p2=");if((p3 = subStractPloyn(p1,p2)) != NULL)printPloyn(p3);break;case 4:printf("\np1*p2=");if((p3 = mulitPloyn(p1,p2)) != NULL)printPloyn(p3);break;case 5:if (!(tmp = choose()))break;printf("p%d導數為:", tmp);switch(tmp){case 1:if ((p3=derivative(p1)) != NULL)printPloyn(p3);break;case 2:if ((p3=derivative(p2)) != NULL)printPloyn(p3);break;}break;case 6:if (!(tmp = choose()))break;printf("請輸入x的值:\n");double tmp2;scanf("%lf", &tmp2);switch(tmp){case 1:ans = getanswer(p1, tmp2);printf("當x=%.2lf時,p1的值為:%.2lf\n", tmp2, ans);break;case 2:ans = getanswer(p2, tmp2);printf("當x=%.2lf時,p2的值為:%.2lf\n", tmp2, ans);break;}break;case 7:if (!(tmp = choose()))break;double a, b;printf("請輸入下限與上限:");scanf("%lf %lf", &a, &b);if (a > b){a = a + b;b = a - b;a = a - b;}if (tmp == 1)ans = getanswer(Rederivative(p1), b) - getanswer(Rederivative(p1), a);if (tmp == 2)ans = getanswer(Rederivative(p2), b) - getanswer(Rederivative(p2), a);printf("結果為:%.2lf", ans);break;case 8:if (!(tmp = choose()))break;printf("p%d=", tmp);if (tmp == 1)printPloyn(p1);if (tmp == 2)printPloyn(p2);break;case 9:Reset_Polynomial(p1);Reset_Polynomial(p2);Reset_Polynomial(p3);puts("\n清空成功!\n");getchar();printf("是否清空螢幕?y/n\t");char tmpa;scanf("%c", &tmpa);if (tmpa == 'y'){system("cls");}break;case 0:return;default:puts("輸入錯誤,請重新輸入:");}}return;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.