




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序設(shè)計(jì)算法與實(shí)現(xiàn)一、數(shù)據(jù)結(jié)構(gòu)給定一段數(shù)組a20(為了便于以后的插入移動(dòng)操作,這里我們給這個(gè)數(shù)組分配的空間大些)初始化10個(gè)數(shù),即a0a9。原數(shù)組為a0a19大小,我們只用了a0a9,因此稱這段區(qū)域?yàn)橛行^(qū)域。當(dāng)然刪除有效區(qū)域的數(shù)據(jù)元素,有效區(qū)要變小。最后只輸出有效區(qū)。圖示一問題一:如何刪除數(shù)組里一段連續(xù)的數(shù)據(jù)?先定義數(shù)組a10,用于存放10個(gè)數(shù)字,由于是向前覆蓋刪除數(shù)據(jù),所以這里可以不需要多定義空間。有效區(qū)域是a0a9上面是為這個(gè)數(shù)組分配了空間,下面需要初始化數(shù)組.初始化數(shù)組有兩種方法,一種是定義后直接賦值初始化,一種是用戶輸入用scanf接收后賦值初始化,第一種明顯沒有第二種靈活,建議使用
2、第二種做法。代碼片段如下int a10,i;/這里定義了數(shù)組a10和變量ifor(i=0;i10;i+)scanf(“%d”,&ai);代碼一上述代碼用一個(gè)for循環(huán)讓用戶自己輸入數(shù)值進(jìn)行a10的初始化。為檢驗(yàn)初始化的結(jié)果,我們可以將a0a9的初始化數(shù)值也用for循環(huán)配合printf輸出出來,代碼如下:for(i=0;i10;i+)printf(“%-5d”,ai);/*這里%-5d為格式化輸出控制符,%d表示輸出整型(int)%5d為先輸出5個(gè)列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個(gè)列空格。*/代碼二為了解決刪除數(shù)組中連續(xù)的元素這個(gè)問題,可以先考慮如何刪除數(shù)組里某個(gè)元素。我們知道,若
3、要?jiǎng)h除某個(gè)元素,其做法就是讓這個(gè)元素后面的元素依次向前移動(dòng),這樣這個(gè)待刪除的元素就會(huì)被他后面的元素所替代,這樣依次下去,達(dá)到目的。圖示二這里要用到for自增運(yùn)算,我們根據(jù)上圖列出后面的數(shù)據(jù)覆蓋前面的數(shù)據(jù)的關(guān)系。開始:a3=a4a4=a5a5=a6a6=a7a7=a8a8=a9結(jié)束;由上可以找出替換規(guī)律:an=an+1n為要替換的數(shù)據(jù)元素的數(shù)組下標(biāo),這里n+1中止于數(shù)組最后一個(gè)元素的下標(biāo)。由此可見,n是從要?jiǎng)h除的那個(gè)元素的數(shù)組下標(biāo)開始,結(jié)束于最后一個(gè)元素的下標(biāo)減去1。以上圖為列,數(shù)組已經(jīng)初始化為1、6、0、7、12、55、8、4、2、16,刪除數(shù)組這些元素中的7,獲得7的數(shù)組下標(biāo)3,已知數(shù)組最后
4、一個(gè)元素16的數(shù)組下標(biāo)為9。代碼片段如下:for(i=3;i9;i+)/這里的i是從3開始結(jié)束于8,當(dāng)i為9時(shí)已經(jīng)不執(zhí)行循環(huán)ai=ai+1;代碼三綜合以上,我們不難得到刪除數(shù)組任意元素的C語言源代碼,完整的代碼如下:#include /*頭文件,標(biāo)準(zhǔn)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個(gè)列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個(gè)列空格。*/printf(nDelete number,give me the location:);/輸出這行文字scanf(%d,&b);/得到用戶的輸入并且賦值給b變量,作為要?jiǎng)h除的元素的位置b-;/這里主要將用戶輸入的“第幾個(gè)數(shù)”轉(zhuǎn)化為這個(gè)數(shù)的數(shù)組下標(biāo)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ū)的,由于刪掉一個(gè)元素,有效區(qū)變?yōu)?printf(“%-5d”,ai);putchar(n);/輸出回車代碼四通過以上,我們已經(jīng)了解了如何刪除數(shù)組里任意一個(gè)元素了,但是如何去刪除一段范圍連續(xù)的元素呢?其實(shí)我們可以通過兩層for嵌套循環(huán)一個(gè)一個(gè)去刪除這段范圍的數(shù)組元素。就如下圖所示:圖示三通過以上圖示我們發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象,就是說每次我們需要?jiǎng)h除的元素的數(shù)組下標(biāo)都是固定的,因此我們只需找到這個(gè)要?jiǎng)h除范圍的第一個(gè)元素的下標(biāo),并且根據(jù)這個(gè)范圍包含元素的個(gè)數(shù)控制刪除次數(shù)就可以達(dá)到
7、我們的目的。因此這里需要在上面提到的刪除一個(gè)元素的for循環(huán)代碼上再加上一個(gè)控制刪除次數(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實(shí)現(xiàn)目的:for(i=0;i(6-3+1);i+)for(j=3;j9;j+)/這里的for和上面講的刪除一個(gè)元素的原理一樣aj=aj+1;代碼五下面的代碼通過外嵌套while實(shí)現(xiàn)目的:i=0;/初始i為0while(i(6-3+1)for(j=3;j9;j+)/這里的for和上面講的刪除一個(gè)元素的原理一樣aj=aj
8、+1;i+;代碼六下面的代碼通過外嵌套dowhile實(shí)現(xiàn)目的:i=0;/初始i為0dofor(j=3;j9;j+)/這里的for和上面講的刪除一個(gè)元素的原理一樣aj=aj+1;i+; while(i(6-3+1);代碼七綜上,我們可以得到第一個(gè)問題的具體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個(gè)列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個(gè)列空格。*/printf(nI want delete numbers from:);scanf(%d,&b);printf(To:);scanf(%d,&c);b-;/將b轉(zhuǎn)換為這個(gè)數(shù)的數(shù)組下標(biāo)c-;/同上for(i=0;i(c-b+1);i+
10、)for(j=b;j9;j+)/這里的for和上面講的刪除一個(gè)元素的原理一樣aj=aj+1;for(i=0;i10-(c-b+1);i+)/for循環(huán)顯示有效區(qū)的printf(“%-5d”,ai);putchar(n);/輸出回車代碼八寫到這里似乎我又想到一個(gè)比較高效率的算法,分享如下:圖示四這里可以跳躍替換,以上圖為例,列出關(guān)系如下:開始:a3=a7a4=a8a5=a9結(jié)束;好,到這里我們輸出a0a5六個(gè)元素,你會(huì)發(fā)現(xiàn)這個(gè)方法似乎比上個(gè)方法還要簡(jiǎn)單而且效率高,但怎樣實(shí)現(xiàn)呢?具體方法如下:得到要?jiǎng)h除元素的個(gè)數(shù)s這里通過數(shù)組下標(biāo)運(yùn)算很容易得到s=6-3+1=4得到要?jiǎng)h除元素最后個(gè)元素到數(shù)組最后元
11、素的包含元素個(gè)數(shù),還是通過數(shù)組下標(biāo)得到h=9-6=3算出刪除后數(shù)組元素個(gè)數(shù)t=9-4=5for循環(huán)如下:j=3;/*得到要?jiǎng)h除元素最后個(gè)元素到數(shù)組最后元素的包含元素個(gè)數(shù),還是通過數(shù)組下標(biāo)得到h=9-6=3*/for(i=0;ih;i+)aj+=a7+i;代碼九最后輸出需要這樣/算出刪除后數(shù)組元素個(gè)數(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個(gè)列空格再輸出數(shù)字,%-5d為先輸出數(shù)字后輸出5個(gè)列空格。*/printf(nI want delete numbers from:);
13、scanf(%d,&b);printf(To:);scanf(%d,&c);b-;/將b轉(zhuǎn)換為這個(gè)數(shù)的數(shù)組下標(biāo)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ù)字插入到這個(gè)移動(dòng)過的數(shù)組里_。使用ai+1=26;/這里i經(jīng)過上面循環(huán)變?yōu)?所以需要再加上1整理一下方法,可以通過下面的C語言代碼實(shí)現(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);/輸出回車代碼十三好,對(duì)于單個(gè)元素的插入我們研究到這里,下面再來看這個(gè)關(guān)于選定元素進(jìn)行分類的問題,對(duì)于這個(gè)問題,我的想法可能比較
15、復(fù)雜,需要用到插入和刪除的方法。循環(huán)讀取數(shù)組元素并且與數(shù)組內(nèi)的這個(gè)元素b進(jìn)行比較,滿足條件,b元素前面或者后面自動(dòng)移出一個(gè)位置用于存放這個(gè)元素,同時(shí)刪除原有位置的這個(gè)元素,說起來比較麻煩,還是先看圖示(下圖是將小于這個(gè)固定元素b的排前面,大于的排后面):圖示六可能有點(diǎn)夸張,但理清思路,下面繼續(xù):大家可能注意到上圖中8是個(gè)特殊的元素,這個(gè)元素起主要作用,數(shù)組中其它元素將與她進(jìn)行比較,比她大的將排到其右邊(后面),比她小的將排到她左邊(前面)。這里需要進(jìn)行比較也就是if語句;注意我們將與8一樣大的歸類于比8小的排到左邊(前面)?,F(xiàn)在思路有了,先枚舉數(shù)組元素但跳過8這個(gè)元素,為保險(xiǎn)起見,可以記錄下其
16、數(shù)組下標(biāo)。循環(huán)開始,如果一個(gè)元素比8小并且在8的后面,我們就在8前面移動(dòng)空個(gè)位置用于插入這個(gè)元素,在插入完成后,我們需要?jiǎng)h除原有位置的這個(gè)元素,同理如果比8大且在8的前面,我們就在8后面移動(dòng)空個(gè)位置用于插入這個(gè)元素,當(dāng)然也要?jiǎng)h除原有位置的這個(gè)元素。這樣外循環(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國家用光脫毛器具行業(yè)市場(chǎng)全景分析及前景機(jī)遇研判報(bào)告
- 中醫(yī)培訓(xùn)課件 哪些
- 2025年中國車床行業(yè)市場(chǎng)深度評(píng)估及投資策略咨詢報(bào)告
- 中國幕墻裝飾板市場(chǎng)規(guī)模預(yù)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- 2025年 重慶市長(zhǎng)壽區(qū)教育事業(yè)單位定向招聘考試筆試試題附答案
- 2025年 新疆鐵道職業(yè)技術(shù)學(xué)院招聘考試筆試試題附答案
- 2025年 楚雄州楚雄市緊密型醫(yī)共體編制外職工招聘筆試試題附答案
- 中國蔬菜種場(chǎng)運(yùn)植市場(chǎng)競(jìng)爭(zhēng)格局及行業(yè)投資前景預(yù)測(cè)報(bào)告
- 2025年中國展會(huì)展覽行業(yè)發(fā)展趨勢(shì)預(yù)測(cè)及投資戰(zhàn)略咨詢報(bào)告
- (立項(xiàng)備案申請(qǐng)模板)重鈣粉項(xiàng)目可行性研究報(bào)告參考范文
- 消防工程火災(zāi)自動(dòng)報(bào)警及聯(lián)動(dòng)控制系統(tǒng)安裝施工方案
- 工程竣工結(jié)算協(xié)議書
- 2024年江西省初中學(xué)業(yè)水平考試地理試題含答案
- 《理想國》導(dǎo)讀學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 四川省南充市語文小升初試卷及解答參考(2024-2025學(xué)年)
- 2024屆湖南省普通高等學(xué)校對(duì)口招生考試語文試題
- GB/T 44302-2024碳纖維增強(qiáng)塑料和金屬組合件拉伸搭接剪切強(qiáng)度的測(cè)定
- 敘事療法課件
- 《Python編程基礎(chǔ)》課程標(biāo)準(zhǔn)
- 2024年人教版小學(xué)四年級(jí)科學(xué)(下冊(cè))期末試卷及答案
- 2023-2024學(xué)年全國小學(xué)二年級(jí)下英語人教版期末考卷(含答案解析)
評(píng)論
0/150
提交評(píng)論