版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 一.概述2</b></p><p> 二.總體方案設(shè)計3</p><p><b> 三.詳細設(shè)計4</b></p><p> 四.程序的調(diào)試與運行結(jié)果說明5</p><
2、p> 五.課程設(shè)計總結(jié)6</p><p><b> 參考文獻7</b></p><p> 附錄..................................................................................................................................
3、...............8</p><p><b> 一 概述</b></p><p> 一、課程設(shè)計的目的與要求</p><p> 本課程設(shè)計是為了配合《數(shù)據(jù)結(jié)構(gòu)》課程的開設(shè),通過設(shè)計一個完整的程序,使學(xué)生掌握數(shù)據(jù)結(jié)構(gòu)的應(yīng)用,算法的編寫,類C語言的算法轉(zhuǎn)換成C程序并用Turbo C2.0或Visual C++6.0上機調(diào)試的基本方
4、法。要求如下: 1.要充分認識課程設(shè)計對自己的重要性,認真做好課程設(shè)計前的各項準備工作。 2.既要虛心接受老師的指導(dǎo),又要充分發(fā)揮主觀能動性.結(jié)合課題,獨立思考,努力鉆研,勤于實踐,勇于創(chuàng)新。 3.獨立按時完成規(guī)定的工作任務(wù),不得弄虛作假,不準抄襲他人內(nèi)容,否則成績以不及格計。 4.課程設(shè)計期間,無故缺席按曠課處理;缺席時間達四分之一以上者,其成績按不及格處理。 5.在設(shè)計過程中,要嚴格要求自己,樹立嚴肅,
5、嚴密,嚴謹?shù)目茖W(xué)態(tài)度,必須按時,按質(zhì),按量完成課程設(shè)計。 6.小組成員之間,分工明確,但要保持聯(lián)系暢通,密切合作,培養(yǎng)良好的互相幫助和團隊協(xié)作精神。</p><p><b> 二、需求分析</b></p><p> 本課程設(shè)計的課題為表達式求值,要求:</p><p> 1.用戶將表達式原樣輸入(在表達式結(jié)尾加上#),能得出結(jié)果(為
6、減小難度,運算結(jié)果的10進制形式的值,不超過longdouble的存儲范圍);</p><p> 2.輸入的數(shù)可以為小數(shù)(為減小難度,小數(shù)的整數(shù)與小數(shù)部分均不超過10位),負數(shù)(如果負數(shù)前有運算符,則應(yīng)將負數(shù)括起來),以及2進制,8進制,10進制,16進制的數(shù)(為減小難度,數(shù)出的結(jié)果都以10進制形式表示);</p><p> 3.運算符號包括()、+、—、*、/;括號可以多重;<
7、/p><p><b> 二 總體方案設(shè)計</b></p><p> 1.使用雙鏈表的數(shù)據(jù)結(jié)構(gòu)表示數(shù)據(jù)的存儲,將用戶輸入的表達式以字符形式存入雙鏈表中。</p><p> 2.對以負數(shù)開頭、以括號開頭、左括號后緊跟負數(shù)的特殊情況作處理。</p><p> 3.將數(shù)與運算符分開;</p><p>
8、 4.依次找到表達式最內(nèi)層括號,次內(nèi)層括號..................每次找到括號內(nèi)的表達式,便將其進行只有 加減乘除運算的計算。</p><p><b> 結(jié)構(gòu)體類型:</b></p><p> //用來存儲字符的結(jié)點類型</p><p> typedef struct CharNode</p><p>
9、;<b> {</b></p><p><b> char c;</b></p><p> struct CharNode *next;</p><p> }CharNode;</p><p> //用來存儲數(shù)的結(jié)點類型</p><p> typedef stru
10、ct IntNode</p><p><b> {</b></p><p> long double i;</p><p> struct IntNode *next;</p><p><b> }IntNode;</b></p><p> //用來存儲數(shù)的結(jié)點類型
11、</p><p> typedef struct Node</p><p><b> {</b></p><p> long double n;</p><p> struct Node_ys_char *next;</p><p><b> }Node;</b>
12、;</p><p> //用來存儲運算符的結(jié)點類型</p><p> typedef struct Node_ys_char</p><p><b> {</b></p><p><b> char c;</b></p><p> struct Node_ys_ch
13、ar *next_c;</p><p> struct Node *next;</p><p> }Node_ys_char;</p><p><b> 三 詳細設(shè)計</b></p><p> 我任務(wù)是整個程序的算法設(shè)計,以及部分子函數(shù)的編寫,經(jīng)過其他組員編寫的子函數(shù)的處理,將表達式變?yōu)橐粋€普通的表達式,其中數(shù)與
14、運算符已經(jīng)分開,將這個表達式的頭指針傳遞到我所編寫函數(shù)中,運算思想為:找到最內(nèi)層的一對括號,計算括號間的表達式的值,得到值之后,用這個值替換掉原始位置上的一對括號,以及其中的表達式。例如(((6.5-2*2.25)*2-6)/2+1.5)+3#,第一次替換后為((2*2-6)/2+1.5)+3#,第二次替換后為(-2/2+1.5)+3#,第三次替換后為0.5+3#,當沒有括號時調(diào)用四則運算函數(shù)直接計算。</p><p
15、> 如果一開始輸入的表達式中沒有括號,則直接調(diào)用四則運算函數(shù)進行計算。整個程序的算法思想見流程圖。</p><p><b> 函數(shù)的功能如下:</b></p><p> 主要部分的詳細流程圖)</p><p> 四 程序的調(diào)試與運行結(jié)果說明</p><p> 在編寫只有加減乘除的表達式求值的表達式求值時,
16、原始思想是用兩個指針分別指向相鄰的兩個運算符,若后者大,則進行后面運算符的運算,然后指針繼續(xù)后移,當再次遇到的兩個運算符,前者與后者相等,則進行前面運算符的運算;此算法思想錯誤,導(dǎo)致計算6+2*3+1#結(jié)果正確,而當計算6-2*3+1#時,卻得出-1的錯誤結(jié)果,正確結(jié)果為+1;這是因為先計算2*3得到6;表達式變?yōu)?-6+1#;接著進行6+1的運算,得到7;當前計算循序錯誤,導(dǎo)致結(jié)果錯誤。后來將程序改為先進行優(yōu)先級高的運算符的運算,當優(yōu)
17、先級相等時,不計算。指針后移,當遇到表達式結(jié)束標志時,便將指針移到表達式的頭位置,此時,判斷是否進行運算的條件發(fā)生變化,當前后運算符的優(yōu)先級相等時,進行前面運算符的運算;使得第一次將乘除運算符運算完,第二進行只有加減運算符的運算</p><p><b> 五 課程設(shè)計總結(jié)</b></p><p> 進過調(diào)試程序能得出大多數(shù)表達式的正確結(jié)果,雖然經(jīng)過了一些特殊情況表
18、達式的輸入,得出了正確結(jié)果,但不排除還有某些漏洞使得一些特殊情況的表達式不能得出正確結(jié)果,還有待進一步的測試。</p><p> 特點:本程序能進行小數(shù)、以及2進制、8進制、16進制的運算。</p><p> 不足:結(jié)果都以10進制形式表示,用戶不能改變;結(jié)果的10進制形式不能超出longdouble型數(shù)據(jù)能存儲的數(shù)的范圍;</p><p> 進一步的設(shè)想:將
19、數(shù)分段存儲,內(nèi)存動態(tài)分配,使其能進行天文數(shù)字運算;錄入其他的運算符例如指數(shù)運算,開方運算,取余運算,解一元一次方程,解二元一次方程組。</p><p><b> 附錄:</b></p><p><b> 源代碼:</b></p><p> //用來存儲字符的結(jié)點類型</p><p> typ
20、edef struct CharNode</p><p><b> {</b></p><p><b> char c;</b></p><p> struct CharNode *next;</p><p> }CharNode;</p><p> //用來存儲數(shù)
21、的結(jié)點類型</p><p> typedef struct IntNode</p><p><b> {</b></p><p> long double i;</p><p> struct IntNode *next;</p><p><b> }IntNode;</
22、b></p><p> //用來存儲數(shù)的結(jié)點類型</p><p> typedef struct Node</p><p><b> {</b></p><p> long double n;</p><p> struct Node_ys_char *next;</p&
23、gt;<p><b> }Node;</b></p><p> //用來存儲運算符的結(jié)點類型</p><p> typedef struct Node_ys_char</p><p><b> {</b></p><p><b> char c;</b>
24、</p><p> struct Node_ys_char *next_c;</p><p> struct Node *next;</p><p> }Node_ys_char;</p><p> char Precede(char x,char y)//運算符優(yōu)先級判斷</p><p><b>
25、 {</b></p><p><b> int i,j;</b></p><p> int from[5][5]</p><p><b> ={</b></p><p> {0,0,-1,-1,0},</p><p> {0,0,-1,-1,0},<
26、;/p><p> {1,1,0,0,1},</p><p> {1,1,0,0,1},</p><p> {0,0,-1,-1,0}</p><p> };//定義一個二維數(shù)組存放算術(shù)符號的優(yōu)先級</p><p><b> switch(x)</b></p><p>
27、<b> {</b></p><p> case '+':i=0;break;</p><p> case '-':i=1;break;</p><p> case '*':i=2;break;</p><p> case '/':i=3;brea
28、k;</p><p> case '#':i=4;break;</p><p><b> }</b></p><p><b> switch(y)</b></p><p><b> {</b></p><p> case
29、9;+':j=0;break;</p><p> case '-':j=1;break;</p><p> case '*':j=2;break;</p><p> case '/':j=3;break;</p><p> case '#':j=4;break;&
30、lt;/p><p><b> }</b></p><p> if(from[i][j]==1)//說明運算符i的優(yōu)先級比j的優(yōu)先級高</p><p> return '>';</p><p> if(from[i][j]==-1)</p><p> return
31、9;<';</p><p><b> else</b></p><p> return '=';</p><p><b> }</b></p><p> //輸入表達式,并對特殊情況做處理</p><p> CharNode *Crea
32、tRegister()</p><p><b> {</b></p><p> CharNode *top,*p,*q,*e;</p><p> top=(CharNode *)malloc(sizeof(CharNode));</p><p><b> p=q=top;</b></p
33、><p> scanf("%c",&p->c);</p><p> scanf("%c",&p->c);</p><p> if(q->c=='-')</p><p><b> {</b></p><p>
34、; p=(CharNode *)malloc(sizeof(CharNode));</p><p><b> p->c='0';</b></p><p> p->next=q;</p><p><b> top=p;</b></p><p><b>
35、p=q;</b></p><p><b> }</b></p><p> if(q->c=='(')</p><p><b> {</b></p><p> e=(CharNode *)malloc(sizeof(CharNode));</p>
36、<p><b> e->c='0';</b></p><p> p=(CharNode *)malloc(sizeof(CharNode));</p><p><b> p->c='+';</b></p><p> e->next=p;</p>
37、;<p> p->next=q;</p><p><b> p=q;</b></p><p><b> top=e;</b></p><p><b> }</b></p><p> while(p->c!='#')</p
38、><p><b> {</b></p><p> q=(CharNode *)malloc(sizeof(CharNode));</p><p> scanf("%c",&q->c);</p><p> if((p->c=='(')&&(q-&g
39、t;c=='-'))</p><p><b> {</b></p><p> e=(CharNode *)malloc(sizeof(CharNode));</p><p><b> e->c='0';</b></p><p> e->next=q
40、;</p><p> p->next=e;</p><p><b> p=q;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></
41、p><p> p->next=q;</p><p><b> p=q;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> p->c='+';</
42、b></p><p> p->next=(CharNode *)malloc(sizeof(CharNode));</p><p> p->next->c='0';</p><p> p=p->next;</p><p> p->next=(CharNode *)malloc(siz
43、eof(CharNode));</p><p> p->next->c='#';</p><p> return top;</p><p><b> }</b></p><p> //將數(shù)與運算符分開,并將其他進制轉(zhuǎn)化為10進制</p><p> Node *
44、StackChange(CharNode *top,int m)</p><p><b> {</b></p><p> CharNode *p,*q;</p><p> long double x=0,y=0;</p><p> char a[10],b[10];</p><p> i
45、nt n=0,i=0,JiWei,max,min=47,mark_1=0,mark_2=0,h,k=0;</p><p> Node *node,*head;</p><p> Node_ys_char *node_char;</p><p><b> switch(m)</b></p><p><b>
46、 {</b></p><p><b> case 2:</b></p><p><b> JiWei=2;</b></p><p><b> max=50;</b></p><p><b> break;</b></p>
47、<p><b> case 8:</b></p><p><b> JiWei=8;</b></p><p><b> max=56;</b></p><p><b> break;</b></p><p><b> cas
48、e 10:</b></p><p><b> JiWei=10;</b></p><p><b> max=97;</b></p><p><b> break;</b></p><p><b> case 16:</b></p&
49、gt;<p><b> JiWei=16;</b></p><p><b> max=103;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> p=q
50、=top;</b></p><p> while(p->c !='#')</p><p><b> {</b></p><p> while((q->c>min)&&(q->c<max)||(q->c==46))</p><p><
51、;b> {</b></p><p> if(q->c==46)</p><p><b> {</b></p><p><b> mark_1=1;</b></p><p> q=q->next;</p><p><b> }
52、</b></p><p> if(mark_1==0)</p><p><b> {</b></p><p> a[n]=q->c;</p><p> q=q->next;</p><p><b> n++;</b></p>&
53、lt;p><b> }</b></p><p> if(mark_1==1)</p><p><b> {</b></p><p> b[i]=q->c;</p><p> q=q->next;</p><p><b> i++;<
54、;/b></p><p><b> }</b></p><p><b> }</b></p><p> for(h=n-1;h>=0;h--)</p><p><b> {</b></p><p> x=(a[n-h-1]-48)*
55、pow(JiWei,h)+x;//</p><p><b> }</b></p><p> for(h=0;h<i;h++)</p><p><b> {</b></p><p> y=y+(b[h]-48)*pow(JiWei,(-(h+1)));//</p><
56、p><b> }</b></p><p> node=(Node *)malloc(sizeof(Node));//</p><p> node->n=x+y;</p><p><b> mark_1=0;</b></p><p><b> n=0;</b>
57、;</p><p><b> i=0;</b></p><p> if(mark_2==1)</p><p> node_char->next=node;</p><p> node_char=(Node_ys_char *)malloc(sizeof(Node_ys_char));</p>
58、<p> node_char->c=q->c;</p><p> node->next=node_char;</p><p> node_char->next_c=NULL;</p><p> node_char->next=NULL;</p><p> if(q->c=='#&
59、#39;)</p><p><b> {</b></p><p> node->next=(Node_ys_char *)malloc(sizeof(Node_ys_char));</p><p> node->next->c='#';</p><p> return head;
60、</p><p><b> }</b></p><p> q=q->next;</p><p> if(q->c<=min)</p><p> while(q->c<=min)</p><p><b> {</b></p>
61、<p> node_char->next_c=(Node_ys_char*)malloc(sizeof(Node_ys_char));</p><p> node_char->next_c->c=q->c;</p><p> q=q->next ;</p><p> //node->next=node_char
62、;</p><p> node_char=node_char->next_c;</p><p> node_char->next_c=NULL;</p><p> node_char->next=NULL;</p><p><b> }</b></p><p><b
63、> else</b></p><p><b> {</b></p><p> node->next=node_char;</p><p> node_char->next_c=NULL;</p><p> node_char->next=NULL;</p>&l
64、t;p><b> }</b></p><p><b> p=q;</b></p><p><b> n=0;</b></p><p><b> x=0;</b></p><p><b> y=0;</b></p&
65、gt;<p> if(mark_2==0)</p><p><b> {</b></p><p> head=node;</p><p><b> mark_2=1;</b></p><p><b> }</b></p><p>
66、<b> }</b></p><p> return head;</p><p><b> }</b></p><p> //作只有加減乘除運算的表達式求值</p><p> Node *Compute(Node *p)</p><p><b> {&l
67、t;/b></p><p> int mark=0;</p><p> Node *m,*n;</p><p> char max_char,min_char;</p><p><b> m=n=p;</b></p><p> while(p->next->c!=
68、9;#')</p><p><b> {</b></p><p> max_char=n->next->c;</p><p> n=n->next->next;</p><p> min_char=n->next->c;</p><p> if
69、((Precede(max_char,min_char)=='<'||Precede(max_char,min_char)=='=')&&mark!=1)</p><p><b> {</b></p><p><b> m=n;</b></p><p><b&
70、gt; }</b></p><p> if(Precede(max_char,min_char)=='>'||mark==1)</p><p><b> {</b></p><p> switch(m->next->c)</p><p><b> {<
71、;/b></p><p> case '+':m->n =m->n + n->n ;break;</p><p> case '-':m->n =m->n - n->n ;break;</p><p> case '*':m->n =m->n * n->
72、n ;break;</p><p> case '/':m->n =m->n / n->n ;break;</p><p><b> }</b></p><p> m->next=n->next;</p><p><b> n=m;</b><
73、;/p><p><b> }</b></p><p> if(m->next->c=='#')</p><p><b> {</b></p><p><b> m=n=p;</b></p><p><b> m
74、ark=1;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return m;</b></p><p><b> }</b></p><p> /
75、/求用戶輸入表達式的值</p><p> Node *GetOutcome(Node *head)</p><p><b> {</b></p><p> Node *p,*q,*R;</p><p> Node_ys_char *m,*n,*t,*k;</p><p> n=(Node
76、_ys_char *)malloc(sizeof(Node_ys_char));</p><p><b> n->c='(';</b></p><p><b> p=q=head;</b></p><p> while((n->c!=')')&&(q->
77、;next->c!='#'))</p><p><b> {</b></p><p> if(q->next->c=='(')</p><p><b> {</b></p><p> m=q->next;</p><
78、p><b> k=m;</b></p><p><b> }</b></p><p> else if(q->next->next_c==NULL)</p><p> q=q->next->next;</p><p><b> else</b
79、></p><p><b> {</b></p><p> m=q->next->next_c;</p><p> k=q->next;//t=q->next;</p><p> if(m->c=='(')</p><p><b&
80、gt; {</b></p><p><b> t=k;</b></p><p><b> k=m;</b></p><p><b> }</b></p><p> while(m->next_c!=NULL)</p><p>
81、<b> {</b></p><p> m=m->next_c;</p><p> if(m->c=='(')</p><p><b> {</b></p><p><b> t=k;</b></p><p><
82、;b> k=m;</b></p><p><b> }</b></p><p><b> }</b></p><p> q=m->next ;</p><p><b> }</b></p><p> if(q->
83、next->c==')')</p><p><b> {</b></p><p> n=q->next;</p><p><b> }</b></p><p><b> }</b></p><p> if(n->
84、;c==')')</p><p><b> {</b></p><p> p=k->next;</p><p> q->next->c='#';</p><p> R=Compute(p);</p><p> t->next =R;
85、</p><p> t->next_c=NULL;</p><p> R->next=n->next_c;</p><p> GetOutcome(head);</p><p><b> }</b></p><p><b> else</b><
86、;/p><p><b> {</b></p><p> R=Compute(head);</p><p><b> return R;</b></p><p><b> }</b></p><p><b> }</b><
87、/p><p><b> main()</b></p><p><b> {</b></p><p> int m;//進制</p><p><b> char a;</b></p><p> CharNode *top_1;</p>
88、<p> Node *top_2,*R;</p><p> printf("\n\n");</p><p> printf("███████████████████████████████████████\n");</p><p> printf("██
89、 ██\n");</p><p> printf("██ 表達式求值系統(tǒng) ██\n");</p><p> printf("██
90、 ██\n");</p><p> printf("███████████████████████████████████████\n");</p><p> printf("本程序可分別進行2進制,8進制,10進制,16進制的加
91、減乘除運算:\n");</p><p><b> loop:</b></p><p> printf("...............請輸入進制..............\n");</p><p> printf("你選的進制為:");</p><p> sca
92、nf("%d",&m);</p><p> printf("請輸入表達式,表達式請以#結(jié)尾:\n");</p><p> top_1=CreatRegister();//錄入表達式,并對特殊情況作處理,將頭指針帶回;</p><p> top_2=StackChange(top_1,m);//進制轉(zhuǎn)換,將數(shù)與運算
93、符分開,將頭指針帶回;</p><p> R=GetOutcome(top_2);得出結(jié)果</p><p> printf("運算結(jié)果的十進制形式為:\n");</p><p> printf("%lf",R->n);</p><p> printf("\n繼續(xù)進行運算請輸入y否
94、則退出:\n");</p><p> scanf("%c",&a);</p><p> scanf("%c",&a);</p><p> if(a=='y'||a=='Y')</p><p> goto loop; </p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- c語言,c++算數(shù)表達式求值
- 算數(shù)表達式的求解課程設(shè)計報告
- 算術(shù)表達式求值課程設(shè)計
- 算術(shù)表達式求值演示-課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---表達式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達式求值)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值
- 表達式求值廣義表的運算課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---算術(shù)表達式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告(二)表達式求值(計算器)
- c++課程設(shè)計---中綴表達式轉(zhuǎn)后綴表達式的實現(xiàn)
評論
0/150
提交評論