第一篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計——教學(xué)計劃編制
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
摘 要
教學(xué)計劃(課程計劃)是課程設(shè)置的整體規(guī)劃,它規(guī)定不同課程類型相互結(jié)構(gòu)的方式,也規(guī)定了不同課程在管理學(xué)習(xí)方式的要求及其所占比例,同時,對學(xué)校的教學(xué)、生產(chǎn)勞動、課外活動等作出全面安排,具體規(guī)定了學(xué)校應(yīng)設(shè)置的學(xué)科、課程開設(shè)的順序及課時分配,并對學(xué)期、學(xué)年、假期進(jìn)行劃分。
根據(jù)一定的教育目的和培養(yǎng)目標(biāo)制定的教學(xué)和教育工作的指導(dǎo)文件。它決定著教學(xué)內(nèi)容總的方向和總的結(jié)構(gòu),并對有關(guān)學(xué)校的教學(xué)、教育活動,生產(chǎn)勞動和課外活動校外活動等各方面作出全面安排,具體規(guī)定一定學(xué)校的學(xué)科設(shè)置、各門學(xué)科的教學(xué)順序、教學(xué)時數(shù)以及各種活動等。教學(xué)計劃、教學(xué)大綱和教科書互相聯(lián)系,共同反映教學(xué)內(nèi)容。
近代以來,特別是在實(shí)行學(xué)科課程的條件下,教學(xué)計劃主要是學(xué)科的計劃,或只是學(xué)科表。隨著社會經(jīng)濟(jì)和科學(xué)技術(shù)的新發(fā)展,教育結(jié)構(gòu)不斷發(fā)生變革,現(xiàn)代教育和教學(xué)理論主張對教學(xué)計劃的結(jié)構(gòu)實(shí)行改革。除了教學(xué)以外,生產(chǎn)勞動、科技活動、發(fā)展體力和增進(jìn)健康的活動、藝術(shù)活動和社會活動等也應(yīng)列入教學(xué)計劃。下面就利用對此進(jìn)行程序設(shè)計,已達(dá)到預(yù)期的目的。
關(guān)鍵字:數(shù)據(jù)結(jié)構(gòu),教學(xué)計劃編制,抽象數(shù)據(jù)類型,程序設(shè)計
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
2.概要設(shè)計:
2.1流程圖
void FindInDegree(ALGraph G, int indegree[])//求圖中各節(jié)點(diǎn)的入度(如下左圖)void CreatGraph(ALGraph *G)//構(gòu)件圖(如下右圖)。
void TopologicalSort_1(ALGraph G,int numterm,int uplcredit)//有向圖G采用鄰接表存儲結(jié)構(gòu)(如下左圖);
void TopologicalSort_2(ALGraph G,int numterm,int uplcredit)//有向圖G采用鄰接表存儲結(jié)構(gòu)(如下右圖)。
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
主函數(shù): void main()
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
數(shù)據(jù)關(guān)系:R1={﹤ai-1 ai﹥|ai-1,ai∈D,i=2,…,n} 基本操作: void InitStack(SqStack *S);int StackEmpty(SqStack S);void Push(SqStack *S, int);int Pop(SqStack *S, int *e);}ADT Stack 2.3主程序
int main()//主函數(shù) { int numterm;//學(xué)期總數(shù)
int uplcredit;//一個學(xué)期的學(xué)分上限 int selectway;ALGraph G;printf(“請輸入學(xué)期總數(shù):n”);scanf(“%d”,&numterm);printf(“請輸入一個學(xué)期的學(xué)分上限:n”);scanf(“%d”,&uplcredit);CreatGraph(&G);printf(“請選擇編排策略:1.課程盡可能集中到前幾個學(xué)期;2.課程盡量均勻分布n”);scanf(“%d”,&selectway);if(selectway==1)TopologicalSort_1(G,numterm,uplcredit);if(selectway==2)TopologicalSort_2(G,numterm,uplcredit);system(“pause”);return 0;} 2.4本程序只有兩個模塊,調(diào)用關(guān)系簡單
主程序模塊→拓?fù)渑判蚰K
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
4.詳細(xì)設(shè)計
4.1頭結(jié)點(diǎn)、表結(jié)點(diǎn)、鄰接表的定義
#define MAX_VERTEX_NUM 100 //最大課程總數(shù) typedef struct ArcNode{ int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{ char name[24];//課程名 int classid;//課程號 int credit;//課程的學(xué)分 int indegree;//該結(jié)點(diǎn)的入度 int state;//該節(jié)點(diǎn)的狀態(tài)
ArcNode *firstarc;//指向第一條依附該頂點(diǎn)的弧的指針 }VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{ AdjList vertices;int vexnum, arcnum;}ALGraph;鄰接表的基本操作:
void CreatGraph(ALGraph *);創(chuàng)建鄰接表
void FindInDegree(ALGraph , int *);求一個結(jié)點(diǎn)的入度
void TopologicalSort_1(ALGraph G,int numterm,int maxcredit);拓?fù)渑判騺砭幣耪n程
void TopologicalSort_2(ALGraph G,int numterm,int maxcredit);拓?fù)渑判騺砭幣耪n程
4.2棧的定義
#define STACk_INIT_SIZE 100 //存儲空間的初時分配量 #define STACKINCREMENT 10 //存儲空間的分配增量
-***攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
6.調(diào)試分析
6.1實(shí)驗(yàn)過程中出現(xiàn)的問題及解決方法
我們在實(shí)驗(yàn)過程中遇到的最大難題是兩個課程排序算法的編寫。剛開始的時候沒有任何的思路,網(wǎng)上也只有拓?fù)渑判虻乃惴ǎ瑢τ谡n程設(shè)計要求的排序算法沒有任何頭緒。經(jīng)過請教老師和同學(xué)以及翻閱了一些相關(guān)書籍,并在網(wǎng)上的搜索有了排序算法的大體思路。經(jīng)過三天的修改,終于寫出了符合要求的排序算法。
6.2測試數(shù)據(jù)
學(xué)期總數(shù):6;學(xué)分上限:10;該專業(yè)共開設(shè)12門課,課程號從01到12,學(xué)分順序?yàn)?,3,4,3,2,3,4,4,7,5,2,3。
6.3測試結(jié)果(包含正確和錯誤的)
正確測試結(jié)果:
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
錯誤測試結(jié)果:
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
6.4測試數(shù)據(jù)及程序運(yùn)行情況
輸入的內(nèi)容如下: 課程編號 課程名稱 學(xué)分 先決條件 01 程序設(shè)計基礎(chǔ) 2 無 02 離散數(shù)學(xué) 3 01 03 數(shù)據(jù)結(jié)構(gòu) 4 01,02 04 匯編語言 3 01 05 語言的設(shè)計和分析 2 03,04 06 計算機(jī)原理 3 11 07 編譯原理 4 05,03 08 操作系統(tǒng) 4 03,06 09 高等數(shù)學(xué) 7 無 10 線性代數(shù) 5 09 11 普通物理 2 09 12 數(shù)值分析 3 09,10,01 兩種編排方法都輸出結(jié)果為: 第一學(xué)期學(xué)的課程有:高等數(shù)學(xué) 程序設(shè)計基礎(chǔ); 第二學(xué)期學(xué)的課程有:普通物理 線性代數(shù) 匯編語言; 第三學(xué)期學(xué)的課程有:數(shù)值分析 計算機(jī)原理 離散數(shù)學(xué); 第四學(xué)期學(xué)的課程有:數(shù)據(jù)結(jié)構(gòu);
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
第五學(xué)期學(xué)的課程有:操作系統(tǒng) 語言的設(shè)計和分析; 第六學(xué)期學(xué)的課程有:編譯原理。
7.實(shí)驗(yàn)分工
8.總結(jié)
剛開始學(xué)的時候確實(shí)有很多地方我很不理解,每次上課時老師都會給我們出不同的設(shè)計題目,對于我們一個初學(xué)者來說,無疑是一個具大的挑戰(zhàn),撞了幾次壁之后,我決定靜下心來,仔細(xì)去寫程序。老師會給我們需要編程的內(nèi)容一些講解,順著老師的思路,來完成自己的設(shè)計,我們可以開始運(yùn)行自己的程序,可是好多處的錯誤讓人看的可怕,還看不出到底是哪里出現(xiàn)了錯誤,但是程序還是得繼續(xù)下去,我多次請教了老師和同學(xué),逐漸能自己找出錯誤,并加以改正。經(jīng)過了這次課程設(shè)計,現(xiàn)在已經(jīng)可以了解很多錯誤在英文里的提示,這對我來說是一個突破性的進(jìn)步,眼看著一個個錯誤通過自己的努力在我眼前消失,覺得很是開心。此次的程序設(shè)計能夠成功,是我和我的同學(xué)三個人共同努力作用的結(jié)果。在這一段努力學(xué)習(xí)的過程中,我們的編程設(shè)計有了明顯的提高。
其實(shí)現(xiàn)在想起來,收獲還真是不少,雖然說以前非常不懂這門語言,在它上面花費(fèi)了好多心血,覺得它很難,是需用花費(fèi)了大量的時間編寫出來的?,F(xiàn)在真正的明白了一些代碼的應(yīng)用,每個程序都有一些共同點(diǎn),通用的結(jié)構(gòu),相似的格式。同時也對教學(xué)編制問題有了進(jìn)一步的認(rèn)識。只要努力去學(xué)習(xí),就會靈活的去應(yīng)用它。
9.參考文獻(xiàn)
[1]《數(shù)據(jù)結(jié)構(gòu)》(C語言版),嚴(yán)蔚敏,清華大學(xué)出版社,2003。
攀枝花學(xué)院課程設(shè)計論文 教學(xué)計劃編制問題
[2]《數(shù)據(jù)結(jié)構(gòu)題集》,嚴(yán)蔚敏,清華大學(xué)出版社,2005。[3]《數(shù)據(jù)結(jié)構(gòu)》(C語言版),劉大有,高等教育出版社,2004。[4]《Data Structure with C++》,William Ford.William Topp,清華大學(xué)出版社,2003。
第二篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
課 程 設(shè) 計 任 務(wù) 書
信息 學(xué)院 信息管理與信息系統(tǒng) 專業(yè) 09級1班 班 孫鵬一、二、課程設(shè)計題目: 迷宮求解、一元多項(xiàng)式
課程設(shè)計主要參考資料: 數(shù)據(jù)結(jié)構(gòu)(C語言版)嚴(yán)蔚敏、吳偉民 編著
數(shù)據(jù)結(jié)構(gòu)題集(C語言版)嚴(yán)蔚敏、吳偉民、米寧 編著
數(shù)據(jù)結(jié)構(gòu)課件
三、設(shè)計應(yīng)解決下列各主要問題:
1.實(shí)現(xiàn)迷宮的路徑求解,并輸出最終路徑,標(biāo)記走過卻未選擇的路徑和最終選擇的路徑
2.對一元多項(xiàng)式實(shí)現(xiàn)加法,減法,乘法,求導(dǎo)的計算,并按指數(shù)由大到小排序輸出
四、課程設(shè)計相關(guān)附件(如:圖紙、軟件等):
五、命題發(fā)出日期:2011-3-15 設(shè)計應(yīng)完成日期: 2010-6-20
設(shè)計指導(dǎo)教師(簽章):
系主任(簽章):
指導(dǎo)教師對課程設(shè)計的評語
指導(dǎo)教師(簽章):
年 月 日
山東科技大學(xué)學(xué)生課程設(shè)計
課程設(shè)計1 迷宮問題
一、需求分析:
1.2.3.4.以二維數(shù)組Maze[][]表示迷宮
用戶輸入迷宮的數(shù)據(jù):構(gòu)建迷宮,行數(shù)m,列數(shù)n 迷宮的入口位置和出口位置可由用戶隨時設(shè)定
若設(shè)定的迷宮存在通路,則以長方陣形式將迷宮及其通路輸出到標(biāo)準(zhǔn)輸出文件(即終端)上,其中,字符“#”表示障礙,字符“*”表示路徑上的位置,字符“@”表示“死胡同”,即曾經(jīng)途徑然而不能到達(dá)出口的位置,余者用空格符印出。若設(shè)定的迷宮不存在通路,則報告相應(yīng)信息。
5.本程序只求出一條成功的通路。然而,只需要對迷宮求解的函數(shù)做小量修改,便可求得全部路徑。
二、概要設(shè)計:
抽象數(shù)據(jù)類型線性表的定義如下: ⒈ 設(shè)計棧的抽象數(shù)據(jù)類型定義:
ADT Stack { 數(shù)據(jù)對象:D={ai:|ai∈PositionSet,i=1?n,n≥0} 數(shù)據(jù)關(guān)系:R1={
Push(&S,e)Pop(&S,e)
返回其值 }ADT Stack;
⒉ 迷宮的抽象數(shù)據(jù)類型定義: ADT Maze{ 數(shù)據(jù)對象:D:={aij,Start,end|aij,Start,end∈{} 0≤i≤m+2,0≤j≤n+2,m,n≥0}
數(shù)據(jù)關(guān)系:R={ROW.COL} Row={
第1頁
操作結(jié)果
構(gòu)造一個空棧,完成棧用e返回棧S的棧頂元將新的元素e壓入棧頂 刪除棧頂元素,并用eInitStack(&S)
山東科技大學(xué)學(xué)生課程設(shè)計
Col={
基本操作: masepath(int i,int j,int m,int n,sqstack &s)初始條件:已知目前迷宮狀態(tài), 傳過起始位置,和終止位置 操作結(jié)果:搜索迷宮,用sqstack s返回搜索所得路徑。如不存在,返回2 }ADT MAZE
三、詳細(xì)設(shè)計:
#include
typedef int Status;
typedef struct { int r;int c;}PostType;//坐標(biāo)位置
迷宮的r行c列 typedef struct { int ord;//通道塊在路徑上的序號
PostType seat;//通道塊的當(dāng)前坐標(biāo)位置
int di;//通道塊指向下一通道塊的方向 }SElemType;//棧元素的類型 typedef struct { SElemType *base;//棧底指針
SElemType *top;//棧頂指針
int stacksize;//棧的最大容量 }Stack;//棧的類型
第2頁 山東科技大學(xué)學(xué)生課程設(shè)計
Status InitStack(Stack &S)//初始化棧 { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)
exit(OVERFLOW);//存儲分配失敗;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}//InitStack
Status StackEmpty(Stack S)//判斷棧是否為空,如果為空返回TRUE,否則返回FALSE { if(S.top==S.base)
return TRUE;
return FALSE;}//StackEmpty
Status Push(Stack &S,SElemType e)//插入元素為e的棧頂元素 { if(S.top-S.base>=S.stacksize){
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACK_INCREMENT;} *S.top++=e;return OK;}//Push
Status Pop(Stack &S,SElemType &e)//刪除棧頂元素存入e { if(S.top==S.base)
return ERROR;e=*--S.top;
第3頁 山東科技大學(xué)學(xué)生課程設(shè)計
return OK;}//Pop
Status DestroyStack(Stack &S)//銷毀棧 { free(S.base);S.top=S.base;return OK;}//DestroyStack
//maze.cpp #define MAXLEN 20//迷宮包括外墻最大行列數(shù)目 typedef struct{
int r;
int c;
char adr[MAXLEN][MAXLEN];//可取' ''*' '@' '#' }MazeType;
//迷宮類型
Status InitMaze(MazeType &maze){ //初始化迷宮若成功返回TRUE,否則返回FALSE
int m,n,i,j,k=1;
printf(“輸入迷口的行數(shù)和列數(shù): ”);
scanf(“%d%d”,&maze.r,&maze.c);//迷宮行和列數(shù)
for(i=0;i<=maze.c+1;i++){//迷宮行外墻
maze.adr[0][i]='#';
maze.adr[maze.r+1][i]='#';
}//for
for(i=0;i<=maze.r+1;i++){//迷宮列外墻
maze.adr[i][0]='#';
maze.adr[i][maze.c+1]='#';
}
for(i=1;i<=maze.r;i++)
for(j=1;j<=maze.c;j++)
maze.adr[i][j]=' ';//初始化迷宮
printf(“輸入障礙物%d的坐標(biāo)(以坐標(biāo)(0,0)結(jié)束輸入): ”,k);
scanf(“%d%d”,&m,&n);
k++;
while(m!=0)
{
if(m>maze.r || n>maze.c)//越界
第4頁 山東科技大學(xué)學(xué)生課程設(shè)計
exit(ERROR);
maze.adr[m][n]='#';//迷宮障礙用'#'標(biāo)記
printf(“輸入障礙物%d的坐標(biāo)(以坐標(biāo)(0,0)結(jié)束輸入): ”,k);
scanf(“%d%d”,&m,&n);
k++;
}
return OK;}//InitMaze
Status Pass(MazeType maze,PostType curpos){ //當(dāng)前位置可通則返回TURE,否則返回FALSE
if(maze.adr[curpos.r][curpos.c]==' ')//可通
return TRUE;
else
return FALSE;}//Pass
Status FootPrint(MazeType &maze,PostType curpos){ //若走過并且可通返回TRUE,否則返回FALSE //在返回之前銷毀棧S
maze.adr[curpos.r][curpos.c]='*';//“*”表示可通
return OK;}//FootPrint
PostType NextPos(PostType &curpos,int i){ //指示并返回下一位置的坐標(biāo)
PostType cpos;
cpos=curpos;
switch(i){
//1.2.3.4分別表示東,南,西,北方向
case 1 : cpos.c+=1;break;
case 2 : cpos.r+=1;break;
case 3 : cpos.c-=1;break;
case 4 : cpos.r-=1;break;
default: exit(ERROR);
}
return cpos;}//Nextpos
Status MarkPrint(MazeType &maze,PostType curpos){ //曾走過但不是通路標(biāo)記并返回OK
第5頁 山東科技大學(xué)學(xué)生課程設(shè)計
maze.adr[curpos.r][curpos.c]='@';//“@”表示曾走過但不通
return OK;}//MarkPrint
void PrintMaze(MazeType &maze)//將最后標(biāo)記好的迷宮輸出 { int i,j;printf(“n輸出迷宮的路徑:n”);for(i=0;i<=maze.c+1;i++)
printf(“%4d”,i);//輸出列數(shù)
printf(“n”);for(i=0;i<=maze.r+1;i++){
printf(“%d”,i);//輸出行數(shù)
for(j=0;j<=maze.c+1;j++)
printf(“%4c”,maze.adr[i][j]);//輸出迷宮
printf(“n”);} }//PrintMaze
Status MazePath(MazeType &maze,PostType start,PostType end)//若迷宮從入口start到end的通道則求得一條存放在棧中 { Stack S;//初始化棧
PostType curpos;int curstep;SElemType e;InitStack(S);curpos=start;curstep=1;do {
if(Pass(maze,curpos))//當(dāng)前位置可通過而未曾走過留下足跡
{
FootPrint(maze,curpos);
e.ord=curstep;e.seat=curpos;e.di=1;
Push(S,e);//加入棧路徑中
if(curpos.r==end.r && curpos.c==end.c)//到達(dá)出口返回TRUE
{
第6頁 山東科技大學(xué)學(xué)生課程設(shè)計
if(!DestroyStack(S))
exit(OVERFLOW);
else return TRUE;
}
else
{
curpos=NextPos(curpos,1);//下一位置是當(dāng)前位置
curstep++;//探索下一步
}
}//if
else//當(dāng)前位置不能通過
{
if(!StackEmpty(S))
{
Pop(S,e);//提取前一位置
while(e.di==4 &&!StackEmpty(S))//4個方向都不能通過則留下記號@ 提取前一個位置進(jìn)行判斷是否是能通過
{
MarkPrint(maze,e.seat);
Pop(S,e);
}
if(e.di<4)//換下一個方向探索
設(shè)定當(dāng)前位置為該新方向上的鄰位
{
e.di++;
Push(S,e);
curpos=NextPos(e.seat,e.di);
}
}//if
} }while(!StackEmpty(S));if(!DestroyStack(S))
exit(ERROR);else return FALSE;}//MazePath
int main(){ MazeType maze;PostType start,end;char c;
第7頁 山東科技大學(xué)學(xué)生課程設(shè)計
do {
printf(“**********迷宮求解**********n”);
if(!InitMaze(maze))
{
printf(“n 初始化迷宮失??!!”);
exit(ERROR);
}
do
{
printf(“n請輸入入口的坐標(biāo):”);
scanf(“%d%d”,&start.r,&start.c);//輸入入口坐標(biāo)
if(start.r>maze.r || start.c>maze.c)
printf(“n輸入錯誤,請重新輸入入口的坐標(biāo)!n”);
continue;
}
while(start.r>maze.r || start.c>maze.c);
do
{
printf(“n請輸入出口的坐標(biāo):”);//輸入出口的坐標(biāo)
scanf(“%d%d”,&end.r,&end.c);
if(end.r>maze.r || end.c>maze.c)
printf(“n輸入錯誤,請重新輸入出口坐標(biāo)!n”);
continue;
}
while(end.r>maze.r || end.c>maze.c);
if(!MazePath(maze,start,end))
printf(“n不能找到一條路徑!!n”);
else PrintMaze(maze);//輸出迷宮
printf(“是否要繼續(xù)?(y/n):”);
scanf(“%s”,&c);} while(c=='y' || c=='Y');}。測試結(jié)果:
第8頁
四、山東科技大學(xué)學(xué)生課程設(shè)計
課程設(shè)計2 一元多項(xiàng)式
一、需求分析:
第9頁 山東科技大學(xué)學(xué)生課程設(shè)計
1.2.3.首先定義一個結(jié)構(gòu)體,其中定義一元多項(xiàng)式中的兩個參數(shù):系數(shù)和指數(shù)和鏈表中結(jié)點(diǎn)的指針域;
然后一一羅列每個在主程序中用到的函數(shù),并一一實(shí)現(xiàn); 最后在主程序中主要完成用戶的輸入和相關(guān)函數(shù)的調(diào)用。
二、概要設(shè)計:
void insert(PLOYList *head,PLOYList *input)
//查找位置插入新鏈節(jié)的函數(shù),且讓輸入的多項(xiàng)式呈降序排列 PLOYList *creat(char ch)//輸入多項(xiàng)式
PLOYList *add(PLOYList *head,PLOYList *pre)//多項(xiàng)式相加,head為第一個多項(xiàng)式建立的鏈表表頭,pre為第二個多項(xiàng)式建立的鏈表表頭
PLOYList *sub(PLOYList *head,PLOYList *pre)//多項(xiàng)式相減
PLOYList *mul(PLOYList *head,PLOYList *pre)//多項(xiàng)式相乘
PLOYList *der(PLOYList *head)//多項(xiàng)式求導(dǎo)
void print(PLOYList *fun)//輸出多項(xiàng)式,fun指要輸出的多項(xiàng)式鏈表的表頭 void start()//用戶選擇界面
三、詳細(xì)設(shè)計:
#include
//定義節(jié)點(diǎn)類型 { float coef;
//多項(xiàng)式的系數(shù)
int expn;
//多項(xiàng)式的指數(shù)
struct node * next;//結(jié)點(diǎn)指針域 }PLOYList;void insert(PLOYList *head,PLOYList *input)
//查找位置插入新鏈節(jié)的函數(shù),且讓輸入的多項(xiàng)式呈降序排列 {
PLOYList *pre,*now;
int signal=0;
pre=head;
第10頁 山東科技大學(xué)學(xué)生課程設(shè)計
if(pre->next==NULL){pre->next=input;} //如果只有一個頭結(jié)點(diǎn),則把新結(jié)點(diǎn)直接連在后面
else {
now=pre->next;//如果不是只有一個頭結(jié)點(diǎn),則設(shè)置now指針
while(signal==0)
{
if(input->expn < now->expn)
{
if(now->next==NULL)
{
now->next=input;
signal=1;
}
else
{
pre=now;
now=pre->next;//始終讓新輸入的數(shù)的指數(shù)與最后一個結(jié)點(diǎn)中的數(shù)的指數(shù)比較,小于則插在其后面
}
}
else if(input->expn > now->expn)
{
input->next=now;
pre->next=input;
signal=1;
}//若新結(jié)點(diǎn)中指數(shù)比最后一個結(jié)點(diǎn)即now中的指數(shù)大,則插入now之前
else//若指數(shù)相等則需合并為一個結(jié)點(diǎn),若相加后指數(shù)為0則釋放該結(jié)點(diǎn)
{
now->coef=now->coef+input->coef;
signal=1;
free(input);
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
}//else } //while
第11頁 山東科技大學(xué)學(xué)生課程設(shè)計
}//else }//void
PLOYList *creat(char ch)
//輸入多項(xiàng)式 {
PLOYList *head,*input;
float x;
int y;
head=(PLOYList *)malloc(sizeof(PLOYList));
//創(chuàng)建鏈表頭
head->next=NULL;
scanf(“%f %d”,&x,&y);//實(shí)現(xiàn)用戶輸入的第一個項(xiàng),包括其指數(shù)和系數(shù)
while(x!=0)
{
input=(PLOYList *)malloc(sizeof(PLOYList));//創(chuàng)建新鏈節(jié)
input->coef=x;
input->expn=y;
input->next=NULL;
insert(head,input);//每輸入一項(xiàng)就將其排序,是的鏈表中多項(xiàng)式呈降序排列
scanf(“%f %d”,&x,&y);
} return head;}
PLOYList *add(PLOYList *head,PLOYList *pre)
//多項(xiàng)式相加,head為第一個多項(xiàng)式建立的鏈表表頭,pre為第二個多項(xiàng)式建立的鏈表表頭 {
PLOYList *input;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//若該鏈表為空,則無需進(jìn)行加法運(yùn)算,跳出循環(huán)
else
{
pre=pre->next;
input=(PLOYList *)malloc(sizeof(PLOYList));
第12頁 山東科技大學(xué)學(xué)生課程設(shè)計
input->coef=pre->coef;
input->expn=pre->expn;
input->next=NULL;
insert(head,input);// 把g(x)插入到f(x)中,相當(dāng)于兩者相加,結(jié)果保存于f(x)
}
} return head;}
PLOYList *sub(PLOYList *head,PLOYList *pre)//多項(xiàng)式相減 {
PLOYList *input;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;
else
{
pre=pre->next;
input=(PLOYList *)malloc(sizeof(PLOYList));
input->coef=0-pre->coef;//將第二個多項(xiàng)式里的數(shù)變?yōu)槠湎喾磾?shù),再用和加法一樣的方法實(shí)現(xiàn)減法
input->expn=pre->expn;
input->next=NULL;
insert(head,input);
}
} return head;}
PLOYList *mul(PLOYList *head,PLOYList *pre)//多項(xiàng)式項(xiàng)乘 { PLOYList *hf,*pf,*qa,*qb;
qa = head-> next;
qb = pre-> next;//定義指針指向表頭后一個元素,即鏈表中第一個元素
hf =(PLOYList *)malloc(sizeof(PLOYList));//新創(chuàng)建一個結(jié)點(diǎn),當(dāng)做表頭
hf-> next = NULL;for(;qa;qa = qa-> next)
第13頁 山東科技大學(xué)學(xué)生課程設(shè)計
{
for(qb = pre-> next;qb;qb= qb-> next)//用兩個循環(huán),實(shí)現(xiàn)兩個多項(xiàng)式之間每個項(xiàng)相乘,結(jié)果用insert函數(shù)進(jìn)行排序與合并
{
pf =(PLOYList *)malloc(sizeof(PLOYList));
pf-> coef = qa-> coef * qb-> coef;//系數(shù)相乘
pf-> expn = qa-> expn + qb-> expn;//指數(shù)相加
pf-> next = NULL;
insert(hf,pf);
} } return hf;}
PLOYList *der(PLOYList *head)//多項(xiàng)式求導(dǎo) { PLOYList *p;p = head-> next;while(p){
p-> coef = p-> coef * p-> expn;
p-> expn = p-> expn--;
p = p-> next;} return head;}//將多項(xiàng)式的每項(xiàng)系數(shù)和指數(shù)相乘得到新的系數(shù),指數(shù)減一得到新的指數(shù)即完成求導(dǎo)
void print(PLOYList *fun)//輸出多項(xiàng)式,fun指要輸出的多項(xiàng)式鏈表的表頭 {
PLOYList *printing;
int flag=0;
printing=fun->next;
if(fun->next==NULL)//若為空表,則無需輸出
{
printf(“0n”);
return;
}
while(flag==0)
{
第14頁 山東科技大學(xué)學(xué)生課程設(shè)計
if(printing->coef>0&&fun->next!=printing)
printf(“+”);
if(printing->coef==1);
else if(printing->coef==-1)
printf(“-”);
else
printf(“%f”,printing->coef);
if(printing->expn!=0)printf(“x^%d”,printing->expn);
else if((printing->coef==1)||(printing->coef==-1))
printf(“1”);
if(printing->next==NULL)
flag=1;
else
printing=printing->next;
} printf(“n”);}
void start()//用戶選擇界面 { printf(“
#n”);
printf(“
用戶選擇界面
n”);
printf(“ ************************************n”);
printf(“ *
*n”);
printf(“ *
1.兩個一元多項(xiàng)式相加
*n”);
printf(“ *
2.兩個一元多項(xiàng)式相減
*n”);
printf(“ *
3.兩個一元多項(xiàng)式相乘
*n”);
printf(“ *
4.對一個一個一元多項(xiàng)式求導(dǎo) *n”);
printf(“ *
0.退出系統(tǒng)
*n”);
printf(“ *
*n”);
printf(“ ************************************n”);
printf(“
n”);
printf(“ 注釋:輸入多項(xiàng)式格式(可無序):系數(shù)1 指數(shù)1 系數(shù)2 指數(shù)2 ??,并以0 0 結(jié)束:n”);
printf(“
n”);
printf(“ 請選擇操作: ”);}
int main(){ PLOYList *f,*g,*pf,*hf,*p;
第15頁 山東科技大學(xué)學(xué)生課程設(shè)計
int sign=-1;
start();
while(sign!=0)
{
scanf(“%d”,&sign);
switch(sign)
{
case 0:
break;
case 1://多項(xiàng)式相加
{
printf(“ 你選擇的操作是多項(xiàng)式相加:n”);
printf(“ 請輸入第一個多項(xiàng)式f(x):”);
f=creat('f');
printf(“ 第一個多項(xiàng)式為:f(x)=”);
print(f);
printf(“ 請輸入第二個多項(xiàng)式g(x):”);
g=creat('g');
printf(“ 第二個多項(xiàng)式為:g(x)=”);
print(g);
printf(“ 結(jié)果為:F(x)=f(x)+g(x)=”);
f=add(f,g);
print(f);
printf(“nn”);
printf(“ 繼續(xù)請選擇相應(yīng)操作,退出請按0.break;
}
case 2://多項(xiàng)式相減
{
printf(” 你選擇的操作是多項(xiàng)式相減:n“);
printf(” 請輸入第一個多項(xiàng)式f(x):“);
f=creat('f');
printf(” 第一個多項(xiàng)式為:f(x)=“);
print(f);
printf(” 請輸入第二個多項(xiàng)式g(x):“);
g=creat('g');
printf(” 第二個多項(xiàng)式為:g(x)=“);
print(g);
printf(” 結(jié)果為:F(x)=f(x)-g(x)=“);
f=sub(f,g);
print(f);
”);第16頁
山東科技大學(xué)學(xué)生課程設(shè)計
printf(“nn”);
printf(“ 繼續(xù)請選擇相應(yīng)操作,退出請按0.”);
break;
}
case 3://多項(xiàng)式相乘
{
printf(“ 你選擇的操作是多項(xiàng)式相乘:n”);
printf(“ 請輸入第一個多項(xiàng)式f(x):”);
f=creat('f');
printf(“ 第一個多項(xiàng)式為:f(x)=”);
print(f);
printf(“ 請輸入第二個多項(xiàng)式g(x):”);
g=creat('g');
printf(“ 第二個多項(xiàng)式為:g(x)=”);
print(g);
printf(“ 結(jié)果為:F(x)=f(x)* g(x)=”);
pf=mul(f,g);
print(pf);
printf(“nn”);
printf(“ 繼續(xù)請選擇相應(yīng)操作,退出請按0.”);
break;
}
case 4://多項(xiàng)式求導(dǎo)
{
printf(“您選擇的是對一個一元多項(xiàng)式求導(dǎo):n”);
printf(“請輸入一個一元多項(xiàng)式:”);
f = creat('f');
printf(“這個多項(xiàng)式為:f(x)= ”);
print(f);
printf(“求導(dǎo)結(jié)果為:F(x)=f'(x)= ”);
f=der(f);
print(f);
printf(“nn”);
printf(“ 繼續(xù)請選擇相應(yīng)操作,退出請按0.”);
break;
}
}//swith
}//while }//void
四、測試結(jié)果:
第17頁 山東科技大學(xué)學(xué)生課程設(shè)計
第18頁
第三篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
南京航空航天大學(xué)金城學(xué)院
《數(shù)據(jù)結(jié)構(gòu)》 課程設(shè)計報告
題目:一元多項(xiàng)式的加減乘法運(yùn)算
班級: 20100232 學(xué)號: 2010023220 姓名: 祁博 成績:
指導(dǎo)教師: 葉延風(fēng)
完成日期: 2012年 2月18 日
課程設(shè)計的主要內(nèi)容 需求分析
1.1課程設(shè)計題目
用線性表實(shí)現(xiàn)一元多項(xiàng)式的加法減法與乘法。
1.2課程設(shè)計的任務(wù)及要求
任務(wù):利用所學(xué)線性表知識來完成計算器中一元多項(xiàng)式的加法減法與乘法的運(yùn)算。要求:能自己創(chuàng)建線性表,能自主的進(jìn)行線性表的有關(guān)插入刪除操作,并且可以在此基礎(chǔ)上實(shí)現(xiàn)線性表之間的加減乘除運(yùn)算。
1.3課程設(shè)計思想
首先要定義一個結(jié)構(gòu)體,其中定義一元多項(xiàng)式的兩個參數(shù),系數(shù)和指數(shù)和鏈表中的指針域,然后一一羅列每個在主程序中得到的函數(shù),并一一實(shí)現(xiàn),最后在主程序中主要完成用戶的輸入和相關(guān)程序的調(diào)用。
1.4軟件開發(fā)的環(huán)境
VC++6.0。
? 2.程序源代碼
#include
typedef struct node{//定義節(jié)點(diǎn)類型
float coef;int expn;
struct node * next;}Ployn;
void menu()//用戶選擇界面
{
printf(“************************************n”);
printf(“ 兩個一元多項(xiàng)式的相加/相減,相乘:n”);
printf(“************************************n”);
printf(“請選擇操作:n”);
printf(“0.退出n”);
printf(“1.兩個一元多項(xiàng)式相加n”);
printf(“2.兩個一元多項(xiàng)式相乘n”);
printf(“3.兩個一元多項(xiàng)式相減n”);
}
void insert(Ployn *head,Ployn *inpt)//查找位置插入新鏈節(jié)程序
{
Ployn *pre,*now;
int signal=0;
pre=head;//pre定義為現(xiàn)在的前一個鏈節(jié)
if(pre->next==NULL){pre->next=inpt;}
else {now=pre->next;while(signal==0){
if(inpt->expn>now->expn)//當(dāng)新鏈節(jié)小于現(xiàn)在的連接時向后移一個鏈節(jié)
{
if(now->next==NULL)
{
now->next=inpt;
signal=1;
}
else
{
pre=now;
now=pre->next;
}
}
else if(inpt->expn
{
inpt->next=now;
pre->next=inpt;
signal=1;
}
else
{
now->coef=now->coef+inpt->coef;
signal=1;
free(inpt);//與當(dāng)前鏈節(jié)相等指數(shù)
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
} } } }
Ployn *creat(char ch)//輸入多項(xiàng)式
{
Ployn *head,*inpt;
float x;
int y;
head=(Ployn *)malloc(sizeof(Ployn));//創(chuàng)建鏈表頭
head->next=NULL;
printf(“請輸入一元多項(xiàng)式%c:(格式是:系數(shù) 指數(shù);以0 0 結(jié)束!)n”,ch);
scanf(“%f %d”,&x,&y);
while(x!=0)
{
inpt=(Ployn *)malloc(sizeof(Ployn));//創(chuàng)建新鏈節(jié)
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);//不然就查找位置并且插入新鏈節(jié)
printf(“請輸入一元多項(xiàng)式%c的下一項(xiàng):(以0 0 結(jié)束!)n”,ch);
scanf(“%f %d”,&x,&y);
}
return head;}
Ployn *addPloyn(Ployn *head,Ployn *pre)//多項(xiàng)式相加
{
Ployn *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//當(dāng)現(xiàn)在指向空時跳出循環(huán)
else
{
pre=pre->next;
inpt=(Ployn *)malloc(sizeof(Ployn));//創(chuàng)建新鏈節(jié)
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否則把當(dāng)前“g(x)”的鏈節(jié)插入到“y(x)”中
}
return head;}
Ployn *minusPloyn(Ployn *head,Ployn *pre)//多項(xiàng)式相加
{
Ployn *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//當(dāng)現(xiàn)在指向空時跳出循環(huán)
else
{
pre=pre->next;
inpt=(Ployn *)malloc(sizeof(Ployn));//創(chuàng)建新鏈節(jié)
inpt->coef=0-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否則把當(dāng)前“g(x)”的鏈節(jié)插入到“y(x)”中
}
return head;}
Ployn *byPloyn(Ployn *head1,Ployn *head2)//多項(xiàng)式相乘
{
Ployn *inpt,*res,*pre;
int flag=0;
res=(Ployn *)malloc(sizeof(Ployn));//創(chuàng)建鏈表頭
res->next=NULL;
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;//當(dāng)現(xiàn)在指向空時跳出循環(huán)
head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;//當(dāng)現(xiàn)在指向空時跳出循環(huán)
continue;
}
pre=pre->next;
inpt=(Ployn *)malloc(sizeof(Ployn));//創(chuàng)建新鏈節(jié)
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);//把當(dāng)前“g(x)”的鏈節(jié)插入到“y(x)”中
}
return res;}
void print(Ployn *fun)//輸出多項(xiàng)式
{
Ployn *printing;
int flag=0;
printing=fun->next;//正在被打印的鏈節(jié)
if(fun->next==NULL)//如果函數(shù)為空打印0
{
printf(“0n”);
return;}
while(flag==0)
{
if(printing->coef>0 && fun->next!=printing)
printf(“+”);//為正數(shù)且不為第一項(xiàng)時打印“+”號
if(printing->coef==1);//如果為“1”就不用打印系數(shù)了
else if(printing->coef==-1)
printf(“-”);//如果為“-1”就打印“-”號就行了
else
printf(“%f”,printing->coef);//其余情況都得打印
if(printing->expn!=0)//如果指數(shù)為“0”不打印指數(shù)項(xiàng)
{ if(printing->expn==1)printf(“x”);
else printf(“x^%d”,printing->expn);
}
else if((printing->coef==1)||(printing->coef==-1))
printf(“1”);
if(printing->next==NULL)
flag=1;//如果現(xiàn)在的鏈節(jié)沒有下一個就結(jié)束
else
printing=printing->next;
}
printf(“n”);}
void main(){
Ployn *f,*g;
int sign=-1;//設(shè)置標(biāo)志
menu();
while(sign!=0)
{
scanf(“%d”,&sign);
switch(sign){
case 0: break;//退出
case 1:
{
printf(“你選擇的操作是多項(xiàng)式相加:n”);
f=creat('f');//輸入多項(xiàng)式f(x)
printf(“f(x)=”);
print(f);
g=creat('g');//輸入多項(xiàng)式g(x)
printf(“g(x)=”);
print(g);
printf(“F(x)=f(x)+g(x)=”);
f=addPloyn(f,g);//兩個多項(xiàng)式相加
print(f);
sign=-1;//復(fù)位標(biāo)志
menu();//回復(fù)用戶選擇界面
break;
}
case 2:
{
printf(“你選擇的操作是多項(xiàng)式相乘:n”);
f=creat('f');//輸入多項(xiàng)式f(x)
printf(“f(x)=”);
print(f);
g=creat('g');//輸入多項(xiàng)式g(x)
printf(“g(x)=”);
print(g);
printf(“F(x)=f(x)*g(x)=”);
f=byPloyn(f,g);//兩個多項(xiàng)式相加
print(f);
sign=-1;//復(fù)位標(biāo)志
menu();//回復(fù)用戶選擇界面
break;
}
case 3:
{
printf(“你選擇的操作是多項(xiàng)式相減:n”);
f=creat('f');//輸入多項(xiàng)式f(x)
printf(“f(x)=”);
print(f);
g=creat('g');//輸入多項(xiàng)式g(x)
printf(“g(x)=”);
print(g);
printf(“F(x)=f(x)-g(x)=”);
f=minusPloyn(f,g);//兩個多項(xiàng)式相加
print(f);
sign=-1;//復(fù)位標(biāo)志
menu();//回復(fù)用戶選擇界面
break;
}
default:
{
printf(“輸入有誤!請重新選擇操作!n”);//選擇錯誤,返回選擇界面
menu();
break;
}
}
} }
? 3.心得體會
每次做課設(shè)都有很大的收獲。課設(shè)不僅是對課本知識的理論實(shí)踐,更是對自我的一種挑戰(zhàn)。
這次課設(shè)過程中,遇到很多的問題,讓我有種無從下手的感覺,但是辦法總比困難多,于是,在老師、同學(xué)的幫助下,以及自己在翻書、上網(wǎng)找資料的情況下,順利解決問題。于是,我又上課的認(rèn)識到,團(tuán)隊的重要性。
第四篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
河海大學(xué)計算機(jī)與信息學(xué)院(常州)
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
課程設(shè)計題目:
多 項(xiàng) 式 問 題
專業(yè)、年級:計算機(jī)科學(xué)與技術(shù)09級 學(xué)
號:
0962810226
姓
名:
王
超
目 錄
一、問題描述-------------3
二、需求分析-------------4
三、概要設(shè)計-------------4 1.概要設(shè)計目的與要求--4 2.概要設(shè)計內(nèi)容--------4 3.功能算法描述與數(shù)據(jù)結(jié)構(gòu)說明-------------------------5
四、詳細(xì)設(shè)計-------------5
五、系統(tǒng)測試-------------8
六、使用說明-------------9
七、總結(jié)及心得體會-----10
多項(xiàng)式問題
一.問題描述
給你九個整數(shù),這九個整數(shù)分別是x的8次方至0次方的系數(shù),請你按照多項(xiàng)式的一半形式合理地構(gòu)造(去除不必要的)。例如九個系數(shù)分別是為0,0,0,1,22,-333,0,1,-1,你要構(gòu)造并輸出一行多項(xiàng)式:x^5 + 22x^4 – 333x^3 + x – 1。
它的格式規(guī)則如下:
1.多項(xiàng)式的項(xiàng)必須按其指數(shù)從高到低排列。2.指數(shù)必須跟在符號“^”后顯示。3.有常數(shù)的只顯示常數(shù)項(xiàng)(無需跟x^0)。
4.只顯示系數(shù)不為0的項(xiàng);若系數(shù)全為0,需顯示常數(shù)項(xiàng)。
5.在多項(xiàng)式中唯一需要空格的地方是項(xiàng)與項(xiàng)之間的加號或減號的兩邊需加上空格。
6.如果首項(xiàng)的系數(shù)是正數(shù),則系數(shù)前不加符號;如果首項(xiàng)的系數(shù)是負(fù)數(shù),則符號與數(shù)字之間不加空格,就如:-3x^2 +-2x。
7.系數(shù)為1,指數(shù)為0時,系數(shù)的1才顯示(推廣到系數(shù)為-1)。
輸入/輸出說明
1.輸入/輸出方式為文件方式,輸入文件有一行或多行的系數(shù),系數(shù)之間有空格分隔。
2.每行共有九個系數(shù),每個系數(shù)的絕對值為小于1000的整數(shù)。輸出文件包含構(gòu)造完地多項(xiàng)式,每行一個多項(xiàng)式。
輸入范例
0 0 0 1 22-333 0 1-1 0 0 0 0 0 0-55 5 0
輸出范例
x^5 + 22x^4 – 333x^3 + x – 1-55x^2 + 5x
二.需求分析
2.1可行性研究
該程序主要從技術(shù)的角度來分析可行性。技術(shù)上的可行性研究主要分析技術(shù)條件能否順利完成開發(fā)工作,硬、軟件能否滿足開發(fā)者的需要等。該系統(tǒng)采用了Windows 7操作系統(tǒng)結(jié)合Visual C++ 6.0等軟件開發(fā)平臺已成熟可行。硬件方面,科技飛速發(fā)展的今天,硬件更新的速度越來越快,容量越來越大,可靠性越來越高,其硬件平臺也比較能滿足此系統(tǒng)的需要。
2.2結(jié)構(gòu)與主要功能模塊
從實(shí)現(xiàn)多項(xiàng)式輸出過程的角度來分析,至少需要這樣一些子功能模塊。如: 1.多項(xiàng)式創(chuàng)建功能;
2.多項(xiàng)式輸出功能;
3.釋放多項(xiàng)式功能;
4.操作界面顯示功能;
三.概要設(shè)計
1.概要設(shè)計目的與要求
通過多項(xiàng)式程序設(shè)計,使我們進(jìn)一步掌握和利用C++語言進(jìn)行結(jié)構(gòu)化程序設(shè)計的能力;進(jìn)一步理解和運(yùn)用結(jié)構(gòu)化程設(shè)計的思想和方法;初步掌握開發(fā)一個小型系統(tǒng)程序設(shè)計的基本方法;學(xué)會調(diào)試一個較長程序的基本方法;以及掌握書寫課程設(shè)計開發(fā)文檔的能力(書寫課程設(shè)計報告)。總之,通過本課程設(shè)計加深對《C++語言》及《數(shù)據(jù)結(jié)構(gòu)》課程所學(xué)知識的理解,進(jìn)一步鞏固C++語言語法規(guī)則,在程序中體現(xiàn)出算法的思想,提高程序的運(yùn)行效率。學(xué)會編制結(jié)構(gòu)清晰、風(fēng)格良好、數(shù)據(jù)結(jié)構(gòu)適當(dāng)?shù)腃++語言程序,從而具備解決綜合性實(shí)際問題的能力。
2.概要設(shè)計內(nèi)容
多項(xiàng)式輸出程序具有以下基本功能:
1.創(chuàng)建多項(xiàng)式。接收輸入的數(shù)據(jù),并保存到鏈表中。
2.Txt文檔輸入輸出功能。
3. 清除內(nèi)存內(nèi)容,釋放創(chuàng)建的鏈表,退出程序。
3.功能算法描述與數(shù)據(jù)結(jié)構(gòu)說明
該多項(xiàng)式程序除了main()函數(shù)外,主要有以下函數(shù):
node *CreatePolyn()
void firstnode(node *p)
void othernode(node *p)
void PrintPolyn(node *Pa)
void deletechain(node *h)
下面對這些函數(shù)逐一介紹。①.main()函數(shù)
main函數(shù)主要調(diào)用其他函數(shù),用來實(shí)現(xiàn)輸入、顯示功能。
在main()函數(shù)中,定義一維數(shù)組p[]用來保存多項(xiàng)式的系數(shù),Pa定義程序所需鏈表的頭指針。在程序開始要求輸入多項(xiàng)式的系數(shù),隨后創(chuàng)建鏈表以保存多項(xiàng)式,再顯示出構(gòu)建的符合要求的多項(xiàng)式。②.node *CreatePolyn()該函數(shù)功能是創(chuàng)建新的多項(xiàng)式鏈表。使用for語句,控制輸入多項(xiàng)式的每一項(xiàng)。
③.void firstnode(node *p)該函數(shù)功能是判斷輸出多項(xiàng)式第一項(xiàng)。對于第一項(xiàng)的系數(shù)為1或-1,指數(shù)為0或-1等五種情況進(jìn)行討論。④.void othernode(node *p)該函數(shù)功能是判斷輸出多項(xiàng)式除第一項(xiàng)外的其它項(xiàng)。對于第一項(xiàng)的系數(shù)為1或-1,指數(shù)為0或-1等五種情況進(jìn)行討論。⑤.void PrintPolyn(node *Pa)該函數(shù)功能:顯示構(gòu)造的符合要求的多項(xiàng)式鏈表。在該函數(shù)中調(diào)用③、④函數(shù),進(jìn)行多項(xiàng)式的輸出。⑥.void deletechain(node *h)該函數(shù)的功能是釋放掉創(chuàng)建的鏈表,釋放內(nèi)存。
四.詳細(xì)設(shè)計
下面討論重要函數(shù)具體實(shí)現(xiàn)過程:
1.node *CreatePolyn()定義int i=9計數(shù),當(dāng)i>0時,for語句反復(fù)提示用戶輸入該多項(xiàng)式的每一項(xiàng)的指數(shù)。當(dāng)i=1時,輸入完畢,該鏈表也創(chuàng)建完畢。詳細(xì)的實(shí)現(xiàn)過程如下:
node *CreatePolyn(){ node *head,*pa,*s;int i;
pa=head=new node;//創(chuàng)建一個新的結(jié)點(diǎn)
head->next=NULL;
for(i = 9;i >0;i--)// 依次輸入9項(xiàng)
{
s=new node;
s->next=NULL;
s->coef = p[9-i];
s->exp=i-1;//x指數(shù)從8遞減到0
if(s->coef!=0)//系數(shù)不為零時,結(jié)點(diǎn)p鏈接s
{
pa->next=s;
pa=s;
} } return head;} 2.void firstnode(node *p)對多項(xiàng)式第一項(xiàng)輸出可能性進(jìn)行多種分類討論。
void firstnode(node *p)//輸出多項(xiàng)式第一個結(jié)點(diǎn) { //指數(shù)不為1且不為0,系數(shù)絕對值不為1(正常的輸出)if(p->exp!=1&&p->exp&&fabs(p->coef)!=1)
{
if(p->coef>0)
{
outfile<
coef<<“X^”<
exp;
}
else
{
outfile<
coef<<“X^”<
exp;
} } if(p->exp==0)//指數(shù)為0,即常數(shù)項(xiàng)
{
if(p->coef>0)
{
outfile<
coef;
}
else
{
outfile<
coef;
} }
//指數(shù)大于0且不為1,系數(shù)絕對值為1 if(p->exp>0&&fabs(p->coef)==1&&p->exp!=1){
if(p->coef>0)
{
outfile<<“X^”<
exp;
}
else
{
outfile<<“-X^”<
exp;
} } if(p->exp==1&&fabs(p->coef)!=1)//指數(shù)為1且系數(shù)絕對值不為1 {
if(p->coef>0&&p->coef!=1)
{
outfile<
coef<<“X”;
}
if(p->coef<0&&p->coef!=-1)
{
outfile<
coef<<“X”;
} } if(p->exp==1&&fabs(p->coef)==1)//指數(shù)為1且系數(shù)絕對值為1 {
if(p->coef==1)
outfile<<“X”;
else
outfile<<“-X”;} }
3.void PrintPolyn(node *Pa)該函數(shù)有一個參數(shù),該指針指向多項(xiàng)式鏈表的頭指針,以下是實(shí)現(xiàn)插入的關(guān)鍵代碼: void PrintPolyn(node *Pa){ node *p;if(Pa->next==NULL)//首項(xiàng)判斷,如果首項(xiàng)無,則顯示“0”
outfile<<“0”;
return;else {
firstnode(Pa->next);} p=Pa->next->next;//定義指針p指向Pa的下下個指針
while(p!=NULL){
othernode(p);
p=p->next;
//將p指向下個一個結(jié)點(diǎn)
}
outfile< 五.系統(tǒng)測試 該程序在VC6.0中調(diào)試通過,沒有錯誤和警告,運(yùn)行結(jié)果經(jīng)過檢驗(yàn)為正確。以下圖為該程序運(yùn)行結(jié)果效果圖: 圖5-1 范例 圖5-2 一行輸出 圖5-3 多行輸出 六.使用說明 1.打開1.txt文件,在里面任意輸入9個整數(shù),每個數(shù)字間要有空格,可以輸入一行或者多行,輸入多行的時候需要換行。 2.編譯運(yùn)行后,打開2.txt文件,即可看到輸出的符合要求的多項(xiàng)式。 七.總結(jié)及心得體會 通過這次課程設(shè)計練習(xí),使我更深刻地理解了C++語言的精髓-----指針的使用。完成整個程序設(shè)計有很大的收獲,對指針掌握的更加熟練。 同時通過直接對單鏈表的操作,加深了對數(shù)據(jù)結(jié)構(gòu)的理解和認(rèn)識。并在完成課程設(shè)計的過程作主動查閱了相關(guān)資料,學(xué)到了不少課本上沒有的技術(shù)知識。 經(jīng)過這次課程設(shè)計,我深刻認(rèn)識到算法在程序設(shè)計中的重要性,如何讓程序簡單、易讀是這個課程設(shè)計的難點(diǎn)。程序總是由若干個函數(shù)構(gòu)成的,這些相應(yīng)的函數(shù)體現(xiàn)了算法的基本思想。 編程是一件枯燥乏味工作,但是只要認(rèn)真專研,我們會從中學(xué)到很多在課本上學(xué)不到或者無法在課堂上掌握的知識,同時也能從中感受到編程的樂趣。興趣是可以培養(yǎng)的,只要堅持下去,面對困難我們總能夠找到解決問題的方法。 計算多項(xiàng)式的輸出-----該程序雖然不是很大,但是自己獨(dú)立完成這一任務(wù)也遇到不少的困難。另外也需要提出的是,非常感謝老師對我們的耐心指導(dǎo),尤其是上機(jī)的時候給了我很多鍛煉的機(jī)會。所以這次課程設(shè)計我才能夠順利的完成。 一、課程題目:一元稀疏多項(xiàng)式計算器 二、需求分析 1、一元稀疏多項(xiàng)式簡單計算器的功能是: 1.1 輸入并建立多項(xiàng)式; 1.2 輸出多項(xiàng)式,輸出形式為整數(shù)序列:n,c1,e1,c2,e2,???cn,en,其中n是多項(xiàng)式的項(xiàng)數(shù),ci和ei分別是第i項(xiàng)的系數(shù)和指數(shù),序列按指數(shù)降序排列; 1.3多項(xiàng)式a和b相加,建立多項(xiàng)式a+b; 1.4 多項(xiàng)式a和b相減,建立多項(xiàng)式a-b。 2、設(shè)計思路: 2、設(shè)計思路: 2.1 定義線性表的動態(tài)分配順序存儲結(jié)構(gòu); 2.2 建立多項(xiàng)式存儲結(jié)構(gòu),定義指針*next 2.3利用鏈表實(shí)現(xiàn)隊列的構(gòu)造。每次輸入一項(xiàng)的系數(shù)和指數(shù),可以輸出構(gòu)造的一元多項(xiàng)式 2.4演示程序以用戶和計算機(jī)的對話方式執(zhí)行,即在計算機(jī)終站上顯示“提示信息”之后,由用戶在鍵盤上輸入演示程序中規(guī)定的運(yùn)行命令; 根據(jù)相應(yīng)的輸入數(shù)據(jù)(濾去輸入中的非法字符)和運(yùn)算結(jié)果顯示在其后。 3、程序執(zhí)行的命令包括: 1)輸入多項(xiàng)式a;2)輸入多項(xiàng)式b;3)求a+b;4)求a-b;5)求a*b;6)求a的導(dǎo)數(shù);7)求b的導(dǎo)數(shù);8)退出程序。 4、測試數(shù)據(jù): 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15)=(-7.8x^15-1.2x^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3.7、互換上述測試數(shù)據(jù)中的前后兩個多項(xiàng)式 三、概要設(shè)計 為了實(shí)現(xiàn)上述功能需用帶表頭結(jié)點(diǎn)的單鏈表存儲多項(xiàng)式。為此需要兩個抽象的數(shù)據(jù)類型:線性表和多項(xiàng)式。 1.有序表的抽象數(shù)據(jù)類型定義為: ADT List{ 數(shù)據(jù)對象:D={ai|ai∈Elemset,i=1,2,?,n,n≥0} 數(shù)據(jù)關(guān)系:R1={ 2、多數(shù)據(jù)類型定義為: ADT Polynomial { 數(shù)據(jù)對象:D={ai,bi|ai為不為0的實(shí)數(shù),bi為整數(shù),i=2,?,n} 數(shù)據(jù)關(guān)系:R1={ai,bi} 基本操作: PrintPolyn(Polyn p)操作結(jié)果:輸出多項(xiàng)式p。DestroyPolyn(Polyn p)操作結(jié)果:銷毀多項(xiàng)式p。 Polyn CreatePolyn(Polyn head,int m)操作結(jié)果:創(chuàng)建一個m項(xiàng)的多項(xiàng)式。Polyn AddPolyn(Polyn pa,Polyn pb)初始條件:多項(xiàng)式鏈表pa,pb存在。 操作結(jié)果:創(chuàng)建一新多項(xiàng)式鏈表p,其結(jié)點(diǎn)為pa,pb相加。Polyn SubtractPolyn(Polyn pa,Polyn pb)初始條件:多項(xiàng)式鏈表pa,pb存在。 操作結(jié)果:創(chuàng)建一新多項(xiàng)式鏈表p,其結(jié)點(diǎn)為怕pa,pb相減。ValuePolyn(Polyn head,int x)操作結(jié)果:輸入x值,計算并返回多項(xiàng)式的值 }ADT Polynomial 四、詳細(xì)設(shè)計 1、元素類型、結(jié)點(diǎn)類型和指針類型 typedef int Status;typedef struct{ int coef;int expn;}Term;typedef Term ElemType;typedef struct LNode{ ElemType data;//數(shù)據(jù)域 struct LNode *next;//指針域 }LNode,* LinkList; 2、主函數(shù)和其他函數(shù) void main(){ int m,n,a,x;int flag;Polynomial pa,pb,pc;printf(“ 歡迎使用多項(xiàng)式操作程序n”); //輸出菜單 printf(“n 1: 創(chuàng)建多項(xiàng)式a n”);printf(“n 2: 創(chuàng)建多項(xiàng)式b n”);printf(“n 3: 輸出多項(xiàng)式a n”);printf(“n 4: 輸出多項(xiàng)式b n”);printf(“n 5: 輸出a+b n”);printf(“n 6: 輸出a-b n”);printf(“n 7: 輸出a的導(dǎo)數(shù) n”);printf(“n 8: 輸出b的導(dǎo)數(shù) n”);printf(“n 9: 代入x的值計算a n”);printf(“n 10: 代入x的值計算b n”);printf(“n 11: 輸出a*b n”);printf(“n 12:退出程序 n”);while(a){ printf(“n請選擇操作:”);scanf(“ %d”,&flag); switch(flag) { case 1 : { printf(“請輸入a的項(xiàng)數(shù):”);scanf(“%d”,&m);CreatePolyn(pa,m); break; } case 2 : { printf(“請輸入b的項(xiàng)數(shù):”);scanf(“%d”,&n);CreatePolyn(pb,n); break; } case 3 : { printf(“n 多項(xiàng)式a=”); PrintPolyn(pa); break; } case 4 : { printf(“n 多項(xiàng)式b=”); PrintPolyn(pb); break; } case 5 : { AddPolyn(pa,pb,pc);printf(“n a+b=”); PrintPolyn(pc); break; } case 6 : { SubtractPolyn(pa,pb,pc);printf(“n a-b=”); PrintPolyn(pc); break; } case 7 : { Polynomial_derivatePolyn(pa,pc); printf(“n 多項(xiàng)式a的導(dǎo)函數(shù)為:a'=”); PrintPolyn(pc); break; } case 8 : { Polynomial_derivatePolyn(pb,pc); printf(“n 多項(xiàng)式b的導(dǎo)函數(shù)為:b'=”); PrintPolyn(pc); break; } case 9 : { printf(“輸入x的值:x=”); scanf(“%d”,&x); printf(“n x=%da=%.3fn”,x,ValuePolyn(pa,x)); break; } case 10 : { printf(“輸入x的值:x=”); scanf(“%d”,&x); printf(“n x=%d,時 時b=%.3fn”,x,ValuePolyn(pb,x)); break; } case 11 : { MultiplyPolyn(pa,pb,pc);printf(“n a*b=”); PrintPolyn(pc); break; } case'12': { printf(“n 感謝使用此程序!n”); DestroyPolyn(pa); DestroyPolyn(pb); a=0; break; } default: printf(“n 您的選擇錯誤,請重新選擇!n”); } } } 3、建立一個頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式, 建立新結(jié)點(diǎn)以接收數(shù)據(jù), 調(diào)用Insert函數(shù)插入結(jié)點(diǎn) Status CreatePolyn(Polynomial &head,int m){ //建立一個頭指針為head、項(xiàng)數(shù)為m的一元多項(xiàng)式 int i;LNode *p;p=head=(Polynomial)malloc(sizeof(struct LNode));head->next=NULL;for(i=0;i printf(“請輸入第%d項(xiàng)的系數(shù)與指數(shù):”,i+1);scanf(“%d %d”,&p->data.coef,&p->data.expn);Insert(p,head);//調(diào)用Insert函數(shù)插入結(jié)點(diǎn) } return OK;}//CreatePolyn 4、求解并建立多項(xiàng)式a+b Status AddPolyn(Polynomial pa,Polynomial pb,Polynomial &pc){ //求解并建立多項(xiàng)式a+b,返回其頭指針 LNode *qa=pa->next;LNode *qb=pb->next;LNode *headc,*hc,*qc;hc=(Polynomial)malloc(sizeof(struct LNode));//建立頭結(jié)點(diǎn) hc->next=NULL;headc=hc;while(qa||qb){ qc=(Polynomial)malloc(sizeof(struct LNode));switch(compare(qa,qb)){ case 1: { qc->data.coef=qa->data.coef;qc->data.expn=qa->data.expn;qa=qa->next;break; } case 0: { qc->data.coef=qa->data.coef+qb->data.coef;qc->data.expn=qa->data.expn;qa=qa->next;qb=qb->next;break; } case-1: { qc->data.coef=qb->data.coef;qc->data.expn=qb->data.expn;qb=qb->next;break; } } if(qc->data.coef!=0) { qc->next=hc->next;hc->next=qc;hc=qc; } else free(qc);//當(dāng)相加系數(shù)為0時,釋放該結(jié)點(diǎn) } pc=headc;return OK;} 5、求解并建立多項(xiàng)式a-b Status SubtractPolyn(Polynomial pa,Polynomial pb,Polynomial &pc){ //求解并建立多項(xiàng)式a-b,返回其頭指針 LNode *h=pb;LNode *p=pb->next;LNode *pd,*pf;while(p){ //將pb的系數(shù)取反 p->data.coef*=-1;p=p->next;} AddPolyn(pa,h,pf);pd=pf;for(p=h->next;p;p=p->next)//恢復(fù)pb的系數(shù) p->data.coef*=-1;pc=pd;return OK;} float ValuePolyn(Polynomial head,int x){ //輸入x值,計算并返回多項(xiàng)式的值 LNode *p;int i,t;float sum=0;for(p=head->next;p;p=p->next){ t=1;for(i=p->data.expn;i!=0;) { if(i<0){t/=x;i++;} //指數(shù)小于0,進(jìn)行除法 else{t*=x;i--;} //指數(shù)大于0,進(jìn)行乘法 } sum+=p->data.coef*t;} return sum;} 6、求解并建立導(dǎo)函數(shù)多項(xiàng)式 Status Polynomial_derivatePolyn(Polynomial P,Polynomial &pc)//求導(dǎo) { LNode *p,*pf,*ph;//用于遍歷結(jié)點(diǎn) p=P->next; ph=(Polynomial)malloc(sizeof(struct LNode)); ph->next=NULL; //pre=P; while(p!=NULL) { pf=(Polynomial)malloc(sizeof(struct LNode)); if(p->data.expn==0) { p=p->next; //free(p); //p=pre->next; } else { pf->data.coef=p->data.coef*p->data.expn; pf->data.expn=p->data.expn-1; Insert(pf,ph); p=p->next; } } pc=ph;return OK;} 7、求解并建立多項(xiàng)式a*b Status MultiplyPolyn(Polynomial pa,Polynomial pb,Polynomial &pc){ //求解并建立多項(xiàng)式a*b,返回其頭指針 LNode *hf,*pf;LNode *qa=pa->next;LNode *qb=pb->next;hf=(Polynomial)malloc(sizeof(struct LNode));//建立頭結(jié)點(diǎn) hf->next=NULL;for(;qa;qa=qa->next){ for(qb=pb->next;qb;qb=qb->next) { pf=(Polynomial)malloc(sizeof(struct LNode));pf->data.coef=qa->data.coef*qb->data.coef;pf->data.expn=qa->data.expn+qb->data.expn;Insert(pf,hf);//調(diào)用Insert函數(shù)以合并指數(shù)相同的項(xiàng) } } pc=hf;return OK;} 8、函數(shù)的調(diào)用關(guān)系圖 主函數(shù)Pa pb pc數(shù)meadreturn headc*h項(xiàng)回*h 建立鏈表Polyn CreatePolyn(Polyn head,int m)多項(xiàng)式相加Polyn AddPolyn(Polyn pa,Polyn pb)返回*hc返輸出多項(xiàng)式While{Printf(“”); 四、調(diào)試分析 5.1 運(yùn)行該程序的操作平臺: 5.1.1 硬件要求: 此程序需在一臺PC機(jī)上運(yùn)行,要用INTER或AMD的CPU,其他沒多大要求。5.1.2 軟件要求: 本程序能在Visual C++ 6.0下運(yùn)行。5.2 錯誤分析: 1、函數(shù)名拼寫錯誤 2、括號匹配錯誤 3、變量類型名定義錯誤 4、分號沒有在英文環(huán)境下輸出,導(dǎo)致運(yùn)行出錯 5、參數(shù)表出現(xiàn)語法錯誤,函數(shù)調(diào)用的一組參數(shù)之間沒有以逗號隔開,并以一個右括號結(jié)束 六、用戶手冊 1、本程序的執(zhí)行文件為:Cpp1.exe。 2、進(jìn)入演示程序后即顯示文本方式的用戶界面。 3、根據(jù)提示數(shù)字執(zhí)行操作。如輸入數(shù)字“1” 4、執(zhí)行相應(yīng)命令后顯示操作結(jié)果。 七、測試結(jié)果 1、最初的界面 2、選擇操作“1”、“2”“3”、“4”,輸入數(shù)字得到的結(jié)果,即創(chuàng)建多項(xiàng)式a和b 3、a+b 4、a-b 5、a*b 6、求導(dǎo) 7、帶入x值求a,b 八、心得體會 通過這次課程設(shè)計,我覺得我們對于《數(shù)據(jù)結(jié)構(gòu)》的學(xué)習(xí)不僅包括理論部分的學(xué)習(xí),還要勤動手,多實(shí)踐。真正將這個程序做出來很不容易,但只要只要用心去做,總會有收獲,特別是當(dāng)我遇到問題時,通過向同學(xué)請教,最后終于找到方法時,并理解代碼的含義時,心中是無比喜悅的。編寫程序中遇到問題再所難免,應(yīng)耐心探究其中的原因,從出現(xiàn)問題的地方起,并聯(lián)系前后程序,仔細(xì)推敲,逐個排查.直到最終搞清為止。第五篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計