第3套
已知數(shù)據(jù)文件in3.dat中存有200個四位數(shù),并已調(diào)用讀函數(shù)readDat()把這些數(shù)存入數(shù)組a中,請考生編制一函數(shù)jsVal(),其功能是:依次從數(shù)組a中取出一個四位數(shù),如果該四位數(shù)連續(xù)大于該四位數(shù)以后的5個數(shù)且該數(shù)是奇數(shù),則統(tǒng)計出滿足此條件的個數(shù)cnt并把這些四位數(shù)按從小到大的順序存入數(shù)組b 中,最后調(diào)用寫函數(shù)writeDat()把結(jié)果cnt以及數(shù)組b中符合條件的四位數(shù)輸出到out3.dat文件中。
注意:部分程序已經(jīng)給出。
程序中已定義數(shù)組:a[200],b[200],已定義變量:cnt。
請勿改動數(shù)據(jù)文件in.dat中的任何數(shù)據(jù)、主函數(shù)main()、讀函數(shù)readDat()和寫函數(shù)writeDat()的內(nèi)容。
【答案】
int findStr(char *str,char *substr)
{
int n;
char *p,*r;
n=0;
while(*str)
{
p=str;
r=substr;
while(*r)
if(*r==*p)
{r++;p++;}
else
break;
if(*r=='\0')
n++;
str++;
}
return n;
}
【解析】
考點:(1)在給定的字符串中查找指定字符;
(2)統(tǒng)計查找后滿足條件的個數(shù)。
本題的解題思路是:對原字符串中的字符進(jìn)行掃描,若原字符串中含有子字符串,即原字符串的其中一部分與子字符串完全相同時,統(tǒng)計出個數(shù)。判斷原字符串是否含有子字符串,可以將原字符串中的元素逐個與子字符串相比較,當(dāng)兩字符串中各個元素都相同且子字符串結(jié)束時,則證明原字符串包含一個子字符串。在統(tǒng)計個數(shù)的時候需要設(shè)置一個記錄變量,每當(dāng)原字符串包含子字符串一次的時候,該記錄變量自動加1。
程序的流程是:首先通過鍵盤接收兩個字符串,其中一個作為原字符串,另一個作為子字符串,然后調(diào)用findStr()函數(shù)對兩字符串進(jìn)行比較,處理后的結(jié)果由ReadWrite()函數(shù)寫回文件out.dat中。
在findStr()函數(shù)中,當(dāng)原字符串不為空,即*str不為空時進(jìn)入到外層while循環(huán)中,此時原字符串指針str和子字符串指針substr都指向其字符串內(nèi)的第一個元素,將兩字符串的指針分別賦給p和r,然后再對p和r進(jìn)行比較。這樣做的好處是,當(dāng)p與r改變的時候str和substr不會受到影響。當(dāng)子字符串也不為空時即*r不空時,進(jìn)入內(nèi)嵌的while循環(huán),該while循環(huán)的功能是,將原字符串與子字符串逐個元素進(jìn)行比較看是否相等,結(jié)束該層while循環(huán)的情況有兩種:(1)比較完畢,即原字符串中包含該子字符串,此時子字符串的指針指向串尾(為“\0”);(2)未比較完畢,此時子字符串的指針不指向串尾。下面的if語句的功能是,通過判斷子字符串的指針是否指向串尾,進(jìn)而來判斷內(nèi)層while循環(huán)結(jié)束的原因,若是比較完成,即*r==‘\0’,則把記錄個數(shù)的變量加1,并且原字符串指針也指向下一個字符,為重新進(jìn)入外層while循環(huán)作準(zhǔn)備。