文件操作与字符处理文件操作与字符处理
C语言程序设计综合实验
实验题目: 文件操作与字符处理
一、题目与运行说明
(1) 题目描述
,不是字母l,写错提交后会判错)的在当前目录中存在文件名为"case1.in"(其中case后为数字1
文本文件,其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,不足5个单词时,按序输出全部单词)。程序中注意如下细节: (1) 空格、标点符号与回车符起到...
文件操作与字符处理
C语言程序设计综合实验
实验题目: 文件操作与字符处理
一、题目与运行说明
(1) 题目描述
,不是字母l,写错提交后会判错)的在当前目录中存在文件名为"case1.in"(其中case后为数字1
文本文件,其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计文章中每个单词出现的次数,并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,不足5个单词时,按序输出全部单词)。程序中注意如下细节: (1) 空格、标点符号与回车符起到分隔单词的作用。
(2) 文章一行的末尾可能有连字符,出现连字符时,该行最末的字符串与下行最先出现的字符串
构一个单词;
(3) 名词缩写算一个单词;
(4) 数字不算单词;
(5) 单词不区分大小写;
(6) 输出时单词全使用小写;
(2) 数据输入的形式和输入值的范围
建立结构体和链表,打开文件,将数据输入到链表中;输入值的范围可以超过1000个单词,
每个单词不超过20个字符。
(3) 数据输出的形式
将保存数据的链表进行一系列排序,输出满足实验要求的链表。
(4) 程序中所使用的主要变量
计算单词个数的变量:i;存储单词的结构体变量:struct vocab ;
(5) 程序所能达到的功能以及出错处理
程序所能达到的功能为计算文件中单词的个数,并将单词和数目以数目大小的次序进行有序
输出;出错处理暂无
二、程序设计思路
程序
图如图1所示,
图1:
以此为例: 打开文件,计算单词个数
I am a student. My school is SCAU.It is a readfile函数实现功能
Beautiful university. I like it.
以此为例
建立链表
根据单词个数建立相同数目的结点 struct vocab * creat()函数实现此功能
读取文件的内容,将单词输入链表 seadfile2()函数实现此功能(包含insert() 和insert2()以及insert3()、insert4()四 个函数)
将单词按照字典顺序进行排序 paixu()函数实现此功能
在按字典顺序排列的前提下统计每个单词出现的次数并排序 (run函数实现统计功能,tiao函数实现排序功能)
输出排在前面的单词和单词出现的
个数 (print函数实现此功能)
三、程序清单
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#define LEN sizeof(struct vocab) struct vocab * head; //建立结构体 int i,d; //全局变量 struct vocab
{
char ch[20]; //字符数组存储单词
unsigned num; //存储单词出现的次数
struct vocab * next; //结构体指针 };
//主函数
main()
{
int readfile();
struct vocab * creat(int n);
int readfile2();
struct vocab * insert(char sh[20],int a);
struct vocab * insert2(char sh[20],int a);
void insert3(char sh,int x,int a);
struct vocab * paixu();
int run();
struct vocab * tiao();
void print();
d=i=readfile();
head=creat(i);
readfile2();
paixu();
d=run();
tiao();
print();
}
//读文件,统计单词个数。
int readfile()
{
FILE *fp;
char ch,ch1,ch2;
int n=0,word=1;
if((fp=fopen("case1.in","r"))==NULL)
return(0);
while((ch=fgetc(fp))!=EOF)
{
if(ch==' '||ch=='\n'||ch=='.'||ch=='-'||ch=='=')
{ ch1=ch;
word=1;
if((ch2=='-')&&(ch1=='\n')) n--;
ch2=ch1;
}
else if(word==1)
{
if(('A'<=ch&&ch<='Z')||('a'<=ch&&ch<='z')) n++;
word=0;
}
}
fclose(fp);
return(n);
}
//根据单词个数,建立相应结点的链表。
struct vocab * creat(int n) {
int m;
struct vocab *p1,*p2;
char eh[20]={0};
head=NULL;
for(m=0;m
num=1;strcpy(p1->ch,eh);
if(m==0) p2=head=p1;
else p2->next=p1;
p1->next=NULL;
p2=p1;
}
return(head);
}
//将单词从文件中输入到链表。
int readfile2()
{
struct vocab * insert(char sh[20],int a);
struct vocab * insert2(char sh[20],int a);
void insert3(char sh,int x,int a);
void insert4(int x,int a);
FILE *fp;
char ch,ch1,ch2,ch3;
char s[20],c[20];
int word=1,j=1,flag=1,k,t=-1,r=0;
if((fp=fopen("case1.in","r"))==NULL)
return(0);
while((ch=fgetc(fp))!=EOF)
{
if(ch==' '||ch=='.'||ch=='-'||ch=='='||ch=='\n')
{
if(ch!='\n')ch1=ch;
if(flag!=1)
{
for(k=flag-1;k<20;k++)
s[k]='\0';
if(ch2=='\n'&&ch3=='-')
{
insert2(s,--j);
}
else if(r==i-1)
insert4(++t,i);
else
{
insert(s,j);
ch2=ch;
r++;
}
j++;
}
ch3=ch1;
flag=1;
}
if(ch=='\n') ch2=ch;
else if(('A'<=ch&&ch<='Z')||('a'<=ch&&ch<='z'))
{
if(ch<='Z'&&ch>='A')
ch=ch+32;
if(r==i-1)
{ t++;
insert3(ch,t,i);
}
s[flag-1]=ch;
flag++;
}
}
fclose(fp);
}
struct vocab * insert(char sh[20],int a)
{
struct vocab *p1,*p2 ;
unsigned f=1;
p1=head;
while(fnext;
f++;
}
strcpy (p1->ch,sh); }
struct vocab * insert2(char sh[20],int a)
{
struct vocab *p1,*p2 ;
unsigned f=1;
p1=head;
while(fnext;
f++;
}
strcat(p1->ch,sh);
return(head);
}
void insert3(char sh,int x,int a)
{
struct vocab *p1,*p2 ;
unsigned f=1;
p1=head;
while(fnext;
f++;
}
(p1->ch[x])=sh;
}
void insert4(int x,int a) {
struct vocab *p1,*p2 ;
unsigned f=1,v;
p1=head;
while(fnext;
f++;
}
for(v=x;v<20;v++)
(p1->ch[v])='\0';
}
//将单词按照字典的顺序排列。
struct vocab * paixu() {
struct vocab *p1,*p2;
int t,y=1,j;
char p[20]={0};
p2=p1=head;
for(y=1;y<=i;y++)
{p2=head;
for(j=1;j<=i-y;j++)
{if((strcmp(p2->ch,p2->next->ch))>=0)
{
strcpy(p,p2->ch);
strcpy(p2->ch,p2->next->ch);
strcpy(p2->next->ch,p);
t=p2->num;
p2->num=p2->next->num;
p2->next->num=t;
}
p2=p2->next;
}
}
return(head);
}
//在按字典顺序排列的前提下,计算单词出现的次数,并删除相同单词的结点。
int run()
{
struct vocab *p1,*p3,*p4;
int t,d;
p4=p3=p1=head;
while(p4->next!=NULL)
{
p4=p1->next;
while(strcmp(p1->ch,p4->ch)==0)
{
p1->num=(p1->num)+1;
i--;
if(p4->next==NULL) break;
else
{p3->next=p4->next;
p4=p4->next;
}
}
p3=p1=p3->next;
}
return(i);
}
//在按字典顺序排列的前提下,根据单词出现的次数进行排序(相同数目时仍保持字典排列的顺序)。
struct vocab * tiao()
{
struct vocab *p2;
int t,y=1,j;
char p[20]={0};
p2=head;
for(y=1;ynum)<(p2->next->num))
{
strcpy(p,p2->ch);
strcpy(p2->ch,p2->next->ch);
strcpy(p2->next->ch,p);
t=p2->num;
p2->num=p2->next->num;
p2->next->num=t;
}
p2=p2->next;
j++;
}
}
return(head);
}
//输出链表,输出前五个单词。 void print()
{
struct vocab * p; p=head;
int r=1;
if(head!=NULL) for(r=1;r<=5;r++) {
printf("%s %d\n",p->ch,p->num);
p=p->next;
}
}
四、小结(收获和体会)
综合终于独立完成了~做这题花了我一个星期的时间,刚开始看到这题目的时候就想到了用链表,毕竟自己对链表比较熟悉,上学期的关于链表的题目都是自己独立完成,也庆幸做完了老师才发答案。做这题时出现了很多问题,刚按照自己的思路敲完第一遍的程序,有二百五十行左右,出现的错误有三十几个,这是意料之中的事情,经过修改,在将所有的语法错误改正后问题还是在意料之中出现了,问题没那么简单我也知道。
经过一系列的修改:刚开始时将所有的结点(即所有的单词)输出,查看在输入链表时有什么错误,确认没问题时在将单词按字典的顺序进行排序,然后再将相同的单词进行累加,删掉有相同单词的结点,然后输出前五个结点,完成任务。
途中出现的问题:根据纸质的题目进行编写,用题目的数据进行测试成功后上交时错误,根据错误提示没有考虑连接符出现的情况,进行修改后,提交再次发现错误,根据错误提示和自己的反复调试,发现问题是没有考虑另一种情况:在将所有的单词输入的时候,当最后一个单词没有标点符号的情况。出错后在添加了一个程序将最后一个单词以逐个字母输入链表以解决问题。将题目完成后,经过反复的测试和调试,不断地提交,最后得以完成。
程序是完成了,但我知道最重要的还是在里面学的东西,一个星期的时间让我懂得了什么是坚持,什么是对自己的肯定,看我做了一个星期,舍友叫我放弃,当时是有这种感觉,我想就算我把错的交上去也不会很差,但我最后还是坚持下来了,没有把这题做出来,好像对其他的事情的事情都失去了兴趣,提不起一点精神,看着别人花更少的时间却轻而易举地把它完成,我开始对自己产生怀疑,但这些只能对自己说,暂时的他们是让我敬畏的。再试一次,我还是成功了,这次代码有接近三百行,都是我参考书和一些链表的注意事项做出来的。
对于编程我学到了:加深了对链表的理解;对调试程序熟练了很多;具体问题实际解决;学会了发现规律勇于探索。
最重要的一点是我对编程有了信心~谢谢老师~
评分表
题目:文件操作与字符处理
学号: 姓名:
评分项目 分数 1(实现情况(40):完成设计要求的情况
4(程序(10):程序的结构与格式规范程度等等
5(报告情况(35):报告内容是否详实,内容是否深刻等等 6(报告规范(15):撰写的规范性、合理性等等
总成绩:
评语:
评阅老师: 评阅时间: 年 月 日
本文档为【文件操作与字符处理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。