數據結構課程設計心得體會通用多篇
- 專題心得體會
- 關注:2.91W次
數據結構課程設計心得體會 篇一
本次課程設計,使我對《數據結構》這門課程有了更深入的理解。我的課程設計題目是線索二叉樹的運算。剛開始做這個程序的時候,感到完全無從下手,甚至讓我覺得完成這次程序設計根本就是不可能的,於是開始查閲各種資料以及參考文獻,之後便開始着手寫程序,寫完運行時有很多問題。特別是實現線索二叉樹的刪除運算時很多情況沒有考慮周全,經常運行出現錯誤,但通過同學間的幫助最終基本解決問題。
在本課程設計中,我明白了理論與實際應用相結合的重要性,並提高了自己組織數據及編寫大型程序的能力。培養了基本的、良好的程序設計技能以及合作能力。這次課程設計同樣提高了我的綜合運用所學知識的能力。並對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)); } 程序運行結果: 六,心得體會 通過這次編程,我發現很多編程過程中的不足與問題,很多問題由於考慮不全面,導致程序運行失敗。還有一些小問題,比如字母的大小寫,括號的遺漏,語法書寫錯誤等等一些基礎錯誤,也是讓我體會很深寫程序要謹慎仔細。數據結構課程設計 篇三
數據結構課程設計 篇四
- 文章版權屬於文章作者所有,轉載請註明 https://wenfanwang.com/xindetihui/zhuanti/4oqgog.html