




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
.z.目錄TOC\o"1-3"\h\u185971前言1321061.1設(shè)計背景和意義114281.1.1數(shù)據(jù)結(jié)構(gòu)簡介 242501.1.2選擇算法的原因 2391.2設(shè)計的原理和內(nèi)容2199822正文2254432.1設(shè)計的目的和意義2266852.2目標(biāo)和總體方案213642.3設(shè)計方法和內(nèi)容3318852.3.1模塊劃分3304842.3.2主要程序模塊3173672.4程序的設(shè)計思想和內(nèi)容6209172.4.1用數(shù)組實現(xiàn)該問題641202.4.2用棧實現(xiàn)該問題640092.5設(shè)計創(chuàng)新和關(guān)鍵技術(shù)6186172.6程序調(diào)試6323662.7程序流程圖7251092.8結(jié)論829308參考文獻(xiàn)929218附錄 91前言1.1設(shè)計背景和意義1.1.1數(shù)據(jù)結(jié)構(gòu)簡介數(shù)據(jù)結(jié)構(gòu)是計算機程序設(shè)計的重要理論設(shè)計基礎(chǔ),是一門綜合性的專業(yè)基礎(chǔ)科。數(shù)據(jù)結(jié)構(gòu)是研究數(shù)據(jù)之間的相互關(guān)系,也即數(shù)據(jù)的組織形式的一門科學(xué)。它不僅是計算機學(xué)科的核心課程,數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率的算法。在計算機科學(xué)中,"數(shù)據(jù)結(jié)構(gòu)”不僅是一般程序設(shè)計的基礎(chǔ),而且是設(shè)計和實現(xiàn)編譯程序、操作系統(tǒng)、數(shù)據(jù)庫系統(tǒng)及其他系統(tǒng)程序和大型應(yīng)用程序的重要基礎(chǔ)。1.1.2選擇算法的原因在許多類型的程序的設(shè)計中,數(shù)據(jù)結(jié)構(gòu)的選擇是一個基本的設(shè)計考慮因素。許多大型系統(tǒng)的構(gòu)造經(jīng)驗表明,系統(tǒng)實現(xiàn)的困難程度和系統(tǒng)構(gòu)造的質(zhì)量都嚴(yán)重的依賴于是否選擇了最優(yōu)的數(shù)據(jù)結(jié)構(gòu)。許多時候,確定了數(shù)據(jù)結(jié)構(gòu)后,算法就容易得到了。有些時候事情也會反過來,我們根據(jù)特定算法來選擇數(shù)據(jù)結(jié)構(gòu)與之適應(yīng)。不論哪種情況,選擇合適的數(shù)據(jù)結(jié)構(gòu)都是非常重要的。1.2設(shè)計的原理和內(nèi)容設(shè)計了一個10進(jìn)制轉(zhuǎn)換其它進(jìn)制(36進(jìn)制以內(nèi))及逆轉(zhuǎn)換的軟件,該軟件具有簡單的將10進(jìn)制數(shù)轉(zhuǎn)換成2、8、16進(jìn)制數(shù)以及較復(fù)雜的高進(jìn)制數(shù)的轉(zhuǎn)換和逆轉(zhuǎn)功能。本軟件采用C語言編寫以VC++作為軟件開發(fā)環(huán)境,采用順序棧存儲方式來存儲運算中的數(shù)位,借助棧后進(jìn)先出的特點,易于結(jié)果輸出。操作簡單,界面清晰,易于為用戶所接受。2正文2.1設(shè)計的目的和意義我們是計算機科學(xué)與技術(shù)專業(yè)的本科生,《數(shù)據(jù)結(jié)構(gòu)》是我們重要的必修課程。當(dāng)代社會學(xué)要大學(xué)培養(yǎng)出理論扎實,動手實踐能力強的大學(xué)生。所以,本次課程設(shè)計的目的就在于通過一次實踐性的活動加深對這門課程的理解,使我們在感性的認(rèn)識上進(jìn)一步升華為理性的認(rèn)識。為后繼課程的學(xué)習(xí)打下堅實的基礎(chǔ)。通過本次數(shù)據(jù)結(jié)構(gòu)課程設(shè)計,我們基本上掌握了課程設(shè)計流程,還掌握了一些知識和技能,這對于我們以后對于數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)有了很大的幫助和提高,加深了我們對數(shù)據(jù)結(jié)構(gòu)的理解,,為今后的學(xué)習(xí)打下了堅實的基礎(chǔ)。同時也提高了我們對于編程這方面的能力。2.2目標(biāo)和總體方案本次設(shè)計的目標(biāo)在于設(shè)計出一個能夠?qū)崿F(xiàn)數(shù)制轉(zhuǎn)換的程序,于是特制訂了一個總體的方案:程序的設(shè)計第一步:查閱有關(guān)數(shù)據(jù)結(jié)構(gòu)數(shù)制轉(zhuǎn)換操作的資料,用半天的時間。第二步:設(shè)計這個項目的整體架構(gòu)和算法。用一到兩天的時間。第三步:使用C語言程序設(shè)計程序語言進(jìn)行算法的描述。兩天的時間。程序的調(diào)試進(jìn)行程序的調(diào)試。用一天。最后,我在完整的整理一遍,完成課設(shè)。2.3設(shè)計方法和內(nèi)容2.3.1模塊劃分2.3.1.1用數(shù)組實現(xiàn)該問題(1)i,j,y,n,s,m,r,reminder,*是定義的全局變量,初始值都為0;(2)D2M(intg,inth)是實現(xiàn)十進(jìn)制數(shù)轉(zhuǎn)換為M進(jìn)制數(shù)的函數(shù);(3)M2D()是實現(xiàn)M(僅指二進(jìn)制數(shù)和八進(jìn)制數(shù))進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的函數(shù),并在其中調(diào)用D2M(intg,inth)實現(xiàn)向非M進(jìn)制數(shù)的轉(zhuǎn)換;(4)H2D(intf)是實現(xiàn)十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)的函數(shù),并在其中調(diào)用D2M(intg,inth)實現(xiàn)向非十六進(jìn)制數(shù)的轉(zhuǎn)換;(5)voidmain()是主函數(shù),功能是給出測試的數(shù)據(jù),并在特定條件下調(diào)用D2M()函數(shù)和M2D()函數(shù)。2.3.1.2用棧實現(xiàn)該問題(1)SqStack定義棧,說明base為棧底指針,top為棧頂指針,stacksize為棧容量;(2)intInitStack(SqStack&S)到intDestroyStack(SqStack&S)六大模塊分別表示構(gòu)造一個空棧、用e表示棧元素、插入元素、刪除元素、判斷棧是否為空以及摧毀棧;(3)SqStackS是指定義棧S;(4)D2M(inta,intb)的功能是將十進(jìn)制數(shù)轉(zhuǎn)換成M進(jìn)制的函數(shù);(5)M2D()的功能是M進(jìn)制轉(zhuǎn)換為十進(jìn)制的函數(shù);(6)voidmain()是主函數(shù)。其功能是輸入需要測試的數(shù)據(jù)以及需要轉(zhuǎn)換的進(jìn)制,并在特定情形下調(diào)用D2M()函數(shù)和M2D()函數(shù),而且實現(xiàn)M進(jìn)制數(shù)向轉(zhuǎn)任意非M進(jìn)制數(shù)的換。2.3.2主要程序模塊(1):D2M(intg,inth){ intc[N]; i=0; reminder=g%h; g=g/h; if(reminder>9) { c[i]=reminder+55; i++; }else { c[i]=reminder; i++; } if(g>0) D2M(g,h); for(j=i-1;j>=0;j--) if(c[j]>=65) printf("%c",c[j]); else printf("%d",c[j]); return0;}自定義函數(shù)D2M用于在用數(shù)組實現(xiàn)該問題的程序中十進(jìn)制數(shù)轉(zhuǎn)換為其他進(jìn)制數(shù)(2):M2D(inte){inta[N];printf("請輸入%d進(jìn)制位數(shù):",m); scanf("%d",&n); printf("請輸入%d進(jìn)制的每位并使每位用空格隔開:",m); for(i=0;i<n;i++)scanf("%d",&a[i]); for(i=n-1;i>=0;i--) { y+=(int)pow(e,j)*a[i];//強制類型轉(zhuǎn)換,以免造成數(shù)據(jù)丟失 j++; } printf("請輸出所得的10進(jìn)制的結(jié)果:"); printf("%d",y);printf("\n需要轉(zhuǎn)換的進(jìn)制M:"); scanf("%d",&s); printf("請輸出轉(zhuǎn)換成%d進(jìn)制的結(jié)果:",s); D2M(y,s); return0;}自定義函數(shù)M2D用于在用數(shù)組實現(xiàn)該問題的程序中二進(jìn)制和八進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并且轉(zhuǎn)換為其他進(jìn)制數(shù)(3):H2D(intf){ intb[N]; printf("請輸入%d進(jìn)制位數(shù):",m); scanf("%d",&n); printf("請輸入%d進(jìn)制的每位并使每位用空格隔開:",m); for(i=0;i<n;i++)scanf("%*",&b[i]); for(i=n-1;i>=0;i--) { y+=(int)pow(f,j)*b[i];//強制類型轉(zhuǎn)換,以免造成數(shù)據(jù)丟失 j++; } printf("請輸出所得的10進(jìn)制的結(jié)果:"); printf("%d",y); printf("\n需要轉(zhuǎn)換的進(jìn)制M:"); scanf("%d",&s); printf("請輸出轉(zhuǎn)換成%d進(jìn)制的結(jié)果:",s); D2M(y,s); return0;}自定義函數(shù)H2D用于在用數(shù)組實現(xiàn)該問題的程序中十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并轉(zhuǎn)換為其他進(jìn)制數(shù)(4):D2M(inta,intb){ while(a) { r=a%b; if(r>9) r=r+55; Push(S,r);//壓入棧 a/=b;//轉(zhuǎn)換成M進(jìn)制 } printf("該數(shù)轉(zhuǎn)換成%d進(jìn)制的結(jié)果:",b); while(!StackEmpty(S)) { Pop(S,e);//彈出棧 if(e>=65) printf("%c",e); else printf("%d",e); } return0;}自定義函數(shù)D2M用于在用棧實現(xiàn)該問題的程序中十進(jìn)制數(shù)轉(zhuǎn)換成其他進(jìn)制數(shù)(5):M2D()其他進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù){charc[1000]; printf("請輸入需要轉(zhuǎn)換的數(shù)的位數(shù):"); scanf("%d",&n); printf("請輸入需要轉(zhuǎn)換的數(shù)的每位并用空格隔開:");for(i=0;i<n;i++) { scanf("%*",&c[i]); Push(S,c[i]); }i=0; while(!StackEmpty(S)) { Pop(S,e); y+=(int)pow(m,i)*e; i++; } printf("轉(zhuǎn)換成10進(jìn)制的結(jié)果是:"); printf("%d",y); return0;}自定義函數(shù)M2D用于用棧實現(xiàn)該問題的程序中其他進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù)2.4程序的設(shè)計思想和內(nèi)容2.4.1用數(shù)組實現(xiàn)該問題D2M()函數(shù)和M2D()函數(shù)是實現(xiàn)該問題的主要函數(shù)。D2M()函數(shù)是實現(xiàn)十進(jìn)制轉(zhuǎn)換為其它進(jìn)制的函數(shù),它是將輸入的十進(jìn)制數(shù)x取首先對需要轉(zhuǎn)換的進(jìn)制M取余,然后再對其取整,接著通過遞歸調(diào)用D2M()函數(shù)依次將得到的整數(shù)部分依次先取余后取整,并將所得的余數(shù)依次存入一個數(shù)組中,然后逆向取出數(shù)組中的元素,即得到轉(zhuǎn)換后的結(jié)果。而M2D()函數(shù)則是實現(xiàn)其他進(jìn)制M轉(zhuǎn)換為十進(jìn)制,并將其轉(zhuǎn)換為非M進(jìn)制的數(shù)。M進(jìn)制轉(zhuǎn)十進(jìn)制則是從該M進(jìn)制數(shù)的最后一位開始算,依次列為第0、1、2…n位并分別乘以M的0、1、2…n次方,將得到的次方相加便得到對應(yīng)的十進(jìn)制數(shù),再調(diào)用D2M()函數(shù)將其轉(zhuǎn)換為非M進(jìn)制的數(shù)。2.4.2用棧實現(xiàn)該問題同樣是利用D2M()和M2D()兩個函數(shù)實現(xiàn)。兩個函數(shù)的思想同利用數(shù)組實現(xiàn)時相同。只是棧具有后進(jìn)先出的性質(zhì),故其用Pop()取數(shù)較數(shù)組的逆向取數(shù)方便些。2.5設(shè)計創(chuàng)新和關(guān)鍵技術(shù)利用了棧的先進(jìn)后出特點來滿足數(shù)制轉(zhuǎn)換中從最后一位余數(shù)依次取出的要求,利用數(shù)組的特性依次存儲取于數(shù)運算的結(jié)果余數(shù),再從該數(shù)組的最后一個元素從后往前依次取出即為轉(zhuǎn)換后的數(shù)。2.6程序調(diào)試1十進(jìn)制數(shù)527的調(diào)試情況如下:2十六進(jìn)制數(shù)1A2C9的調(diào)試情況如下:2.7程序流程圖數(shù)組數(shù)組棧輸入*轉(zhuǎn)換的位數(shù)輸入需要轉(zhuǎn)換的數(shù)輸入將轉(zhuǎn)換的進(jìn)制數(shù)輸出結(jié)果開始輸入需轉(zhuǎn)換的數(shù)的進(jìn)制2.8結(jié)論通過本次課程設(shè)計,我認(rèn)識到熟練掌握基礎(chǔ)算法的重要性,對棧的含義及其基本算法有了更好的理解和應(yīng)用。棧"先進(jìn)后出”的算法加上Push()和Pop()方便了對要轉(zhuǎn)換的數(shù)進(jìn)行讀取,和對轉(zhuǎn)換后數(shù)倒置的輸出。在編寫過程中常遇到的不少問題,例如,變量類型的轉(zhuǎn)換和ASCII碼轉(zhuǎn)義字符的應(yīng)用,變量的定義和*圍,算法循環(huán)語句的退出條件等,我通過不斷調(diào)試,翻閱課本和網(wǎng)上搜索材料得到了解決,也認(rèn)識到這些細(xì)節(jié)上的處理更當(dāng)注意。在調(diào)試時,學(xué)會了在有問題的地方注釋并能經(jīng)常使用printf()函數(shù)測試輸出結(jié)果。在測試時對測試數(shù)據(jù)的選取更當(dāng)考慮全面能檢測錯誤輸入并進(jìn)行提示。通過這次實驗我學(xué)會運用課本和老師平時講授知識進(jìn)行切身實踐,通過網(wǎng)絡(luò)搜索學(xué)到了新的庫函數(shù),提高了我實際編寫程序的能力。參考文獻(xiàn)[1]嚴(yán)蔚敏,*偉民編著.數(shù)據(jù)結(jié)構(gòu)(C語言版).清華大學(xué),2006年[2]李春葆,曾慧,*植民編著.數(shù)據(jù)結(jié)構(gòu)程序設(shè)計題典.清華大學(xué),2002年[3]郭翠英編著.C語言課程設(shè)計案例精編.中國水利水電,2004年[4]譚浩強編著.C程序設(shè)計.清華大學(xué),2005年[5]許卓群,*乃孝,楊冬青,唐世渭編著.《數(shù)據(jù)結(jié)構(gòu)》.高等教育,1988年[6]晉良潁編著.《數(shù)據(jù)結(jié)構(gòu)》.人民郵電,2002年附錄用數(shù)組實現(xiàn):#include<stdio.h>#include<math.h>#defineN1000inti,j,y,n,s;intm,r,reminder;int*;//全局變量默認(rèn)初始化為0,不必再賦0了D2M(intg,inth)//十進(jìn)制數(shù)轉(zhuǎn)換為其他進(jìn)制數(shù){ intc[N]; i=0; reminder=g%h; g=g/h; if(reminder>9) { c[i]=reminder+55; i++;}else { c[i]=reminder; i++; } if(g>0) D2M(g,h); for(j=i-1;j>=0;j--) if(c[j]>=65) printf("%c",c[j]); else printf("%d",c[j]); return0;}M2D(inte)//二進(jìn)制和八進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并這轉(zhuǎn)換為其他進(jìn)制數(shù){ inta[N];printf("請輸入%d進(jìn)制位數(shù):",m); scanf("%d",&n); printf("請輸入%d進(jìn)制的每位并使每位用空格隔開:",m); for(i=0;i<n;i++)scanf("%d",&a[i]); for(i=n-1;i>=0;i--) { y+=(int)pow(e,j)*a[i];//強制類型轉(zhuǎn)換,以免造成數(shù)據(jù)丟失 j++; } printf("請輸出所得的10進(jìn)制的結(jié)果:"); printf("%d",y);printf("\n需要轉(zhuǎn)換的進(jìn)制M:"); scanf("%d",&s); printf("請輸出轉(zhuǎn)換成%d進(jìn)制的結(jié)果:",s); D2M(y,s); return0;}H2D(intf)//十六進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并轉(zhuǎn)換為其他進(jìn)制數(shù){ intb[N]; printf("請輸入%d進(jìn)制位數(shù):",m); scanf("%d",&n); printf("請輸入%d進(jìn)制的每位并使每位用空格隔開:",m); for(i=0;i<n;i++)scanf("%*",&b[i]); for(i=n-1;i>=0;i--) { y+=(int)pow(f,j)*b[i];//強制類型轉(zhuǎn)換,以免造成數(shù)據(jù)丟失 j++; } printf("請輸出所得的10進(jìn)制的結(jié)果:"); printf("%d",y); printf("\n需要轉(zhuǎn)換的進(jìn)制M:"); scanf("%d",&s); printf("請輸出轉(zhuǎn)換成%d進(jìn)制的結(jié)果:",s); D2M(y,s); return0;}voidmain(){ printf("請給定一個需轉(zhuǎn)換的進(jìn)制M(2or8or10or16):"); scanf("%d",&m); if(m==2||m==8)//二進(jìn)制和八進(jìn)制轉(zhuǎn)換成十進(jìn)制 M2D(m); elseif(m==16)//十六進(jìn)制轉(zhuǎn)換成十進(jìn)制 H2D(m); elseif(m==10)//十進(jìn)制轉(zhuǎn)換成其它進(jìn)制 { printf("請輸入一個%d進(jìn)制數(shù):",m); scanf("%d",&*); printf("請輸入需要轉(zhuǎn)換成的進(jìn)制M(2or8or16):"); scanf("%d",&r); printf("請輸出轉(zhuǎn)換成%d進(jìn)制的結(jié)果:",r); D2M(*,r); } printf("\n");}用棧實現(xiàn):#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<math.h>#defineSTACK_INIT_SIZE100//存儲空間初始分配量#defineSTACKINCREMENT10//存儲空間分配增量inte,m,*,s,t;//*為要轉(zhuǎn)換的十進(jìn)制數(shù),e為臨時用的的int型變量intr,y,i,n;typedefstruct{int*base;//棧底int*top;//棧頂intstacksize;//棧容量}SqStack;intInitStack(SqStack&S){//構(gòu)造一個空棧 S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S.base)e*it(0);//存儲空間失敗 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return0;}intGetTop(SqStackS,int&e){//若棧不為空,則用e返回S的棧頂元素,并返回0,否則返回1 if(S.top==S.base)return1; e=*(S.top-1); return0;}intPush(SqStack&S,inte){//插入元素e為新的棧頂元素 if(S.top-S.base>=S.stacksize){//棧滿,追加存儲空間 S.base=(int*)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base)return1;//存儲分配失敗 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return0;}intPop(SqStack&S,int&e){//若棧不空,則刪除S的棧頂元素,用e返回其值,并返回0,否則返回1 if(S.top==S.base)return1; e=*--S.top; return0;}intStackEmpty(SqStackS){//若??眨瑒t返回1,否則返回0 if(S.top==S.base) return1; return0;}intDestroyStack(SqStack&S){//銷毀棧S,棧S不再存在 free(S.base); S.top=NULL;//防止程序后面不小心使用了它 S.base=S.top; return0;}SqStackS;//定義棧SD2M(inta,intb)//十進(jìn)制轉(zhuǎn)換成其他進(jìn)制的函數(shù)D2M(){ while(a) {
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025加盟合同范本:品牌工坊合作協(xié)議
- 2025 商城店鋪的租賃合同范本
- 弱電臨時用工合同范本
- 2025景觀美化工程承包合同
- 2025建筑裝飾單項工程承包合同(水電安裝)
- 代為清關(guān)合同范本
- 酒樓裝修租房合同范本
- 軟件代理開發(fā)合同范本
- 代理拆遷賠償合同范本
- 土地建設(shè)工程合同二零二五年
- 農(nóng)家肥撒施翻耕施工方案
- GB∕T 11071-2018 區(qū)熔鍺錠-行業(yè)標(biāo)準(zhǔn)
- 產(chǎn)品和服務(wù)戰(zhàn)略
- 2019最新中小學(xué)校安全管理制度匯編
- 心理治療師考試復(fù)習(xí)重點筆記匯總
- 《中西醫(yī)結(jié)合概論》期末考試題
- 高速鐵路知識.ppt課件
- 吹灰器檢修三措兩案
- ROHS等有害物質(zhì)削減計劃
- 產(chǎn)品推介會策劃方案
- sch壁厚等級對照表要點
評論
0/150
提交評論