




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、數據結構課程設計題 目 名 稱: 數 制 轉 換 問 題 課 程 名 稱: 數 據 結 構 學 生 姓 名: 學 號: 學 院 名 稱: 指 導 教 師: 目 錄一需求分析二概要設計三詳細設計四調試測試五總結一需求分析 應用環境設定: 生活中我們需要將M進制的數轉換為我們所需要的進制,從鍵盤任意輸入一個M進制的數,對其進行轉換成其他三種進制的數,然后再從電腦中顯示出來,最終得到我們的結果。 用戶界面:命令行界面,根據自己的要求,對界面的提示進行操作,正確輸入我們需要的數據。輸入方式:首先輸入將轉換的進制數,回車確認;然后輸入確定的數據,回車確認;接著選擇要轉換為的進制數,回車確認。輸出方式:界
2、面直接輸出,啟動程序后,按照界面提示,輸入數據,直接回車確認,顯示屏即輸出我們的數據結果。數據儲存方式:全部在內存存放,不使用硬盤上的文件或其他數據源,程序執行過程中和結束后不保存數據。程序功能:1.根據界面提示輸入M進制數據。 2.對任意M進制數據實行非M進制的轉換。二概要設計在此說明數據結構設計和關鍵的算法設計思想1. 用數組實現該問題D2M()函數和M2D()函數是實現該問題的主要函數。D2M()函數是實現十進制轉換為其它進制的函數,它是將輸入的十進制數取首先對需要轉換的進制M取余,然后再對其取整,接著通過遞歸調用D2M()函數依次將得到的整數部分依次先取余后取整,并將所得的余數依次存入
3、一個數組中,然后逆向取出數組中的元素,即得到轉換后的結果。而M2D()函數則是實現其他進制M轉換為十進制,并將其轉換為非M進制的數。M進制轉十進制則是從該M進制數的最后一位開始算,依次列為第、位并分別乘以M的、次方,將得到的次方相加便得到對應的十進制數,再調用D2M()函數將其轉換為非M進制的數。i,j,y,n,s,m,r,reminder,x是定義的全局變量,初始值都為; D2M(int g,int h)是實現十進制數轉換為M進制數的函數;M2D(int e)是實現M(僅指二進制數和八進制數)進制數轉換為十進制數的函數,并在其中調用D2M(int g,int h)實現向非M進制數的轉換;H2
4、D(int f)是實現十六進制數轉換為十進制數的函數,并在其中調用D2M(int g,int h)實現向非十六進制數的轉換;void main()是主函數,功能是給出測試的數據,并在特定條件下調用D2M()函數和M2D()函數。使用簡單一維數組int aN,int bN, int cN。2. 用棧實現該問題 同樣是利用D2M()和M2D()兩個函數實現。兩個函數的思想同利用數組實現時相同。只是棧具有后進先出的性質,故其用Pop()取數較數組的逆向取數方便些。SqStack定義棧,說明base為棧底指針,top為棧頂指針,stacksize為棧容量;int InitStack(SqStack &
5、S)到int DestroyStack(SqStack &S)六大模塊分別表示構造一個空棧、用表示棧元素、插入元素、刪除元素、判斷棧是否為空以及摧毀棧;SqStack S是指定義棧S;D2M(int a,int b)的功能是將十進制數轉換成M進制的函數;M2D()的功能是M進制轉換為十進制的函數;void main()是主函數。其功能是輸入需要測試的數據以及需要轉換的進制,并在特定情形下調用D2M()函數和M2D()函數,而且實現M進制數向任意非M進制數的轉換。數據類型定義如下:typedef struct int *base; 棧底int *top; 棧頂int stacksize;棧容量S
6、qStack;int InitStack(SqStack &S)構造一個個空棧int GetTop(SqStack S, int &e) 若棧不為空,則用e返回S的棧頂元素,并返回0,否則返回1int Push(SqStack &S , int e) 插入元素e為新的棧頂元素int Pop(SqStack &S, int &e) 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回0,否則返回1。1.程序流程圖開始棧數組輸入需轉換的位數輸入需轉換的數的進制N 若N!=10 若N=10輸入需轉換的數輸出結果輸入將轉換的進制數2.程序源代碼A用數組實現(文件名shuzu.cpp)#include#i
7、nclude#define N 1000int i,j,y,n,s;int m,r,reminder;int x; /全局變量默認初始化為0,不必再賦0了D2M(int g,int h) /十進制數轉換為其他進制數int cN;i=0;reminder=g%h;g=g/h;if(reminder9)ci=reminder+55;i+; elseci=reminder;i+;if(g0)D2M(g,h);for(j=i-1;j=0;j-)if(cj=65)printf(%c,cj);elseprintf(%d,cj);return 0;M2D(int e) /二進制和八進制數轉換為十進制數,并這
8、轉換為其他進制數int aN; printf(請輸入%d進制位數:,m);scanf(%d,&n);printf(請輸入%d進制的每位并使每位用空格隔開:,m);for(i=0;i=0;i-)y+=(int)pow(e,j)*ai; /強制類型轉換,以免造成數據丟失j+; printf(需要轉換的進制M:);scanf(%d,&s);printf(請輸出轉換成%d進制的結果:,s);D2M(y,s);return 0;H2D(int f) /十六進制數轉換為十進制數,并轉換為其他進制數int bN;printf(請輸入%d進制位數:,m);scanf(%d,&n);printf(請輸入%d進制
9、的每位并使每位用空格隔開:,m);for(i=0;i=0;i-)y+=(int)pow(f,j)*bi; /強制類型轉換,以免造成數據丟失 j+;printf(需要轉換的進制M:);scanf(%d,&s);printf(請輸出轉換成%d進制的結果:,s);D2M(y,s);return 0;void main()printf(請給定一個需轉換的進制M(2or8or10or16):);scanf(%d,&m);if(m=2|m=8) /二進制和八進制轉換成十進制M2D(m);else if(m=16) /十六進制轉換成十進制H2D(m);else if(m=10) /十進制轉換成其它進制pri
10、ntf(請輸入一個%d進制數:,m);scanf(%d,&x);printf(請輸入需要轉換成的進制M(2or8or16):);scanf(%d,&r);printf(請輸出轉換成%d進制的結果:,r);D2M(x,r);printf(n);B用棧實現(文件名zhan.cpp)#include#include#include#include#define STACK_INIT_SIZE 100 /存儲空間初始分配量#define STACKINCREMENT 10 /存儲空間分配增量int e,m,x,s,t; /x為要轉換的十進制數,e 為臨時用的的int型變量int r,y,i,n;typ
11、edef struct int *base; /棧底int *top; /棧頂int stacksize; /棧容量SqStack;int InitStack(SqStack &S) /構造一個空棧S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int);if(!S.base) exit(0); /存儲空間失敗S.top=S.base;S.stacksize=STACK_INIT_SIZE;return 0;int GetTop(SqStack S, int &e) /若棧不為空,則用e返回S的棧頂元素,并返回0,否則返回1if(S.top=S.bas
12、e) return 1;e=*(S.top-1);return 0;int Push(SqStack &S , int e) /插入元素e為新的棧頂元素if(S.top-S.base=S.stacksize) /棧滿,追加存儲空間S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int);if(!S.base) return 1 ; /存儲分配失敗S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return 0;int Pop(SqSta
13、ck &S, int &e) /若棧不空,則刪除S的棧頂元素,用e返回其值,并返回0,否則返回1if(S.top=S.base) return 1;e=*-S.top;return 0;int StackEmpty(SqStack S) /若棧空,則返回1,否則返回0if(S.top=S.base)return 1;return 0 ;int DestroyStack(SqStack &S) /銷毀棧S,棧S不再存在free(S.base);S.top=NULL; /防止程序后面不小心使用了它S.base=S.top;return 0 ;SqStack S; /定義棧SD2M(int a,in
14、t b) /十進制轉換成其他進制的函數D2M()while(a)r=a%b;if(r9)r=r+55;Push(S,r); /壓入棧a/=b; /轉換成M進制printf(該數轉換成%d進制的結果:,b);while(!StackEmpty(S)Pop(S,e); /彈出棧if(e=65)printf(%c,e);elseprintf(%d,e);return 0;M2D() /其他進制轉換為十進制的函數M2D() char c1000;printf(請輸入需要轉換的數的位數:);scanf(%d,&n);printf(請輸入需要轉換的數的每位并用空格隔開:);for(i=0;in;i+)sc
15、anf(%x,&ci);Push(S,ci); i=0;while(!StackEmpty(S)Pop(S,e);y+=(int)pow(m,i)*e;i+;void main()InitStack(S); /構造一個空棧printf(請輸入需要轉換的進制M(2or8or10or16):);scanf(%d,&m);if(m=10) /十進制轉換成其他進制printf(請給定一個需要轉換的10進制數:);scanf(%d,&x);printf(請輸入需要轉換成的進制數:);scanf(%d,&t);D2M(x,t);if(m=2|m=8|m=16) /其他進制轉換成十進制,且其他任意進制的相互
16、轉換M2D();printf(給定要轉換成的進制M:);scanf(%d,&s);D2M(y,s);printf(n);DestroyStack(S); /銷毀棧S,棧S不再存在 四調試測試 1.十進制數365轉換二進制數測試結果如下:(圖1) 圖1 2.十六進制數1A2B3C轉換十進制數測試結果如下:(圖2) 圖2 3.二進制數11001100轉換八進制數測試結果如下:(圖3) 圖3 4.八進制數1234轉換為十六進制數測試結果如下:(圖4) 圖4五總結此次課程設計與以往不同:第一,時間是比較緊的,從題目分配到完成設計不足十天的時間,而且又是即將期末考試的這段時間;第二,人數和以往也不同,以前都是幾個同學一起完成設計,而這次卻是每個人單獨完成自己的題目,所以人手也是比較緊的;第三,以前的課程設計是最后完成提交就行了,而這次我們必須時刻都提交自己課程設計的進程,中途隨時交給指導老師批閱,避免同學最后時間才去完成作業的思想。這次課程設計過程中遇見的問題就是2、8、10、16進制之間的轉
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025書店員工聘用合同
- 2025簽訂合同繳納社保即為勞動合同關系確立
- 2025食品冷鏈物流合同
- 2025娛樂公司員工勞動合同模板
- 2025建筑設備租賃合同書
- 2025公寓建筑合同模板
- 2025財務分析咨詢合同
- 2025租賃及服務合同
- 2025汽車租賃合同(范本x格式)
- 2025版項目合同范本下載
- 安全環保班組培訓
- 2024年北京大學強基計劃物理試題(附答案)
- 2024企業咨詢服務與戰略規劃合同
- TCUWA40055-2023排水管道工程自密實回填材料應用技術規程
- 糖尿病病人的麻醉管理
- 大型活動策劃與管理第九章 大型活動知識產權保護
- 2024年新課標培訓2022年小學英語新課標學習培訓課件
- 精神科患者便秘護理
- 煤礦反三違認定培訓課件
- 超高清視頻技術
- 2024年安全標志標識標準圖冊
評論
0/150
提交評論