四則運算練習軟件(附源程序)_第1頁
四則運算練習軟件(附源程序)_第2頁
四則運算練習軟件(附源程序)_第3頁
四則運算練習軟件(附源程序)_第4頁
四則運算練習軟件(附源程序)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、淮北師范大學 數(shù)據(jù)結構設計實驗報告題目四則運算練習軟件班級: 設計者: 指導老師: 時間: 2011/04/13-2011/04/14 目錄1程序設計的內容和相關的要求-2程序總的功能說明-3程序的模塊的說明-4程序設計的流程圖-5程序的操作說明及運行結果-6源程序的清單-7心得體會-1程序設計的內容和相關的要求課程設計的目的:數(shù)據(jù)結構課程設計是計算機學院重要的教學環(huán)節(jié),它為學生提供了一個既動手又動腦,將課本上的理論知識和實際有機的結合起來,獨立分析和解決實際問題的機會。l進一步鞏固和復習數(shù)據(jù)結構的基礎知識。l培養(yǎng)學生結構化程序、模塊化程序設計的方法和能力。l提高學生調試程序的技巧和軟件設計的

2、能力。l提高學生分析問題、解決問題以及綜合利用c語言進行程序設計的能力。l了解軟件的編制過程。實現(xiàn)的任務:編寫一個100以內的四則運算練習軟件。設計內容:1.隨機產(chǎn)生兩個100的整數(shù)(運算結果也要在100內),可以選擇要練習的運算,/,調用,/四個運算函數(shù)實現(xiàn)運算。2.,/混合運算(用棧的原理實現(xiàn))設計要求:1.不同的功能使用不同的函數(shù)實現(xiàn)(模塊化),對每個函數(shù)的功能和調用接口要注釋清楚。對程序其它部分也進行必要的注釋。2.對系統(tǒng)進行功能模塊分析、畫出總流程圖和各模塊流程圖。3.用戶界面要求使用方便、簡潔明了、美觀大方、格式統(tǒng)一。所有功能可以反復使用,最好使用菜單。4.通過命令行相應選項能直接

3、進入某個相應菜單選項的功能模塊。5.所有程序需調試通過。2程序總的功能說明:本程序主要功能是進行數(shù)學算式運算練習,能夠進行簡單算式練習、混合算式運算,也能進行雙向運算練習(自己模擬訓練)。3程序各模塊的功能說明:(1) 界面顯示函數(shù):enu();顯示主菜單界面show();顯示子界面雙向練習菜單(2) 執(zhí)行練習的功能函數(shù):main_1();簡單練習函數(shù)main_2();混合運算函數(shù)main_3();雙向運算練習函數(shù)(3)窗體和背景設置函數(shù) 調用system(“color na”)(其中n表示從0到9任意一個數(shù)字;a表示任意取一個a,b,c,d,e,f中的一個字符)函數(shù)來實現(xiàn)不同窗體前景和背景色

4、彩的設置 4程序設計的流程圖 : 四則運算界面單向運算雙向運算混合運算簡單運算加乘減除簡單的練習運算加減乘除輸入數(shù)字:輸入輸入輸入輸入退出退出11111222223333345程序操作說明書及結果在vc+6.0環(huán)境中運行本程序,先進行編譯,然后再進行鏈接,在進行執(zhí)行將會出現(xiàn)顯示界面。按照顯示界面上顯示的提示從鍵盤上輸入數(shù)字,就可以實現(xiàn)相應的功能。6源程序清單#include #include#include /對內存操作的頭文件#include #include #include #include /#include 是在調用字符函數(shù)時,在源文件中包含的頭文件。ctype中c為字符型char的

5、縮寫,type 為類型。#include/操作時間有關的函數(shù)的頭文件#define max_len 1024#define exp_len 4int right=0,wrong=0;int v;void add() int a,b,c; a=rand()%100;/rand()函數(shù),生成范圍1-1000; b=100-a;b=rand()%b; printf(請回答:%d+%d=,a,b); scanf(%d,&c); if(a+b!=c)printf(回答錯誤n);wrong+; else printf(回答正確n);right+; void minu() int a,b,c; a=rand

6、()%100;/*隨機產(chǎn)生1個100以內的整數(shù),并賦值給a。srand()函數(shù)是隨機數(shù)發(fā)生器的初始化函數(shù),還缺少#include #include 兩個頭文件,int x,a;/表示初始化整數(shù)x和asrand(time(0);/表示隨機數(shù)產(chǎn)生初始化a=(int)(rand()%100);/表示調用rand()函數(shù)產(chǎn)生100以內整數(shù)并賦值給a*/ b=rand()%a; printf(請回答:%d-%d=,a,b); scanf(%d,&c); if(a-b!=c)printf(回答錯誤n);wrong+; else printf(回答正確n);right+; void mul() int a,

7、b,c; a=rand()%11; b=(rand()%100)/(a+1); printf(請回答:%d*%d=,a,b); scanf(%d,&c); if(a*b!=c)printf(回答錯誤n);wrong+; else printf(回答正確n);right+; void di() int a,b,c; a=rand()%100; b=rand()%100+1; printf(請回答:%d/%d=,a,b); scanf(%d,&c); if(a/b!=c)printf(回答錯誤n);wrong+; else printf(回答正確n);right+; void main_1() s

