計(jì)算器的設(shè)計(jì)課程設(shè)計(jì)含源代碼可以運(yùn)行_第1頁
計(jì)算器的設(shè)計(jì)課程設(shè)計(jì)含源代碼可以運(yùn)行_第2頁
計(jì)算器的設(shè)計(jì)課程設(shè)計(jì)含源代碼可以運(yùn)行_第3頁
計(jì)算器的設(shè)計(jì)課程設(shè)計(jì)含源代碼可以運(yùn)行_第4頁
計(jì)算器的設(shè)計(jì)課程設(shè)計(jì)含源代碼可以運(yùn)行_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

計(jì)算器的設(shè)計(jì)第一章需求分析1.1加減乘除的運(yùn)算 設(shè)計(jì)一個(gè)簡(jiǎn)單的計(jì)算器,能夠在有限位數(shù)內(nèi)實(shí)現(xiàn)加、減、乘、除運(yùn)算,并支持括號(hào)和小數(shù)。1.2進(jìn)制轉(zhuǎn)換通過該計(jì)算器可以實(shí)現(xiàn)二進(jìn)制、十進(jìn)制、八進(jìn)制、十六進(jìn)制之間的轉(zhuǎn)換和運(yùn)算。這個(gè)程序首先要求選擇一種數(shù)值轉(zhuǎn)換的種類,例如我們可以選擇二進(jìn)制輸入,十進(jìn)制輸出,這樣就要求我們把輸入的二進(jìn)制轉(zhuǎn)換成十進(jìn)制。由于按照我們要求的輸入,輸出,總共有6種情況。所以我們不能一一寫出來每個(gè)程序的執(zhí)行過程,對(duì)于不同的情況我們只需要定義不同的輸入函數(shù)和輸出函數(shù),根據(jù)不同的情況,調(diào)用不同的輸入函數(shù)和輸出函數(shù),這樣做是為了對(duì)于多進(jìn)制的情況,這樣能簡(jiǎn)化程序。我定義了二進(jìn)制輸入,十進(jìn)制輸入,十六進(jìn)制輸入,二進(jìn)制輸出,十進(jìn)制輸出,十六進(jìn)制輸出,這樣就能滿足各種需要。1.3一元多項(xiàng)式的運(yùn)算通過C語言實(shí)現(xiàn)多項(xiàng)式的的計(jì)算功能,輸入多項(xiàng)式的項(xiàng)數(shù)、每項(xiàng)的系數(shù)和指數(shù),將兩個(gè)多項(xiàng)式進(jìn)行加減進(jìn)行加減運(yùn)算。該內(nèi)容包括輸入并建立多項(xiàng)式、多項(xiàng)式相加、多項(xiàng)式相減、多項(xiàng)式求值及輸出多項(xiàng)式。本項(xiàng)功能使用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)存儲(chǔ)一元多項(xiàng)式,可以方便的計(jì)算簡(jiǎn)單的一元多項(xiàng)式的基本運(yùn)算。1.4實(shí)現(xiàn)形式要求采用鏈表結(jié)構(gòu)進(jìn)行實(shí)現(xiàn)第二章功能描述2.1全局功能模塊圖計(jì)算器計(jì)算器二級(jí)制十進(jìn)制八進(jìn)制十六進(jìn)制的轉(zhuǎn)換和運(yùn)算二級(jí)制十進(jìn)制八進(jìn)制十六進(jìn)制的轉(zhuǎn)換和運(yùn)算加減乘除的運(yùn)算一元多項(xiàng)式的計(jì)算減加加減乘除八到十二到十十六到十減加加減乘除八到十二到十十六到十圖1全局功能圖全局功能模塊圖說明:該計(jì)算器主要實(shí)現(xiàn)四則運(yùn)算、進(jìn)制的轉(zhuǎn)換以及一元多項(xiàng)式的加減運(yùn)算。在四則運(yùn)算中主要功能有整型數(shù)據(jù)的加減乘除運(yùn)算,進(jìn)制轉(zhuǎn)換分為二進(jìn)制轉(zhuǎn)換為十進(jìn)制、八進(jìn)制轉(zhuǎn)換為十進(jìn)制、十六進(jìn)制轉(zhuǎn)換為十進(jìn)制,一元多項(xiàng)式的計(jì)算分為加法運(yùn)算和減法運(yùn)算,以下是對(duì)計(jì)算器功能實(shí)現(xiàn)的具體說明。2.2四則運(yùn)算功能描述計(jì)算器可以進(jìn)行簡(jiǎn)單的加減乘除運(yùn)算,可以判斷用戶的錯(cuò)誤輸入并且進(jìn)行限制提示,比如:輸入的左右括號(hào)不匹配,除數(shù)為0,輸入非法字符時(shí),都會(huì)有相應(yīng)的提示,對(duì)用戶比較友好。在進(jìn)行加減乘除的運(yùn)算過程中,程序的運(yùn)算部分建立了兩個(gè)堆棧,分別用來存儲(chǔ)操作符和操作數(shù)。接收的用戶輸入可細(xì)分為四種,分別是數(shù)字,加減乘除操作符及左括號(hào),右括號(hào),等號(hào)。根據(jù)個(gè)符號(hào)的優(yōu)先級(jí)進(jìn)行計(jì)算式的運(yùn)算。此程序調(diào)用的函數(shù)主要有<math.h>/*數(shù)學(xué)函數(shù)的定義*/<conio.h>/*屏幕操作函數(shù)*/<stdio.h>/*I/O函數(shù)*/<stdlib.h>/*庫函數(shù)*/<stdarg.h>//<ctype.h>/*字符操作函數(shù)*/?;臼褂?用→←↑↓控制鼠標(biāo)圖形移動(dòng),當(dāng)*變量長度參數(shù)表*/<graphics.h>/*圖形函數(shù)*/<string.h>/*字符串函數(shù)*移動(dòng)到相應(yīng)得按鈕時(shí)按回車鍵輸入當(dāng)前數(shù)字或執(zhí)行對(duì)應(yīng)的函數(shù)。加法:輸入一個(gè)被加數(shù)數(shù),按“+”,輸入被加數(shù),按“=”,輸出結(jié)果。乘法:輸入一個(gè)數(shù),按“*”,輸入另個(gè)數(shù),按“=”,輸出結(jié)果。除法:輸入一個(gè)被除數(shù),按“+”,輸入另個(gè)除數(shù),按“=”,輸出結(jié)果。求余:輸入一個(gè)數(shù),按“mod”,按“=”,輸出結(jié)果。取整:輸入一個(gè)數(shù),按“int”,按“=”,輸出結(jié)果。2.3進(jìn)制轉(zhuǎn)換功能描述輸入一個(gè)八進(jìn)制數(shù),按“8->10”,按“=”,輸出十進(jìn)制結(jié)果。十六進(jìn)制轉(zhuǎn)十進(jìn)制:輸入一個(gè)十六進(jìn)制數(shù),按下“jz”+“16->10”按“=”2.4一元多項(xiàng)式運(yùn)算功能描述一元多項(xiàng)式的計(jì)算是常用的數(shù)學(xué)計(jì)算,在計(jì)算機(jī)計(jì)算中是非常普遍的,為了更加方便的進(jìn)行此類運(yùn)算,在此設(shè)計(jì)了一個(gè)簡(jiǎn)單的一元多項(xiàng)式計(jì)算器,用于對(duì)一元多項(xiàng)式進(jìn)行創(chuàng)建,輸出,以及一元多項(xiàng)式之間的相加,相減。該程序簡(jiǎn)單,清晰,明了,用戶易懂易用,能較好得實(shí)現(xiàn)一元多項(xiàng)式的計(jì)算功能[2]。程序的基本功能:(1)建立多項(xiàng)式(2)輸出多項(xiàng)式(3)兩個(gè)多項(xiàng)式相加,建立并輸出和多項(xiàng)式(4)兩個(gè)多項(xiàng)式相減,建立并輸出差多項(xiàng)式(5)兩個(gè)多項(xiàng)式相乘,建立并輸出乘多項(xiàng)式第三章功能的設(shè)計(jì)3.1四則運(yùn)算設(shè)計(jì)思路系統(tǒng)在進(jìn)行加減乘除的運(yùn)算時(shí),程序中主要運(yùn)用堆棧這一數(shù)據(jù)邏輯結(jié)構(gòu)。并建立了兩個(gè)堆棧,當(dāng)遇到數(shù)字時(shí)直接壓入操作數(shù)堆棧;當(dāng)遇到加減乘除或左括號(hào)時(shí)進(jìn)行優(yōu)先級(jí)判斷:如果傳入的操作符優(yōu)先級(jí)大于棧頂操作符的優(yōu)先級(jí)則操作符入棧,如果傳入的操作符優(yōu)先級(jí)小于等于棧頂操作數(shù)的優(yōu)先級(jí)則將棧頂操作符彈出,另外從操作數(shù)堆棧彈出兩操作數(shù)進(jìn)行運(yùn)算,運(yùn)算結(jié)果壓入操作數(shù)堆棧;當(dāng)遇到右括號(hào)時(shí)從兩堆棧中彈出數(shù)據(jù)進(jìn)行運(yùn)算(每次結(jié)果壓入操作數(shù)堆棧),直至遇到左括號(hào)從堆棧中彈出為止;當(dāng)遇到等號(hào)時(shí)從兩堆棧中彈出數(shù)據(jù)進(jìn)行運(yùn)算,直至操作符堆棧為空。switch(act)/*根據(jù)運(yùn)算符號(hào)計(jì)算*/{case1:result=num1+num2;break;/*做加法*/case2:result=num1-num2;break;/*做減法*/case3:result=num1*num2;break;/*做乘法*/case4:result=num1/num2;break;/*做除法*/3.2進(jìn)制轉(zhuǎn)換設(shè)計(jì)思路在進(jìn)行十六進(jìn)制轉(zhuǎn)化為十進(jìn)制或八進(jìn)制時(shí),需要注意的是:先輸入一個(gè)十六進(jìn)制數(shù)據(jù),再輸入“sft”然后輸入“16->10”或“16->8”,最后輸入“=”,輸出轉(zhuǎn)換后的結(jié)果。3.2.1十六進(jìn)制轉(zhuǎn)換為十進(jìn)制本段程序的作用是將十六進(jìn)制轉(zhuǎn)化為十進(jìn)制,該程序是作為十六進(jìn)制轉(zhuǎn)化為其他進(jìn)制的橋梁。十六進(jìn)制向十進(jìn)制的轉(zhuǎn)換分成兩個(gè)大的步驟,一是從十六進(jìn)制向二進(jìn)制的轉(zhuǎn)換,由于十六進(jìn)制和二進(jìn)制的特殊關(guān)系,它們之間的轉(zhuǎn)換非常簡(jiǎn)單。二是從二進(jìn)制轉(zhuǎn)換為十進(jìn)制,相對(duì)而言,這種轉(zhuǎn)換復(fù)雜一些。所以該模塊的核心是實(shí)現(xiàn)二進(jìn)制數(shù)向十進(jìn)制數(shù)的轉(zhuǎn)換。方法是將要轉(zhuǎn)換的二進(jìn)制數(shù)預(yù)先放到AX寄存器中,判斷AX中數(shù)的符號(hào),若為負(fù)數(shù),則將負(fù)號(hào)送入輸出緩沖區(qū),并求AX的絕對(duì)值;若AX中的數(shù)為正數(shù),則不做其他處理,此時(shí)AX中即為無符號(hào)二進(jìn)制數(shù)。然后將無符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù),可采用將AX除以10,得到第一個(gè)商和第一個(gè)余數(shù),第一個(gè)余數(shù)就是所求十進(jìn)制數(shù)的個(gè)位:將第一個(gè)商除以10,得到第二個(gè)商和余數(shù),第二個(gè)余數(shù)就是所求十進(jìn)制數(shù)的十位數(shù),重復(fù)以上過程,一直循環(huán)到商為0時(shí),得到的余數(shù)就是所求十進(jìn)制數(shù)的最高位數(shù)。這就是數(shù)制轉(zhuǎn)換中常用的“除模留余倒排列”法則。cd1=strlen(str7);for(i=0,j=1;i<cd1;i++,j++){if(str7[i]=='1')num=num+1*pow(16,cd1-j);elseif(str7[i]=='2')num=num+2*pow(16,cd1-j);elseif(str7[i]=='3')num=num+3*pow(16,cd1-j);elseif(str7[i]=='4')num=num+4*pow(16,cd1-j);elseif(str7[i]=='5')num=num+5*pow(16,cd1-j);elseif(str7[i]=='1')num=num+1*pow(16,cd1-j);elseif(str7[i]=='6')num=num+6*pow(16,cd1-j);elseif(str7[i]=='7')num=num+7*pow(16,cd1-j);elseif(str7[i]=='8')num=num+8*pow(16,cd1-j);elseif(str7[i]=='9')num=num+9*pow(16,cd1-j);elseif(str7[i]=='A')num=num+10*pow(16,cd1-j);elseif(str7[i]=='B')num=num+11*pow(16,cd1-j);elseif(str7[i]=='C')num=num+12*pow(16,cd1-j);elseif(str7[i]=='D')num=num+13*pow(16,cd1-j);elseif(str7[i]=='E')num=num+14*pow(16,cd1-j);elseif(str7[i]=='F')num=num+15*pow(16,cd1-j);}3.2.2二進(jìn)制轉(zhuǎn)換為十進(jìn)制由二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)的基本做法是,把二進(jìn)制數(shù)首先寫成加權(quán)系數(shù)展開式,然后按十進(jìn)制加法規(guī)則求和。這種做法稱為"按權(quán)相加"法。本段程序的作用是將二進(jìn)制轉(zhuǎn)化為十進(jìn)制,可作為二進(jìn)制轉(zhuǎn)化為其他進(jìn)制的橋梁。zj=num1;result=0;for(i=0;i<=cd;i++){result=result+fmod((int)(zj),10)*pow(2,i);zj=(int)(zj/10);}3.2.3八進(jìn)制轉(zhuǎn)換為十進(jìn)制本段程序的作用是將八進(jìn)制轉(zhuǎn)化為十進(jìn)制,可作為八進(jìn)制轉(zhuǎn)化為其他進(jìn)制的橋梁。zj=num1;result=0;for(i=0;i<=cd;i++){result=result+fmod((int)(zj),10)*pow(8,i);zj=(int)(zj/10);}3.3一元多項(xiàng)式運(yùn)算設(shè)計(jì)思路輸入多項(xiàng)式采用頭插法的方式,輸入多項(xiàng)式中一個(gè)項(xiàng)的系數(shù)和指數(shù),就產(chǎn)生一個(gè)新的節(jié)點(diǎn),建立起它的右指針,并用頭節(jié)點(diǎn)指向它;為了判斷一個(gè)多項(xiàng)式是否輸入結(jié)束,定義一個(gè)結(jié)束標(biāo)志,當(dāng)輸入非0時(shí)就繼續(xù),當(dāng)輸入0時(shí),就結(jié)束一個(gè)多項(xiàng)式的輸入。創(chuàng)建一元多項(xiàng)式的關(guān)鍵程序如下,由用戶決定一元多項(xiàng)式的項(xiàng)數(shù),項(xiàng)數(shù)系數(shù)和指數(shù)。#include<stdlib.h>#include<stdio.h>#include<ctype.h>typedefstructterm{//項(xiàng)的表示,多項(xiàng)式的項(xiàng)作為LinkList的數(shù)據(jù)元素floatcoef;//系數(shù)intexpn;//指數(shù)structterm*next;}termterm*CreatPolyn(term*P,intm){//算法2.22//輸入m項(xiàng)的系數(shù)和指數(shù),建立表示一元多項(xiàng)式的有序鏈表Pif(m<=0)returnNULL;term*h=P=(term*)malloc(sizeof(term)),*q;P->coef=0.0;inti;printf("依次輸入%d個(gè)非零項(xiàng)\n",m);for(i=1;i<=m;++i){//依次輸入m個(gè)非零項(xiàng)scanf("%f%d",&P->coef,&P->expn);if(P->coef)q=P;P=P->next=(term*)malloc(sizeof(term));}q->next=NULL;free(P);returnh;}//CreatPolyn3.3.1一元多項(xiàng)式的相加它從兩個(gè)多項(xiàng)式的頭部開始,兩個(gè)多項(xiàng)式的某一項(xiàng)都不為空時(shí),如果指數(shù)相等的話,系數(shù)就應(yīng)該相加;相加的和不為0的話,用頭插法建立一個(gè)新的節(jié)點(diǎn)。p的指數(shù)小于q的指數(shù)的話,就應(yīng)該復(fù)制q節(jié)點(diǎn)到多項(xiàng)式中。p的指數(shù)大于q的指數(shù)的話,就應(yīng)該復(fù)制p節(jié)點(diǎn)到多項(xiàng)式中。當(dāng)?shù)诙€(gè)多項(xiàng)式空,第一個(gè)多項(xiàng)式不為空時(shí),將第一個(gè)多項(xiàng)式用新節(jié)點(diǎn)產(chǎn)生。當(dāng)?shù)谝粋€(gè)多項(xiàng)式空,第二個(gè)多項(xiàng)式不為空時(shí),將第二多項(xiàng)式用新節(jié)點(diǎn)產(chǎn)生。一元多項(xiàng)式加法的關(guān)鍵程序如下:term*APolyn(term*Pa,term*Pb){//算法2.23//多項(xiàng)式加法:Pa=Pa+Pb,利用兩個(gè)多項(xiàng)式的結(jié)點(diǎn)構(gòu)成"和多項(xiàng)式"。term*h,*qa=Pa,*qb=Pb,*p,*q;floatsum;h=p=(term*)malloc(sizeof(term));p->next=NULL;while(qa&&qb){//Pa和Pb均非空switch(Compare(qa,qb)){case-1://多項(xiàng)式PA中當(dāng)前結(jié)點(diǎn)的指數(shù)值小p->next=qb;p=qb;qb=qb->next;break;case0://兩者的指數(shù)值相等sum=qa->coef+qb->coef;if(sum!=0.0){//修改多項(xiàng)式PA中當(dāng)前結(jié)點(diǎn)的系數(shù)值p->next=qa;qa->coef=sum;p=qa;qa=qa->next;}else{//刪除多項(xiàng)式PA中當(dāng)前結(jié)點(diǎn)q=qa;qa=qa->next;ree(q);}q=qb;qb=qb->next;free(q);break;case1://多項(xiàng)式PB中當(dāng)前結(jié)點(diǎn)的指數(shù)值小p->next=qa;p=qa;qa=qa->next;break;}//switch}//whileif(Pa)p->next=qa;//鏈接Pa中剩余結(jié)點(diǎn)if(Pb)p->next=qb;//鏈接Pb中剩余結(jié)點(diǎn)q=h;h=h->next;free(q);returnh;}//APolynterm*A(term*Pa,term*Pb){intn;puts("再輸入一一元多項(xiàng)式的項(xiàng)數(shù)");scanf("%d",&n);//輸入nPb=CreatPolyn(Pb,n);Pb=selsort(Pb);PrintfPoly(Pa);//輸出Poly(Pa)if(Pb&&Pb->coef>0)printf("+");PrintfPoly(Pb);Pa=APolyn(Pa,Pb);printf("=");//輸出“=”Pa=selsort(Pa);PrintfPoly(Pa);returnPa;}3.3.2一元多項(xiàng)式的相減它從兩個(gè)多項(xiàng)式的頭部開始,兩個(gè)多項(xiàng)式的某一項(xiàng)都不為空時(shí),如果指數(shù)相等的話,系數(shù)就應(yīng)該相減;相加的和不為0的話,用頭插法建立一個(gè)新的節(jié)點(diǎn)。p的指數(shù)小于q的指數(shù)的話,就應(yīng)該復(fù)制q節(jié)點(diǎn)到多項(xiàng)式中。p的指數(shù)大于q的指數(shù)的話,就應(yīng)該復(fù)制p節(jié)點(diǎn)到多項(xiàng)式中,并且建立的節(jié)點(diǎn)的系數(shù)為原來的相反數(shù);當(dāng)?shù)诙€(gè)多項(xiàng)式空,第一個(gè)多項(xiàng)式不為空時(shí),將第一個(gè)多項(xiàng)式用新節(jié)點(diǎn)產(chǎn)生。當(dāng)?shù)谝粋€(gè)多項(xiàng)式空,第二個(gè)多項(xiàng)式不為空時(shí),將第二個(gè)多項(xiàng)式用新節(jié)點(diǎn)產(chǎn)生,并且建立的節(jié)點(diǎn)的系數(shù)為原來的相反數(shù)。一元多項(xiàng)式減法關(guān)鍵程序如下:term*BPolyn(term*Pa,term*Pb){//多項(xiàng)式減法:Pa=Pa-Pb,利用兩個(gè)多項(xiàng)式的結(jié)點(diǎn)構(gòu)成"差多項(xiàng)式"。term*p=Pb;//創(chuàng)建指針while(p){p->coef*=-1;p=p->next;}returnAPolyn(Pa,Pb);}//BPolynterm*B(term*Pa,term*Pb){intn;puts("再輸入一一元多項(xiàng)式的項(xiàng)數(shù)");scanf("%d",&n);Pb=CreatPolyn(Pb,n);Pb=selsort(Pb);PrintfPoly(Pa);printf("-");putchar('(');PrintfPoly(Pb);putchar(')');Pa=BPolyn(Pa,Pb);printf("=");Pa=selsort(Pa);PrintfPoly(Pa);returnPa;}第四章程序流程圖圖2流程圖程序流程圖的說明:首先開始后輸出功能選擇菜單,在選擇菜單中1代表四則運(yùn)算,2代表進(jìn)制轉(zhuǎn)換,3代表一元多項(xiàng)式的計(jì)算,0表示退出。當(dāng)選擇1時(shí),調(diào)用四則運(yùn)算程序,在四則運(yùn)算程序中輸出子菜單,根據(jù)提示選擇要進(jìn)行的算法,輸入數(shù)據(jù)得到運(yùn)行結(jié)果出現(xiàn)問句是否結(jié)束運(yùn)行是:結(jié)束,否:回到開始;當(dāng)選擇2時(shí),調(diào)用進(jìn)制轉(zhuǎn)換程序,輸出子菜單,根據(jù)提示選擇進(jìn)制轉(zhuǎn)換,操作步驟同上;當(dāng)選擇3時(shí),調(diào)用一元多項(xiàng)式的計(jì)算程序,在子菜單中輸入要計(jì)算的多項(xiàng)式,選擇要進(jìn)行的加減運(yùn)算,運(yùn)行。當(dāng)選擇0時(shí),結(jié)束程序。第五章程序運(yùn)行結(jié)果圖5.1四則運(yùn)算運(yùn)行結(jié)果圖3四則運(yùn)算結(jié)果圖3是四則運(yùn)算運(yùn)行結(jié)果,在主菜單中選擇1基本四則運(yùn)算,然后選擇2減法基本運(yùn)算輸入數(shù)據(jù)3426即得到運(yùn)行結(jié)果為85.2一元多項(xiàng)式加減運(yùn)行結(jié)果圖4一元多項(xiàng)式結(jié)果圖4是一元多項(xiàng)式運(yùn)算結(jié)果,在主菜單中選3一元多項(xiàng)式運(yùn)算,在提示下輸入3個(gè)非零項(xiàng),得出運(yùn)算結(jié)果,若還要繼續(xù)運(yùn)算則輸入要輸入的項(xiàng)數(shù)4,再輸入4個(gè)非零項(xiàng):34564523得出運(yùn)算結(jié)果。5.3運(yùn)行初始狀態(tài)圖5初始菜單圖5為程序的初始狀態(tài)及主菜單,在該對(duì)話框中選擇要進(jìn)行的功能。第六章總結(jié)附錄附錄一參考文獻(xiàn)[1]嚴(yán)蔚敏.數(shù)據(jù)結(jié)構(gòu).北京:清華大學(xué)出版社,2010年[2]蘇士華.數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì).機(jī)械工程出版社附錄二程序源代碼#include<stdlib.h>#include<stdio.h>#include<ctype.h>voidcomputer1();voidcomputer2();voidcomputer3();intsum(intx,inty);//加intsubstract(intx,inty);intmultipe(intx,inty);intdiver(intx,inty);intBtoD(char*,char*);typedefstructterm{//項(xiàng)的表示,多項(xiàng)式的項(xiàng)作為LinkList的數(shù)據(jù)元素floatcoef;//系數(shù)intexpn;//指數(shù)structterm*next;}term;term*CreatPolyn(term*P,intm){//算法2.22//輸入m項(xiàng)的系數(shù)和指數(shù),建立表示一元多項(xiàng)式的有序鏈表Pif(m<=0)returnNULL;term*h=P=(term*)malloc(sizeof(term)),*q;P->coef=0.0;inti;printf("依次輸入%d個(gè)非零項(xiàng)\n",m);for(i=1;i<=m;++i){//依次輸入m個(gè)非零項(xiàng)scanf("%f%d",&P->coef,&P->expn);if(P->coef)q=P;P=P->next=(term*)malloc(sizeof(term));}q->next=NULL;free(P);returnh;}//CreatPolynterm*selsort(term*h){term*g,*p,*q;if(!h)returnNULL;floatf;inti,fini=1;for(g=h;g->next&&fini;g=g->next){fini=0;for(p=h,q=h->next;q;p=p->next,q=q->next)if(p->expn<q->expn){f=p->coef;i=p->expn;p->coef=q->coef;p->expn=q->expn;q->coef=f;q->expn=i;fini=1;}}for(g=h,p=g->next;p;)if(g->expn==p->expn){g->coef+=p->coef;g->next=p->next;q=p;p=p->next;free(q);}elseif(g->next){g=g->next;p=p->next;}returnh;}voidPrintfPoly(term*P){term*q=P;if(!q){putchar('0');return;}if(q->coef!=1){printf("%g",q->coef);if(q->expn==1)putchar('X');elseif(q->expn)printf("X^%d",q->expn);}elseif(!q->expn)putchar('1');elseif(q->expn==1)putchar('X');elseprintf("X^%d",q->expn);q=q->next;while(q){if(q->coef>0)putchar('+');if(q->coef!=1){printf("%g",q->coef);if(q->expn==1)putchar('X');elseif(q->expn)printf("X^%d",q->expn);}elseif(!q->expn)putchar('1');elseif(q->expn==1)putchar('X');elseprintf("X^%d",q->expn);q=q->next;}}Compare(term*a,term*b){if(a->expn<b->expn)return-1;if(a->expn>b->expn)return1;return0;}term*APolyn(term*Pa,term*Pb){//算法2.23//多項(xiàng)式加法:Pa=Pa+Pb,利用兩個(gè)多項(xiàng)式的結(jié)點(diǎn)構(gòu)成"和多項(xiàng)式"。term*h,*qa=Pa,*qb=Pb,*p,*q;floatsum;h=p=(term*)malloc(sizeof(term));p->next=NULL;while(qa&&qb){//Pa和Pb均非空switch(Compare(qa,qb)){case-1://多項(xiàng)式PA中當(dāng)前結(jié)點(diǎn)的指數(shù)值小p->next=qb;p=qb;qb=qb->next;break;case0://兩者的指數(shù)值相等sum=qa->coef+qb->coef;if(sum!=0.0){//修改多項(xiàng)式PA中當(dāng)前結(jié)點(diǎn)的系數(shù)值p->next=qa;qa->coef=sum;p=qa;qa=qa->next;}else{//刪除多項(xiàng)式PA中當(dāng)前結(jié)點(diǎn)q=qa;qa=qa->next;free(q);}q=qb;qb=qb->next;free(q);break;case1://多項(xiàng)式PB中當(dāng)前結(jié)點(diǎn)的指數(shù)值小p->next=qa;p=qa;qa=qa->next;break;}//switch}//whileif(Pa)p->next=qa;//鏈接Pa中剩余結(jié)點(diǎn)if(Pb)p->next=qb;//鏈接Pb中剩余結(jié)點(diǎn)q=h;h=h->next;free(q);returnh;}//APolynterm*A(term*Pa,term*Pb){intn;puts("再輸入一一元多項(xiàng)式的項(xiàng)數(shù)");scanf("%d",&n);Pb=CreatPolyn(Pb,n);Pb=selsort(Pb);PrintfPoly(Pa);if(Pb&&Pb->coef>0)printf("+");PrintfPoly(Pb);Pa=APolyn(Pa,Pb);printf("=");Pa=selsort(Pa);PrintfPoly(Pa);returnPa;}term*BPolyn(term*Pa,term*Pb){//算法2.23//多項(xiàng)式減法:Pa=Pa-Pb,利用兩個(gè)多項(xiàng)式的結(jié)點(diǎn)構(gòu)成"差多項(xiàng)式"。term*p=Pb;while(p){p->coef*=-1;p=p->next;}returnAPolyn(Pa,Pb);}//BPolynterm*B(term*Pa,term*Pb){intn;puts("再輸入一一元多項(xiàng)式的項(xiàng)數(shù)");scanf("%d",&n);Pb=CreatPolyn(Pb,n);Pb=selsort(Pb);PrintfPoly(Pa);printf("-");putchar('(');PrintfPoly(Pb);putchar(')');Pa=BPolyn(Pa,Pb);printf("=");Pa=selsort(Pa);PrintfPoly(Pa);returnPa;}term*CPolyn(term*Pa,term*Pb){//算法2.23//多項(xiàng)式乘法:Pa=Pa*Pb,利用兩個(gè)多項(xiàng)式的結(jié)點(diǎn)構(gòu)成"積多項(xiàng)式"。if(!Pb)returnNULL;term*pa=Pa,*p,*q,*r,*s,*t;r=p=(term*)malloc(sizeof(term));while(pa){p->coef=pa->coef;p->expn=pa->expn;q=p;p=p->next=(term*)malloc(sizeof(term));pa=pa->next;}q->next=NULL;free(p);pa=Pa;t=s=(term*)malloc(sizeof(term));while(pa){q=s;s=s->next=(term*)malloc(sizeof(term));pa=pa->next;}q->next=NULL;free(s);pa=Pa;while(pa){pa->coef*=Pb->coef;pa->expn+=Pb->expn;pa=pa->next;}Pb=Pb->next;while(Pb){p=r;s=t;while(p){s->coef=p->coef*Pb->coef;s->expn=p->expn+Pb->expn;p=p->next;s=s->next;}Pa=APolyn(Pa,t);Pb=Pb->next;}returnPa;}//CPolynterm*C(term*Pa,term*Pb){intn;puts("再輸入一一元多項(xiàng)式的項(xiàng)數(shù)");scanf("%d",&n);Pb=CreatPolyn(Pb,n);Pb=selsort(Pb);putchar('(');PrintfPoly(Pa);putchar(')');printf("*");putchar('(');PrintfPoly(Pb);putchar(')');printf("=");Pa=CPolyn(Pa,Pb);Pa=selsort(Pa);PrintfPoly(Pa);returnPa;}voidmain(){inti;pri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論