重慶大學(xué)本科學(xué)生課程設(shè)計(jì)任務(wù)書——長整數(shù)運(yùn)算
《重慶大學(xué)本科學(xué)生課程設(shè)計(jì)任務(wù)書——長整數(shù)運(yùn)算》由會員分享,可在線閱讀,更多相關(guān)《重慶大學(xué)本科學(xué)生課程設(shè)計(jì)任務(wù)書——長整數(shù)運(yùn)算(17頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 方案設(shè)計(jì)重慶大學(xué)本科學(xué)生課程設(shè)計(jì)任務(wù)書課程設(shè)計(jì)題目 長整數(shù)運(yùn)算學(xué)院 軟件學(xué)院 專業(yè) 軟件工程 年級 16 級已知參數(shù)和設(shè)計(jì)要求:[問題描述]設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)兩個(gè)任意長的整數(shù)求和運(yùn)算。學(xué)生應(yīng)完成的工作:[基本要求]利用雙項(xiàng)循環(huán)鏈表實(shí)現(xiàn)長整數(shù)的存儲,每個(gè)結(jié)點(diǎn)含一個(gè)整型變量。任何整型變量的范圍是- (2 15-1)~(2 15-1) 。輸入和輸出形式:按中國對于長整數(shù)的表示習(xí)慣,每四位一組,組間用逗號隔開。[測試數(shù)據(jù)](1) 0;0;應(yīng)輸出“0” 。(2) -2345,6789;-7654,3211;應(yīng)輸出“-1,0000,0000” 。(3) -9999,9999;1,0000,0000,0000 ;應(yīng)輸出“9999,0000,0001” 。(4) 1,0001,000;-1,0001,0001 ;應(yīng)輸出“0” 。(5) 1,0001,0001;-1,0001,0000 ;應(yīng)輸出“1” 。目前資料收集情況(含指定參考資料):1. Robert L. Kruse 編. Data Structures and Program Design in C++. 高等教育出版社,2001.2. 嚴(yán)蔚敏編. 數(shù)據(jù)結(jié)構(gòu). 清華大學(xué)出版社,2000.3. 李春葆編. 數(shù)據(jù)結(jié)構(gòu)教程. 清華大學(xué)出版社,2002.4. Clifford A.Shaffer 著. 張銘,劉曉丹等譯. 數(shù)據(jù)結(jié)構(gòu)與算法分析(第三版).電子工業(yè)出版社,2013.10.課程設(shè)計(jì)的工作計(jì)劃:第 1~4 天 完成方案設(shè)計(jì)與程序框圖 第 4~10 天 編寫程序代碼第 10~15 天 程序調(diào)試分析和結(jié)果第 15~20 天 課程設(shè)計(jì)報(bào)告和總結(jié)任務(wù)下達(dá)日期 2017 年 12 月 15 日完成日期 2018 年 1 月 12 日指導(dǎo)教師 文俊浩 (簽名) 學(xué) 生 陳勇 (簽名)說明:1、學(xué)院、專業(yè)、年級均填全稱,如:光電工程學(xué)院、測控技術(shù)、2003。2、本表除簽名外均可采用計(jì)算機(jī)打印。本表不夠,可另附頁,但應(yīng)在頁腳添加頁碼。數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 方案設(shè)計(jì)1.方案設(shè)計(jì)1.1 問題描述利用雙項(xiàng)循環(huán)鏈表實(shí)現(xiàn)長整數(shù)的存儲,每個(gè)結(jié)點(diǎn)含一個(gè)整型變量。任何整型變量的范圍是- ( 215-1) ~(2 15-1) 。輸入和輸出形式:按中國對于長整數(shù)的表示習(xí)慣,每四位一組,組間用逗號隔開。1.2 需求分析核心問題:長整形數(shù)的進(jìn)行拆分再加減數(shù)據(jù)模型(邏輯結(jié)構(gòu)):類似匯編的帶進(jìn)位加法和帶進(jìn)位減法存儲結(jié)構(gòu):循環(huán)鏈表,字符數(shù)組核心算法:字符數(shù)組提取數(shù)字,鏈表的加減輸入數(shù)據(jù):兩個(gè)長整形數(shù)字輸出數(shù)據(jù):加減結(jié)果通過以上分析,該程序具有可行性。1.3 運(yùn)行環(huán)境硬件開發(fā)環(huán)境:PC 機(jī)軟件開發(fā)環(huán)境:VS2015操作系統(tǒng)環(huán)境 Window 1.4 概要設(shè)計(jì)整個(gè)設(shè)計(jì)的流程圖數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 方案設(shè)計(jì)主函數(shù)輸入數(shù)據(jù) 存入鏈表 判斷運(yùn)算輸出運(yùn)算圖 1.1數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 算法設(shè)計(jì)2.算法設(shè)計(jì)2.1 算法設(shè)計(jì)思想用兩個(gè)字符數(shù)組儲存輸入的字符串,再將字符串中的每個(gè) 4 位整數(shù)轉(zhuǎn)入成鏈表的關(guān)鍵節(jié)點(diǎn)分別儲存到兩個(gè)鏈表中,這樣就讓長整數(shù)分割開來,使得儲存成為現(xiàn)實(shí),然后再分別把兩個(gè)鏈表的節(jié)點(diǎn)相加儲存到另一個(gè)鏈表中,用 flag 來判斷有無進(jìn)位與借位,有進(jìn)位flag 置為 1,無進(jìn)位 flag 置為-1,最后將結(jié)果鏈表按照要求的格式輸出即可2.2 算法設(shè)計(jì)的對應(yīng)方式如 1,1111,4444,5555,3334,0000,0001 與 1,0000,2321,9000,5555,0000 相加圖 2長整數(shù) 1 1111 4444 5555 3334 0000 0001長整數(shù) 1 0000 2321 9000 5555 0000flag 0 0 0 1(有進(jìn)位)0 0 0相加1 1112 4444 7877 2334 5555 0001數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 詳細(xì)設(shè)計(jì)3.詳細(xì)設(shè)計(jì)3.1 設(shè)計(jì)思想用字符數(shù)組來存儲輸入的數(shù),用循環(huán)鏈表的儲存整數(shù)的節(jié)點(diǎn),以及計(jì)算的結(jié)果。用鏈表的好處可以節(jié)約空間,它可以隨著數(shù)據(jù)的長短來調(diào)整大小,同時(shí),雙向循環(huán)鏈表也方便了查找和刪除。3.2 設(shè)計(jì)關(guān)鍵算法節(jié)點(diǎn)類:public:E element; // Value for this nodeLink* next; // Point to next node in listLink*prev; //Pointer to previous node// ConstructorsLink(const E& it, Link* prevp,Link*nextval){element = it; next = nextval;prev = prevp;}Link(Link*prevp = NULL,Link* nextval = NULL) { next = nextval; prev = prevp; }雙向循環(huán)鏈表類:template class DoubleLList {private:Link* head; // Pointer to list headerLink* tail; // Pointer to last elementLink* curr; // Access to current elementint cnt; // Size of listpublic:void init() { // Intialization helper methodcurr = tail = head = new Link(0,NULL,NULL);tail->next = head;head->prev = tail;數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 詳細(xì)設(shè)計(jì)cnt = 1;}void removeall() { // Return link nodes to free storewhile (head != tail) {curr = head;head = head->next;delete curr;}delete head;}//DoubleLList() { init(); } // ConstructorDoubleLList(const E&it) //constructor{curr = tail = head = new Link(it, NULL, NULL);tail->next = head;head->prev = tail;cnt = 0;}DoubleLList() //Constructor,make the head element with 0{curr = tail = head = new Link(0, NULL, NULL);head->next = head->prev = head;cnt = 1;}// Destructor~DoubleLList() {removeall(); }void clear() { removeall(); init(); } // Clear list// Insert "it" at current positionvoid insert(const E&it) {curr->next = curr->next->prev = new Link(it, curr, curr->next);if (tail == head){tail = curr->next;}cnt++;}數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 詳細(xì)設(shè)計(jì)void append(const E& it) { // Append "it" to listif (cnt == 1) //當(dāng)節(jié)點(diǎn)為1的時(shí)候{head->next=head->prev=tail = new Link(it, head, head);}elsetail=head->prev = tail->next = new Link(it, tail, head);cnt++;}輸入:void input(char *a, char *b) //輸入字符串{cout > a;cout > b;}轉(zhuǎn)化:(將輸入的輸入轉(zhuǎn)化到鏈表中)//將儲存在字符串?dāng)?shù)組中的整數(shù)轉(zhuǎn)化到鏈表中void charTransformList(DoubleLList &L1, char a[]){int temp=0, r,count,flag=0 ; //temp用于存儲中間每個(gè)4位整數(shù),r用于表示在4位整數(shù)的哪個(gè)位上,count用于表示a的字符串長度,flag=0表示整數(shù),1表示負(fù)數(shù)count = strlen(a);if (a[0] == '-')flag = 1;for (int i = count - 1, j = 0; i >= 0+flag; i--, j++){int m = j / 5; //m用于記錄第幾個(gè)數(shù)r = j % 5;if (r == 4){continue;}else if (r!=4&&(a[i] '9')) { //當(dāng)輸入格式錯(cuò)誤的時(shí)候,退出cout strlen(b)&&a[0] == '-'&&b[0] != '-'))return -1;else if(a[0]=='-'&&b[0]!='-'&&strlen(a)-1==strlen(b)) //當(dāng)兩整數(shù)長度相同,符號相反時(shí){for (int i = 0; i b[i]) {return -1;break;}if (a[i+1] b[i + 1]) {return 1;break;}if (a[i] strlen(b) || a[0] != '-'&&strlen(a) > strlen(b) - 1) //當(dāng)?shù)谝粋€(gè)整數(shù)絕對值長度大于第二個(gè)整數(shù)絕對值長度,返回truereturn 1;else if (a[0] == '-'&&strlen(a) - 1 b[i]) {return 1;break;}if (a[i + 1] b[i + 1]) {return 1;break;}if (a[i] &L1, DoubleLList&L2, DoubleLList&L3, char charArray1[100], char charArray2[100]){int flag = 0, temp; //保存是否有進(jìn)位或則是借位,進(jìn)位為1,未進(jìn)位為0,借位為-1;temp用為暫時(shí)存儲鏈表相加的結(jié)果cout = 10000) //處理進(jìn)位{flag = 1;temp = temp - 10000;}L3.append(temp);if ((i == (L1.length() - 2)) && flag == 1) //當(dāng)最后有進(jìn)位的時(shí)候L3.append(1);}}else if (L1.length() > L2.length()) //當(dāng)L1的長度大于L2的長度{L1.moveToStart();L2.moveToStart();for (int i = 0; i = 10000){flag = 1;temp -= 10000;}L3.append(temp);if ((i == L1.length() - 2) && flag == 1) //當(dāng)最后有進(jìn)位的時(shí)候L3.append(1);}}else //當(dāng)L2的長度大于L1的長度{L1.moveToStart();L2.moveToStart();for (int i = 0; i = 10000){flag = 1;temp -= 10000;}L3.append(temp);if ((i == L2.length() - 2) && flag == 1) //當(dāng)最后有進(jìn)位的時(shí)候L3.append(1);}}}else //當(dāng)符號不相同時(shí){if (aboluteValue(charArray1, charArray2) == 0) //如果兩個(gè)整數(shù)絕對值大小相等,結(jié)果為0L3.append(0);else if (aboluteValue(charArray1, charArray2) > 0) //如果第一個(gè)整數(shù)絕對值大于數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 詳細(xì)設(shè)計(jì)第二個(gè)整數(shù)的絕對值{L1.moveToStart();L2.moveToStart();for (int i = 0; i = L2.getValue()){temp = L1.getValue() - L2.getValue() + flag;flag = 0; //沒有借位}else{temp = L1.getValue() + 10000 - L2.getValue();flag = -1; //有借位}}else{if (L1.getValue() + flag >= 0){temp = L1.getValue() + flag;flag = 0; //沒有借位}else{temp = L1.getValue() + flag + 10000;flag = -1; //有借位}}L3.append(temp);}}//第二個(gè)整數(shù)大于第一個(gè)整數(shù)絕對值的時(shí)候else{L1.moveToStart();L2.moveToStart();for (int i = 0; i = L1.getValue()){temp = L2.getValue() - L1.getValue() + flag;flag = 0; //沒有借位}else{temp = L2.getValue()+flag + 10000 - L1.getValue();flag = -1; //有借位}}else //L1中整數(shù)遍歷完后,只剩下L2的整數(shù){if (L2.getValue() + flag >= 0){temp = L2.getValue() + flag;flag = 0; //沒有借位}else{temp = L2.getValue() + flag + 10000;flag = -1; //有借位}}L3.append(temp);}}}}輸出:void resultPrint(DoubleLListL3,int flag) //L3存儲了相加的結(jié)果,flag儲存了結(jié)果的正負(fù),結(jié)果顯示到屏幕上{if(flag=1000){cout = 100){cout = 10){cout << "00" << L3.getValue();}else{cout << "000" << L3.getValue();}}cout << endl;}數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 調(diào)試分析4.調(diào)試分析_ 圖 6數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 參考文獻(xiàn)5.總結(jié)通過半個(gè)多月的學(xué)習(xí)和實(shí)踐,解決實(shí)際問題,讓我對鏈表有了更深的了解,對數(shù)據(jù)結(jié)構(gòu)產(chǎn)生了濃厚的興趣,同時(shí)也讓我提高了解決實(shí)際問題的能力。我們要不斷的通過上機(jī)來提高自己的學(xué)習(xí)水平,在上機(jī)的同時(shí)改正了自己對某些算法的錯(cuò)誤使用,使自己在通過程序解決問題時(shí)抓住關(guān)鍵算法,有了算法設(shè)計(jì)思想和流程圖,并用 C++語言描繪出關(guān)鍵算法。以前我對數(shù)據(jù)結(jié)構(gòu)(C++語言描述)的一些標(biāo)準(zhǔn)庫函數(shù)不太了解,還有對函數(shù)調(diào)用的正確使用不夠熟悉,還有對 C 語言中經(jīng)常出現(xiàn)的錯(cuò)誤也不了解,通過實(shí)踐,使我在這幾個(gè)方面的認(rèn)識有所提高。讓自己有一定的能力去改正一些常見的錯(cuò)誤語法,很高興這半個(gè)多月的學(xué)習(xí)讓我對數(shù)據(jù)結(jié)構(gòu)(C++語言描述)有了新的認(rèn)識,所以后在學(xué)習(xí)過程中,我會更加注視實(shí)踐操作,使自己便好地學(xué)好計(jì)算機(jī)。在這次課程設(shè)計(jì)的實(shí)驗(yàn)中,我收獲了許多知識,通過查找大量資料,請教老師,以及不懈的努力,也培養(yǎng)了獨(dú)立思考、動(dòng)手操作的能力。我也學(xué)會了許多學(xué)習(xí)和解決實(shí)際問題的方法,讓我受益匪淺。時(shí)間的緊缺成為一個(gè)很大的問題。也希望老師可以為我們知道一下以后的發(fā)展方向。如果可以讓每個(gè)人都有動(dòng)手焊接以及參與其他的各個(gè)流程,有專門的知道就更好了。課程設(shè)計(jì)對我來說,趣味性強(qiáng),不僅鍛煉能力,而且可以學(xué)到很多東西,在與老師和同學(xué)的交流過程中,互動(dòng)學(xué)習(xí),將知識融會貫通,也增強(qiáng)了我和同學(xué)之間的團(tuán)隊(duì)合作的能力。讓我們知道只要努力,集中精力解決問題,一定會有收獲的,過程也是很重要的。在這次課程設(shè)計(jì)中我們要學(xué)會利用時(shí)間,在規(guī)定的時(shí)間內(nèi)完成我們的任務(wù),要逐漸養(yǎng)成用 C++語言編寫程序的良好習(xí)慣。這些對我來說都是一種鍛煉,一個(gè)知識積累的過程,一種能力的提高。要打好基礎(chǔ),才能用更好的辦法,更簡潔明了的程序解決實(shí)際問題,只有這樣才能進(jìn)一步的取得更好的成績。我們會更加努力,努力的去彌補(bǔ)自己的缺點(diǎn),發(fā)展自己的優(yōu)點(diǎn),去充實(shí)自己,只有在了解了自己的長短之后,我們會更加珍惜擁有的,更加努力的去完善它,增進(jìn)它。參考文獻(xiàn)《數(shù)據(jù)結(jié)構(gòu)與算法分析第三版》 (C++)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 參考文獻(xiàn)17- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
10 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 重慶大學(xué) 本科 學(xué)生 課程設(shè)計(jì) 任務(wù)書 整數(shù) 運(yùn)算
鏈接地址:http://m.zhongcaozhi.com.cn/p-359775.html