版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、課程名稱: 數(shù)據(jù)結構課程設計課程設計題目: 任意長整數(shù)加法運算姓 名: XXX專 業(yè): 計算機科技2班 年 級: 13級 學 號: E11314XXX指導老師:XXX2015年9月17目錄1.課程設計的目的12.需求分析13任意長整數(shù)加法的設計23.1概要設計23.2詳細設計33.3調試分析93.4用戶手冊103.5測試結果104總結115、程序清單:(見附錄)117、程序運行結果11附錄1131.課程設計的目的(1) 熟練使用 C 語言編寫程序,解決實際問題;(2) 了解并掌握數(shù)據(jù)結構與算法的設計方法,具備初步的獨立分析和設計能力;(3) 初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設計、程序編碼、
2、測試等基本方法和技能;(4) 提高綜合運用所學的理論知識和方法獨立分析和解決問題的能力;2.需求分析(1) 設計一個實現(xiàn)任意長的整數(shù)加法運算演示程序。(2) 利用雙向鏈表實現(xiàn)長整數(shù)的存儲,每個結點含一個整型變量。(3) 輸入輸出形式按中國對長整數(shù)的表示習慣,每四位一組,用逗號隔開。3任意長整數(shù)加法的設計3.1概要設計(1) 主界面設計圖 1圖2主界面,如圖1所示,包含四個菜單項,輸入數(shù)字選擇對應菜單,進入子項。其中選項2包含子菜單,如圖2所示。(2) 存儲結構本系統(tǒng)用結構體linlist存儲數(shù)據(jù),該結構體由數(shù)據(jù)data、下一節(jié)點指針next、上一節(jié)點指針prior組成。data是short型變
3、量,存放每個結點的數(shù)據(jù)。本系統(tǒng)中data一般不超過10000。用結構體linlist構建鏈表,頭結點的data域符號代表長整數(shù)的符號,絕對值表示鏈表結點數(shù)目。(3) 系統(tǒng)功能設計本系統(tǒng)主菜單包含四個選項,功能描述如下:菜單1:輸入兩個任意長的整數(shù)??砂凑諛藴仕奈灰唤M中間用逗號隔開輸入,也可直接輸入,輸入的數(shù)字保存在文件中,結束后自動返回主菜單。菜單2:實現(xiàn)兩個任意長整數(shù)的加法??芍苯虞斎雰蓚€數(shù)也可讀入一個文件,獲取兩個加數(shù),相加結果可保存在文件中,也可不保存,結束后返回菜單2。菜單3:輸入文件名稱,查詢文件中的數(shù)字。文件中可能保存的是兩個加數(shù),也可能保存的是某次兩個任意長整數(shù)相加的結果。菜單4
4、:退出系統(tǒng)。3.2詳細設計(1) 系統(tǒng)子程序及功能設計本系統(tǒng)設置16個子程序,各程序的函數(shù)名及功能說明如下:void append(LinList &L,Elemtype d);/以L為頭結點,將d加入到鏈表Lvoid Delete(LinList &L);/刪除結點Lvoid display(LinList L);/按照輸出標準,輸出任意長整數(shù)void add(LinList &L1,LinList L2);/將L1與L2相加short StrToPosiNum(char * s);/將s轉化為一個小于32767的正整數(shù)void input(LinList &
5、L);/輸入一個很長的整數(shù)到Lvoid FREE(LinList &L1);/刪除以L1為頭結點的整個鏈表void save(LinList L1,LinList L2);/把L1,L2寫到文件void load(LinList &L1,LinList &L2);/讀文件到L1,L2void inputdata();/調用input函數(shù),實現(xiàn)兩個任意長整數(shù)的輸入void welcome();/輸出歡迎界面void fileadd();/讀入文件,調用add函數(shù),實現(xiàn)兩個任意長整數(shù)的相加void directadd();/直接輸入數(shù)字相加void calculaytead
6、d();/實現(xiàn)兩個任意長整數(shù)的相加int maincourse();/菜單選擇void search();/查詢文件中的數(shù)字(2) 數(shù)據(jù)類型定義typedef struct linlistElemtype data;linlist * next;linlist * prior; * LinList;(3) 系統(tǒng)主要子程序詳細設計本系統(tǒng)的各個函數(shù)之間的關系如下圖:圖31) 菜單1代碼void inputdata()/調用input函數(shù),實現(xiàn)兩個任意長整數(shù)的輸入system("cls");LinList L1=NULL,L2=NULL;printf("ttt -ntt
7、tt 輸入數(shù)據(jù)nttt -n");printf("輸入第一個長整數(shù):");input(L1);/調用input函數(shù)printf("輸入第二個長整數(shù):");input(L2);printf("n數(shù)據(jù)將存放于文件中.");save(L1,L2);/調用save函數(shù),存儲L1L2FREE(L1);FREE(L2);/釋放L1,L2printf("寫入完成!n");system("pause");void input(LinList &L)/輸入一個很長的整數(shù)到Lchar s1000,
8、s25='0','0','0','0','0'unsigned i=0,j;int sign=1,num=0,flag=1;Elemtype data;while(flag)flag=0;s0=getchar();if(s0='-')/若為負數(shù)sign=-1;i=i-1;while(i=-1|si!='n')/第一個輸入負號或者輸入數(shù)字i=i+1;si=getchar();if(si=',')i=i-1;else if(si>'9'|si<
9、'0')&&si!='n')printf("非法輸入,請重新輸入!n");flag=1;continue;si=0;append(L,(int)(sign*ceil(strlen(s)/4.0);/第一個結點存放鏈表長度和數(shù)據(jù)的正負號j=strlen(s)%4;i=0;if(j!=0)for(;i<j;i+)s2i=si;s2i=0;data=StrToPosiNum(s2);append(L,data);/以L為頭結點,添加結點for(;i<strlen(s);i=i+4)/每4位數(shù)放入一個結點for(j=0;j
10、<4;j+)s2j=si+j;s2j=0;data=StrToPosiNum(s2);append(L,data);/以L為頭結點,添加結點2) 菜單2代碼void calculayteadd()/菜單2求和while(1)system("cls");printf("ntt -ntttt 加 法 運 算n");printf("tt -n");printf("tttt1. 直接輸入求和ntttt2. 讀入文件求和ntttt3. 返回主菜單n");printf("tt -nn");char s
11、100;int flag=0;doif(flag)printf("t 輸入非法,請重新輸入:");elseprintf("t 輸入數(shù)字1-3選擇:");flag=1;scanf("%s",s);while(strlen(s)>1|s0-'0'<=0|s0-'0'>3);getchar();switch(s0-'0')case 1:directadd();/直接輸入數(shù)字求和break;case 2:fileadd();/輸入文件名稱求和break;case 3:retur
12、n;break;void add(LinList &L1,LinList L2)/將L1與L2相加,結果放到L1LinList p,q,r;int cy=0;int sign1=1,sign2=1;if(!L1|L1->data=0)/若L1為空,相加結果為L2L1=L2;else if(!L2|L2->data=0)/若L2為空,相加結果為L1return;else/否則if(abs(L1->data)<abs(L2->data)|L1->next->data<L2->next->data)q=L1;/L1總是存放絕對值較大
13、的數(shù)字L1=L2;L2=q;p=L1->prior;q=L2->prior;if(L1->data<0)sign1=-1;if(L2->data<0)sign2=-1;if(sign1*sign2>0)/相加的為同號數(shù)字while(p!=L1&&q!=L2)p->data=q->data+p->data+cy;if(p->data>9999)cy=1;p->data=abs(p->data)-10000;elsecy=0;p=p->prior;q=q->prior;while(p!=
14、L1&&cy)p->data=p->data+cy;if(p->data>9999)cy=1;p->data=p->data-10000;elsecy=0;p=p->prior;p=p->next;if(cy)r=(LinList)malloc(sizeof(linlist);p->prior->next=r;r->prior=p->prior;r->next=p;p->prior=r;r->data=cy;L1->data=L1->data*sign1+1;L1->da
15、ta=L1->data*sign1;else/相加的為異號的數(shù)字cy=0;while(p!=L1&&q!=L2)p->data=p->data-cy;if(p->data<q->data)p->data=p->data+10000;cy=1;p->data=p->data-q->data;p=p->prior;q=q->prior;while(p!=L1&&cy)if(p->data<cy)cy=1;p->data=p->data+10000;p->dat
16、a=p->data-cy;p=p->prior;while(L1->next->data=0&&L1->next->next!=L1)/結果為0的結點去掉p=L1->next;p->next->prior=L1;L1->next=p->next;L1->data=L1->data*sign1-1;L1->data=L1->data*sign1;Delete(p);3) 菜單3代碼void search()/查詢文件中的數(shù)字FILE * fp;LinList L1=NULL,L2=NULL;
17、LinList p=L1;int i,length;char s100;system("cls");printf("ttt -ntttt 文件查詢nttt -");Elemtype t;printf("n文件的名稱為:");/讀取文件scanf("%s",s);fp=fopen(s,"rb");fseek(fp,0,SEEK_SET);fread(&t,sizeof(Elemtype),1,fp);length=abs(t);/第一個數(shù)字的位數(shù)append(L1,t);for(i=0;i
18、<length;i+)fread(&t,sizeof(Elemtype),1,fp);append(L1,t);fread(&t,sizeof(Elemtype),1,fp);if(!feof(fp)/讀入第二個數(shù)字length=abs(t);append(L2,t);for(i=0;i<length;i+)fread(&t,sizeof(Elemtype),1,fp);append(L2,t);printf("文件中有兩個數(shù)字,分別為:n");display(L1);putchar('n');display(L2);pu
19、tchar('n');elseprintf("文件中有一個數(shù)字:n");display(L1);putchar('n');system("pause");3.3調試分析1. 輸入數(shù)據(jù)在主菜單下輸入1并回車,進入子項1,可輸入兩個任意長的整數(shù),保存于文件中,運行結果如圖4所示。圖42. 加法運算在主菜單下輸入2并回車,可進入子菜單。選擇子菜單1直接輸入數(shù)字或者選擇子菜單2,讀取文件,計算文件中兩個任意長整數(shù)的和,并可選擇是否將結果保存在文件中,結果如圖5所示。圖53. 文件查詢在主菜單下輸入3并回車,可進入子菜單,讀取文件,
20、查詢文件中的數(shù)字,結果如圖6。圖64. 退出系統(tǒng)在主菜單下輸入4并回車,退出系統(tǒng),結果如圖7。圖73.4用戶手冊1. 本程序執(zhí)行文件為“任意長整數(shù)加法.exe”。2. 用戶進入系統(tǒng)后根據(jù)提示,輸入數(shù)字進入相應的子菜單,實現(xiàn)相應功能。3. 本系統(tǒng)可實現(xiàn)任意長整數(shù)加法的運算。3.5測試結果圖 8圖9圖10圖11圖12圖13該部分給出了本系統(tǒng)的加法測試結果,如圖8到13所示。本系統(tǒng)主要函數(shù)的時間復雜度:add函數(shù)是將L1與L2相加,相加是從鏈表尾部加到鏈表頭部,時間復雜度與鏈表長度相關。鏈表長度與數(shù)據(jù)位數(shù)有關。鏈表長度。是數(shù)據(jù)的位數(shù)。所以時間復雜度為。Input函數(shù)將數(shù)字作為字符逐個輸入,時間復雜度
21、與數(shù)字位數(shù)相關,所以時間復雜度為。save和load函數(shù)是將結點中data逐個保存到文件或從文件讀出,時間復雜度與鏈表長度有關,加上頭結點,鏈表長度為,對應的時間復雜度為。4總結實驗中,我在算法設計不太清晰時就敲代碼,到后來發(fā)現(xiàn)有點混亂不得不重新改,浪費了很多時間,讓我總結到了在完成代碼部分之前要設計好算法才能更高效。這次實驗相對于上次實驗有所提高,代碼的冗余相對上次代碼有明顯的減少,很多功能都封裝在了函數(shù)里,比上次的代碼易讀點,但程序整體的設計還是有待提高,回過頭再看看發(fā)現(xiàn)整體不是很規(guī)整。下次繼續(xù)改進。5、程序清單:(見附錄)7、程序運行結果1 主界面2 輸入數(shù)據(jù),生成文件3 加法運算界面4
22、 直接輸入數(shù)據(jù)求和5 讀入文件求和6 查詢文件內容7 退出系統(tǒng)附錄1(系統(tǒng)主要子程序詳細設計給出的代碼不再詳細給出)程序清單#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#define Elemtype shorttypedef struct linlistElemtype data;linlist * next;linlist * prior; * LinList;void append(LinList &L,Elemtype d)/以L
23、為頭結點,添加結點LinList p,q;if(!L)L=(LinList)malloc(sizeof(linlist);L->data=d;L->next=L;L->prior=L;elsep=L;while(p->next!=L)p=p->next;q=(LinList)malloc(sizeof(linlist);q->data=d;q->next=p->next;q->prior=p;p->next=q;q->next->prior=q;void Delete(LinList &L)/刪除結點Lif(!L)
24、return;else if(L->next=L)L=NULL;elseL->next->prior=L->prior;L->prior->next=L->next;free(L);void display(LinList L)/按照輸出標準,輸出任意長整數(shù)if(!L)putchar('n');else if(L->next=L)printf("n");elseLinList q=L->next;if(L->data<0&&q->data!=0)printf("
25、-");printf("%d",q->data);q=q->next;while(q!=L)putchar(',');if(q->data<10)printf("000");else if(q->data<100)printf("00");else if(q->data<1000)printf("0");printf("%d",q->data);q=q->next;void add(LinList &L
26、1,LinList L2);/將L1與L2相加,結果放到L1short StrToPosiNum(char * s)/將s轉化為一個小于32767的正整數(shù)int length=1,i=0,flag;double num1;while(i!=length)flag=1;num1=0;length=strlen(s);for(i=0;i<length;i+)if(si-'0'>-1&&si-'0'<10)num1=num1*10+si-'0'else if(si='-')flag=-1;elsepri
27、ntf("%cn字符串到整型數(shù)字出錯!",si);exit(0);if(num1>32767)printf("輸入數(shù)字太大!,請重新輸入:");exit(0);return flag*(short)num1;void input(LinList &L);/輸入一個很長的整數(shù)到Lvoid FREE(LinList &L1)/刪除以L1為頭結點的整個鏈表LinList p;if(!L1)return;elseL1->prior->next=NULL;while(L1)p=L1;L1=L1->next;free(p);v
28、oid save(LinList L1,LinList L2)/把L1,L2寫到文件FILE * fp;LinList p=L1;int i,length;char s100;printf("n文件的名稱為:");/將生成的數(shù)保存于文件scanf("%s",s);if(L1)length=abs(L1->data);fp=fopen(s,"wb+");for(i=0;i<length+1;i+)fwrite(&p->data,sizeof(Elemtype),1,fp);p=p->next;if(L2)
29、p=L2;for(i=0;i<length+1;i+)fwrite(&p->data,sizeof(Elemtype),1,fp);p=p->next;fclose(fp);void load(LinList &L1,LinList &L2)/讀文件到L1,L2FILE * fp;LinList p=L1;int i,length;char s100;Elemtype t;printf("n文件的名稱為:");/將生成的數(shù)保存于文件scanf("%s",s);fp=fopen(s,"rb");
30、fseek(fp,0,SEEK_SET);fread(&t,sizeof(Elemtype),1,fp);length=abs(t);append(L1,t);for(i=0;i<length;i+)fread(&t,sizeof(Elemtype),1,fp);append(L1,t);fread(&t,sizeof(Elemtype),1,fp);length=abs(t);append(L2,t);for(i=0;i<length;i+)fread(&t,sizeof(Elemtype),1,fp);append(L2,t);void inpu
31、tdata();/調用input函數(shù),實現(xiàn)兩個任意長整數(shù)的輸入void welcome()/輸出歡迎界面printf("nt n");printf("t . .n");printf("t . 任意長的整數(shù)加法運算器 .n");printf("t . .n");printf("t n");void fileadd()/讀入文件,調用add函數(shù),實現(xiàn)兩個任意長整數(shù)的相加LinList L1=NULL,L2=NULL;int flag;char s100;system("cls")
32、;printf("ttt -ntttt 讀入文件求和nttt -n");printf("讀入文件.");load(L1,L2);/讀入到L1L2printf("(");display(L1);printf(")+");printf("(");display(L2);printf(")=");add(L1,L2);/調用add,計算L1+L2display(L1);putchar('n');flag=0;do/保存計算結果if(flag)printf("
33、;輸入非法,請重新輸入:");elseprintf("是否保存結果(輸入Y/N)?");flag=1;scanf("%s",s);while(strlen(s)>1|s0-'y'!=0&&s0-'Y'!=0&&s0-'N'!=0&&s0-'n'!=0);if(s0='y'|s0='Y')save(L1,NULL);printf("保存完成!n");system("pause");void directadd() /直接輸入數(shù)字相加LinList L1=NULL,L2=NULL;int flag;system("cls");printf("ttt -ntttt 直接輸入求和nttt -n");puts("輸入第一個整數(shù):");input(L1);puts("輸入第二個整數(shù):&
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會計專業(yè)大一學期計劃范文
- 鄉(xiāng)鎮(zhèn)文化站建成文藝晚會主持詞
- 七夕節(jié)促銷活動方案
- 范文新學期學習計劃范文集錦十篇
- 個人工作總結(集錦14篇)
- 高等數(shù)學教程 上冊 第4版 測試題 高數(shù)1-測試二
- 荒山租地合同協(xié)議書(2篇)
- 分段計費說課稿
- 南京工業(yè)大學浦江學院《汽車電氣設備》2023-2024學年第一學期期末試卷
- 南京工業(yè)大學浦江學院《計算機設計》2022-2023學年期末試卷
- 區(qū)域醫(yī)療中心建設方案
- 浙江省地方執(zhí)法證考試參考題庫大全-4(案例分析題部分)
- 流程圖、結構圖(優(yōu)秀) 兒童教育課件 精選
- 小學一年級期中考試家長會課件
- 政府安置房交房交付儀式活動方案
- 2022年全國高中數(shù)學聯(lián)賽福建賽區(qū)預賽試卷參考答案
- 物業(yè)管理風險管控
- 電泳-厚-度-檢-測-記錄
- 服務采購詢比價表
- 衛(wèi)生院會議制度
- 小學 四年級 體育水平二 基本運動技能平衡篇 課件
評論
0/150
提交評論