利用棧求表達(dá)式的值可供小學(xué)生作業(yè)并能給出分?jǐn)?shù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說(shuō)明書(shū)格式_第1頁(yè)
利用棧求表達(dá)式的值可供小學(xué)生作業(yè)并能給出分?jǐn)?shù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說(shuō)明書(shū)格式_第2頁(yè)
利用棧求表達(dá)式的值可供小學(xué)生作業(yè)并能給出分?jǐn)?shù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說(shuō)明書(shū)格式_第3頁(yè)
利用棧求表達(dá)式的值可供小學(xué)生作業(yè)并能給出分?jǐn)?shù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說(shuō)明書(shū)格式_第4頁(yè)
利用棧求表達(dá)式的值可供小學(xué)生作業(yè)并能給出分?jǐn)?shù)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)說(shuō)明書(shū)格式_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、word中北大學(xué)數(shù) 據(jù) 結(jié) 構(gòu)課 程 設(shè) 計(jì) 說(shuō) 明 書(shū)   學(xué)生姓名:劉敏杰學(xué) 號(hào):1021011545 學(xué) 院:軟件學(xué)院專(zhuān) 業(yè):軟件開(kāi)發(fā)與測(cè)試題 目:利用棧求表達(dá)式的值,可供小學(xué)生作業(yè),并能給出分?jǐn)?shù)指導(dǎo)教師何志英    2011年12月20日1. 設(shè)計(jì)任務(wù)概述包括系統(tǒng)總體框圖及功能描述此課題是研究表達(dá)式求值的問(wèn)題,以幫助小學(xué)生完成測(cè)試。為了到達(dá)這個(gè)功能,實(shí)際我們要做的就是出題,和計(jì)算分?jǐn)?shù)給出評(píng)價(jià)的工作。整體設(shè)計(jì)都是以這個(gè)要求為軸心進(jìn)行的。為了直觀和方便,現(xiàn)畫(huà)出軟件整體設(shè)計(jì)模塊圖。利用棧求表達(dá)式的值創(chuàng)立試題庫(kù)試題

2、測(cè)試查看歷史分?jǐn)?shù)隨時(shí)退出整體設(shè)計(jì)模塊圖可以清晰的看出軟件的幾大模塊。整個(gè)系統(tǒng)的操作流程圖可以看出操作的整體流程,如下列圖開(kāi)始結(jié)束菜單項(xiàng)選擇擇試題測(cè)試查看歷史分?jǐn)?shù)輸入1 輸入2 輸入0 2. 本設(shè)計(jì)所采用的數(shù)據(jù)結(jié)構(gòu)如:鏈表、棧、樹(shù)、圖等根據(jù)以上功能說(shuō)明,設(shè)計(jì)運(yùn)算信息,堆棧的存儲(chǔ)結(jié)構(gòu),設(shè)計(jì)程序完成功能;3. 功能模塊詳細(xì)設(shè)計(jì)在此說(shuō)明每個(gè)局部的算法設(shè)計(jì)說(shuō)明可以是描述算法的流程圖,每個(gè)程序中使用的存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)說(shuō)明如果指定存儲(chǔ)結(jié)構(gòu)請(qǐng)寫(xiě)出該存儲(chǔ)結(jié)構(gòu)的定義。3.1 詳細(xì)設(shè)計(jì)思想學(xué)生要進(jìn)行測(cè)試,首先要有試題。那么我們就要先建立試題庫(kù)。這個(gè)試題庫(kù)的試題是我們?cè)诔绦蜻\(yùn)行過(guò)程中手動(dòng)輸入,存放在一個(gè)shujuku.t

3、xt的文件中。首先在主函數(shù)中調(diào)用創(chuàng)立試題庫(kù)函數(shù),將試題存入到試題庫(kù)文件shitiku.txt中,然后將該調(diào)用從主函數(shù)中刪除。創(chuàng)立試題庫(kù)函數(shù):創(chuàng)立指向xuanti類(lèi)型的指針,利用循環(huán)將輸入的測(cè)試題該指針的xuanti單元中,最后將該指針中的測(cè)試題寫(xiě)入試題庫(kù)文件shitiku.txt中。3.2 核心代碼(正文宋體小四號(hào)字,1.5倍行距)#include <stdio.h>#include <stdlib.h>#include <time.h> #include<string.h>#include <conio.h>#define STAC

4、K_INIT_SIZE 100#define STACKINCREMENT 10#define ERROR 0#define OK 1/定義表達(dá)式typedef struct shiti char a20; long result;xuanti;typedef struct SqStack1 /建立數(shù)字棧int *base; int *top; int stacksize;SqStack1; typedef struct SqStack2/建立運(yùn)算符棧char *base; char *top; int stacksize;SqStack2; void WriteToFile(xuanti *

