文件操作与字符处理
- 格式:doc
- 大小:54.00 KB
- 文档页数:7
C语言程序设计综合实验
实验题目:文件操作与字符处理
实验班级:
学生学号:
学生姓名:
任课教师:陈湘骥
提交时间:2012年12月27日
华南农业大学信息学院
一、题目与运行说明
(1)题目描述
在当前目录中存在文件名为"case1.in"(其中case后为数字1,不是字母l,写错提交后会判错)的文本文件,其内容为一篇英文文章(以EOF作为结束标志)。
现要求读取该文本文件内容,统计文章中每个单词出现的次数,并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,不足5个单词时,按序输出全部单词)。
程序中注意如下细节:(1)空格、标点符号与回车符起到分隔单词的作用。
(2)文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串构一个单词;
(3)名词缩写算一个单词;
(4)数字不算单词;
(5)单词不区分大小写;
(6)输出时单词全使用小写;
(2)数据输入的形式和输入值的范围
读取文件中的单词,以字符的形式读入。
取值可以在10000个之中。
每个字符组可以包含最
多20个字符。
(3)数据输出的形式
在屏幕中,以字符的形式输出单词,以数字的形式输出数量。
(4)程序中所使用的主要变量
使用结构体,用来存放,处理单词。
使用整形变量i,j,m,n,t,用来调控循环系统。
使用文件指针进行文件操作,使用多种函数,进行排序,比较。
使用结构体temp,进行交换时作中间量。
(5)程序所能达到的功能以及出错处理
对文件进行读取,读取文件时,能自动识别单词,把非单词的字符去掉,把带有破折号的单词进行重新合并,进行数量的比较,排序。
对总体单词数进行分析,区分开多于5个单词与少于5个单词的功能。
二、程序设计思路
程序流程图如图所示,
三、程序清单将字符串读入结构体中
读入文件
case1.in
将单词留在结构体
中,非单词的统统删
将单词按字典的顺
序进行排序
计算相同单词的数量
计算不同单词的个
数,是不是比5少
将全部单词按序输出将出现次数最多的前5个单词及其
出现次数输出
关闭文件,程序结束
是否
三、程序清单
#include<stdio.h>
#include<string.h>
struct word
{ char b[21];
int num;
}a[10000];
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(('A'<=ch&&ch<='Z')||('a'<=ch&&ch<='z'))
{a[i].b[j]=ch;
if('A'<=ch&&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<i;m++)
{while(a[m].b[0]>'z'||'a'>a[m].b[0])
m++;
a[n]=a[m];
n++;}
for(i=0;i<n-1;i++) /*将单词按字典的顺序进行排序*/ for(j=0;j<n-1-i;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<n;i++)
a[i].num=1; /*将单词的数量初始化为1*/
for(i=1,j=0;i<n;i++) /*统计相同单词的个数*/
if(strcmp(a[j].b,a[i].b)==0)
a[j].num++;
else
{j++;a[j]=a[i];}
for(i=0;i<j;i++) /*将单词按数量从大到小排好*/
for(t=0;t<j-i;t++)
if(a[t].num<a[t+1].num)
{temp=a[t];a[t]=a[t+1];a[t+1]=temp;}
j++;
if(j<5) /*判断不同单词的个数,如果少于5全部输出,多余5输出最多的5位*/ for(i=0;i<j;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);}
四、小结(收获和体会)
刚开始做题的时候,打开文件读取内容都比较简单,我知道要输出单词和它的数量,结构体能包含多种数据,用它来存放单词最好不过。
但如何将不是单词的字符串删除,我确实想了很久。
最后我用了一个循环加一个判断将单词分开。
出现了单词数量比实际多的情况,我又添加了一些判断如将破折号连接单词的情况,首字母肯定是字母才是单词等加进去,终于把单词都成功放进结构体。
接下来,并不能马上就数数,我先对单词进行排序,把相同的单词都放在一起,然后再数,这样就可以避免重复数数的问题。
同时在进行完一个单词的数数后,我马上对结构体进行重新编排,这样新结构体全部都是不同的单词,带正确的数量。
最后,进行判断不同单词的总个数,然后输出。
结束了程序。
总体来说,难度并不大。
我觉得这道题的难点是如何处理这些字符串,处理得不好,不能进行后续的排序和数数,但文件中的内容千变万化,不按正规格式出牌,一开始没有考虑到这种情况,结果很多单词没有存进结构体,或者把一些奇形怪状的字符也存进去,后来不断添加判断语句进行补充,情况得到解决。
完好的结构体,后面的排序和数数就游刃有余了。
评分表
题目:文件操作与字符处理
学号:姓名:
评分项目分数1.实现情况(40):完成设计要求的情况
4.程序规范(10):程序的结构与格式规范程度等等
5.报告情况(35):报告内容是否详实,总结内容是否深刻等等
6.报告规范(15):撰写的规范性、合理性等等
总成绩:
评语:
评阅老师:评阅时间:年月日。