

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> C語言集中上機報告</b></p><p> 院 系: 通信與信息工程學院 </p><p> 班 級: 電子信息工程 </p><p> 姓 名: </p><p> 指導教師:
2、 </p><p> 2012 年 05月 20日</p><p><b> 目 錄</b></p><p><b> 一 概述3</b></p><p> 1.1課程設(shè)計的目的3</p><p> 1.2課程設(shè)計的要求3<
3、;/p><p> 1.3課程設(shè)計的主要設(shè)計思想3</p><p> 二 總體方案設(shè)計4</p><p><b> 2.1整體框圖4</b></p><p> 2.2主要功能表4</p><p><b> 三 詳細設(shè)計5</b></p><p
4、> 四 程序的調(diào)試與運行結(jié)果說明6</p><p> 4.1 調(diào)試報告6</p><p><b> 4.2測試結(jié)果7</b></p><p> 五 課程設(shè)計總結(jié)8</p><p><b> 六 后記9</b></p><p><b> 七
5、 附錄9</b></p><p><b> 參考文獻16</b></p><p><b> 一 概述</b></p><p> 1.1課程設(shè)計的目的</p><p> 為綜合應用C語言程序設(shè)計理論知識、進一步提高我們綜合解決問題、協(xié)調(diào)工作的能力和良好的軟件開發(fā)習慣,學校為我們
6、特意安排此次課程設(shè)計。希望通過該實習能夠進一步激發(fā)我們的學習熱情,培養(yǎng)我們初步編程的能力,為后續(xù)的學習和發(fā)展奠定基礎(chǔ)。</p><p> 1.2課程設(shè)計的要求</p><p> 掌握從上至下的分析過程;合理完成功能的分解;分析獲得實現(xiàn)功能所需的各種數(shù)據(jù)結(jié)構(gòu);功能模塊的整合;使用面相過程開發(fā)語言建立各種數(shù)據(jù)結(jié)構(gòu),各種結(jié)構(gòu)體;掌握面相過程開發(fā)語言的特點,建立各種函數(shù)實現(xiàn)各個功能;調(diào)用各個功
7、能模塊,完成系統(tǒng)的整體功能;調(diào)試、測試各個功能模塊,并完成系統(tǒng)的測試;分析畫出各個功能的流程等。</p><p> 1.3課程設(shè)計的主要設(shè)計思想</p><p> 用不同的數(shù)組存儲操作數(shù)和操作符號,然后要定義運算的優(yōu)先級,因為我準備通過輸入運算表達式來直接求出運算結(jié)果,所以要使用到括號。通過上網(wǎng)查閱資料,我決定采用逆波蘭表達式,它的優(yōu)勢在于只用兩種簡單操作,入棧和出棧就可以搞定任何普通
8、表達式的運算。其運算方式如下: 如果當前字符為變量或者為數(shù)字,則壓棧,如果是運算符,則將棧頂兩個元素彈出作相應運算,結(jié)果再入棧,最后當表達式掃描完后,棧里的就是結(jié)果。由于我對棧的應用不是很熟練,因此這里改用數(shù)組和指針。但基本思路是類似的。</p><p><b> 二 總體方案設(shè)計</b></p><p><b> 2.1整體框圖</b>&l
9、t;/p><p><b> 2.2主要功能表</b></p><p><b> 三 詳細設(shè)計</b></p><p> 主要部分的詳細流程圖</p><p> (1)if(a[i]>='0'&&a[i]<='9')//內(nèi)循環(huán)使用if-e
10、lse語句,一個操作數(shù)的表示</p><p><b> {</b></p><p><b> z=0;</b></p><p><b> j=i+1;</b></p><p> while(a[j]>='0'&&a[j]<=&
11、#39;9')</p><p><b> {j++;}</b></p><p> j--;//回到該操作數(shù)的個位</p><p> for(k=i;k<=j;k++)</p><p><b> {</b></p><p> z=z*10+a[k]-
12、39;0';</p><p><b> }</b></p><p><b> j=j+1;</b></p><p><b> x=z;</b></p><p> i j</p>
13、<p><b> X<=z</b></p><p> (2) if(a[j]=='.')</p><p><b> {</b></p><p><b> l=1;</b></p><p><b> i=j+1;</b&
14、gt;</p><p><b> j=i+1;</b></p><p> while(a[j]>='0'&&a[j]<='9')</p><p><b> {j++;}</b></p><p><b> j--;</
15、b></p><p> for(k=i;k<=j;k++)</p><p><b> {</b></p><p> n=pow(0.1,l);//pow(x,y)表示計算x的y次方,這里指計算0.1的l次方</p><p><b> l=l+1;</b></p>&
16、lt;p> x=x+n*(a[k]-'0');//一個帶小數(shù)的操作數(shù)讀取完成</p><p><b> }</b></p><p> i j</p><p><b> k</b></p><p><b> n&l
17、t;/b></p><p><b> x=k+n</b></p><p> (3)逆波蘭算法流程</p><p> 1、建立運算符棧stackOperator用于運算符的存儲,壓入'\0'。 </p><p> 2、預處理表達式,正、負號前加0(如果一個加號(減號)出現(xiàn)在最前面或左括號后面,
18、則該加號(減號)為正負號) 。 </p><p> 3、順序掃描表達式,如果當前字符是數(shù)字(優(yōu)先級為0的符號),則直接輸出該數(shù)字;如果當前字符為運算符或括號(優(yōu)先級不為0的符號),則判斷第4點 。 </p><p> 4、若當前運算符為'(',直接入棧; 若為')',出棧并順序輸出運算符直到遇到第一個'(',遇到的第一個'(
19、9;出棧但不輸出; 若為其它,比較stackOperator棧頂元素與當前元素的優(yōu)先級: </p><p> 如果 棧頂元素運算符優(yōu)先級 >= 當前元素的優(yōu)先級,出棧并順序輸出運算符直到 棧頂元素優(yōu)先級 < 當前元素優(yōu)先級,然后當前元素入棧; 如果 棧頂元素 < 當前元素,直接入棧。 </p><p> 5、重復第3點直到表達式掃描完畢。 </p>&l
20、t;p> 6、順序出棧并輸出運算符直到棧頂元素為'\0'。</p><p> 四 程序的調(diào)試與運行結(jié)果說明</p><p><b> 4.1 調(diào)試報告</b></p><p> 1、編譯時提示錯誤:</p><p> 原因為分號是在中文輸入法狀態(tài)下輸入,將其改為英文輸入狀態(tài)下了分號即可。&
21、lt;/p><p> 2. 編譯時提示錯誤</p><p> 原因為頭文件里忘了寫#include<malloc.h>,導致出現(xiàn) Undeclaredidentifier,在頭文件里加上即可改正。</p><p><b> 4.2測試結(jié)果</b></p><p> ※(普通加減乘除四則運算)</p&
22、gt;<p> ※(小數(shù)的開方運算)</p><p> ※(負數(shù)的乘方運算)</p><p><b> ※(帶括號的運算)</b></p><p> ※(負數(shù)的開方運算)</p><p> ※(很大的數(shù)也可以運算)</p><p><b> 五 課程設(shè)計總結(jié)&l
23、t;/b></p><p> 本課程設(shè)計我只完成了一些基本的功能,還有很多功能沒有實現(xiàn):如不能進行三角函數(shù)運算,不能進行l(wèi)n,階乘運算等。還有因為我自己沒有設(shè)計出計算器界面,所以使用戶感覺不是那么方便,因此該設(shè)計還有待進一步完善。我覺得要設(shè)計出好用的計算器界面,可以利用VC++6.0里邊的MFC AppWizard(exe)進行設(shè)計,我已經(jīng)初步設(shè)計出計算器界面,但和程序的結(jié)合方面還有問題,但我有時間會繼續(xù)
24、完成的。</p><p><b> 六 后記</b></p><p> 通過這次課程設(shè)計,我明白了很多。</p><p> 首先基本功要過硬。不能馬虎經(jīng)常犯犯小錯誤。提高自己找錯糾錯能力,通常錯誤總是那幾種,多練習就熟練了。</p><p> 其次要善于查找資料提高自己的資料查詢能力,要善于利用網(wǎng)絡來獲得知識,獲
25、得幫助。開始著手程序設(shè)計時,有些功能感覺無從下手,都不知道要干什么。這些問題只要找到相關(guān)的資料就會得到提示從而理解所要解決問題的大致方向。有了明確的目的,就可以發(fā)揮自己的頭腦來完成它了。</p><p> 除此之外要善于思考。程序中有些實現(xiàn)難點和最初完成程序時免不了的許多不足就需要自己根據(jù)代碼認真思考來解決。只有這樣才能糾正程序的不足并使其更加人性化。</p><p> 這次課程設(shè)計讓
26、我學到了很多,不僅是鞏固了先前學的C程序設(shè)計知識,而且也培養(yǎng)了我的動手能力,更令我的創(chuàng)造性思維得到拓展。希望今后類似這樣課程設(shè)計、類似這樣的鍛煉機會能更多些!</p><p><b> 七 附錄</b></p><p><b> 全部代碼及注釋</b></p><p> #include<stdio.h>
27、</p><p> #include<math.h></p><p> #include<malloc.h>//動態(tài)存儲分配函數(shù)頭文件,當對內(nèi)存區(qū)進行操作時,調(diào)用相關(guān)函數(shù).</p><p> double jisuan(char a[])</p><p><b> {</b></p&
28、gt;<p> int i=1,j,k,m,cnt=0,t1=0,t2=0,t3=0;//定義整型變量i,j,k,m,n,cnt,t1,t2,t3</p><p> char nibo[50],zhan2[50];//定義字符型數(shù)組</p><p> double x,n,l,z=0,zhan3[50];//定義雙精度變量x,n,l,z,zhan3[50]</p&
29、gt;<p> typedef struct//結(jié)構(gòu)體定義</p><p><b> {</b></p><p> double d1;</p><p><b> int d2;</b></p><p><b> }dd;</b></p>
30、<p> typedef struct</p><p><b> {</b></p><p> dd data[50];</p><p><b> int top;</b></p><p><b> }zhan1;</b></p><p&
31、gt; zhan1 *shu;//定義指針變量shu</p><p> shu=(zhan1 *)malloc(sizeof(zhan1));//給shu分配了zhan1大小的,類型為和zhan1相同的數(shù)組</p><p> shu->top=0;//shu指向top=0的位置</p><p> while(a[i]!='\0')//外
32、循環(huán)是用while語句</p><p><b> {</b></p><p> if(a[i]>='0'&&a[i]<='9')//內(nèi)循環(huán)使用if-else語句,一個操作數(shù)的表示</p><p><b> {</b></p><p>
33、<b> z=0;</b></p><p><b> j=i+1;</b></p><p> while(a[j]>='0'&&a[j]<='9')//除非下個相鄰的位置里沒有合法的數(shù) 則表示一個操作數(shù)讀取完成</p><p><b> {j
34、++;}</b></p><p> j--;//回到該操作數(shù)的個位</p><p> for(k=i;k<=j;k++)</p><p><b> {</b></p><p> z=z*10+a[k]-'0';</p><p><b> }&l
35、t;/b></p><p><b> j=j+1;</b></p><p><b> x=z;</b></p><p> if(a[j]=='.')//如果操作數(shù)為小數(shù)</p><p><b> {</b></p><p>
36、<b> l=1;</b></p><p><b> i=j+1;</b></p><p><b> j=i+1;</b></p><p> while(a[j]>='0'&&a[j]<='9')</p><p&g
37、t;<b> {j++;}</b></p><p><b> j--;</b></p><p> for(k=i;k<=j;k++)</p><p><b> {</b></p><p> n=pow(0.1,l);//pow(x,y)表示計算x的y次方,這里指
38、計算0.1的l次方</p><p><b> l=l+1;</b></p><p> x=x+n*(a[k]-'0');//一個帶小數(shù)的操作數(shù)讀取完成</p><p><b> }</b></p><p> i=j+1;//開始下一個操作數(shù)的讀取</p><
39、;p><b> }</b></p><p><b> else i=j;</b></p><p> shu->data[++shu->top].d1=x;//先取shu->top值,++,(shu->top先加1在使用。 </p><p> shu->data[shu->t
40、op].d2=++cnt;</p><p> nibo[++t1]='0'+shu->data[shu->top].d2;</p><p> nibo[t1+1]='\0';</p><p><b> }</b></p><p> else if(a[i]=='
41、(')</p><p><b> {</b></p><p> zhan2[++t2]=a[i];</p><p><b> i++;</b></p><p><b> }</b></p><p> else if(a[i]=='
42、;)')</p><p><b> {</b></p><p><b> j=t2;</b></p><p> while(zhan2[j]!='(')</p><p><b> {</b></p><p> nibo[
43、++t1]=zhan2[j];</p><p> nibo[t1+1]='\0';</p><p><b> j--;</b></p><p><b> }</b></p><p><b> t2=j-1;</b></p><p>
44、;<b> i++;</b></p><p><b> }</b></p><p> else if(a[i]=='+')//對加法的定義</p><p><b> {</b></p><p> while(t2>0&&zhan2
45、[t2]!='(')//定義當加號和括號同時出現(xiàn)時</p><p><b> {</b></p><p> nibo[++t1]=zhan2[t2];//將zhan2[t2]賦給nibo[++t1]</p><p> nibo[t1+1]='\0';</p><p><b>
46、; t2--;</b></p><p><b> }</b></p><p> zhan2[++t2]=a[i];</p><p><b> i++;</b></p><p><b> }</b></p><p> else if
47、(a[i]=='-')//對減法的定義</p><p><b> {</b></p><p> if(a[i-1]=='$')</p><p><b> {</b></p><p><b> a[0]='0';</b>&l
48、t;/p><p><b> i=0;</b></p><p><b> }</b></p><p> else if(a[i-1]=='(')</p><p><b> {</b></p><p> a[i-1]='0
49、9;;</p><p> a[i-2]='(';</p><p><b> i=i-2;</b></p><p><b> t2--;</b></p><p><b> }</b></p><p><b> else&
50、lt;/b></p><p><b> {</b></p><p> while(t2>0&&zhan2[t2]!='(')//t2>0說明zhan2里還有括號</p><p><b> {</b></p><p> nibo[++t1]=z
51、han2[t2];//將括號輸出給表達式</p><p> nibo[t1+1]='\0';//下移一位</p><p> t2--;//指向zhan2的下一位</p><p><b> }</b></p><p> zhan2[++t2]=a[i];</p><p>&l
52、t;b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p> else if(a[i]=='*'||a[i]=='/')//對乘法和除法的定義</p><p><b>
53、{</b></p><p> while(zhan2[t2]=='*'||zhan2[t2]=='/'||zhan2[t2]=='^'||zhan2[t2]=='#')</p><p><b> {</b></p><p> nibo[++t1]=zhan2[t2
54、];//將zhan2中的*或/或#或^放到表達式中</p><p> nibo[t1+1]='\0';</p><p><b> t2--;</b></p><p><b> }</b></p><p> zhan2[++t2]=a[i];</p><p&
55、gt;<b> i++;</b></p><p><b> }</b></p><p> else if(a[i]=='^'||a[i]=='#')//邏輯運算中的或運算</p><p><b> {</b></p><p> whil
56、e(zhan2[t2]=='^'||zhan2[t2]=='#')</p><p><b> {</b></p><p> nibo[++t1]=zhan2[t2];</p><p> nibo[t1+1]='\0';</p><p><b> t2--;
57、</b></p><p><b> }</b></p><p> zhan2[++t2]=a[i];</p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</
58、b></p><p> while(t2>0)//繼續(xù)取出zhan2里邊的符號</p><p><b> {</b></p><p> nibo[++t1]=zhan2[t2];//將zhan2[t2]值賦給nibo[++t1]</p><p> nibo[t1+1]='\0';//碰
59、到'\0'結(jié)束部分程序的運算</p><p><b> t2--;</b></p><p><b> }</b></p><p><b> j=1;t3=0;</b></p><p> while(j<=t1)</p><p&g
60、t;<b> {</b></p><p> if(nibo[j]>='0'&&nibo[j]!='^'&&nibo[j]!='#')</p><p><b> {</b></p><p> for(i=1;i<=shu-&g
61、t;top;i++)</p><p><b> {</b></p><p> if((int)(nibo[j]-'0')==shu->data[i].d2)</p><p><b> {</b></p><p><b> m=i;</b></
62、p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> zhan3[++t3]=shu->data[m].d1;</p><p><b> }<
63、/b></p><p> else if(nibo[j]=='+')//對加法的定義</p><p><b> {</b></p><p> zhan3[t3-1]=zhan3[t3-1]+zhan3[t3];</p><p><b> t3--;</b></p&
64、gt;<p><b> }</b></p><p> else if(nibo[j]=='-')//對減法法的定義</p><p><b> {</b></p><p> zhan3[t3-1]=zhan3[t3-1]-zhan3[t3];</p><p>&l
65、t;b> t3--;</b></p><p><b> }</b></p><p> else if(nibo[j]=='*')//對乘法的定義</p><p><b> {</b></p><p> zhan3[t3-1]=zhan3[t3-1]*zha
66、n3[t3];</p><p><b> t3--;</b></p><p><b> }</b></p><p> else if(nibo[j]=='/')//對除法的定義</p><p><b> {</b></p><p>
67、; zhan3[t3-1]=zhan3[t3-1]/zhan3[t3];</p><p><b> t3--;</b></p><p><b> }</b></p><p> else if(nibo[j]=='^')//對乘方的定義</p><p><b> {
68、</b></p><p> zhan3[t3-1]=pow(zhan3[t3-1],zhan3[t3]);</p><p><b> t3--;</b></p><p><b> }</b></p><p> else if(nibo[j]=='#')//對開方的
69、定義</p><p><b> {</b></p><p> zhan3[t3]=sqrt(zhan3[t3]);</p><p><b> }</b></p><p><b> j++;</b></p><p><b> }<
70、/b></p><p> return zhan3[t3];//返回值</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p><p><b> for(;;)</b>
71、</p><p><b> {</b></p><p> char x,a[50];</p><p> double jieguo;</p><p><b> int i=0;</b></p><p><b> a[0]='$';</
72、b></p><p> printf("#表示開方,^表示乘方(支持負數(shù))\n");</p><p> printf("請輸入表達式,退出請輸入q:\n\n");</p><p> scanf("%c",&x);</p><p> if(x=='q
73、9;) break;//輸入q表示退出</p><p> while(x!='\n')//碰到'\0'結(jié)束部分程序的運算</p><p><b> {</b></p><p><b> a[++i]=x;</b></p><p> scanf("%c
74、",&x);</p><p><b> }</b></p><p> a[i+1]='\0';</p><p> jieguo=jisuan(a);</p><p> printf("\n");</p><p> printf(&qu
75、ot;結(jié)果為:%lf",jieguo);//結(jié)果為long float型</p><p> printf("\n\n\n\n");//空4行,和下一次的結(jié)果區(qū)分,看起來舒服些</p><p><b> }</b></p><p><b> }</b></p><p&g
76、t;<b> 參考文獻</b></p><p> [1] 譚浩強,C程序設(shè)計題解與上機指導(第二版),北京,清華大學出版社,2000年9月。</p><p> [2] 張宏軍,黨留群,趙天巨.Visual C++ 6.0編程案例精解.北京:電子工業(yè)出版社,2005</p><p> [3] 陳朔鷹,C語言程序設(shè)計基礎(chǔ)教程,兵器工業(yè)出版社
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 簡單計算器課程設(shè)計報告
- 計算器java課程設(shè)計--簡單計算器
- 簡單計算器課程設(shè)計
- c++簡單計算器課程設(shè)計報告
- c++課程設(shè)計報告--簡單計算器
- 簡單的計算器課程設(shè)計
- 課程設(shè)計---簡單的計算器
- vb課程設(shè)計--簡單計算器
- 簡單的計算器課程設(shè)計
- 課程設(shè)計--簡單計算器的設(shè)計
- 課程設(shè)計--簡單的計算器設(shè)計
- 課程設(shè)計--簡單計算器的設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--簡單計算器
- 課程設(shè)計實驗報告--簡單的計算器設(shè)計
- c++課程設(shè)計--簡單計算器
- c++課程設(shè)計--簡單計算器
- vc++課程設(shè)計報告--簡單科學計算器設(shè)計
- 計算器課程設(shè)計報告
- 課程設(shè)計報告---計算器設(shè)計
- vc++課程設(shè)計---簡單計算器的設(shè)計
評論
0/150
提交評論