本系列资料由"韬略宏智" 授权发布,任何网站不得转载,否则追究法律责任。
第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()函数结束。
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |