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