



版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言中常見算法總結(jié)ー、函數(shù)部分常見算法(1)函數(shù)fun的功能是,從低位開始取出長(zhǎng)整型變量S中的奇數(shù)位上的數(shù),依次構(gòu)成一個(gè)新數(shù)放在t中。高位仍在高位,低位仍在低位。例如,當(dāng)s中的數(shù)為:7654321時(shí),t中的數(shù)為:7531.請(qǐng)改正程序中的錯(cuò)誤,使它能得出正確的結(jié)果。這是二級(jí)上機(jī)題中比較常見的類型,主要內(nèi)容是從一個(gè)數(shù)中取出ー些位,再組成一個(gè)新數(shù)的過(guò)程,那么取每個(gè)位的方法有兩種,而組成新數(shù)的方法也有兩種方法。取出每一位的方法一:用ー個(gè)數(shù)與10取余,那么該值就是數(shù)的最后一位,再將原數(shù)與10求商,那么該商就相當(dāng)于將原數(shù)的個(gè)位去掉。再次重復(fù)上述過(guò)程。求每一位的方法二:那就是用這個(gè)數(shù)與最高位的位權(quán)求商,之后再用該數(shù)與最高位的位權(quán)求余。然后再次重復(fù)上述過(guò)程。組數(shù)的方法一:由低到高組數(shù)時(shí),每一位乘以位權(quán),求和即可。組數(shù)的方法二:將變量置為0,每次將該變量乘以10再加新數(shù),不斷重復(fù)即可。下面看ー下這個(gè)程序我們的寫法。include4*stdio.h^^intfun(intn){inti,s=0,k=l;for(i=n;i>0;i=i/l00,k=k*10)s=s+i%10*k;returns;main(){intn,m;scanf("%d",&n);m=fun(n);printf("%d\n”,m);對(duì)于這個(gè)題目只有這樣寫オ是最簡(jiǎn)單,其他的寫法也可以寫,但是相對(duì)比較復(fù)雜。(2)函數(shù)fun的功能是:計(jì)算正整數(shù)num的各位商的數(shù)字之積。例如,若輸入:202〇則輸出應(yīng)該是:〇〇include4*stdio.h^^intfun(intn){inti=l;for(;n>0;n=n/10)i*=n%IO;returni;main(){intn,m;scanf("%d”,&n);m=fun(n);printf("%d\n”,m);(3)函數(shù)fun的功能是:判斷ー個(gè)數(shù)是否是回環(huán)數(shù),如果是返回值為1,不是返回值為0?;丨h(huán)數(shù)指的是對(duì)稱的數(shù),如121,1331就是回環(huán)數(shù),而1323則不是回環(huán)數(shù)。includenstdio.hMintfun(intn){inti,s=0,k=n;for(;k;k=k/10)s=s*10+k%10; /?將n的值倒過(guò)來(lái)?/if(s==n) /*如果調(diào)換以后的值與原值相等,則說(shuō)明是回環(huán)數(shù)?/return1;return0;main(){intn,m;scanfC'%dM,&n);m=fun(n);if(m==l)printf("%d是回環(huán)數(shù)、n”,n);elseprintf(M%d不是回環(huán)數(shù)ゝn",n);(4)給定程序中,函數(shù)fun的功能是:找出100至x(x《999)之間各位上的數(shù)字之和為15的所有整數(shù),然后輸出:符合條件的整數(shù)個(gè)數(shù)作為函數(shù)值返回#include"stdio.h"intfun()intn,k=0,sum,i;fdr(n=100;n<1〇00;n++)fdr(i=n,sum=0;i;i=i/10)sum+=i%10;if(sum==15)printf(M%4dM,n);k++;returnk;main()intn;n=fun();printf(M\n共有%d個(gè)各位數(shù)字上和為15的元素!\nM,n);(5)函數(shù)fun的功能是:找出100?999之間(含100和999)所有整數(shù)中各位上數(shù)字之和為x(x為宜正整數(shù))的整數(shù),然后輸出;符合條件的整數(shù)個(gè)數(shù)作為函數(shù)值返回。例如,當(dāng)x值為5時(shí),10〇?999之間各位上數(shù)字之和為5的整數(shù)有:104、113、122、131、140、203、212、230、302、311、320、401、410、500。共有15個(gè)。當(dāng)x值為27時(shí),各位數(shù)字之和為2フ的整數(shù)是:999〇只有一個(gè)。includeustdio.hHintfun(intx)intn,k=O,sum,i;for(n=100;n<100〇;n++)fbr(i=n,sum=O;i;i=i/10)sum+=i%10;if(sum==x)printf(,,%4d,,,n);k++;returnk;main()intn,x;printf("請(qǐng)輸入你需要的各位數(shù)字之和:り;scanf(”%d”,&x);n=fun(x);printf(M\n共有%d個(gè)各位數(shù)字上和為%a的元素!\n",n,x);(6)函數(shù)fun的功能是:從低位開始取出長(zhǎng)整型變量s中偶數(shù)位上的數(shù),依次構(gòu)成一個(gè)新數(shù)放在t中。高位仍在高位,低位仍在低位,include飛tdio.h"intfun(intn)ints=0,k=l;for(;n;n=n/10)if(n%2==0) /*ー個(gè)數(shù)的奇偶性由其個(gè)位決定。*/s+=n%10*k;k=k*10;returns;main()intn,m;scanf(,,%d,\&n);m=fun(n);printf(n%d\nn,m);(7)函數(shù)fun的功能是:將形參n中,各位上為偶數(shù)的數(shù)取出,并按原來(lái)從高位到低位相反的順序組成一個(gè)新的數(shù),并作為函數(shù)值返回。例如:輸入ー個(gè)整數(shù):27638496,函數(shù)返回值為64862。include"stdio.h"intfun(intn)ints=0;for(;n;n=n/10)if(n%2==0)s=s*10+n%10;returns;main()intn,m;scanf("%d”,&n);m=fun(n);printf(M%d\nM,m);(8)函數(shù)fun的功能是:將兩個(gè)兩位的正整數(shù)a、b合并形成一個(gè)新整數(shù)放在c中。合并的方式是:將a數(shù)的十位和個(gè)位數(shù)依次放在c數(shù)的千位和十位上,b數(shù)的十位和個(gè)位數(shù)依次放在c數(shù)的百位和個(gè)位上。例如,當(dāng)a=45,b=12時(shí),調(diào)用該函數(shù)后,¢=4152,這類題型是上機(jī)題中比較常見也是比較簡(jiǎn)單的題。在這里雖然用到了指針,但是并不影響作這道題。這類題的思路是先取出a,b的每一位,后再將其組合成。voidfun(inta,intb,int*c)*c=a/10*1000+a%10*10+b/l0*100+b%10;main()inta,b,c;scanf(M%d%d,,,&a,&b);fun(a,b,&c);printfC4a=%d,b=%d,c=%d\n,\a,b,c);(9)素?cái)?shù)問(wèn)題:如函數(shù)fun的功能是:計(jì)算并輸出high以內(nèi)最大的10個(gè)素?cái)?shù)之和。High的值由主函數(shù)傳給fun函數(shù)intfun(inthigh)intsum=0;inti,j=0;for(high—;j<10;high—)for(i=2;i<high;i++)if(high%i==O)break; /?如果有一個(gè)i能夠把high整除,則說(shuō)明high不是素?cái)?shù),則循環(huán)終止?/if(high==i) /?表示其是素?cái)?shù)?/sum+=high;j++;二;main()intn,sum;scanf(H%d",&n);sum=fun(n);printf("小于%d的10個(gè)數(shù)的素?cái)?shù)的和是%d\n”,n,sum);(10)fun的功能是:判斷ー個(gè)整數(shù)是否是素?cái)?shù),若是返回1,否則返回0。include"stdio.h"intfun(intn)inti;for(i=2;i<n;i++)if(n%i==0)return0;return1;main()intn,m;scanf(n%d",&n);m=fun(n);if(m==l)printf("這個(gè)數(shù)是素?cái)?shù)!'n");elseprintf("這個(gè)數(shù)不是素?cái)?shù)!'n");(11)請(qǐng)編寫函數(shù)fun,其功能是:計(jì)算并輸出3到n之間(含3和n)所有素?cái)?shù)的平方根之和例如,在主函數(shù)中從鍵盤給n輸入100后,輸出為:sum=148.874270o注意:要求n的值大于2但不大于100。includeustdio.hHinclude"math.h"doublefun(intn)inti;doublesum=0;for(;n>=3;n—)fdr(i=2;i<n;i++)if(n%i==0)break;if(n==i) /?表示是素?cái)?shù)時(shí)應(yīng)該求平方根的和?/sum+=sqrt(n);returnsum;main()intn;doublesum;scanf("%d”,&n);sum=fun(n);printf("小于%d的素?cái)?shù)的平方根的和是%f\n”,n,sum);(12)函數(shù)fun的功能是:計(jì)算小于形參k的最大的10個(gè)能被13或17整除的自然數(shù)之和。k的值由主函數(shù)傳入,若k的值為500,則函數(shù)值為4622。include"stdio.h"include"math.h"intfun(intn)intsum=0,i=0;for(n—;i<10;n—)if(n%13==0||n%17==0)sum+=n;i++;returnsum;main()intn,sum;scanf(”%d”,&n);sum=fun(n);printf("小于%d的10個(gè)能被13或17整除的數(shù)和是%d\n”,n,sum);(13)請(qǐng)編寫函數(shù)fun,其功能是:計(jì)算并輸出n(包括n)以內(nèi)能被5或9整除的所有自然數(shù)的倒數(shù)之和。例如,在主函數(shù)中,從鍵盤給n輸入20后,輸出為:s=0.583333。注意:要求n的值不大于100。include"stdio.1Tinclude"math.h"doublefun(intn)inti;doublesum=0;fbr(i=l;i<=n;i++)if(i%5==0||i%9==0)sum+=1.0/i;returnsum;main()intn;doublesum;scanfC'%dM,&n);sum=fun(n);printf("小于%d的素?cái)?shù)的5或9的倒數(shù)和是%f\n”,n,sum);(14)中函數(shù)fun的功能是:根據(jù)形參m,計(jì)算如下公式的值。1 1t=1+ + + + 3 m#include“stdio.h"doublefun(intm)doubles=0;inti;fbr(i=l;i<=m;i++)s+=1.0/i;returns;main()intm;doubles;scanf("%d",&m);s=fun(m);printf(M%f,,s);(15)函數(shù)fun的功能是:用下面的公式求”的近似值,直到最后ー項(xiàng)的絕對(duì)值小于指定的數(shù)(參數(shù)num)為止:n 1 1 1I - ???+??????4 3 5 7這類題是C語(yǔ)言的上機(jī)考試中的ー類常見的考題,在這類題中的特點(diǎn)都是有一個(gè)公式,或者說(shuō)是ー個(gè)級(jí)數(shù)式,筆者把這類題稱為級(jí)數(shù)求和的問(wèn)題,那么這類題的思路是什么呢?我們應(yīng)該從每ー項(xiàng)入手,也就是說(shuō)首先求出通項(xiàng)公式,有很多題再由通項(xiàng)來(lái)求出來(lái)遞推關(guān)系,我們可以依據(jù)通項(xiàng)或遞推關(guān)系來(lái)編寫程序。本題中的每ー項(xiàng)有符號(hào)的變化,那么我們可以把每ー項(xiàng)分解分成符號(hào)和值,符號(hào)每ー項(xiàng)ー變號(hào),而值則是所有奇數(shù)的倒數(shù),所以我們可以在計(jì)算每ー項(xiàng)時(shí)把符號(hào)與值的乘積累加即可。另外在這道題中我們可注意給定的pi/4的公式,但是要求的卻是pi。include"stdio.h"include"math.hMdoublefun(doubleeps)doubles=O,t=l; /*t表示符號(hào)?/inti;for(i=0;1.0/(2*i+l)>eps;i++) /?注意當(dāng)精度小于eps時(shí)循環(huán)停止,那就說(shuō)明當(dāng)ー項(xiàng)大于eps時(shí)循環(huán)繼續(xù)。*/s+=l.O/(2*i+l)*t;t=-t;return4*s;main()doubleeps,pi;scanf(M%ir,&eps);pi=fun(eps);printffpi的值為%ハガ疝);(16)函數(shù)fun的功能是:計(jì)算X2X3 X4 xnf(X)=l+x + +…+(T尸 +(-l)nt 2! 3! 4! (n-1)! n!的前n項(xiàng)之和。若x=2.5,n=は函數(shù)值為:1.917914。include"stdio.1Tdoublefun(intn,doublex)inti,t=l;doubles=l,a=l;fbr(i=l;i<=n;i++)a=a*x/i;s+=a*t;t=-t;returns;main()doublex,s;intn;scanf(n%d%lf;&n,&x);s=fun(n,x);printf(w%lf\s);(17)請(qǐng)編寫ー個(gè)函數(shù)fun,它的功能是:根據(jù)以下公式求れ的值(要求滿足精度0.0005,即某項(xiàng)小于。.0005時(shí)停止迭代):IT1+Ix2+lx2x3++ 1x2x...x2 33x53x5x7 3x5x...x(2n+l)程序運(yùn)行后,如果輸入精度0.0005,則程序輸出為3.14…對(duì)于這個(gè)程序我們可以從通項(xiàng)入手,通項(xiàng)是ー"ユ*…X"—,由此可知道遞推關(guān)系3x5x...x(2〃+l)是an=an.i*n/(2*n+l)由此可知我們的程序是:include44stdio.h^^include“math.h”doublefun()inti;doublea=l,s=l;for(i=l;a>0.0005;i++)a=a*i/(2*i+l);s+=a;return2*s;main()doubles;s=fun();(18)給ー個(gè)實(shí)數(shù)h,將h四舍五入保留兩位小數(shù).函數(shù)如下:include"stdio.h"floatfun(floath){return(int)(h*100+0.5)/100.0;} /?一定要注意最后要除以100.〇?/main(){floats;scanfC€%f\&s);s=fun(s);printfr%f;s);}(19)再如:它的功能是:計(jì)算并輸出下列級(jí)數(shù)和:s二」一+-L+…+亠1x22x3 〃(〃+1)當(dāng)n=10時(shí),函數(shù)值為0.909091。我們的同學(xué)看到這道題時(shí),可能會(huì)感覺(jué)很難,其時(shí)可以從數(shù)學(xué)的角度進(jìn)行分析,1/(ド2)可以改成!/1-1/2,1/(2*3),可以寫成1/2-1/3,最終能夠知道是s=l-l/(n+l)也就是n/(n+l),所以我們只要直接把這個(gè)值返回就可以。#include"stdio.h"floatfun(intn){return1.0*n/(n+l);Jmain()intn;floats;scanf("%d”,&n);s=fun(n);printf(n%f;s);}(20)給定程序MODI1.C中函數(shù)fun的功能是:求出以下分?jǐn)?shù)序列的前n項(xiàng)之和。和值通過(guò)函數(shù)值返回到main函數(shù)。2 3 5gl3 211 2 35 8 13例如,若n=5,則應(yīng)輸出:8.391667這道題考查的內(nèi)容是菲波那契級(jí)數(shù),那么在這個(gè)級(jí)數(shù)中每ー項(xiàng)是前兩項(xiàng)的和。我們可以回想一下菲波那契級(jí)數(shù)的寫法:c=a+b;a=b;b=c;將這個(gè)內(nèi)容做為循環(huán)的循環(huán)體,那么得到的每一個(gè)c就是每ー項(xiàng)菲波那契級(jí)數(shù),而本題中要求的是本項(xiàng)與前ー項(xiàng)的商,由此我們就可以寫出來(lái)程序了,但是要注意的事,求商時(shí)一定要注意的是變量不能是整型。doublefun(intn)inti;floata=l,b=1,c=2,sum=0;for(i=0;i<n;i++)c=a+b;sum+=c/b;a=b;b=c;returnsum;main()intn;floats;scanf("%d",&n);s=fun(n);printf("%1s);(21)編寫函數(shù)fun,它的功能是:求Fibonacci數(shù)列中大于t的最小的ー個(gè)數(shù),結(jié)果由函數(shù)返回。其中Fibonacci數(shù)列F(n)的定義為:F(0)=l,F(l)=l*,,F(n)=F(n-1)+F(n-2)例如:當(dāng)t=1000時(shí),函數(shù)值為1597intfun(intn)inti,sum=0;floata=l,b=l,c=2;fbr(;c<=n;)c=a+b;sum+=c/b;a=b;b=c;returnc;main()intn,s;scanf("%d",&n);s=fun(n);printf("%d\n”,s);(22)函數(shù)fun的功能是:計(jì)算并輸出S=1+(1+,^2)+(1+,^2+^3)+ 例如,在主函數(shù)中從鍵盤給n輸入20后,輸出為:s=534.188884。注意:要求n的值大于1但不大于100。在這種程序中的分析方法都是將通項(xiàng)寫出來(lái),由通項(xiàng)來(lái)推出來(lái)遞推關(guān)系,對(duì)于本題中通項(xiàng)是(1+V2+Vs+,0?Vh)?而遞推關(guān)系是街=齒“+J/;所以這個(gè)程序的寫法是:include“stdio.h"include“math.h"doublefun(intn)inti;doublea=l,s=l;fbr(i=2;i<=n;i++)a+=sqrt(i);s+=a;returns;main()doubles;intn;scanf(t4%d,\&n);s=fun(n);printfC*%f\s);(22)請(qǐng)編寫函數(shù)fun,其功能是計(jì)算:S=71n(l)+ln(2)+ln(3)+ +In(㈤S作為函數(shù)值返回。在C語(yǔ)言中可調(diào)用log(n)求ln(n)。log函數(shù)的引用說(shuō)明是:doublelog(doublex)例如,若m的值為:20,fun函數(shù)值為:6.506583include“stdio.h"include“math.h"doublefun(intn)inti;doubles=0;fbr(i=l;i<=n;i++)s+=log(i);returnsqrt(s);main()intn;doubles;scanf("%d”,&n);s=fun(n);printfC4%r,s);)(23)它的功能是:根據(jù)以下公式求P的值,結(jié)果由函數(shù)值帶回。m與n為兩個(gè)正整數(shù)且要求m>no例如,當(dāng)m=12,n=8時(shí),運(yùn)行結(jié)果為495.000000。這個(gè)程序我們還可以通過(guò)數(shù)學(xué)的方法進(jìn)行分析,m!可以與(m?n)的階乘約掉,這樣就變成了分子有n個(gè)數(shù),分母有n個(gè)數(shù),于是我們可以組成n個(gè)分?jǐn)?shù)的乘積。#include"stdio.h',floatfun(intm,intn)floats=1;fbr(;n;n—,m-)s*=1.0*m/n; /?在這里m,n都是依次減1的,還要注意每ー項(xiàng)必須要用1.0乘。來(lái)將其改變成實(shí)型。*/returns;main()intm,n;floats;scanf("%d%d”,&m,&n);s=fun(m,n);printf("%f',s);;24)函數(shù)fun的功能是:根據(jù)整型形參m,計(jì)算如下公式的值。111i+Ai+Ai+Ai例如:若n=10,則應(yīng)輸出:0.617977本題是ー個(gè)級(jí)數(shù)的內(nèi)容,相當(dāng)于疊代法求方程的根。疊代公式如下:an=l/(l+an.|)則程序可以這樣寫:#include"stdio.h"doublefun(intm)inti;floata=l,b;fbr(i=l;i<m;i+4-)b=l/(l+a);a=b;returnb;main()intn;doubles;scanf(H%d,',&n);s=fun(n);printf(n%r,s);(25)給定程序M0DI1.C中函數(shù)fun的功能是:將十進(jìn)制正整數(shù)m轉(zhuǎn)換成k(2《k《9)進(jìn)制數(shù),并按高位到低位順序輸出。例如,若輸出8和2,則應(yīng)輸出1000(即十進(jìn)制數(shù)8轉(zhuǎn)換成二進(jìn)制表示是1000)。實(shí)際上這道題的內(nèi)容相當(dāng)于取出每一位及組數(shù)的方法,但是要注意的內(nèi)容是如果轉(zhuǎn)換成k進(jìn)制,那么在取每一位的時(shí)候應(yīng)該是k進(jìn)制的每一位,而輸出時(shí)應(yīng)該把該k進(jìn)制的每ー位組成十進(jìn)制的數(shù)。intfun(intm,intk)ints,n=l;fbr(s=0;m;m=m/k,n=n*10)s+=m%k*n; /*在這里m%k表示該進(jìn)制的末位數(shù),而n表示將其表示成十進(jìn)制時(shí)的位權(quán),這是由于顯示該數(shù)時(shí)是顯示成十進(jìn)制。*/returns;main()intm,n,k;scanf("%d%d”,&m,&k);n=fun(m,k);printf("%d的%d進(jìn)制是%d\n”,m,k,n);(26)請(qǐng)編寫函數(shù)fun,它的功能是:計(jì)算并輸出給定整數(shù)n的所有因子(不包括1與n自身)之和。規(guī)定n的值不大于100〇。例如,在主函數(shù)中從鍵盤給n輸入的值為856。則輸出為:sum=763。因子:能把一個(gè)數(shù)整除的數(shù),就是該數(shù)因子。#include"stdio.h',intfun(intn)intsum=0,i;for(i=2;i<=n/2;i++)if(n%i==0) /?如果i能夠把n整除,由說(shuō)時(shí)i是n的因子?/sum+=i;returnsum;main()intn,s;scanf(,,%d,',&n);s=fun(n);printf("%d的因子和是%d\n”,n,s);;27)請(qǐng)編寫ー個(gè)函數(shù)fun,它的功能是:利用以下所示的簡(jiǎn)單迭代方法求方程:cos(x)-x=0的ー個(gè)實(shí)根。xn+i=cos(xn)迭代的步驟如下:取xl初值為0.0;x0=xl,把xl的值賦給x0;xl=cos(x0),求出ー個(gè)新的xl;若xO-xl的絕對(duì)值小于0000001,執(zhí)行步驟(5).否則執(zhí)行步驟(2);所求xl就是方程cos(x)-x=0的一個(gè)實(shí)根,作為函數(shù)值返回,程序?qū)⑤敵鼋Y(jié)果Root=0.739086o#include"stdio.h"#include"math.h"doublefun()doublex0=l,xl=0;for(;fabs(x0-cos(x0))>le-6;)xl=cos(x0);x0=x1;returnxO;)main()(doubles;s=fun();printf(n%lf',s);二、ー維數(shù)組常見算法(1) 數(shù)組的逆置。(20?25分鐘)2 7 19 24 37 49 53 72 32 13voidnordeK^a[],intn)二 =クfbr(i=O;i<n/2;i++)t=a[i];a[i]=a[n-l-i];a[n-l-i]=t;main(){inta[10]={1,2,3,4,5,6,7,8,9,10}/;norder(a,10);fbr(i=0;i<10;i++)printf(M%5dM,a[i]);作為這個(gè)函數(shù)應(yīng)該對(duì)于所有的學(xué)生都應(yīng)該講解。對(duì)于我們所說(shuō)的ー類院校和二類中應(yīng)該用這個(gè)程序把它展開,引入數(shù)組名表示首元素的地址,也可以在寫程序中把循環(huán)中的條件i<n/2改成i<n后,讓學(xué)生去發(fā)現(xiàn)問(wèn)題,爭(zhēng)取引導(dǎo)學(xué)生把這個(gè)問(wèn)題改過(guò)來(lái)。在這里n表示數(shù)組中的元素個(gè)數(shù),并且在這里可以給學(xué)生講解數(shù)組名表示首元素的地址,而數(shù)組名作參數(shù)時(shí),做實(shí)參的也應(yīng)該用數(shù)組名,數(shù)組名表示首元素的地址,那么用到其他元素的地址可不可以?可以讓學(xué)生把數(shù)組名改為a[l]的地址,把n改為n-2,讓學(xué)生看看結(jié)果,自己總結(jié)ー下。從而可以引出數(shù)組中下標(biāo)表示著數(shù)組名所表示的首地址后的第幾個(gè)元素。和此程序相類似的算法是在ー個(gè)數(shù)組中將數(shù)組的前一半元素與數(shù)組的后一半元素互換,如果是奇數(shù)個(gè)元素則后中間元素不動(dòng)。voidnorder(inta[],intn){inti,t,j;if(n%2==0)j=n⑵elsej=n/2+l;
for(i=0;i<n/2;i++,j++)t=a[i];a[i]=a[j];a[j]=t;main(){inta[10]={l,2,3,4,5,6,7,8,9,10),i;norder(aJO);for(i=0;i<10;i++)printf(w%5dM,a[i]);(2)在ー個(gè)有序的一維數(shù)組中插入ー個(gè)元素,保證有序。實(shí)現(xiàn)的過(guò)程:如有如下的數(shù)組,在要這插入13,則應(yīng)該首先查找13所在的位置,應(yīng)該放在7與19之間,や到之后?該從廳向前將產(chǎn)個(gè)元手向后號(hào)動(dòng)。然產(chǎn)再插個(gè)。2 |7 |19 |24 137口9 |53 |思路:由于數(shù)組在混不髭亞!比蠢觥忘贏えメ且存儲(chǔ)空間是連續(xù)的。那么在存入一個(gè)元素以后還要保證其空間的連續(xù)性。于是可以將插入的過(guò)程分為以下幾個(gè)步驟:.定位,在數(shù)組中找到該元素應(yīng)該在的位置。具體做法,由于數(shù)組中有序,插入完元素以后還要保證有序,則插入完以后一定是前面的元素要小于等于他,而后面的元素要大于等于他,所以要找到第一個(gè)大于該值的位置。.找到的該位置,就是要插入元素應(yīng)該在的位置,此時(shí),應(yīng)該將每個(gè)元素向后移動(dòng),將元素向后移動(dòng)時(shí),應(yīng)該注意要從后向前,將每個(gè)元素依次向后移動(dòng)。.插入。#include“stdio.h"defineN10voidinsert(inta[],intk); /?聲明函數(shù),該函數(shù)是以數(shù)組名做參數(shù),k表示要插入的值。*/main(){inta[N]={1,5,8J2,15,23,27,29),i,k; /?將數(shù)組初始化時(shí)只存入8個(gè)值,則a[8],a[9]#放的內(nèi)容為〇,由于要插入元素,所以原數(shù)組內(nèi)必須要有剩余空間。*/printf(“請(qǐng)輸入要插入的元素:'n");scanfT%d”,&k);insert(a,k); /?調(diào)用插入的函數(shù),注意實(shí)參是數(shù)組名?/for(i=0;a[i]!=0;i++)printfT%d5,,a[i]);
voidinsert(inta[],intk)inti,j;for(i=O;a[i]!=O;i++)if(a[i]>k)break;for(j=0;a|j]!=0;j++);/*定位,將i停在第一個(gè)大于k的位置上。?voidinsert(inta[],intk)inti,j;for(i=O;a[i]!=O;i++)if(a[i]>k)break;for(j=0;a|j]!=0;j++);/*定位,將i停在第一個(gè)大于k的位置上。?/for(;j>i;j-)/?/?將每個(gè)元素依次向后移動(dòng)?/a[i]=k;這個(gè)程序應(yīng)該是所有學(xué)生都應(yīng)該講的內(nèi)容,而在三類院校中我們應(yīng)該讓學(xué)生知道數(shù)組名做參數(shù)時(shí)的一些相關(guān)知識(shí),首先,數(shù)組名表示的是首元素的地址,即數(shù)組名是一個(gè)地址常量,對(duì)數(shù)組名不可以再賦值,也不能進(jìn)行自加自減,從而要理解,在數(shù)組中下標(biāo)含義的第二種理解方式:下標(biāo)可以認(rèn)為是數(shù)組名所表示的地址后的第幾個(gè)元素。這種理解方式在做數(shù)組名做參數(shù)的函數(shù)題中很好用,作為三類院校,我們可以將上個(gè)考題放在這個(gè)位置來(lái)講。由這道題可以引出來(lái)在數(shù)組中循環(huán)移位的算法,這個(gè)程序可以給學(xué)生留為作業(yè),也可以上課的實(shí)例來(lái)講,根據(jù)學(xué)生情況來(lái)定,筆者認(rèn)為從上一章開始要開始培養(yǎng)學(xué)生的寫程序的能力。作業(yè):在數(shù)組中將第最后元素移到最前,其余元素每個(gè)元素都向后移動(dòng)ー個(gè)??梢砸龑?dǎo)學(xué)生,由于每個(gè)元素都向后移動(dòng),那么每個(gè)元素向后移動(dòng)時(shí)都會(huì)將后一個(gè)元素覆蓋,所以從方向上應(yīng)該從后向前,每個(gè)元素都向后移動(dòng),那么毫無(wú)疑問(wèn),最后一個(gè)元素一定會(huì)被覆蓋掉的,所以在移動(dòng)之前一定要將最后一個(gè)元素保存,這后再去移動(dòng),所有元素移動(dòng)之后再把保存的最后一個(gè)元素放在最前面的位置。include'*stdio.h^^voidfun(inta[],intn){intt=a[n-lJ,i;for(i=n-l;i>=l;i-)a[i]=a[i-l];a[O]=t;main(){inta[10]={1,2,3,4,5,6,7,8,9,10},1printf(“原數(shù)組內(nèi)容是:");for(i=0;i<10;i++)printf(“%5d”,a[i]);printff'Xn調(diào)換以后的內(nèi)容是:");fun(aJO);fdr(i=0;i<10;i++)printf(“%5d”,a[i]);printf(“5”);、于ー類及二類院校中我們可以再引導(dǎo)學(xué)生,這個(gè)程序是循環(huán)移位ー個(gè)元素,如果給定ー個(gè)m,讓后m個(gè)元素移動(dòng)到前面,而前n?m個(gè)元素依次后移。在把這個(gè)程序解透以后學(xué)生應(yīng)該能夠?qū)懗鰜?lái)這個(gè)程序,那就是在這個(gè)函數(shù)中將移位的外面再加一個(gè)循環(huán)m次的循環(huán)。程序可以寫成如下:include"stdio.h"voidfun(inta[],intn,intm){intt,i;for(;m;m-){t=a[n-l];for(i=n-l;i>O;i-)a[i]=a[i-l];a[O]=t;main(){inta[10]={1,2,3A5,6,7,8,9,10},i,m;printf("原數(shù)組內(nèi)容是:\nH);fdr(i=O;i<10;i++)printf(w%5dM,a[i]);printf(M\n請(qǐng)輸入m的值:'n");scanf(H%dM,&m);printf(M\n調(diào)換以后的內(nèi)容是:");fun(a,10,m);fbr(i=0;i<10;i++)printf(M%5dH,a[i]);printf(n\nH);(3)在ー個(gè)數(shù)組中刪除給定的元素。實(shí)現(xiàn)的過(guò)程:如有如下的數(shù)組,在要這刪除19則應(yīng)該首先查找19所在的位置,然后應(yīng)該從后向前將每個(gè)元素向后移動(dòng)。然后再插入。
思路:刪除的過(guò)程與插入的過(guò)程有些相似之處,都是要先定位,即先找到要?jiǎng)h除的元素。具體步驟如下:將之覆蓋。/?聲明函數(shù),該函數(shù)是以數(shù)組名做參數(shù),將之覆蓋。/?聲明函數(shù),該函數(shù)是以數(shù)組名做參數(shù),k表示要?jiǎng)h除的值。?/.將其后的每個(gè)元素移前移動(dòng),includenstdio.hndefineN10main(){inta[N]={main(){inta[N]={1,5,8,12,15,23,27,29),i,k;/?將數(shù)組初始化時(shí)只存入8個(gè)值,則a[8],a[9]存放的內(nèi)容為〇。?/printf("請(qǐng)輸入要?jiǎng)h除的元素:\n“);scanf(H%dM,&k);/?調(diào)用插入的函數(shù),注意實(shí)參是數(shù)組名?/?調(diào)用插入的函數(shù),注意實(shí)參是數(shù)組名?//*定位,將i停在第一個(gè)等于k的位置上。?//?將每個(gè)元素依次向前移動(dòng)?/for(i=0;a[i]!=0;i++)printfC'%dM,a[i]);printf(n\nH);voiddelete(inta[],intk)inti;for(i=0;a[i]!=0;i++)if(a[i]==k)break;for(;a[i]!=0;i++)a[i]=a[i+l];)由此程序可以引出另ー個(gè)算法就是在ー維數(shù)組中把最前的ー個(gè)元素移動(dòng)到最后ー個(gè)上,而每個(gè)元素都依次向前移動(dòng)。有了以上的三個(gè)程序的基礎(chǔ),那么這個(gè)程序應(yīng)該可以寫出來(lái)的。這個(gè)程序的引導(dǎo)方法與前ー個(gè)程序是相同的。程序如下:include“stdio.h"voidfun(inta[],intn){intt=a[O],i;for(i=0;i<n;i++)a[i]=a[i+l];a[n-l]=t;)main(){inta[10]={l,2,3,4,5,6,7,8,9,10),i;printf(“原數(shù)組內(nèi)容是:");for(i=0;i<10;i++)printf("%5d'',a[i]);printf(i4\n調(diào)換以后的內(nèi)容是:'’);fun(aJO);for(i=0;i<10;i++)printfCl%5d",a[i]);printfC4\n");上一個(gè)程序是將最前ー個(gè)元素移到最后,那么如果現(xiàn)在要將前m個(gè)元素移到最后,后n-m個(gè)元素循環(huán)移位到前面的寫法如何?這個(gè)程序?qū)τ讴`類和二類學(xué)校中的中上等生應(yīng)該能夠?qū)懗鰜?lái)。答案如下:#include"sldio.h"voidfun(inta[],intn,intm){intt,i;for(;m;m-){t=a[O];for(i=0;i<n-l;i++)a[i]=a[i+l];a[n-l]=t;main(){inta[10]={1,23,4,5,6,7,8,9,10},i,m;printf("原數(shù)組內(nèi)容是:'n");for(i=0;i<10;i++)printf(M%5dw,a[i]);printf("\n請(qǐng)輸入m的值:\n");scanf(”%d”,&m);printf(M\n調(diào)換以后的內(nèi)容是:");fun(a,10,m);for(i=0;i<10;i++)printf("%5d”,a[i]);printf("\n");在本例中是找到第一個(gè)要?jiǎng)h除的元素就將其刪除,那么,如果在一個(gè)數(shù)組中,如果有多個(gè)要?jiǎng)h除的元素又應(yīng)該如何刪除呢?我們?cè)谥v完第一個(gè)程序以后,可以引導(dǎo)學(xué)生,看ー下這個(gè)程序的作用是什么?如果有多個(gè)相同的元素,這個(gè)程序刪除的是哪個(gè)元素?會(huì)有學(xué)生能夠看出來(lái)這個(gè)程序刪除的是第一個(gè)元素,那么就可以引出我們的問(wèn)題,如果ー個(gè)
數(shù)組中有多個(gè)相同元素,我們都要?jiǎng)h除,那么應(yīng)該怎么寫?可以用挑桃的例子來(lái)講,如:一個(gè)同學(xué)買了五斤桃,如果第一天沒(méi)有吃,會(huì)有什么效果?(有的同學(xué)會(huì)說(shuō)應(yīng)該會(huì)有爛的,當(dāng)然這時(shí)爛的不會(huì)很多),那好,我們把爛的挑出去,這就相當(dāng)于第一種刪除的寫法,而如果3天不吃會(huì)什么樣?(學(xué)生會(huì)說(shuō)那還會(huì)有好的嗎?)這時(shí)如果要挑出來(lái),就不用挑爛的了,我們只要把好的拿出來(lái)就可以,其余的都扔了算了。下面的程序就是挑好的元素保存下來(lái)的過(guò)程。(4)在ー個(gè)數(shù)組中刪除給定所有的元素。#include"stdio.h"#defineN10voiddelete(intaロ,inik);/?聲明函數(shù),該函數(shù)是以數(shù)組名做參數(shù),k表示要?jiǎng)h除的值。*/main(){inta[N]={1,5,8,12,15,12,27,12},i,k;printf("請(qǐng)輸入要?jiǎng)h除的元素:'n");scanf("%d",&k);delete(a,k); /?調(diào)用刪除的函數(shù),注意實(shí)參是數(shù)組名?/for(i=0;a[i]!=0;i++)printf("%d",a[ij);printf("\n");voiddelete(inta[],intk)intij=0; /*i表示數(shù)組中原下標(biāo),而j表示刪除以后的元素的for(i=0;a[i]!=0;i++)if(a[i]!=k)a[j++]=a[i];a[j]=O;for(i=0;a[i]!=0;i++)if(a[i]!=k)a[j++]=a[i];a[j]=O;/*if的條件里,應(yīng)該寫上的是保留元素的條件。?//?將不刪除的每個(gè)元素保存?/與本題相近的算法比較多,在二級(jí)考試的上機(jī)題中的刪除類的問(wèn)題都可以用該方法來(lái)解決。如,在ー個(gè)數(shù)組中已經(jīng)按從大到小的順序?qū)⒃嘏藕庙樞蛄?,但是有一些重?fù)元素,現(xiàn)在函數(shù)的功能是將數(shù)組中重復(fù)元素刪除,只留一個(gè),將數(shù)組中剩余元素個(gè)數(shù)作為函數(shù)值返回。(這個(gè)程序如果在ー類院校中時(shí)間夠用時(shí)可以講解,在三類院校中一定沒(méi)有時(shí)間講的,二類院校中看學(xué)生的基礎(chǔ),好的可以講,否則不講。)#include"stdio.h"intfun(inta[],intn){intij;for(i=l,j=0;i<n;i++)if(a[i]!=a|j])a[++j]=a[i];returnj+1;main()inta[20]={1,1,1,2,3,4,4,4,4,4,4,5,6,6,6,7,8,8,9,10);inti,n;n=fun(a,20);for(i=0;i<n;i++)printf(H%5dM,a[i]);(5)冒泡法排序(就是每次將最大的元素放在最后的過(guò)程。)如原內(nèi)容為4321則過(guò)程為TOC\o"1-5"\h\z3 4 2 13 2 4 13 2 14從而知道排序過(guò)程:.比較第一個(gè)數(shù)與第二個(gè)數(shù),若為逆序即a[0]>a[l],則交換;然后比較第二個(gè)數(shù)與第三個(gè)數(shù);依次類推,直至第n?l個(gè)數(shù)和第n個(gè)數(shù)比較為止——第一趟冒泡排序,結(jié)果最大的數(shù)被安置在最后ー個(gè)元素位置上.對(duì)前n?l個(gè)數(shù)進(jìn)行第二趟冒泡排序,結(jié)果使次大的數(shù)被安置在第n?l個(gè)元素位置.重復(fù)上述過(guò)程,共經(jīng)過(guò)n-1趟冒泡排序后,排序結(jié)束。#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[NJ,i;printf("請(qǐng)輸入十個(gè)數(shù):\n");fbr(i=0;i<10;i++)scanf(M%dH,&a[i]);sort(a,10);printf(H\n排序以后的結(jié)果為:\n");for(i=0;i<10;i++)printf(H%d國(guó));voidsort(inta[],intn)/*n表示元素個(gè)數(shù)?/inti,j,t;/*t主要是為了調(diào)換,所以t應(yīng)該與數(shù)組元素的類型相一致*/for(j=0;j<n-l;j++)for(i=0;i<n-l-j;i++)if(a[i]>a[i+l])t=a[i];a[i]=a[i+l];a[i+l]=t;I)這個(gè)冒泡法排序的程序中我們要讓學(xué)生明白,j的循環(huán)主要是表示有多少趟循環(huán),j的循環(huán),循環(huán)一次,那么就會(huì)將最大的元素放到最后,那么有n個(gè)元素,就應(yīng)該循環(huán)n-1次,將n-l個(gè)最大的元素依次放到最后,那么剩余的ー個(gè)一定是最小的了(在這個(gè)位置可以問(wèn)學(xué)生,如果八個(gè)人賽跑,你前面有7個(gè)人,那么你第幾還用說(shuō)嗎?)。而在i的循環(huán)中,i=0中的0表示循環(huán)的起始位置,或者說(shuō)是排序的起始位置,說(shuō)明這個(gè)程序的排序是從下標(biāo)為〇的位置開始的,表示排序的終止位置是到最后ー個(gè)元素,在這個(gè)循環(huán)的終止值上是隨著外層循環(huán)變量j的變化而變化,所以我們說(shuō)循環(huán)的起點(diǎn)不變,而終點(diǎn)類變化。而每次用到的i++表示是每個(gè)元素都要進(jìn)行排序。如果把i++改為i+=2,則表示每隔ー個(gè)元素進(jìn)行排序。而下面的兩個(gè)元素的比較的時(shí)候也應(yīng)該是a[i]與a[i+2]相比較。那么這個(gè)程序如何實(shí)現(xiàn)的將最大的元素放在最后呢?我們可以看i這個(gè)循環(huán),當(dāng)i為〇時(shí),循環(huán)體的內(nèi)容是用a[0]a[l]比較,如果a[0]〉a[l],則他們的互換,這樣a[l]的位置將存放他們兩個(gè)中的大的,然后i加1以后變?yōu)?,此時(shí)是a[l]與a[2]比較,a[l]是前兩個(gè)元素中大的元素,如果他大于a[2]則說(shuō)明了他是前三元素的最大值,后互換到a[2]位置,……這樣比較到什么位置就會(huì)把最大的元素放到最后。如在ー個(gè)數(shù)組中把下標(biāo)為偶數(shù)的元素從小到大排序,其他位置的元素不變.#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[N],i;primf("請(qǐng)輸入十個(gè)數(shù):'n");for(i=0;i<10;i++)scanf(M%d';&a[i]);sort(a,10);printf(,'\nM);printf("排序以后的結(jié)果為:\n");fbr(i=0;i<10;i++)printf(M%d\a[i]);int;if(n%2==0)m=n/2; /?找到排序元素的個(gè)數(shù)?/elsem=n/2+1;for(j=0;j<m-l;j4-+)for(i=0;i<n-1-j*2;i+=2)if(a[i]>a[i+2])t=a[i];a[i]=a[i+2];a[i+2]=t;(6)選擇法排序:每次將最小的元素放在最前,再將剩余的元素中將最小的元素放在最前 。用簡(jiǎn)單排序法對(duì)10個(gè)數(shù)排序排序過(guò)程:.首先通過(guò)n-1次比較,從n個(gè)數(shù)中找出最小的,將它與第一個(gè)數(shù)交換ー第一趟選擇排序,結(jié)果最小的數(shù)被安置在第一個(gè)元素位置上.再通過(guò)n-2次比較,從剩余的n-1個(gè)數(shù)中找出關(guān)鍵字次小的記錄,將它與第二個(gè)數(shù)交換ー第二趟選擇排序.重復(fù)上述過(guò)程,共經(jīng)過(guò)n-1趟排序后,排序結(jié)束#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[N],i;primf("請(qǐng)輸入十個(gè)數(shù):'n");for(i=0;i<10;i++)scanf(M%d';&a[i]);printf(',\nn);sort(aJO);piintf("排序以后的結(jié)果為、T);fbr(i=0;i<10;i++)printf(M%d\a[i]);voidsort(inta[],intn)inti,j,t;for(j=0;j<n-l;j++)for(i=j+l;i<n;i++)if(a|j]>a[i])t=a[i];a[i]=a[j];a[j]=t;我們可以看這個(gè)函數(shù)中,用到的格式與上一個(gè)程序冒泡法排序的程序很接近,但是我們仔細(xì)看時(shí),還能發(fā)現(xiàn)ー些區(qū)別之處的,首先能發(fā)現(xiàn)外層循環(huán)的格式是相同的,都是循環(huán)n-1次的ー個(gè)循環(huán),但是內(nèi)層循環(huán)上i的初值是從j開始的,由于j是外層循環(huán)的循環(huán)變量,也就是說(shuō)外層循環(huán),循環(huán)一次,就變化一次,所以我們說(shuō)這個(gè)寫法中外層循環(huán)的起點(diǎn)是變化的,而i循環(huán)的循環(huán)控制條件是i<n,所以i的終止值都是n-l,說(shuō)明i的終點(diǎn)是不變的,而回顧前面所講的冒泡法排序時(shí)是起點(diǎn)不變,終點(diǎn)變化。再看,比較和互換的元素,在冒泡法中比較的是a[i]與其后ー個(gè)元素即a[i+l],而選擇法是起點(diǎn)變化,終點(diǎn)不變,比較的是a[i],a[j]o這個(gè)寫法中如何實(shí)現(xiàn)的將最小的元素放在最前?當(dāng)外層循環(huán)j為〇時(shí),內(nèi)層循環(huán)(i的循環(huán))中沒(méi)有對(duì)j的變化,也可以這樣說(shuō),在內(nèi)層循環(huán)(i的循環(huán)中)完成整個(gè)循環(huán)的過(guò)程中,j是沒(méi)有變化的,所以我們說(shuō)j在這時(shí)是不動(dòng)的,而這個(gè)過(guò)程中i是不斷自加的,我們說(shuō)i是動(dòng)的。而在比較時(shí)是如果a[j]>a[i]則實(shí)現(xiàn)他們的互換,這樣a[j]的位置一直存放小的,當(dāng)i從頭走到尾時(shí),a[j]的位置也就放的是最小的元素,當(dāng)j=O時(shí),就會(huì)將最小的元素放在a[0],當(dāng)j為1時(shí)就會(huì)將a[l]到a[n-l]的最小值放在a[l]的位置上?!x擇法排序的另ー種寫法:由于選擇法排序的實(shí)現(xiàn)過(guò)程是將最小的元素放在最前,然后再將剩下元素里的最小值再放在剩余的最前…….所以我們可以用最直接的做法就是找到最小的元素,然后再與首元素互換。#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[N],i;primf("請(qǐng)輸入十個(gè)數(shù):'n");for(i=0;i<10;i++)scanf(M%dH,&a[i]);printf(”'n");sort(aJO);printf("排序以后的結(jié)果為:'ガ);for(i=0;i<10;i++)printf(M%dn,a[i]);voidsort(inta[],intn) /*n表示元素個(gè)數(shù)?/inti,j,tgin;fbr(i=O;i<n-l;i++){min=i;for(j=i+l;j<n;j++) /?找最小元素的下標(biāo)。*/if(a[min]>a|j])min=j;t=ali];a[i]=a[min];a[min]=t;ス這個(gè)程序可以看到在一個(gè)數(shù)組中找最小值的辦法。這個(gè)程序中如何實(shí)現(xiàn)找最個(gè)值?我們可以看j這個(gè)循環(huán),首先給min賦值為i,也就是說(shuō)最開始假設(shè)首元素為最小,用min就是來(lái)存放最小的元素的下標(biāo),而在下面的循環(huán)中,是如果a[j]<a[min]時(shí),min存放"我們可以想,min本身存放最小的元素的下標(biāo),而現(xiàn)在a|jka[min],說(shuō)明a|j]是最小的元素,于是min存放j,這樣,min中始終存放最小的元素的下標(biāo)。在這里可也以用熊瞎子掰苞米的故事,說(shuō)到這句話時(shí),估計(jì)同學(xué)都會(huì)知道熊瞎子掰苞米的意思是學(xué)一點(diǎn)忘一點(diǎn),我們可以形象的一點(diǎn),自己掰ー穗苞米,放在自己腋下,再來(lái)一穗放在腋下時(shí),前一個(gè)就掉了,我們可以說(shuō)這個(gè)熊瞎子有些智能,他每次掰ー穗時(shí),都和腋下的比一下,如果腋下的小,就放上,否則就不要了。這樣下來(lái),它腋下的一定是最大的。同理找最大值或最小值的程序也應(yīng)該讓學(xué)生自己去寫。(7)由這個(gè)函數(shù)我們可以寫出來(lái)在ー個(gè)數(shù)組中把最大的元素放在最前,最小的放在其后,剩余的元素中最大的放在最前,最小的放在次后……這個(gè)函數(shù)的思路:每次循環(huán)時(shí)應(yīng)該把這個(gè)范圍內(nèi)的最大值和最小值都找到,然后在這個(gè)范圍內(nèi),將最大值與首位置互換,將次位置與該范圍內(nèi)的最小值互換,在這里只要是互換就說(shuō)明我們就應(yīng)該保存的最大值或最小值的下標(biāo)。而這樣的ー個(gè)循環(huán)完成了兩個(gè)元素的排序,就是最大值和最小值,所以我外層循環(huán)中的循環(huán)變量的變化應(yīng)該是每次加2。#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[N],i;printf(”請(qǐng)輸入十個(gè)數(shù):\n“);for(i=0;i<10;i++)scanf(M%dH,&a[i]);printf(M\nH);sort(a,10);printf("排序以后的結(jié)果為fdr(i=0;i<10;i++)printf(M%d\a[i]);voidsort(inta[],intn)inti,j,t,min,max;fbr(i=0;i<n-l;i+=2){min=max=i;for(j=i+l;j<n;j++)if(a[min]>a[j])min=j;elseif(a[max]<a|j])max寸t=a[i];a[i]=a[max];a[max]=t;t=a[i+l];a[i+l]=a[min];a[min]=t;)做為這個(gè)函數(shù)也可以用另一種方法,我們可以先將整個(gè)數(shù)組排序,后再將排序后的數(shù)組按這個(gè)要求存放a數(shù)組。#include<stdio.h>#defineN10voidsort(inta[],intn);main()inta[N],i;printf(”請(qǐng)輸入十個(gè)數(shù):\n”);fdr(i=O;i<10;i++)scanf(M%d\&a[i]);printf(M\nH);sort(a,10);piintf("排序以后的結(jié)果為、T);fbr(i=0;i<10;i++)printf(M%d\a[i]);voidsort(inta[],intn)inti,j,t,k,b[N];for(i=0;i<n-l;i++)for(j=i;jvn;j++)if(咽〉a[jDt=a[ij;a[i]=a[j];a[j]=t;for(i=0;i<n;i++)b[i]=a[i];fbr(i=k=O,j=n-l;i<=j;k++)if(k%2==0)a[k]=b[j-];elsea[k]=b[i++];(8)再如在排序時(shí),將最大的元素放在數(shù)組的最后,次大的放在最前,剩余的元素中最大的放在最后,次大的放在最前……這個(gè)題的思路是在數(shù)組中找到最大的元素,放在最后,但是要注意下次排序的時(shí)候,不應(yīng)該排到最后了,從剩余的元素中再把最大的元素放在最前,下次排序的范圍應(yīng)該再?gòu)那懊鏈p少ー個(gè)。所以說(shuō)在這個(gè)程序中排序的起始位置和終止位置都是在變化的。并且要根據(jù)次數(shù)來(lái)確定哪個(gè)元素放在前面還是放在后面。通過(guò)分析,我們能知道當(dāng)首次循環(huán)時(shí),找到的元素一定是所有元素的最大值,于是應(yīng)該放在最后,而再下一次時(shí)應(yīng)該找到的是次大的,應(yīng)該放在最前,依此類推。#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[N],i;printf(”請(qǐng)輸入十個(gè)數(shù):'n");for(i=0;i<10;i++)scanf(n%d';&a[i]);printf(M\nM);sort(a,10);printf("排序以后的結(jié)果為ヘバ);for(i=0;i<10;i++)printf(M%d\a[i]);voidsort(inta[],intn)inti,j,t,max,left=O,right=n-1;fdr(i=O;i<n-l;i++){max=left;for(j=left+l;j<=right;j++)if(a[max]<a(j])max=j;if(i%2==0){t=a[right];a[right]=a[max];a[max)=t;right-;}else{t=a[left];a[left]=a[max];a[max]=t;left++;由上一題的思路,我們對(duì)于這個(gè)題也有另ー個(gè)做法,就是先將該數(shù)組排序,放在b數(shù)組中,然后再按照該要求排放。#include<stdio.h>defineN10voidsort(inta[],intn);main()inta[NJ,i;printf(”請(qǐng)輸入十個(gè)數(shù):\n");for(i=0;i<10;i++)scanf(M%dH,&a[i]);printf("\n");sort(a,10);printf("排序以后的結(jié)果為:\n");fdr(i=O;i<10;i++)printf(H%dn,a[i]);voidsort(inta[],intn)inti,j,t,k,b[N];for(i=0;i<n-l;i++)for(j=i;j<n;j++)if(a[i]<a[j])t=a[i];a[i]=a[j];a[j]=t;for(i=0;i<n;i++)b[i]=a[i];fbr(i=k=O,j=n-1;i<=j;k++)if(k%2==0)a[j-]=b[k];elsea[i++]=b[k];(9)折半法查找,查到返回其下標(biāo),如果沒(méi)有找到イ.折半法查找:首先查詢用的數(shù)組要有序,每次用中間元素與要查詢的元素進(jìn)行比較,如果要查詢的內(nèi)容等于中間元素則說(shuō)明查到,如果要查詢內(nèi)容大于中間元素,則說(shuō)明該內(nèi)容在后一半的范圍內(nèi),否則則說(shuō)明該內(nèi)容在前一半的范圍,然后在該范圍再次查詢,直到查到或沒(méi)有查到。include“stdio.h"intmidfind(inta[],intn,intk)intleft=O,right=n-l,mid=(left+right)/2;for(;left<=right;mid=(left+right)/2)if(a[mid]==k)returnmid;elseif(k>a[mid])left=mid+l;elseright=mid-1;return-1;main()inta[16]=[1,5,6912,16,18,23,26,27,34,37,39,42,46,49},k,n;scanf("%d”,&k);n=midfind(a,16,k);if(n==-l)printfT沒(méi)有找到元素\n");elseprintf(iU%d在數(shù)組中的下標(biāo)是:%d”,k,n);(10)篩選法求1000以內(nèi)的素?cái)?shù)。篩選法的含義是在這些數(shù)中先把所有2的倍數(shù)劃去,再將3的倍數(shù)劃去,再將最小的素?cái)?shù)的倍數(shù)劃去,這樣最后剩余的就是所有的素?cái)?shù)。includeustdio.hH#include"math.h"voidfun(inta[],intn)inti,k,m=sqrt(n);for(i=2;i<m;i++)for(;a[i]==0;i++);for(k=a[i]*2;k<n;k+=a[i])a[k]=0;main()inta[1001]={0},i;for(i=2;i<1001;i++)a[i]=i;fun(a,1001);for(i=0;i<1001;i++)if(a[i]!=0)printf(n%4dn,a[i]);(11)請(qǐng)編寫函數(shù)fun,函數(shù)的功能是:將大于形參且緊靠m的k個(gè)素?cái)?shù)存入xx所指的數(shù)組中。voidfun(intm,intkjnt*xx)inti,j;for(m++,i=O;i<k;m++)for(j=2;j<m;j++)if(m%j==0)break;if(m==j)xx[i++]=m;main()intm,k,xx[100],i;scanf(',%d%d,',&m,&k);fun(m,k,xx);fbr(i=O;i<k;i++)printf(M%d\xx[i]);(12)請(qǐng)編寫函數(shù)fun,其功能是:計(jì)算并輸出給定10個(gè)數(shù)的方差:S=J—-X)(即:10個(gè)數(shù)的平均值,其中x'=—ZXk丫1°*=1 1°K=1例如,給定的10個(gè)數(shù)為95.0、89.0、76.0、65.0,88.0、72.0,85.0、81.0,90.0,56.0,輸出為s=l1.730729。include“stdio.h"include“math.h"defineN10doublefun(doublex[])inti;doubleave=0,s=0;for(i=0;i<N;i++)ave+=x[i]/N;for(i=0;i<N;i++)s+=(x[i]-ave)*(x[i]-ave)/N;returnsqrt(s);main()doublex[N]={95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90。,56.0};doubles;s=fun(x);printf(“這10個(gè)數(shù)的樣本方差為:%Rn”,s);(13)函數(shù)fun的功能是:把形參a所指數(shù)組中的奇數(shù)按原順序依次存放到a[〇]、a[l],a[2b……中,把偶數(shù)從數(shù)組中刪除,奇數(shù)個(gè)數(shù)通過(guò)函數(shù)值返回。例如:若a所指數(shù)組中的數(shù)據(jù)最初排列為:9、1、4、2、3、6、5、8、7,刪除偶數(shù)后a所指數(shù)組中的數(shù)據(jù)為:9、1、3、5、7,返回值為5。這個(gè)題的作法有兩種,一是在原數(shù)組中進(jìn)行,那么就是先把偶數(shù)刪除(用〇替換),之后再把非0的內(nèi)容重新放在該數(shù)組中,另ー種方法是借助另一個(gè)數(shù)組,先將奇數(shù)的內(nèi)賓存入到另ー數(shù)組中,而后再重新存放回來(lái)。第一種做法:include“stdio.h"defineN10intfun(inta[],intn)inti,j;for(i=0;i<N;i++)if(a[i]%2==0)a[i]=0;for(i=0,j=0;i<N;i++)if(a[i]!=O)a|j++]=a[i];returnj;main()inta[N]={9,1,4,2,3,6,5,8,7,10},i,n;printf(“原數(shù)組中的內(nèi)容為:\n");for(i=0;i<N;i++)printf("%d5;a[i]);n=fun(a,10);printf("\n刪除以后數(shù)組中的內(nèi)容為:\n");for(i=0;i<n;i++)printfC4%dXi]);第二種方法:include"stdio.hMdefineN10intfun(inta[],intn)inti,b[N]j=0;for(i=0;i<N;i++)if(a[i]%2==l)b[j++]=a[i];for(i=0;i<j;i++)a[i]=b[i];returnj;main()inta[N]={9,1,4,2,3,6,5,8710),i,n;printf("原數(shù)組中的內(nèi)容為:\n");for(i=0;i<N;i++)printf(M%dM,a[i]);n=fun(a,10);printf(M\n刪除以后數(shù)組中的內(nèi)容為:\n");for(i=0;i<n;i++)printf("%dM,a[i]);(14)給定程序中,函數(shù)fun的功能是:計(jì)算形參x所指數(shù)組中N個(gè)數(shù)的平均值(規(guī)定所有數(shù)均為正數(shù)),將所指數(shù)組中大于平均值的數(shù)據(jù)移至數(shù)組的前部,小于等于平均值的數(shù)據(jù)移至X所指數(shù)據(jù)的后部,平均值作為函數(shù)值返回,在主函數(shù)中輸出平均值和移動(dòng)后的數(shù)據(jù)。例如,有10個(gè)正數(shù):4630324061745154826,平均值為30.500000移動(dòng)后的數(shù)據(jù)為4632404548306171526本題的思路和上一題的第二種做法應(yīng)該是一致的,這個(gè)方法對(duì)于這個(gè)題還是要對(duì)簡(jiǎn)單的。includeustdio.h',defineN10doublefun(inta[],intn)inti,b[N],j=O;doubleave=0;for(i=0;i<N;i++)ave+=1.0*ali]/N;for(i=0;i<N;i++)if(a[ij>ave)b|j++]=a[i];for(i=0;i<N;i++)if(a[i]<ave)b[j++]=a[i];for(i=0;i<j;i++)a[i]=b[i];returnave;main()inta[N]={46,30,32,40,6,17,45,15,48,26},i;doubles;printf("原數(shù)組中的內(nèi)容為:\n");for(i=0;i<N;i++)printf(H%dn,a[i]);s=fun(a,10);printf("平均值為%rお);printf("\n刪除以后數(shù)組中的內(nèi)容為:\n");for(i=0;i<N;i++)printf("%d",a[i]);;15)請(qǐng)編寫函數(shù)fun,其功能是:計(jì)算并輸出給定數(shù)組(長(zhǎng)度為9)中每相鄰兩個(gè)元素之平均值的平方根之和。例如,給定數(shù)組中的9個(gè)元素依次為!2.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0,輸出應(yīng)為:s=35.951014o在這個(gè)程序中我們要知道如果有9個(gè)元素則相鄰元素應(yīng)該是八個(gè),所以如果我們要求a[i]與a[i+l]的平均值,則下標(biāo)應(yīng)該從〇變化到7,就可以了。#include"stdio.h"#include"math.h"doublefun(doublea[J)doubles=0;inti;for(i=0;i<8;i++)s+=sqrt((a[i]+a[i+1])/2);returns;main()doublea[9]={12.0,34.0,4.0,23.0,34.0,45.018.0,3.0,11.0},ave;ave=fun(a);printf("相鄰元素的平均值之和為%lf\n",ave);(16)函數(shù)fun的功能是:利用插入排序法對(duì)數(shù)組按從小到大的順序進(jìn)行排序。插入的基本算法是:先對(duì)數(shù)組中的頭兩個(gè)元素進(jìn)行排序。然后把第三個(gè)元素插入到前兩個(gè)元素中,插入后前三個(gè)元素依然有序;再把第四個(gè)元素插入到前三個(gè)字符中,……。includeustdio.hMvoidsort(inta[],intn)inti,j,t,k;if(alO]>a[lJ)t=a[OJ;a[0]=a[l];a[l]=t;for(i=2;i<n;i++)for(t=a[i],j=0;j<i;j++)if(a[j]>t)break;ifg)for(k=i;k>j;k—)a[k]=a[k-l];a[j]=t; }}main()inta[10],i;printf(”請(qǐng)輸入十個(gè)數(shù):'n");for(i=0;i<10;i++)scanf(,,%d,,,&a[i]);printf(',\nM);sort(a,10);printf("排序以后的結(jié)果為ヘn");for(i=0;i<10;i++)printf("%d",a[i]);}(17)請(qǐng)編寫函數(shù)fun,它的功能是:求出能整除形參x且不是偶數(shù)的各整數(shù),并按從小到大的順序放在pp所指的數(shù)組中,這些除數(shù)的個(gè)數(shù)通過(guò)形參n返回。例如,若x中的值為:35,則有4個(gè)數(shù)符合要求,它們是:1,5,7,35。includeustdio.hnvoidfun(intx,intpp[],int*n)inti;*n=0;for(i=l;i<=x;i+=2)if(x%i==0)pp[*n]=i;(*n)++;}main()intx,n,pp[l00]={0},i;scanf(*'%d,',&x);fun(x,pp,&n);for(i=0;i<n;i++)printf(,,%d\n',,pp[i]);(18)給定程序MODILC中函數(shù)fun的功能是:由形參給定n個(gè)實(shí)數(shù),輸出平均值,并統(tǒng)計(jì)在平均值以上(含平均值)的實(shí)數(shù)個(gè)數(shù)。例如,n=8時(shí),輸入:193.195,195.673,195.757,196.051,196.092,196.596,196.579,196.763所得的平均值為:195.838257,在平均值以上的實(shí)數(shù)的個(gè)數(shù)應(yīng)為:5分析:在這個(gè)題目中我們能夠發(fā)現(xiàn)函數(shù)fun需要兩個(gè)值,ー個(gè)是平均值,另ー個(gè)是高于平均值的元素個(gè)數(shù)。而在函數(shù)這一章,我們就知道一個(gè)函數(shù)內(nèi)不管有多少個(gè)return語(yǔ)句,在函數(shù)只能執(zhí)行到ー個(gè)語(yǔ)句,或者說(shuō),ー個(gè)函數(shù)只能有一個(gè)返回值,而這個(gè)題我們需要多個(gè)返回值,在C語(yǔ)言中,如果需要多個(gè)返回值,那么解決方法有兩種,ー種是用定義多個(gè)全局變量,由于全局變量可以在各個(gè)函數(shù)段內(nèi)都可以對(duì)其賦值,和讀取,所以可以用全局變量來(lái)實(shí)現(xiàn)主函數(shù)與子函數(shù)的數(shù)據(jù)交換。但是這種方法在實(shí)際工作中很少用,由于這種用法其安全性很難保證。所以一般都用另ー種方法就是在形參上多一個(gè)指針變量的形參,這個(gè)參數(shù)的目的就是將子函數(shù)中的值帶回到主函數(shù)。include"stdio.h"floatfun(floata[],intn,int*m)inti;floatave=0;for(i=0;i<n;i++)ave+=a[i]/n;for(*m=i=0;i<n;i++)if(ave<a[i])(*m)++;returnave;main()floata[8]={193.195,195.673,195.757,196.051,196.092,196.596,196.579,196.763},ave;intm;ave=fun(a,8,&m);printf("平均值是%An”,ave);printf("高于平均分的人數(shù)是:%d",m);(19)請(qǐng)編寫ー個(gè)函數(shù)fun,其功能是求出數(shù)組最大元素在數(shù)組中的下標(biāo)并存放在k所指的存儲(chǔ)單元中。例如,輸入如下整數(shù):876675896101301401980431451777則輸出結(jié)果為:6,980#include<stdio.h>voidfun(int*s,intt,int*k)inti;for(i=l,*k=O;i<t;i++)if(s[*k]<s[i])*k=i;main()inta[10]={876,675,896,101,301,401,980,431,451,777},k;fun(a,10,&k);printf(M%d,%d\n",k,a[k]);字符串常見算法將字符串中數(shù)字字符轉(zhuǎn)換成等值數(shù)值。本題的思路是在字符串的首位首先看是不是如果是,則表示該數(shù)應(yīng)該為負(fù)數(shù),轉(zhuǎn)換則應(yīng)該從下標(biāo)為1處轉(zhuǎn)換,否則從下標(biāo)為。處開始轉(zhuǎn)換。而在轉(zhuǎn)換時(shí),應(yīng)該從前向后,讀出來(lái)ー個(gè)數(shù)字,由于存放的是ASCII碼,所以要將其表示成其對(duì)應(yīng)的數(shù)值,具體轉(zhuǎn)換方法是:用其所表示的ASCH碼減去,〇'還有一個(gè)算法就是如何用數(shù)字組成一個(gè)數(shù),在這里用數(shù)字組成數(shù)的方法有兩種ー種是從后向前組成數(shù),具體方法是:每一位乘發(fā)位權(quán),再求和,另ー種方法是從前向后組成數(shù),這里是將原數(shù)求乘以10,再加新數(shù)。所以這個(gè)程序有兩種寫法。第一種寫法是從后向前組成數(shù)的方法。intfun(chars[]){inti=O,result=O,k=l;for(i=0;s[i];i++);for(i—;i>0;i—,k*=10)result+=(s[i]-,O,)*k;if?0]==ソ)return-result;elsereturnk*(s[OJ-,O,)+result;main()chars[80];intf;gets(s);f=fun(s);printf("%d”,f);ムー種寫法是從前向后組成數(shù)的方法:intfun(chars[]){intt,i=0,result二。;if(s[O]=<>,)t=-l;i=l;elset=l;fbr(;s[i];i++)result=result*10+s[i]-,0,;returnresult*t;main()chars[80];intf;gets(s);f=fun(s);printf("%ザf);在字符串中將某些“*”刪除,如在ー個(gè)字符串中由字符和“*”構(gòu)成,編寫程序?qū)⒆址星懊娴摹?”刪除,例如原內(nèi)容是"****as*s****dsf*asdf*****”則刪除以后是”as*s****dsf^asdf*****”這種題的分析思路是找到刪除的起始位置和終止位置,然后用我們講到的第二種刪除方法,就是把不符合刪除條件的內(nèi)容進(jìn)行保留。voidfun(chars[]){inti,j;for(i=0;s[i]==,**;i++);for(j=0;s[i];i++,j++)s[j]=s[i];s[j]=O;main()chars[8OJ;intf;gets(s);fun(s);printf("%s”,s);(3)在字符串中將某些“*”刪除,如在ー個(gè)字符串中由字符和”*”構(gòu)成,編寫程序?qū)⒆址兄虚g的刪除,例如原內(nèi)容是"****as*s****dsf*asdf*****”則刪除以后是”****assdsfasdf*****”.voi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- YY/T 1949-2024人工智能醫(yī)療器械數(shù)據(jù)集專用要求:糖尿病視網(wǎng)膜病變眼底彩照
- 度合同制速記服務(wù)與保密全文
- 水產(chǎn)養(yǎng)殖合同范本專業(yè)版
- 租賃合同范本:車輛租賃協(xié)議
- 建筑設(shè)計(jì)服務(wù)合同樣本版
- 生態(tài)林地保護(hù)承包合同書樣本
- 企業(yè)貸款合同、利息計(jì)算標(biāo)準(zhǔn)
- 企業(yè)風(fēng)險(xiǎn)控制反擔(dān)保合同模板
- 公租房解除合同范本
- 化工原料采購(gòu)合同范本大全
- DLT 5630-2021 輸變電工程防災(zāi)減災(zāi)設(shè)計(jì)規(guī)程-PDF解密
- 2024年新疆維吾爾自治區(qū)專升本考試大學(xué)政治測(cè)試題含解析
- 邊坡噴錨施工工藝
- 2016-2023年婁底職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 海鮮酒樓營(yíng)銷策劃方案
- 電能計(jì)量裝置配置規(guī)范
- 有償義工招募方案
- 冬春季節(jié)傳染病防控(流感)
- 潛在供應(yīng)商審核報(bào)告模版13-02
- 《臨床疾病概論》課件
- 安全生產(chǎn)費(fèi)用使用臺(tái)賬
評(píng)論
0/150
提交評(píng)論