第3套
已知數(shù)據(jù)文件in3.dat中存有200個(gè)四位數(shù),并已調(diào)用讀函數(shù)readDat()把這些數(shù)存入數(shù)組a中,請(qǐng)考生編制一函數(shù)jsVal(),其功能是:依次從數(shù)組a中取出一個(gè)四位數(shù),如果該四位數(shù)連續(xù)大于該四位數(shù)以后的5個(gè)數(shù)且該數(shù)是奇數(shù),則統(tǒng)計(jì)出滿(mǎn)足此條件的個(gè)數(shù)cnt并把這些四位數(shù)按從小到大的順序存入數(shù)組b 中,最后調(diào)用寫(xiě)函數(shù)writeDat()把結(jié)果cnt以及數(shù)組b中符合條件的四位數(shù)輸出到out3.dat文件中。
注意:部分程序已經(jīng)給出。
程序中已定義數(shù)組:a[200],b[200],已定義變量:cnt。
請(qǐng)勿改動(dòng)數(shù)據(jù)文件in.dat中的任何數(shù)據(jù)、主函數(shù)main()、讀函數(shù)readDat()和寫(xiě)函數(shù)writeDat()的內(nèi)容。
【答案】
void jsVal()
{
int i,j,flag=0;
int k;
for(i=0;i<MAX-5;i++)
{
for(j=i+1;j<=i+5;j++)
{
if(a[i]>a[j])flag=1;
else{flag=0;break;}
if(a[i]%2==0)
flag=0;
}
if(flag==1)
{b[cnt]=a[i];cnt++;}
}
for(i=0;i<cnt-1;i++)
for(j=i+1;j<cnt;j++)
if(b[i]>b[j])
{k=b[i];b[i]=b[j];b[j]=k;}
}
【解析】
考點(diǎn):(1)按條件篩選;
(2)統(tǒng)計(jì)滿(mǎn)足條件的個(gè)數(shù);
(3)排序算法。
本題的解題思路是:對(duì)數(shù)組a中的元素逐個(gè)進(jìn)行判斷,若其能連續(xù)大于后面的5個(gè)數(shù)(此處可以通過(guò)設(shè)置一個(gè)標(biāo)志變量來(lái)標(biāo)識(shí)a[i]能否連續(xù)大于其后面的5個(gè)數(shù)字),且為奇數(shù)時(shí),把它存入b 數(shù)組中,并對(duì)數(shù)組b進(jìn)行排序。此排序算法為每次選定一個(gè)位置的元素和它后面的所有元素相比較,如果比后面的元素大,則兩者交換,完成比較一趟后,此位置的元素就比其后面所有的元素都小。比較一直進(jìn)行到所有元素均被訪(fǎng)問(wèn)后結(jié)束,一共需要比較cnt趟,每趟需要比較cnt-j次。
程序的流程是:先調(diào)用readDat()函數(shù),讀入數(shù)據(jù)到數(shù)組a中,然后調(diào)用jsVal()函數(shù),對(duì)數(shù)據(jù)進(jìn)行處理再由writeDat()函數(shù)寫(xiě)回文件out3.dat中去。
在jsVal()函數(shù)中,通過(guò)雙重for循環(huán)和內(nèi)嵌if語(yǔ)句對(duì)數(shù)組a中的元素逐個(gè)判斷,每當(dāng)條件滿(mǎn)足時(shí)就將標(biāo)記變量flag設(shè)置為1,否則將flag設(shè)置為0。外層for循環(huán)結(jié)束的條件是i=MAX-5(即一直比較到數(shù)組當(dāng)中倒數(shù)第6個(gè)元素),在for循環(huán)中,當(dāng)a[i]連續(xù)大于其后面的5個(gè)元素時(shí),標(biāo)志變量flag被置為1,否則標(biāo)志flag被置為0,并且跳出內(nèi)層for循環(huán)。下面的if語(yǔ)句的作用是判斷a[i]是否為奇數(shù),若是偶數(shù)則將flag置為0。for循環(huán)結(jié)束后的if語(yǔ)句作用是,通過(guò)標(biāo)志變量flag來(lái)判斷a[i]是否滿(mǎn)足題目中的條件,即a[i]即連續(xù)大于后面5個(gè)數(shù)字,又是奇數(shù)時(shí),若滿(mǎn)足則將a[i]存入b數(shù)組中。最后對(duì)b數(shù)組中的元素進(jìn)行升序排列,排序完成之后,函數(shù)結(jié)束。