5、pstu,int num);void ReadFromFile(xuanti *pstu,int num);void page_title(char *menu_item)/建立菜單 printf(">>> 數(shù)學(xué)習(xí)題庫(kù) <<<nn- %s -nn",menu_item);void return_confirm() printf("n按任意鍵返回n"); getch();void IntInitStack(SqStack1 *S1) S1->base=(int *)malloc(STACK_INIT_SIZE*si

6、zeof(int); if(!S1->base) exit(ERROR); S1->top=S1->base; S1->stacksize=STACK_INIT_SIZE;/IntInitStackvoid CharInitStack(SqStack2 *S2) S2->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char); if(!S2->base) exit(ERROR); S2->top=S2->base; S2->stacksize=STACK_INIT_SIZE;/CharInitSta

7、cklong IntGetTop(SqStack1 *S1) /取棧頂元素 long e1; if(*S1).top=(*S1).base) return 0; e1=*(*S1).top-1); return e1;/IntGetTopchar CharGetTop(SqStack2 *S2) /取棧頂元素 char e2; if(*S2).top=(*S2).base) return 0; e2=*(*S2).top-1); return e2;/IntGetTopint IntPush(SqStack1 *S1,int e1)/入棧 *(*S1).top+=e1; return OK;/

8、IntPushint CharPush(SqStack2 *S2,char e2)/入棧 *(*S2).top+=e2; return OK;/CharPushint IntPop(SqStack1 *S1)/出棧 int e1; if(*S1).top=(*S1).base) return 0; e1=*-(*S1).top; return e1;/IntPopint CharPop(SqStack2 *S2)/出棧 char e2; if(*S2).top=(*S2).base) return 0; e2=*-(*S2).top;return e2;/CharPop char Preced

9、e(char a,char b) int i,j; char Table88= ' ','+','-','*','/','(',')','#', '+','>','>','<','<','<','>','>', '-','>','>',

10、9;<','<','<','>','>', '*','>','>','>','>','<','>','>', '/','>','>','>','>','<','>','&g

11、t;', '(','<','<','<','<','<','=',' ', ')','>','>','>','>',' ','>','>', '#','<','<','<','&l

12、t;','<',' ','=',; /優(yōu)先級(jí)表格 for(i=0;i<8;i+) if(Table0i=a) /縱坐標(biāo)尋找 break; for(j=0;j<8;j+) /橫坐標(biāo)尋找 if(Tablej0=b) break; return Tableji;/Precedeint Operate(int a,char theta,int b) /計(jì)算表達(dá)式值:主要是將大的表達(dá)式轉(zhuǎn)化成小的表達(dá)式進(jìn)行逐步求值 int c; if(theta='+') c=a+b;else if(theta='-'

13、;) c=a-b; else if(theta='*') c=a*b; else c=a/b; return c;/Operateint IsOptr(char ch)char ptr10='+','-','*','/','(',')','#'for(int i=0;i<7;i+) if(ch=ptri) return true;return false;long result(char *a,SqStack1 *OPND,SqStack2 *OPTR) /求值

