本系列资料由"韬略宏智" 授权发布,任何网站不得转载,否则追究法律责任。
第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 StrOR(void)
{
int i,j,k,index,strl;
char ch;
for(i=0;i<maxline;i++)
{ strl=strlen(xx[i]);
index=strl;
for(j=0;j<strl;j++)
if(xx[i][j]=='o')
{ for(k=j;k<strl-1;k++)
xx[i][k]=xx[i][k+1];
xx[i][strl-1]=' ';
index=j;
}
for(j=strl-1;j>=index;j--)
{ ch=xx[i][strl-1];
for(k=strl-1;k>0;k--)
xx[i][k]=xx[i][k-1];
xx[i][0]=ch;
}
}
}
【解析】
考点:(1)查找并删除字符串中的指定字符;
(2)对字符串中的元素进行移位。
本题的解题思路是:以行为单位查找并删除字母“o”,然后根据题意进行字符串的互换。实现字符串的互换时,把左边字符串移到右边,与把右边字符串移到左边其结果一样,但是后者相对简单,故本题采用后者。删除字符“o”,可以通过找到每行中的字母“o”后,将“o”后面 的字母依次向前移一位,即可以把“o”删除。把字符“o”右边的字符串移到左边,可以将最后一位字符移动到字符串的首部,并将其他的字符依次向后移一位,直到原来字母“o”所在位置上的字符也被移到字符串首部为止,确定原来字符“o”所在的位置,可以设定一个记录字符“o”位置的变量。
程序的流程为:首先调用ReadDat()函数读入数据并存放到数组xx中,通过StrOR()函数处理后,由WriteDat()函数写回文件out13.dat中。
在StrOR()函数中,最外层for循环的作用是使下面的操作逐行进行,首先通过库函数strlen()得到每行字符串的实际长度并赋给strl,循环到i=maxline,即访问过所有行时结束,然后进入内嵌的第二层for循环,循环到j=strl,即访问过本行的所有字符时结束,在循环体中,通过if语句依次判断当前元素是否为字符“o”,若是“o”则进入第三层循环体,在循环体中将字符“o”后面的元素依次向前移一位,此时字符“o”已经被它后面的元素所取代,然后再把本行最后一个字符置空,此时j的值为字符“o”原来所在数组元素的下标,把i赋给index,即用index来标记字符“o”原来所在的位置,当k=strl-1,即“o”后面所有的字符都依次向前移动一位后,本层for循环结束。进入下一个for循环,在以下程序中,先把数组中每行的最后一个元素赋给ch后,进入下一重循环,将从index标记的位置开始逐个向后移一位,并且把最后一位移到本行的开头处,一直循环到index标记的位置也被移到开头处,函数结束。
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |