資料結構課程設計心得體會通用多篇
資料結構課程設計心得體會 篇一
本次課程設計,使我對《資料結構》這門課程有了更深入的理解。我的課程設計題目是線索二叉樹的運算。剛開始做這個程式的時候,感到完全無從下手,甚至讓我覺得完成這次程式設計根本就是不可能的,於是開始查閱各種資料以及參考文獻,之後便開始著手寫程式,寫完執行時有很多問題。特別是實現線索二叉樹的刪除運算時很多情況沒有考慮周全,經常執行出現錯誤,但通過同學間的幫助最終基本解決問題。
在本課程設計中,我明白了理論與實際應用相結合的重要性,並提高了自己組織資料及編寫大型程式的能力。培養了基本的、良好的程式設計技能以及合作能力。這次課程設計同樣提高了我的綜合運用所學知識的能力。並對VC有了更深入的瞭解。《資料結構》是一門實踐性很強的課程,上機實習是對學生全面綜合素質進行訓練的一種最基本的方法,是與課堂聽講、自學和練習相輔相成的、必不可少的一個教學環節。上機實習一方面能使書本上的知識變“活”,起到深化理解和靈活掌握教學內容的目的;另一方面,上機實習是對學生軟體設計的綜合能力的訓練,包括問題分析,總體結構設計,程式設計基本技能和技巧的訓練。此外,還有更重要的一點是:機器是比任何教師更嚴厲的檢查者。因此,在“資料結構”的學習過程中,必須嚴格按照老師的要求,主動地、積極地、認真地做好每一個實驗,以不斷提高自己的程式設計能力與專業素質。
通過這段時間的課程設計,我認識到資料結構是一門比較難的課程。需要多花時間上機練習。這次的程式訓練培養了我實際分析問題、程式設計和動手能力,使我掌握了程式設計的基本技能,提高了我適應實際,實踐程式設計的能力。
總的來說,這次課程設計讓我獲益匪淺,對資料結構也有了進一步的理解和認識。
2012資料結構課程設計 篇二
數 據 結 構
課程設計報告
題 目: 一元多項式計算 專 業: 資訊管理與資訊系統 班 級: 2012級普本班 學 號: 201201011367 姓 名: 左帥帥 指導老師: 郝慎學 時 間:
一、課程設計題目分析
本課程設計要求利用C語言或C++編寫,本程式實現了一元多項式的加法、減法、乘法、除法運算等功能。
二、設計思路
本程式採用C語言來完成課程設計。
1、首先,利用順序儲存結構來構造兩個儲存多項式A(x)和 B(x)的結構。
2、然後把輸入,加,減,乘,除運算分成五個主要的模組:實現多項式輸入模組、實現加法的模組、實現減法的模組、實現乘法的模組、實現除法的模組。
3、然後各個模組裡面還要分成若干種情況來考慮並通過函式的巢狀呼叫來實現其功能,儘量減少程式執行時錯誤的出現。
4、最後編寫main()主函式以實現對多項式輸入輸出以及加、減、乘、除,除錯程式並將不足的地方加以修改。
三、設計演算法分析
1、相關函式說明:
(1)定義資料結構型別為線性表的鏈式儲存結構型別變數
typedef struct Polynomial{}
(2)其他功能函式
插入函式void Insert(Polyn p,Polyn h)
比較函式int compare(Polyn a,Polyn b)
建立一元多項式函式Polyn Create(Polyn head,int m)
求解並建立多項式a+b,Polyn Add(Polyn pa,Polyn pb)
求解並建立多項式a-b,Polyn Subtract(Polyn pa,Polyn pb) 2
求解並建立多項式a*b,Polyn Multiply(Polyn pa,Polyn pb)
求解並建立多項式a/b,void Device(Polyn pa,Polyn pb)
輸出函式輸出多項式,void Print(Polyn P)
銷燬多項式函式釋放記憶體,void Destroy(Polyn p)
主函式,void main()
2、主程式的流程基函式呼叫說明 (1)typedef struct Polynomial {
float coef;
int expn;
struct Polynomial *next; } *Polyn,Polynomial;
在這個結構體變數中coef表示每一項前的係數,expn表示每一項的指數,polyn為結點指標型別,屬於抽象資料型別通常由使用者自行定義,Polynomial表示的是結構體中的資料物件名。
(2)當用戶輸入兩個一元多項式的係數和指數後,建立連結串列,儲存這兩個多項式,主要說明如下:
Polyn CreatePolyn(Polyn head,int m)建立一個頭指標為head、項數為m的一元多項式
p=head=(Polyn)malloc(sizeof(struct Polynomial));為輸入的多項式申請足夠的儲存空間
p=(Polyn)malloc(sizeof(struct Polynomial));建立新結點以接收資料
Insert(p,head); 呼叫Insert函式插入結點
這就建立一元多項式的關鍵步驟
(3)由於多項式的係數和指數都是隨即輸入的,所以根據要求需要對多項式按指數進行降冪排序。在這個程式模組中,使用連結串列,根據對指數大小的比較,對各種情況進行處理,此處由於反覆使用指標對各個結點進行定位,找到合適的位置再利用void Insert(Polyn p,Polyn h)進行插入操作。 (4)加、減、乘、除、的演算法實現:
在該程式中,最關鍵的一步是實現四則運算和輸出,由於加減演算法原則是一樣,減法可通過係數為負的加法實現;對於乘除演算法的大致流程都是:首先建立多項式a*b,a/b,然後使用連結串列儲存所求出的乘積,商和餘數。這就實現了多項式計算模組的主要功能。
(5)另一個子函式是輸出函式 PrintPolyn();
輸出最終的結果,演算法是將最後計算合併的連結串列逐個結點依次輸出,便得到整連結串列,也就是最後的計算式計算結果。由於考慮各個結點的指數情況不同,分別進行了判斷處理。
四、程式新點
通過多次寫程式,發現在程式在控制檯執行時總是黑色的,本次寫程式就想著改變一下,於是經過查資料利用system(“Color E0”);可以函式解決,這裡“E0,”E是控制檯背景顏色,0是控制檯輸出字型顏色。
五、設計中遇到的問題及解決辦法
首先是,由於此次課程設計裡使用指標使用比較多,自己在指標多的時候易腦子混亂出錯,對於此問題我是採取比較笨的辦法在稿紙上寫明白後開始進行 4
程式碼編寫。
其次是,在寫除法模組時比較複雜,自己通過查資料最後成功寫出除法模組功能。
最後是,前期分析不足開始急於寫程式碼,中途出現各種問題,算是給自己以後設計時的一個經驗吧。
六、測試(程式截圖)
1、資料輸入及主選單
2、加法和減法模組
3、乘法和除法模組
七、總結
通過本次應用C語言設計一元多項式基本計算程式,使我更加鞏固了C語言程式設計的知識,以前對指標這一點使用是比較模糊,現在通過此次課程設計對指標理解的比較深刻了。而且對於資料結構的相關演算法和函式的呼叫方面知識的加深。本次的課程設計,一方面提高了自己獨立思考處理問題的能力;另一方面使自己再設計開發程式方面有了一定的小經驗和想法,對自己以後學習其他語言程式設計奠定了一定的基礎。
八、指導老師評語及成績
附錄:(課程設計程式碼)
#include
float coef; 6
int expn;
struct Polynomial *next; } *Polyn,Polynomial;
//Polyn為結點指標型別 void Insert(Polyn p,Polyn h) {
if(p->coef==0) free(p);
//係數為0的話釋放結點
else
{
Polyn q1,q2;
q1=h;q2=h->next;
while(q2&&p->expnexpn)//查詢插入位置
{
q1=q2; q2=q2->next; }
if(q2&&p->expn==q2->expn)//將指數相同相合並 {
q2->coef+=p->coef;
free(p);
if(!q2->coef)//係數為0的話釋放結點
{ q1->next=q2->next; free(q2); }
}
else { p->next=q2; q1->next=p;
}//指數為新時將結點插入
} 7
} //建立一個頭指標為head、項數為m的一元多項式 Polyn Create(Polyn head,int m) {
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i { p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結點以接收資料 printf(“請輸入第%d項的係數與指數:”,i+1); scanf(“%f %d”,&p->coef,&p->expn); Insert(p,head); //呼叫Insert函式插入結點 } return head; } //銷燬多項式p void Destroy(Polyn p) { Polyn q1,q2; q1=p->next; 8 q2=q1->next; while(q1->next) { free(q1); q1=q2;//指標後移 q2=q2->next; } } //輸出多項式p int Print(Polyn P) { Polyn q=P->next; int flag=1;//項數計數器 if(!q) //若多項式為空,輸出0 { putchar('0'); printf(“n”); return; } while(q) { if(q->coef>0&&flag!=1) putchar('+'); //係數大於0且不是第一項 9 if(q->coef!=1&&q->coef!=-1)//係數非1或-1的普通情況 { printf(“%g”,q->coef); if(q->expn==1) putchar('X'); else if(q->expn) printf(“X^%d”,q->expn); } else { if(q->coef==1) { if(!q->expn) putchar('1'); else if(q->expn==1) putchar('X'); else printf(“X^%d”,q->expn); } if(q->coef==-1) { if(!q->expn) printf(“-1”); else if(q->expn==1) printf(“-X”); else printf(“-X^%d”,q->expn); } } q=q->next; flag++; } printf(“n”); } int compare(Polyn a,Polyn b) { if(a&&b) { if(!b||a->expn>b->expn) return 1; else if(!a||a->expn else return 0; } else if(!a&&b) return -1;//a多項式已空,但b多項式非空 else return 1;//b多項式已空,但a多項式非空 } //求解並建立多項式a+b,返回其頭指標 Polyn Add(Polyn pa,Polyn pb) { Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 11 hc->next=NULL; headc=hc; while(qa||qb){ qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb)) { case 1: qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; case 0: qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; case -1: qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; 12 } if(qc->coef!=0) { qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//當相加係數為0時,釋放該結點 } return headc; } //求解並建立多項式a-b,返回其頭指標 Polyn Subtract(Polyn pa,Polyn pb) { Polyn h=pb; Polyn p=pb->next; Polyn pd; while(p)//將pb的係數取反 { p->coef*=-1; p=p->next; } pd=Add(pa,h); for(p=h->next;p;p=p->next) //恢復pb的係數 p->coef*=-1; 13 return pd; } //求解並建立多項式a*b,返回其頭指標 Polyn Multiply(Polyn pa,Polyn pb) { Polyn hf,pf; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 hf->next=NULL; for(;qa;qa=qa->next) { for(qb=pb->next;qb;qb=qb->next) { pf=(Polyn)malloc(sizeof(struct Polynomial)); pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn; Insert(pf,hf);//呼叫Insert函式以合併指數相同的項 } } return hf; } //求解並建立多項式a/b,返回其頭指標 void Device(Polyn pa,Polyn pb) { Polyn hf,pf,temp1,temp2; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,儲存商 hf->next=NULL; pf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,儲存餘數 pf->next=NULL; temp1=(Polyn)malloc(sizeof(struct Polynomial)); temp1->next=NULL; temp2=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next=NULL; temp1=Add(temp1,pa); while(qa!=NULL&&qa->expn>=qb->expn) { temp2->next=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next->coef=(qa->coef)/(qb->coef); temp2->next->expn=(qa->expn)-(qb->expn); Insert(temp2->next,hf); pa=Subtract(pa,Multiply(pb,temp2)); 15 qa=pa->next; temp2->next=NULL; } pf=Subtract(temp1,Multiply(hf,pb)); pb=temp1; printf(“商是:”); Print(hf); printf(“餘數是:”); Print(pf); } void main() { int choose=1; int m,n,flag=0; system(“Color E0”); Polyn pa=0,pb=0,pc,pd,pf;//定義各式的頭指標,pa與pb在使用前付初值NULL printf(“請輸入A(x)的項數:”); scanf(“%d”,&m); printf(“n”); pa=Create(pa,m);//建立多項式A printf(“n”); printf(“請輸入B(x)的項數:”); 16 scanf(“%d”,&n); printf(“n”); pb=Create(pb,n);//建立多項式B printf(“n”); printf(“**********************************************n”); printf(“* 多項式操作選單 printf(”**********************************************n“); printf(”tt 1.輸出操作n“); printf(”tt 2.加法操作n“); printf(”tt 3.減法操作n“); printf(”tt 4.乘法操作n“); printf(”tt 5.除法操作n“); printf(”tt 6.退出操作n“); printf(”**********************************************n“); while(choose) { printf(”執行操作:“); scanf(”%d“,&flag); switch(flag) { case 1: printf(”多項式A(x):“);Print(pa); *n”); printf(“多項式B(x):”);Print(pb); break; case 2: pc=Add(pa,pb); printf(“多項式A(x)+B(x):”); Print(pc); Destroy(pc); break; case 3: pd=Subtract(pa,pb); printf(“多項式A(x)-B(x):”); Print(pd); Destroy(pd); break; case 4: pf=Multiply(pa,pb); printf(“多項式A(x)*B(x):”); Print(pf); Destroy(pf); break; case 5: Device(pa,pb); 18 break; case 6: exit(0); break; } } Destroy(pa); Destroy(pb); } 資料結構課程設計 1、赫夫曼編碼器 設計一個利用赫夫曼演算法的編碼和譯碼系統,重複地顯示並處理以下專案,直到選擇退出為止。 要求: 1) 將權值資料存放在資料檔案(檔名為,位於執行程式的當前目錄中) 2) 初始化:鍵盤輸入字符集大小26、26個字元和26個權值(統計一篇英文文章中26個字母),建立哈夫曼樹; 3) 編碼:利用建好的哈夫曼樹生成哈夫曼編碼; 4) 輸出編碼(首先實現螢幕輸出,然後實現檔案輸出); 5) 介面優化設計。 程式碼如下: #include typedef struct HTNode //結構體 { int Weight; char ch; int Parent,Lchild,Rchild; }HTNode; typedef char * * HCode; void Save(int n,HTNode *HT) //把權值儲存到檔案 { FILE * fp; int i; if((fp=fopen(“”,“wb”))==NULL) { printf(“cannot open filen”); return; } for(i=0;i if(fwrite(&HT[i]。Weight,sizeof(struct HTNode),1,fp)!=1) printf(“file write errorn”); fclose(fp); system(“cls”); printf(“儲存成功!”); } void Create_H(int n,int m,HTNode *HT) //建立赫夫曼樹,進行編碼 { int w,k,j; char c; for(k=1;k<=m;k++) { if(k<=n) { printf(“n請輸入權值和字元(用空格隔開): ”); scanf(“%d”,&w); scanf(“ %c”,&c); HT[k]。ch=c; HT[k]。Weight=w; } else HT[k]。Weight=0; HT[k]。Parent=HT[k]。Lchild=HT[k]。Rchild=0; } int p1,p2,w1,w2; for(k=n+1;k<=m;k++) { p1=0;p2=0; w1=32767;w2=32767; for(j=1;j<=k-1;j++) { if(HT[j]。Parent==0) { if(HT[j]。Weight { w2=w1;p2=p1; w1=HT[j]。Weight; p1=j; } else if(HT[j]。Weight { w2=HT[j]。Weight; p2=j; } } } HT[k]。Lchild=p1;HT[k]。Rchild=p2; HT[k]。Weight=HT[p1]。Weight+HT[p2]。Weight; HT[p1]。Parent=k;HT[p2]。Parent=k; } printf(“輸入成功!”); } void Coding_H(int n,HTNode *HT) //對結點進行譯碼 { int k,sp,fp,p; char *cd; HCode HC; HC=(HCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char)); cd[n-1]=''; printf(“************************n”); printf(“Char Codingn”); for(k=1;k<=n;k++) { sp=n-1;p=k;fp=HT[k]。Parent; for(;fp!=0;p=fp,fp=HT[fp]。Parent) if(HT[fp]。Lchild==p) cd[--sp]='0'; else cd[--sp]='1'; HC[k]=(char *)malloc((n-sp)*sizeof(char)); strcpy(HC[k],&cd[sp]); printf(“%c %sn”,HT[k]。ch,HC[k]); } printf(“************************n”); free(cd) ; } void Read(int n,HTNode *HT) //從檔案中讀出資料 { int i; FILE * fp; if((fp=fopen(“”,“rb”))==NULL) { printf(“cannot open filen”); exit(0); } for(i=0;i fread(&HT[i]。Weight,sizeof(struct HTNode),1,fp); // printf(“%d n”,HT[i]。Weight); } Coding_H(n,HT); fclose(fp); } void Print_H(int m,HTNode *HT) //輸出赫夫曼造樹過程 { int k; printf(“************************n”); printf(“Num Weight Par LCh RCh n”); for(k=1;k<=m;k++) { printf(“%d ”,k); printf(“ %d”,HT[k]。Weight); printf(“ %d”,HT[k]。Parent); printf(“ %d”,HT[k]。Lchild); printf(“ %dn”,HT[k]。Rchild); } printf(“************************n”); } void Decode(int m,HTNode *HT) //對輸入的電文進行譯碼 { int i,j=0; char a[10]; char endflag='2'; i=m; printf(“輸入傳送的編碼,以‘2’結束:”); scanf(“%s”,&a); printf(“譯碼後的字元:”); while(a[j]!='2') { if(a[j]=='0') i=HT[i]。Lchild; else i=HT[i]。Rchild; if(HT[i]。Lchild==0) //HT[i]是葉結點 { printf(“%c”,HT[i]。ch); i=m; //回到根結點 } j++; } printf(“n”); if(HT[i]。Lchild!=0&&a[j]!='2') printf(“ERROR”); } int main() //主函式 { int n,m,c; HTNode HT[N]; do { system(“color 2f”); //執行環境背景顏色。 printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt 赫夫曼編譯碼系統 ttt”); printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt1.輸入權值、字母nttt2.把資料寫入檔案nttt3.輸出赫夫曼編碼表nttt”); printf(“4.輸出赫夫曼譯碼錶nttt5.輸入編碼並譯碼。nttt6.從檔案中讀出資料nttt7.退出”); printf(“nnttt請選擇:”); scanf(“%d”,&c); switch(c) { case 1:system(“cls”);printf(“輸入多少結點:”); scanf(“%d”,&n);m=2*n-1;Create_H(n,m,HT);break; case 2:system(“cls”);Save(n,HT);break; case 3:system(“cls”);Print_H(m,HT);break; case 4:system(“cls”);Coding_H(n,HT);break; case 5:system(“cls”);Decode(m,HT);break; case 6:system(“cls”);Read(n,HT);break; case 7:system(“cls”);exit(0); } }while(1); return 0; } 執行介面如下: 2、學生成績管理(連結串列實現) 要求: 實現如下功能:增加、查詢、刪除、輸出、退出。 程式碼如下: #include //定義成績資訊結構體 { char Number[20]; char Name[20]; char Chinese[20]; char English[20]; char Math[20]; }score; typedef struct node_score //定義成績資訊連結串列結點,包括資料域和指標域 { score data; struct node_score *next; }node_score,*p_node_score; p_node_score headScore;//定義連結串列的頭指標為全域性變數 void PrintScore(score s) //輸出資訊函式 { printf(“ %10s”,er); printf(“ | %-6s”,); printf(“ | %-3s”,ese); printf(“ | %-3s”,ish); printf(“ | %-3sn”,); } void View()//輸出函式 { p_node_score pNodeScore; pNodeScore=headScore; printf(“ 學號 | 姓名 | 語文成績 | 英語成績| 高數成績n”); while(pNodeScore != NULL) { PrintScore(pNodeScore->data);//輸出學生資訊和成績資訊 pNodeScore=pNodeScore->next; } } void Add() { p_node_score pNodeScore; // 定義一個節點 pNodeScore=(p_node_score)malloc(sizeof(node_score));//為節點分配儲存空間 printf(“請輸入學號:”); scanf(“%s”,pNodeScore->er); printf(“請輸入姓名:”); scanf(“%s”,pNodeScore->); printf(“請輸入語文成績:”); scanf(“%s”,pNodeScore->ese); printf(“請輸入英語成績:”); scanf(“%s”,pNodeScore->ish); printf(“請輸入高數成績:”); scanf(“%s”,pNodeScore->); if(headScore==NULL) { //如果頭結點為空 headScore=pNodeScore; pNodeScore->next=NULL; } else { //如果頭結點不為空 pNodeScore->next=headScore; headScore=pNodeScore;//將頭結點新結點 } } void Input() { int n,i; printf(“輸入幾個學生的資料:”); scanf(“%d”,&n); for(i=0;i Add(); printf(“輸入成功!”); } int Delete() { p_node_score pNodeScore,p1; //p1為pNodeScore的前驅 p1=headScore; if(p1==NULL) { printf(“成績表中沒有資料!請先新增資料!n”); return 0; } char DeleteNumber[20]; printf(“請數入要刪除的學生學號:”); scanf(“%s”,DeleteNumber); if(strcmp(p1->er,DeleteNumber)==0) { //如果要刪除的結點在第一個 headScore=p1->next; pNodeScore=p1; printf(“學號為%s的學生資訊已經刪除!n”,DeleteNumber); return 0; } else { pNodeScore=p1->next; while(pNodeScore!=NULL) { if(strcmp(pNodeScore->er,DeleteNumber)==0) { p1->next=pNodeScore->next; printf(“學號為%s的學生資訊已經刪除!n”,DeleteNumber); return 0; } else { //否則,結點向下一個,p1仍為pNodeScore的前驅 p1=pNodeScore; pNodeScore=pNodeScore->next; } } } printf(“沒有此學號的學生!”); } int Change() { p_node_score pNodeScore; pNodeScore=headScore; if(pNodeScore==NULL) { printf(“成績表中沒有資料!請先新增資料!n”); return 0; } char EditNumber[20]; printf(“請輸入你要修改的學生學號:”); scanf(“%s”,EditNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->er,EditNumber)==0) { //用strcmp比較兩字串是否相等,相等則返回0 printf(“原來的學生成績資訊如下:n”); //輸出原來的成績資訊 printf(“ 學號 | 姓名 | 語文成績 | 英語成績| 高數成績n”); PrintScore(pNodeScore->data); printf(“語文新成績:”); scanf(“%s”,pNodeScore->ese); printf(“英語新成績:”); scanf(“%s”,pNodeScore->; printf(“高數新成績:”); scanf(“%s”,pNodeScore->); printf(“成績已經修改!”); return 0; } pNodeScore=pNodeScore->next; //如果不相等,pNodeScore則指向下一個結點 } printf(“沒有此學號的學生!n”); //如果找到最後都沒有,則輸出沒有此學號的學生 } int Find() { p_node_score pNodeScore; pNodeScore=headScore; if(pNodeScore==NULL) { printf(“成績表中沒有資料!請先新增資料!n”); return 0; } char FindNumber[20]; printf(“請輸入你要查詢的學生學號:”); scanf(“%s”,FindNumber); while(pNodeScore!=NULL) { if(strcmp(pNodeScore->er,FindNumber)==0) { printf(“你要查詢的學生成績資訊如下:n”); printf(“ 學號 | 姓名 | 語文成績 | 英語成績| 高數成績n”); PrintScore(pNodeScore->data); return 0; } pNodeScore=pNodeScore->next; } printf(“沒有此學號的學生!n”); } int main() //主函式 { int choice=0; headScore=NULL; int c; do { system(“color 2f”); //執行環境背景顏色。 printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt 學生成績管理系統 ttt”); printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”); printf(“nttt1.輸入成績資訊nttt2.輸出成績資訊nttt3.新增成績資訊nttt”); printf(“4.修改成績資訊nttt5.刪除成績資訊nttt6.查詢成績資訊nttt7.退出”); printf(“nnttt請選擇:”); scanf(“%d”,&c); switch(c) { case 1:system(“cls”);Input();break; case 2:system(“cls”);View();break; case 3:system(“cls”);Add();break; case 4:system(“cls”);Change();break; case 5:system(“cls”);Delete();break; case 6:system(“cls”);Find();break; case 7:system(“cls”);exit(0); } }while(1); return 0; } 執行介面如下: 一,課程題目 (算符優先法計算算數表示式)以字元序列的形式從終端輸入語法正確的、不含變數的整數表示式。利用教材表3.1(P53)給出的算符優先關係,實現對於算術四則混合運算(加、減、乘、除)表示式的求值。例如:7+(4-2)*3+12/2=19。注:按照四捨五入的方式將四則運算結果取整。 二,程式設計思想 在程式中分別設立一個運算子棧(OPTR 棧),用於儲存‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用於判斷算術表示式結束),和一個運算元棧(OPND 棧),用於存放整數,輸入算式後,先將數字與運算子分開入i棧,若為數字則先用轉換函式將char型別的數轉換為int型並進入運算元棧,若為運算子則根據教材表3.1(P53)給出的算符優先順序關係,判斷棧頂運算子和從鍵盤取得的運算子作優先順序比較,若取得的運算子優先順序高則進棧,直到取得運算子優先順序低的,則將運算元取出作operate運算後存入棧頂,反覆操作知道遇到‘#’,則結束運算,輸出棧頂元素即為結果。 三,程式流程圖 四,程式關鍵程式碼設計 本次程式設計共呼叫了12個方法分別是: InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。 其中 ParseInt方法 int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){ number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10 *number[3]+number[4]; return i; } 為將輸入的數字字元型轉換為整型的轉換函式,通過Ascall表的轉換關係,將輸入的字元型數字轉換為整型。在入棧前進行此方法,以便整型數的計算。 Preced,Operate函式 char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; int Operate (int a,char theta,int b){ int c ; if (theta=='+'){ c=a+b; return c; } if (theta=='-'){ c=a-b; return c; } if (theta=='*'){ c=a*b; return c; } if (theta=='/'){ c=a/b; return c; } return 0; } 其中preced是判定運算子棧的棧頂運算子C1與讀入的運算子C2之間優先關係函式;Opearte為進行二元運算aCb的函式,如果是編譯表示式,則產生這個運算的一組相應的指令並返回存放結果的中間變數名;如果是解釋執行表示式,則直接進行該運算,並返回運算結果。 五,程式原始碼以及執行結果 #include number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4]; return i; } void PushNum(SqlNum &S,int c){ *=c; ++; } int PopNum(SqlNum &S){ int c; --; c=*; return c; } typedef struct{ char *base; char *top; int Stacksize; }SqlCal; void InitCalStack(SqlCal &S){ =(char *)malloc(100*sizeof(char)); =; ksize=100; } void PushCal(SqlCal &S,char c){ *=c; ++; } char PopCal(SqlCal &S){ char c; --; c=*; return c; } int In(char c,char s[]){ int i; for(i=0;i if(c==s[i]) return 1; return 0; } char GetTopCal(SqlCal &s){ char c; c=*(-1); return c; } int GetTopNum(SqlNum &s){ int c; c=*(-1); return c; } char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; if(a=='+'){ if(b=='+'){ return d[0][0];} if(b=='-'){ return d[0][1];} if(b=='*'){ return d[0][2];} if(b=='/'){ return d[0][3];} if(b=='('){ return d[0][4];} if(b==')'){ return d[0][5];} if(b=='#'){ return d[0][6];} } if(a=='-'){ if(b=='+'){ return d[1][0];} if(b=='-'){ return d[1][1];} if(b=='*'){ return d[1][2];} if(b=='/'){ return d[1][3];} if(b=='('){ return d[1][4];} if(b==')'){ return d[1][5];} if(b=='#'){ return d[1][6];} } if(a=='*'){ if(b=='+'){ return d[2][0];} if(b=='-'){ return d[2][1];} if(b=='*'){ return d[2][2];} if(b=='/'){ return d[2][3];} if(b=='('){ return d[2][4];} if(b==')'){ return d[2][5];} if(b=='#'){ return d[2][6];} } if(a=='/'){ if(b=='+'){ return d[3][0];} if(b=='-'){ return d[3][1];} if(b=='*'){ return d[3][2];} if(b=='/'){ return d[3][3];} if(b=='('){ return d[3][4];} if(b==')'){ return d[3][5];} if(b=='#'){ return d[3][6];} } if(a=='('){ if(b=='+'){ return d[4][0];} if(b=='-'){ return d[4][1];} if(b=='*'){ return d[4][2];} if(b=='/'){ return d[4][3];} if(b=='('){ return d[4][4];} if(b==')'){ return d[4][5];} if(b=='#'){ return d[4][6];} } if(a==')'){ if(b=='+'){ return d[5][0];} if(b=='-'){ return d[5][1];} if(b=='*'){ return d[5][2];} if(b=='/'){ return d[5][3];} if(b=='('){ return d[5][4];} if(b==')'){ return d[5][5];} if(b=='#'){ return d[5][6];} } if(a=='#'){ if(b=='+'){ return d[6][0];} if(b=='-'){ return d[6][1];} if(b=='*'){ return d[6][2];} if(b=='/'){ return d[6][3];} if(b=='('){ return d[6][4];} if(b==')'){ return d[6][5];} if(b=='#'){ return d[6][6];} } return 0; } int Operate (int a,char theta,int b){ int c ; if (theta=='+'){ c=a+b; return c; } if (theta=='-'){ c=a-b; return c; } if (theta=='*'){ c=a*b; return c; } if (theta=='/'){ c=a/b; return c; } return 0; } void main(){ SqlCal OPTR; SqlNum OPND; char c,d[5]={'0','0','0','0','0'}; int f=0; char op[]={'+','-','*','/','(',')','#'}; InitCalStack(OPTR); InitNumStack(OPND); printf(“請輸入算式並在尾部新增一個#號n”); c=getchar(); PushCal(OPTR,'#'); while(c!='#'||GetTopCal(OPTR)!='#') { if (!In(c,op)) { d[0]=d[1]; d[1]=d[2]; d[2]=d[3]; d[3]=d[4]; d[4]=c; c=getchar(); f=1; } else { if(f==1){ PushNum(OPND,ParseInt(d)); d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0'; f=0; } switch(Preced(GetTopCal(OPTR),c)) { case'<': PushCal(OPTR,c); c=getchar(); break; case'=': PopCal(OPTR); c=getchar(); break; case'>': char theta;int a;int b; theta=PopCal(OPTR); b=PopNum(OPND); a=PopNum(OPND); PushNum(OPND,Operate(a,theta,b)); break; } } } printf(“%dn”,GetTopNum(OPND)); } 程式執行結果: 六,心得體會 通過這次程式設計,我發現很多程式設計過程中的不足與問題,很多問題由於考慮不全面,導致程式執行失敗。還有一些小問題,比如字母的大小寫,括號的遺漏,語法書寫錯誤等等一些基礎錯誤,也是讓我體會很深寫程式要謹慎仔細。資料結構課程設計 篇三
資料結構課程設計 篇四
-
法制教育心得新版多篇
法制教育的心得體會篇一最近,貴陽市正在搞“三創一辦”活動,貴陽市交警隊聯合貴州電視臺通過媒體曝光,糾正行人和機動車的違法行為。3月24日上午11時20分左右,一輛無牌中華牌紅色轎車在貴陽市中華路逆行,被交警攔了下來,隨後女記者對女司機進行採訪。女記者問:“現在...
-
藝術教育心得體會(整理7篇)
本站小編為你精心整理了7篇《藝術教育心得體會》的範文,但願對你的工作學習帶來幫助,希望你能喜歡!當然你還可以在本站搜尋到更多與《藝術教育心得體會》相關的範文。篇1:藝術教育心得體會首先,我面對的是國小的孩子,他們就像一張白紙一樣:簡單、天真、純潔,而作為孩子...
-
幼兒育兒心得【多篇】
幼兒育兒心得篇一光蔭如梭,在這不經意的日子裡,範思言已經從曾經只會咿咿呀呀的小寶寶變成了如今的“小大人”了。隨著年齡的增長,自我意識、獨立意識也在增強,面對這個“小大人”我們知道,孩子是父母的“影印件”,所以我們平常也要注意什麼樣的教育會給孩子帶來什麼...
-
銀行優質服務心得體會(推薦10篇)
本站小編為你精心整理了10篇《銀行優質服務心得體會》的範文,但願對你的工作學習帶來幫助,希望你能喜歡!當然你還可以在本站搜尋到更多與《銀行優質服務心得體會》相關的範文。篇1:銀行優質服務心得體會時光飛逝,轉眼間我擔任大堂經理已經一年了,作為一名大堂經理我...