14、 char theta; int b,d,k=0,i=0,j=0,num2=0; IntInitStack(OPND); CharInitStack(OPTR); CharPush(OPTR,'#'); while(ai!='=') if(!IsOptr(ai) k+; if(k<=j) num2=(int(ai)-48); i+; if(k>j) num2=num2*10+(int(ai)-48); k=j=0; i+; if(!IsOptr(ai) k+; if(k=j) IntPush(OPND,num2); else if(IsOptr(ai

15、) switch(Precede(ai,CharGetTop(OPTR) case '<':CharPush(OPTR,ai+); if(ai!='('&&ai!=')') j+; break; case '=':CharPop(OPTR);i+;break; case '>':theta=CharPop(OPTR); d=IntPop(OPND); b=IntPop(OPND); IntPush(OPND,Operate(b,theta,d); break; /switch /else

16、 if /while printf("表達(dá)式的正確結(jié)果為:"); printf("%dn",IntGetTop(OPND); return (IntGetTop(OPND);/reslutvoid Built_shitiKu() int i,num; xuanti *pstu; printf("輸入試題數(shù)目:n"); scanf("%d",&num); fflush(stdin); pstu=(xuanti *)malloc(num*sizeof(xuanti);/動(dòng)態(tài)分配內(nèi)存 if(pstu=NULL)

17、printf("沒(méi)有足夠的內(nèi)存空間!n"); return; for(i=0;i<num;i+)/輸入試題 printf("第%d道試題:",i+1); gets(pstui.a); fflush(stdin); printf("n"); WriteToFile(pstu,num);/將pstu所指向的學(xué)生信息寫(xiě)入文件中 memset(pstu,0,num*sizeof(xuanti);/將pstu所指向的內(nèi)存塊清0 ReadFromFile(pstu,num);/從文件中讀取學(xué)生信息到pstu所指向的內(nèi)存塊中 printf(&

18、quot;試題列表:n"); for(i=0;i<num;i+)/輸入試題 printf("第%d道試題:",i+1); printf("%s",pstui.a); printf("n"); free(pstu);/釋放動(dòng)態(tài)分配的內(nèi)存void WriteToFile(xuanti *pstu,int num)/將pstu所指向的試題息寫(xiě)入文件shitiku.txt中FILE *fp; fp=fopen("shitiku.txt","at"); if(fp=NULL) printf

19、("不能創(chuàng)立shitiku.txtn"); free(pstu); exit(0); fwrite(pstu,sizeof(xuanti),num,fp); fclose(fp);void ReadFromFile(xuanti *pstu,int num)/從試題庫(kù)中提取試題 FILE *fp; fp=fopen("shitiku.txt","rt"); if(fp=NULL) printf("不能翻開(kāi)shitiku.txtn"); free(pstu); exit(0); fread(pstu,sizeof(x

20、uanti),num,fp); fclose(fp);/*void RecMark(int *m,int num)/把得分記錄到markrec.txt中 FILE *mp; mp=fopen("markrec.txt","at"); if(mp=NULL) printf("不能創(chuàng)立markrec.txtn"); free(m); exit(0); fwrite(m,sizeof(int),num,mp); fclose(mp);/Recmarkvoid LookMark(int *m,int num)/查看得分記錄 FILE *mp;

21、 mp=fopen("markrec.txt","rt"); if(mp=NULL) printf("不能翻開(kāi)markrec.txtn"); free(m); exit(0); fread(m,sizeof(int),num,mp); fclose(mp);/*void RecN(int *m,int num)/把m的值記錄到n_rec.txt中 FILE *mp; mp=fopen("n_rec.txt","wt"); if(mp=NULL) printf("不能創(chuàng)立n_rec.tx

22、tn"); free(m); exit(0); fwrite(m,sizeof(int),num,mp); fclose(mp);/Recmarkvoid LookN(int *m,int num)/查看m的值 FILE *mp; mp=fopen("n_rec.txt","rt"); if(mp=NULL) printf("不能翻開(kāi)n_rec.txtn"); free(m); exit(0); fread(m,sizeof(int),num,mp); fclose(mp);/*int excersice_begin() i

23、nt i, j, temp, KEY20; int mark,count=0; int *Mark; char g; SqStack1 s1,*OPND; SqStack2 s2,*OPTR; xuanti *XT; OPND=&s1; OPTR=&s2; Mark=(int *)malloc(20*sizeof(int); XT=(xuanti *)malloc(20*sizeof(xuanti); ReadFromFile(XT,20); do mark=0; srand(unsigned)time(NULL); KEY0 = rand()%20; for(i=1;i<

24、;20;i+) while(1) temp = rand()%20; for(j=0;j<i;j+) if(KEYj=temp) break; if(j=i) KEYi=temp; break; system("cls"); printf("隨機(jī)的10個(gè)練習(xí)題 :n"); for(i=0;i<10;i+) printf("第%d個(gè)練習(xí)題:",i+1); printf("%sn",XTKEYi.a); printf("請(qǐng)輸入計(jì)算結(jié)果:"); scanf("%ld",

25、&XTKEYi.result); fflush(stdin); if(XTKEYi.result=result(XTKEYi.a,OPND,OPTR) mark+=10; printf("答案正確!"); printf("nn"); else printf("答案錯(cuò)誤!"); printf("nn"); printf("*得分情況*n"); printf("最后的得分為:%dn",mark); if(mark>=90) printf("Very Goo

26、d!n"); else if(mark>=60) printf("成績(jī)不錯(cuò)。n"); else printf("很遺憾成績(jī)不及格!n"); printf("n"); RecMark(Mark,count); Markcount=mark; count+;/記錄次數(shù)遞增 printf("是否繼續(xù)做練習(xí)('y'是,'n'否):"); g=getchar(); fflush(stdin); printf("n"); if(count>=20)/超過(guò)

27、最大記錄次數(shù)清0 count=0;while(g='y'); RecMark(Mark,count); return count; return_confirm();void Look_Mark(int count)/printf("是否查看歷史得分('y'是,'n'否):"); int *Mark; int i; Mark=(int *)malloc(20*sizeof(int); system("cls"); printf("*查詢(xún)歷史得分情況*n"); LookMark(Mark,

28、count); for(i=0;i<count;i+) printf("*第%d次得%d分*n", i+1, Marki);if(i>1) if(Marki-1>60|Marki-2>60) if(Marki-1>Marki-2) printf("有進(jìn)步,還要加油哦。n"); else if(Marki-1=Marki-2) printf("成績(jī)還可以,但沒(méi)有進(jìn)步,還要多多努力呀!n"); else printf("成績(jī)有點(diǎn)下降,要多多練習(xí),不要?dú)怵H!n"); else printf(

29、"成績(jī)很不好!要更加努力學(xué)習(xí)!n");else if(Mark0>=90) printf("Very Good!n"); else if(Mark0>=60) printf("成績(jī)不錯(cuò)。n"); else printf("很遺憾成績(jī)不及格!n"); return_confirm();void main() int m=0; int *RN; char ch; RN=(int *)malloc(1*sizeof(int); RN0=0; printf("*如果是第一次運(yùn)行*n"); printf("*請(qǐng)先建立 n_rec.txt*n"); printf("*否那么會(huì)出錯(cuò) !*n"); printf("('y'-創(chuàng)立*'n'-不建)n"); ch=getchar(); if(ch='y') RecN(RN,1); LookN(RN,1); RN0+=m; fflush(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論