综合实验:文件操作与字符处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]; }