综合实验:文件操作与字符处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

高级语言程序设计综合性试验

文件操作与字符处理

一、题目与运行说明

Description

在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,

其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,

并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,

不足5个单词时,按序输出全部单词)。程序中注意如下细节:

(1)空格、标点符号与回车符起到分隔单词的作用。

(2)文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;

(3)名词缩写算一个单词;

(4)数字不算单词;

(5)单词不区分大小写;

(6)输出时单词全使用小写;

(1)使用变量:

struct word

{

char b[21];

int num;

}a[10000];

char ch;

int i=0,j=0,t,m,n;

struct word temp;

FILE *fp;

(2)输入形式和输入范围:

(3)数据输出形式:

x num

(4)程序能达到的功能以及出错处理:

统计文章中每个单词出现的次数,

并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,

不足5个单词时,按序输出全部单词)。

二、程序设计思路:

三、程序清单

#include

#include

struct word

{

char b[21];

int num;

}a[10000];

int main()

{

char ch;

int i=0,j=0,t,m,n;

struct word temp;

FILE *fp;

fp=fopen("case1.in","r");

while((ch=fgetc(fp))!=EOF) /*将文本中的单词读入结构体中,连接有连字符的单词,将大写改小写*/

{

if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))

{

a[i].b[j]=ch;

if(ch>='A'&&ch<='Z')

{ch=ch+32;

a[i].b[j]=ch;

}

j++;

}

else if(ch=='-')

if((ch=fgetc(fp))!='\n')

{i++;

j=0;

a[i].b[j]=ch;

if('A'<=ch&&ch<='Z')

a[i].b[j]=ch+32;}

else

continue;

else

{

i++;

j=0;

}

}

for(;i>=0;)

if(a[i].b[0]>'z'||'a'>a[i].b[0])

i--;

else

break;

i++;

for(m=0,n=0;m

{

while(a[m].b[0]>'z'||'a'>a[m].b[0])

m++;

a[n]=a[m];

n++;

}

for(i=0;i

for(j=0;j

if(strcmp(a[j].b,a[j+1].b)>0)

{strcpy(temp.b,a[j].b);

strcpy(a[j].b,a[j+1].b);

strcpy(a[j+1].b,temp.b);

}

for(i=0;i

a[i].num=1;

for(i=1,j=0;i

if(strcmp(a[j].b,a[i].b)==0)

a[j].num++;

else

{

j++;

a[j]=a[i];

}

for(i=0;i

for(t=0;t

if(a[t].num

{

temp=a[t];

a[t]=a[t+1];

a[t+1]=temp;

}

j++;

if(j<5) /*判断单词总数,大于或等于5,输出前5个,小于5,输出所有单词*/ for(i=0;i

printf("%s %d\n",a[i].b,a[i].num);

else

for(i=0;i<5;i++)

printf("%s %d\n",a[i].b,a[i].num);

fclose(fp);

return 0;

}

四、小结(收货和体会)

思路虽然较为清晰,但题目中的要求比较多也比较细,代码量较大,经常写到一半就思路乱了导致要重写。出错时候大多是因为for循环中的跳出条件错误,自己检查时候很难注意到。将所有错误改正,重新梳理思路后,编译通过,测试运行结果无误,提交至OJ耗时1543ms,虽然仍比不上标程的500-600ms。

相关文档
最新文档