本系列資料由"韜略宏智" 授權(quán)發(fā)布,任何網(wǎng)站不得轉(zhuǎn)載,否則追究法律責(zé)任。
第13題:
函數(shù)ReadDat()實現(xiàn)從文件in13.dat中讀取一篇英文文章存入字符串?dāng)?shù)組xx中;請編制函數(shù)StrOR(),其函數(shù)的功能是:以行為單位依次把字符串中所有小寫字母o左邊的字符串內(nèi)容移到該串的右邊存放,然后把小寫字母o刪除,余下的字符串內(nèi)容移到已處理字符串的左邊存放,之后把已處理的字符串仍按行重新存入字符串?dāng)?shù)組xx中。最后main()函數(shù)調(diào)用函數(shù)WriteDat()把結(jié)果xx輸出到文件out13.dat中。
例如:原文:you can create an index on any field.
you have the correct record.
結(jié)果:n any field.Yu can create an index
rd.yu have the correct rec
原始數(shù)據(jù)文件存放的格式是:每行的寬度均小于80個字符,含標(biāo)點符號和空格。
注意:部分源程序已經(jīng)給出。
請勿改動主函數(shù)main()、讀數(shù)據(jù)函數(shù)ReadDat()和輸出數(shù)據(jù)函數(shù)WriteDat()的內(nèi)容。
#include <stdio.h>
#include <string.h>
#include<conio.h>
char xx[50][80];
int maxline=0; &nbs
【答案】
void StrOL(void)
{
int i,j,k,strl,l;char c;
for(i=0;i<maxline;i++)
for(j=0;j<strlen(xx[i]);j++)
{c=xx[i][j];
if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c==''||(c>='0'&&c<='9'));
else xx[i][j]=' ';
}
for(l=0;l<maxline;l++)
{
char ch[80]={0};
char pp[80]={0};
strl=strlen(xx[l]);
i=strl-1;
k=1;
while(1)
{while(((xx[l][i]>='a'&&xx[l][i]<='z')||(xx[l][i]>='A'&&xx[l][i]<='Z')||
(xx[l][i]>='0'&&xx[l][i]<='9'))&&i>=0)
{
for(j=k;j>=0;j--)
pp[j+1]=pp[j];
pp[0]=xx[l][i];
k++;i--;
}
strcat(ch,pp);
strcpy(pp,"");
k=1;
if(i==-1)break;
while((xx[l][i]<'A'||xx[l][i]>'z')&&(xx[l][i]<'0'||xx[l][i]>'9')&&i>=0)
{
for(j=k;j>=0;j--)
pp[j+1]=pp[j];
pp[0]=xx[l][i];
k++;i--;
}
strcat(ch,pp);
strcpy(pp,"");
k=0;
if(i==-1)
break;
}
strcpy(xx[l],ch);
}
}
【解析】
考點:(1)刪除字符串中的標(biāo)點符號;
(2)對刪除后的字符串重新進行排序。
本題的解題思路是:先找到并刪除每行字符串中的非英文字符,再從每行最后一個單詞開始,依次將每個單詞存入一個臨時數(shù)據(jù)中,然后將臨時數(shù)組連接起來,結(jié)果即實現(xiàn)將所有單詞倒排。刪除非英文字符時,可以通過將其賦值為空字符來實現(xiàn),連接臨時數(shù)組通過字符串連接函數(shù)strcat()來實現(xiàn)。本題在此類題目中屬于難度較大的一道,考生應(yīng)該對程序的核心算法多加分析。
程序的流程是:首先調(diào)用ReadDat()函數(shù),將數(shù)據(jù)讀入到數(shù)組xx中,然后調(diào)用StrOL()函數(shù)對數(shù)據(jù)進行處理,最后調(diào)用WriteDat()函數(shù),將結(jié)果輸出到文件out14.dat中。
在StrOL()函數(shù)中,首先采用兩重for循環(huán),將數(shù)組xx[i]中不是字母也不是空格的元素全部賦值為空字符,然后進入下面一層for循環(huán)(此處聲明了兩個字符型數(shù)組pp和ch,用于存入處理后的臨時數(shù)據(jù)),該層for循環(huán)在i=maxline,即訪問過所有行時結(jié)束。由于不確定循環(huán)的次數(shù),所以設(shè)定最外層while循環(huán)條件恒為真(非0即為真),在i=-1時通過break語句跳出循環(huán),程序直接進入內(nèi)嵌while循環(huán)中,本層while循環(huán)的功能是,從xx[l]數(shù)組,即文章的每一行中最后一個字符開始向前查找,每找到一個單詞就將其存入一個臨時數(shù)組中,最后按照找到單詞的先后順序?qū)⑴R時數(shù)組連接起來,并且各個單詞之間用空格分開。
在第二個while循環(huán)中,當(dāng)xx[l]數(shù)組中的元素為大寫字母或小寫字母且i>=0時進入for循環(huán),該循環(huán)體的功能是將pp數(shù)組中的元素依次向后移一位。然后從xx[l]數(shù)組中的最后一個元素開始,每次for循環(huán)結(jié)束后,就將其存入pp[0]中,然后k和i(由后向前)都指向下一個元素,重新進入到while循環(huán)當(dāng)中,本層while循環(huán)一直執(zhí)行到xx[l]數(shù)組中出現(xiàn)空格時結(jié)束。pp數(shù)組即為存放每一個單詞的臨時數(shù)組,再將pp數(shù)組的內(nèi)容存入ch數(shù)組中,ch數(shù)組為將各個單詞倒排的臨時數(shù)組。此時需用字符串連接函數(shù)strcat(),之后將pp數(shù)組置空。下一層while循環(huán)的條件為當(dāng)xx[l]數(shù)組中的元素不是大寫字母且i>=0時,進入內(nèi)嵌for循環(huán),該for循環(huán)的功能依然為將pp數(shù)組中的元素依次向右移一位。然后將xx[l]數(shù)組中的最后一個元素開始,每次for循環(huán)結(jié)束后,就將其存入pp[0]中,然后k和i(由后向前)都指向下一個元素,重新進入到while循環(huán)體中。本層while循環(huán)結(jié)束后,將pp數(shù)組連接在ch數(shù)組后,同時將pp數(shù)組置空,最外層while循環(huán)執(zhí)行到i=-1,即本行所有元素都訪問過后結(jié)束,字符串排序結(jié)束,最后將ch數(shù)組中的內(nèi)容拷貝到xx[l]數(shù)據(jù)中,for循環(huán)執(zhí)行到xx數(shù)組中的所有元素均被訪問過,然后退出循環(huán)體,StrOL()函數(shù)結(jié)束。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |