




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、程序設(shè)計算法與實現(xiàn)一、數(shù)據(jù)結(jié)構(gòu)給定一段數(shù)組a20(為了便于以后的插入移動操作,這里我們給這個數(shù)組分配的空間大些)初始化10個數(shù),即a0a9。原數(shù)組為a0a19大小,我們只用了a0a9,因此稱這段區(qū)域為有效區(qū)域。當然刪除有效區(qū)域的數(shù)據(jù)元素,有效區(qū)要變小。最后只輸出有效區(qū)。圖示一問題一:如何刪除數(shù)組里一段連續(xù)的數(shù)據(jù)?先定義數(shù)組a10,用于存放10個數(shù)字,由于是向前覆蓋刪除數(shù)據(jù),所以這里可以不需要多定義空間。有效區(qū)域是a0a9上面是為這個數(shù)組分配了空間,下面需要初始化數(shù)組.初始化數(shù)組有兩種方法,一種是定義后直接賦值初始化,一種是用戶輸入用scanf接收后賦值初始化,第一種明顯沒有第二種靈活,建議使用
2、第二種做法。代碼片段如下int a10,i;/這里定義了數(shù)組a10和變量ifor(i=0;i10;i+)scanf(“%d”,&ai);代碼一上述代碼用一個for循環(huán)讓用戶自己輸入數(shù)值進行a10的初始化。為檢驗初始化的結(jié)果,我們可以將a0a9的初始化數(shù)值也用for循環(huán)配合printf輸出出來,代碼如下:for(i=0;i10;i+)printf(“%-5d”,ai);/*這里%-5d為格式化輸出控制符,%d表示輸出整型(int)%5d為先輸出5個列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個列空格。*/代碼二為了解決刪除數(shù)組中連續(xù)的元素這個問題,可以先考慮如何刪除數(shù)組里某個元素。我們知道,若
3、要刪除某個元素,其做法就是讓這個元素后面的元素依次向前移動,這樣這個待刪除的元素就會被他后面的元素所替代,這樣依次下去,達到目的。圖示二這里要用到for自增運算,我們根據(jù)上圖列出后面的數(shù)據(jù)覆蓋前面的數(shù)據(jù)的關(guān)系。開始:a3=a4a4=a5a5=a6a6=a7a7=a8a8=a9結(jié)束;由上可以找出替換規(guī)律:an=an+1n為要替換的數(shù)據(jù)元素的數(shù)組下標,這里n+1中止于數(shù)組最后一個元素的下標。由此可見,n是從要刪除的那個元素的數(shù)組下標開始,結(jié)束于最后一個元素的下標減去1。以上圖為列,數(shù)組已經(jīng)初始化為1、6、0、7、12、55、8、4、2、16,刪除數(shù)組這些元素中的7,獲得7的數(shù)組下標3,已知數(shù)組最后
4、一個元素16的數(shù)組下標為9。代碼片段如下:for(i=3;i9;i+)/這里的i是從3開始結(jié)束于8,當i為9時已經(jīng)不執(zhí)行循環(huán)ai=ai+1;代碼三綜合以上,我們不難得到刪除數(shù)組任意元素的C語言源代碼,完整的代碼如下:#include /*頭文件,標準C語言庫函數(shù),包含下面要用的printf()和scanf()*/void main()int a10,i,b; /*這里定義了數(shù)組a10、變量i變量b,這里變量b用于保存刪除元素的位置*/printf(Please give me 10 numbersn);/輸出這行文字for(i=0;i10;i+)/for循環(huán),從09scanf(%d,&ai);
5、/循環(huán)體得到用戶的輸入并且分別賦給a0a9printf(You give me these numbersn);/輸出這行文字for(i=0;i10;i+)printf(“%-5d”,ai);/*這里%-5d為格式化輸出控制符,%d表示輸出整型(int)%5d為先輸出5個列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個列空格。*/printf(nDelete number,give me the location:);/輸出這行文字scanf(%d,&b);/得到用戶的輸入并且賦值給b變量,作為要刪除的元素的位置b-;/這里主要將用戶輸入的“第幾個數(shù)”轉(zhuǎn)化為這個數(shù)的數(shù)組下標for(i=b;i9
6、;i+)/主要環(huán)節(jié),for循環(huán),執(zhí)行刪除ai=ai+1;/依次后面替換前面的for(i=0;i9;i+)/for循環(huán)顯示有效區(qū)的,由于刪掉一個元素,有效區(qū)變?yōu)?printf(“%-5d”,ai);putchar(n);/輸出回車代碼四通過以上,我們已經(jīng)了解了如何刪除數(shù)組里任意一個元素了,但是如何去刪除一段范圍連續(xù)的元素呢?其實我們可以通過兩層for嵌套循環(huán)一個一個去刪除這段范圍的數(shù)組元素。就如下圖所示:圖示三通過以上圖示我們發(fā)現(xiàn)一個有趣的現(xiàn)象,就是說每次我們需要刪除的元素的數(shù)組下標都是固定的,因此我們只需找到這個要刪除范圍的第一個元素的下標,并且根據(jù)這個范圍包含元素的個數(shù)控制刪除次數(shù)就可以達到
7、我們的目的。因此這里需要在上面提到的刪除一個元素的for循環(huán)代碼上再加上一個控制刪除次數(shù)的循環(huán)代碼即可。下面根據(jù)上圖列出關(guān)系如下:循環(huán)次數(shù)s=6-3+1=4開始:s=1while(s5)a3=a4a4=a5a5=a6a6=a7a7=a8a8=a9s+;結(jié)束;下面的代碼通過嵌套for實現(xiàn)目的:for(i=0;i(6-3+1);i+)for(j=3;j9;j+)/這里的for和上面講的刪除一個元素的原理一樣aj=aj+1;代碼五下面的代碼通過外嵌套while實現(xiàn)目的:i=0;/初始i為0while(i(6-3+1)for(j=3;j9;j+)/這里的for和上面講的刪除一個元素的原理一樣aj=aj
8、+1;i+;代碼六下面的代碼通過外嵌套dowhile實現(xiàn)目的:i=0;/初始i為0dofor(j=3;j9;j+)/這里的for和上面講的刪除一個元素的原理一樣aj=aj+1;i+; while(i(6-3+1);代碼七綜上,我們可以得到第一個問題的具體C語言代碼(for嵌套):#include void main()int a10,i,j,b,c; /*這里定義了數(shù)組a10、變量i、變量j、變量b、變量c,這里變量b用于保存刪除元素群的起始位置c用來保存中止位置*/printf(Please give me 10 numbersn);/輸出這行文字for(i=0;i10;i+)/for循環(huán),
9、從09scanf(%d,&ai);/循環(huán)體得到用戶的輸入并且分別賦給a0a9printf(You give me these numbersn);/輸出這行文字for(i=0;i10;i+)printf(“%-5d”,ai);/*這里%-5d為格式化輸出控制符,%d表示輸出整型(int)%5d為先輸出5個列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個列空格。*/printf(nI want delete numbers from:);scanf(%d,&b);printf(To:);scanf(%d,&c);b-;/將b轉(zhuǎn)換為這個數(shù)的數(shù)組下標c-;/同上for(i=0;i(c-b+1);i+
10、)for(j=b;j9;j+)/這里的for和上面講的刪除一個元素的原理一樣aj=aj+1;for(i=0;i10-(c-b+1);i+)/for循環(huán)顯示有效區(qū)的printf(“%-5d”,ai);putchar(n);/輸出回車代碼八寫到這里似乎我又想到一個比較高效率的算法,分享如下:圖示四這里可以跳躍替換,以上圖為例,列出關(guān)系如下:開始:a3=a7a4=a8a5=a9結(jié)束;好,到這里我們輸出a0a5六個元素,你會發(fā)現(xiàn)這個方法似乎比上個方法還要簡單而且效率高,但怎樣實現(xiàn)呢?具體方法如下:得到要刪除元素的個數(shù)s這里通過數(shù)組下標運算很容易得到s=6-3+1=4得到要刪除元素最后個元素到數(shù)組最后元
11、素的包含元素個數(shù),還是通過數(shù)組下標得到h=9-6=3算出刪除后數(shù)組元素個數(shù)t=9-4=5for循環(huán)如下:j=3;/*得到要刪除元素最后個元素到數(shù)組最后元素的包含元素個數(shù),還是通過數(shù)組下標得到h=9-6=3*/for(i=0;ih;i+)aj+=a7+i;代碼九最后輸出需要這樣/算出刪除后數(shù)組元素個數(shù)t=9-4=5for(i=0;i(t+1);i+)printf(“%-5d”,ai);代碼十最終C語言代碼如下:#include void main()int a10,i,j,b,c,h; /*這里定義了數(shù)組a10、變量i、變量j、變量b、變量c、變量h,這里變量b用于保存刪除元素群的起始位置c用來
12、保存中止位置,h的作用見上文*/printf(Please give me 10 numbersn);/輸出這行文字for(i=0;i10;i+)/for循環(huán),從09scanf(%d,&ai);/循環(huán)體得到用戶的輸入并且分別賦給a0a9printf(You give me these numbersn);/輸出這行文字for(i=0;i10;i+)printf(“%-5d”,ai);/*這里%-5d為格式化輸出控制符,%d表示輸出整型(int)%5d為先輸出5個列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個列空格。*/printf(nI want delete numbers from:);
13、scanf(%d,&b);printf(To:);scanf(%d,&c);b-;/將b轉(zhuǎn)換為這個數(shù)的數(shù)組下標c-;/同上h=9-c;j=b;for(i=0;ih;i+)aj+=ac+1+i;for(i=0;i5for(i=9;i5;i-)ai+1=ai;代碼十二最后別忘了把要插入的數(shù)字插入到這個移動過的數(shù)組里_。使用ai+1=26;/這里i經(jīng)過上面循環(huán)變?yōu)?所以需要再加上1整理一下方法,可以通過下面的C語言代碼實現(xiàn)單元素的插入:#include void main()int a20,i, b,c; /*這里定義了數(shù)組a20、變量i、變量b、變量c,這里變量b用于保存插入元素的位置c用來保存要
14、插入的元素*/printf(Please give me 10 numbersn);/輸出這行文字for(i=0;i10;i+)/for循環(huán),從09scanf(%d,&ai);/循環(huán)體得到用戶的輸入并且分別賦給a0a9printf(You give me these numbersn);/輸出這行文字for(i=0;ib-1;i-)ai+1=ai;ai+1=c;for(i=0;i11;i+)/for循環(huán)顯示有效區(qū)的printf(%-5d,ai);putchar(n);/輸出回車代碼十三好,對于單個元素的插入我們研究到這里,下面再來看這個關(guān)于選定元素進行分類的問題,對于這個問題,我的想法可能比較
15、復(fù)雜,需要用到插入和刪除的方法。循環(huán)讀取數(shù)組元素并且與數(shù)組內(nèi)的這個元素b進行比較,滿足條件,b元素前面或者后面自動移出一個位置用于存放這個元素,同時刪除原有位置的這個元素,說起來比較麻煩,還是先看圖示(下圖是將小于這個固定元素b的排前面,大于的排后面):圖示六可能有點夸張,但理清思路,下面繼續(xù):大家可能注意到上圖中8是個特殊的元素,這個元素起主要作用,數(shù)組中其它元素將與她進行比較,比她大的將排到其右邊(后面),比她小的將排到她左邊(前面)。這里需要進行比較也就是if語句;注意我們將與8一樣大的歸類于比8小的排到左邊(前面)?,F(xiàn)在思路有了,先枚舉數(shù)組元素但跳過8這個元素,為保險起見,可以記錄下其
16、數(shù)組下標。循環(huán)開始,如果一個元素比8小并且在8的后面,我們就在8前面移動空個位置用于插入這個元素,在插入完成后,我們需要刪除原有位置的這個元素,同理如果比8大且在8的前面,我們就在8后面移動空個位置用于插入這個元素,當然也要刪除原有位置的這個元素。這樣外循環(huán)一次即可。外循環(huán)代碼如下:for(i=0;i10;i+)if(i!=6)/程序代碼在這里代碼十四比較代碼如下:if(ai6)/a6前面空出位置插入ai并刪除原位置ai,a6變?yōu)閍7else if(aia6&i6)/ a6后面空出位置插入ai并刪除原位置ai,a6變?yōu)閍5代碼十五綜上關(guān)鍵代碼如下:s=6;/記錄位置for(i=0;i10;i+)if(i!=s)if(ais)/a6前面空出位置插入ai并刪除原位置ai,a6變?yōu)閍7for(j=9;j(s-1-1);j-)aj+1=aj;aj+1=ai;for(j=i;jas&i(s+1-1);j-)aj+1=aj;aj+1=ai;for(j=i;j9;
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人教版小升初數(shù)學(xué)專項訓(xùn)練-雞兔同籠(含答案)
- 精彩視頻分享廣告設(shè)計師試題及答案
- 2024紡織品設(shè)計師證書考試重要試題及答案
- 生理學(xué)解剖試題及答案
- 冰雕設(shè)計考試題及答案
- 保密在線考試題庫及答案
- .net專業(yè)面試題目及答案
- 市場競爭下的紡織研發(fā)戰(zhàn)略試題及答案
- 開發(fā)潛能的廣告設(shè)計師考試試題及答案
- 新聞夜航考試題及答案
- 韋氏測試題及答案
- 歷年貴州特崗試題及答案
- 2025怎樣正確理解全過程人民民主的歷史邏輯、實踐邏輯與理論邏輯?(答案3份)
- 國家開放大學(xué)《工具書與文獻檢索》形考任務(wù)1-4參考答案及作業(yè)1
- GB/T 45501-2025工業(yè)機器人三維視覺引導(dǎo)系統(tǒng)通用技術(shù)要求
- 淺談南京市區(qū)地形地貌和工程地質(zhì)層構(gòu)成
- 北師大版四年級數(shù)學(xué)下冊第五單元 認識方程標準檢測卷(含答案)
- 人工智能在環(huán)保領(lǐng)域的應(yīng)用及挑戰(zhàn)
- 2025年陜西省初中學(xué)業(yè)水平考試英語 例析與指導(dǎo) 試卷示例題答案及聽力材料
- 泉州地理會考題目及答案
- 2025年工會知識競賽題庫200題及答案(完整版)
評論
0/150
提交評論