8、ystem(pause); system(cls); int choise,con=0; system(color 2a); printf(nntt簡單四則運算程序n); system(pause); system(cls); while(1) printf(nntt請選擇:n加(輸入1)n減(輸入2)n乘(輸入3)n除(輸入4)n); if(con=0)scanf(%d,&choise); switch(choise) case 1:add();break; case 2:minu();break; case 3:mul();break; case 4:di();break; printf(

9、請問您想繼續(xù)進行這個運算還是重新選擇其他運算還是退出?n繼續(xù)(輸入1),重新(輸入2),退出(輸入3); scanf(%d,&con); if(con=1)con=1; if(con=2)con=0; if(con=3)break; system(pause);const char* operator = +-*/;typedef structint n100;int top;stack;/定義棧的基本結構void inits(stack *s)s-top=-1;/棧的初始化int push(stack *s,int e)/將e入棧 s-top+; s-ns-top=e; return 1;

10、int pop(stack *s)/將棧頂元素出棧,存到e中 int e;e=s-ns-top; s-top-; return e;int gettop(stack *s)/取棧頂元素int e;e=s-ns-top;return e;char s2max_len, expmax_len * 2;/* s1保存數(shù)字或運算結果, s2保存操作符, exp為輸入的表達式 * t1為棧s1的頂指針, t2為棧s2的頂指針, p為掃描exp的位置 */int s1max_len, t1, t2, p;int iscorrect;/* 檢查生成的表達式是否合理 */int numberexp_len,

11、bracketexp_len;/* number為隨機生成的表達式的操作數(shù), oper為運算符, bracket為括號數(shù)組(0表示沒有括號,-1表示左括號,1表示右括號) */char operexp_len - 1;char replymax_len * 2;/* 用戶答案 */int n = 5;/* 題目數(shù)量,默認為5道題 */int getpriority(char c)/* 獲得運算符的優(yōu)先級 */if(c = + | c = -)return1;elsereturn 2;int getnum()/* 將字符轉換成int */ int r = 0;while(isdigit(expp

12、)r = r * 10 + expp - 0; p = p + 1; return r;void calc(char op)/* 從棧頂取出兩個數(shù)字, 進行 op 對應的操作 */ int a = s1t1 - 2;int b = s1t1 - 1; if(op = +)a += b; else if(op = -)a -= b;if(a 0 & s2t2 - 1 != ( & getpriority(s2t2-1) = getpriority(op)/* 先計算優(yōu)先級高的表達式 */t2 = t2 - 1;calc(s2t2); s2t2 = op;/* 將op壓入s2操作符棧中,并更新棧頂

13、指針 */t2 = t2 + 1; int processexp()/* 計算表達式的值 */ t1 = t2 = p = 0;/* 清空棧,將掃描指針復位 */ while(expp != 0)if(isdigit(expp) /* 如果是數(shù)值,入s1棧 */s1t1 = getnum();t1 = t1 + 1;-p; else /* 反之是運算符,入s2棧 */push(expp);p = p + 1;while(t2 0)/* 取出s2中剩余操作符,進行運算 */t2 = t2 - 1;calc(s2t2); return s10;int generateexp()/* 生成合法的表達

14、式(中間結果沒有負數(shù),分數(shù)和小數(shù)等) */int i, j, k, w, ret, digit16; while(true)/* 一直循環(huán)直到隨機到一個合法的表達式 */iscorrect = 1;for(i = 0; i exp_len; i+)/* 隨機操作數(shù) */numberi = rand() % 30+ 1;for(i = 0; i exp_len - 1; i+)/* 隨機操作符 */operi = operatorrand() % 4;j = -1;memset(bracket, 0, sizeof(bracket);/* 隨機括號的位置 */while(true)i = j +

15、 1;if(exp_len - 1 - i = 0)break;j = rand() % (exp_len - 1 - i) + i;bracketj = -1;i = j + 1;j = rand() % (exp_len - i) + i;bracketj = 1;memset(exp, 0, sizeof(exp);/* 構造生成的表達式 */j = 0;for(i = 0; i 0)digitk = numberi % 10;numberi /= 10;k+;for(w = k - 1; w = 0; w-)expj = digitw + 0;j = j + 1;if(bracketi

16、 = 1)expj = );j = j + 1;expj = operi;j+;ret = processexp();/* 計算表達式的結果 */if(iscorrect)/* 如果合法,退出 */break;return ret;void operate()int j,k,i, ans = 0, rep = 0, correctnum = 0;char c;printf(請輸入您要做題的數(shù)量:);scanf(%d,&k);for(i=1;i=k;i+)ans = generateexp();if(ans-1)printf(%s=n, exp); printf(答案: ); while(c =

17、 getchar() = n | c = )/* 忽略用戶無意輸入的空格和回車 */;ungetc(c, stdin);/* 將最后的合法字符放回輸入緩沖區(qū) */gets(reply);/* 讀取用戶答案 */rep = 0;for(j = 0; replyj; j+)/* 將用戶的答案轉化為數(shù)字 */if(!isdigit(replyj)break;rep = rep * 10 + replyj - 0;if(replyj)/* 若發(fā)現(xiàn)用戶輸入中有字母,退出 */return;if(replyj | rep != ans)/* 與標準答案不一致 */printf(很抱歉,回答錯誤!n);wr

18、ong+;else if(rep = ans) /* 回答正確 */printf(恭喜您,回答正確!n);right+;else i-;void main_2() int choise,con=0; system(cls); printf(nntt混合運算練習界面n); system(pause); system(cls); while(1) printf(nntt請選擇:n繼續(xù)(輸入1)n退出(輸入2)n); if(con=0)scanf(%d,&choise); switch(choise) case 1:operate();break; case 2:;break; printf(請問您

19、想繼續(xù)進行這個運算還是重新選擇其他運算還是退出程序?n繼續(xù)(輸入1),重頭再來(輸入2)n,退出(輸入3)n); scanf(%d,&con); if(con=1)con=1; if(con=2)con=0; if(con=3)break; system(pause);char op7=+,-,*,/,(,),#;/運算符數(shù)組char level77=, , ,=;/用二維數(shù)組定義運算符優(yōu)先級int in(char c)switch(c)case +:case -:case *:case /:case (:case ):case #:return 1;return 0;/判斷c是否在運算符數(shù)組

20、中char precede(char c1,char c2)int i,j;for(int k=0;k7;k+)if(c1=opk)i=k;break;/判斷c1為何種運算符for(k=0;k7;k+)if(c2=opk)j=k;break;/判斷c2為何種運算符return levelij;/判斷兩個運算符的優(yōu)先級int oparate(int f1,char c,int f2)switch(c)case +: return f1+f2;case -: return f1-f2;case *: return f1*f2;case /: return f1/f2;return 0;/計算f1和

21、f2int eve(stack *optr,stack *opnd)char c;int i,temp;int t,x,theta;char n20;/定義一個數(shù)組臨時存儲待轉換字符char c1=#;push(optr,(int)c1);c=getchar();int l,r;i=0;while(c!=|(int)gettop(optr)!=(int)(#)if(c=)c=c-26;/將=轉換為#進行處理if(theta=/&r=0)while(c!=n)c=getchar();printf(error! n);break;/除數(shù)為0處理if(!in(c)ni=c;i+;c=getchar(

22、);/如果獲取的是不是運算符,則暫存于一個數(shù)組中,繼續(xù)獲取下一字符continue;if(in(c)if(n0!=0)i=0;t=(int)atof(n);/將數(shù)組中的字符串轉換為float型數(shù)據(jù)push(opnd,t);memset(n,0,strlen(n);/清空數(shù)組,待下次獲取vtemp=(int)gettop(optr); switch(precede(char)temp,c)case :theta=pop(optr);r=pop(opnd); l=pop(opnd);if(theta=/&r=0)v=1;break;push(opnd,oparate(l,(char)(int)th

23、eta),r);if(c=#)c=c+26;/將#還原為=處理break;return (int)gettop(opnd);void show()printf(222 222n);printf( 雙向運算練習 n);printf(222 222n);printf(四則運算(包含、/和括號簡單算術表達式)nnn);printf(若輸入負數(shù),請按(0-*)的形式輸入nnn);printf(請按以下方式輸入:n);printf(輸入:n);printf(x+y=(enter)n);printf(nnn);void result() int m,n; stack *optr;stack *opnd;o

24、ptr=(stack *)malloc(sizeof(stack);opnd=(stack *)malloc(sizeof(stack);/動態(tài)分配存儲空間inits(optr);inits(opnd);/初始化棧結構printf(輸入算式:n);m=eve(optr,opnd);/計算數(shù)據(jù)printf(輸入計算的數(shù)值:n );scanf( %d,&n);if(n=m)printf(rightn);right+;else printf(wrongn);wrong+;if(v!=1)getchar();printf(正確答案:%d,m); printf(n);/除數(shù)不為0正常輸出elsev=0;

25、printf(除數(shù)不能為0n);/除數(shù)為0出錯判斷處理*/void circle() int choise,con=0; system(pause); system(cls); while(1) printf(nntt請選擇:n進入運算式(輸入1)n退出(輸入2)n); if(con=0)scanf(%d,&choise); switch(choise) case 1:result();break; case 2: break; printf(請問您想繼續(xù)進行這個運算還是重新選擇其他運算還是退出程序?n繼續(xù)(輸入1),重新(輸入2),退出(輸入3); scanf(%d,&con); if(con=1)con=1; if(con=2)con=0; if(con=3)break; /當接受到y(tǒng)時循環(huán)輸入void main_3() system(pause); system(cls);system(color 3b);show(); circle();printf(thanks for usingn);system(pause);void menu()/主菜單printf(*);printf(_ _ 歡迎你們來學習四則運算_);printf( );printf( 1.簡單練習運算

溫馨提示

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

評論

0/150

提交評論