文件操作与字符处理
- 格式:doc
- 大小:628.50 KB
- 文档页数:15
文本文件操作方法文本文件操作是指在计算机中对文本文件进行读取、写入、修改和删除等操作的过程。
文本文件是一种以文本形式存储的文件,通常以.txt或者.csv为扩展名,其中存储的是以字符为基本单位的数据。
文本文件操作是日常编程中非常常见的操作之一,可以用于读取和处理大量的文本数据,也可以用于将处理后的结果保存到文本文件中。
下面将介绍一些常用的文本文件操作方法。
1. 打开文件:在进行文本文件操作之前,需要先打开文件,以便后续的读写操作。
可以使用python内置的open()函数来打开文件,该函数的用法如下:file = open('filename.txt', 'r')其中'filename.txt'是要打开的文件名,'r'表示以只读模式打开文件。
还可以使用'w'表示以只写模式打开文件,'a'表示以追加模式打开文件。
2. 读取文件内容:打开文件之后,可以使用read()方法来读取文件中的内容。
该方法会一次性将文件中的所有内容读取到一个字符串中。
content = file.read()还可以使用readline()方法每次只读取文件中的一行内容,使用readlines()方法将文件中的内容按行读取到一个列表中。
line = file.readline()lines = file.readlines()3. 写入文件内容:如果以写入模式打开文件,就可以使用write()方法或者writelines()方法向文件中写入内容。
file.write('Hello World!')file.writelines(['Hello', 'World!'])4. 关闭文件:在对文件进行读写操作之后,要及时关闭文件,以释放资源。
file.close()另外,还可以使用with语句来打开文件,在语句块结束时会自动关闭文件。
《C语言程序设计》综合实验实验题目:文件操作与字符处理实验班级:学生学号:学生姓名:任课教师:提交时间:程序中使用的主要变量:S,I,j,k1,k2,p:标记变量与记录截取位置的静态指针A,b:存储单词统计数据数据输入的形式与范围:若干行,以非字母作为分隔符。
数据输出格式:不超过5行,每行包括单词名和出现次数程序所能达到的功能:统计单次出现次数并找出出现最多的5个#include <stdio.h>#include <string.h>int a[10000];int b[10000][256];char s[256];int qsort(int l,int r);int cut(char *s1,char *s2,int k1,int k2);int main(){FILE *fp;int i,j,k,k1,k2,p,m=0;char s1[256],s2[256];fp=fopen("case1.in","r");while ((fgets(s,256,fp))!=NULL){k2=-1;for (i=0;i<=strlen(s);i++) if(((s[i]<='z')&&(s[i]>='a'))||((s[i]<='Z')&&(s[i]>="A"))&&(!((s[i+1]<='z')&&(s[i+1]>='a'))| |((s[i+1]<='Z')&&(s[i +1]>="A")))){k1=k2+2;k2=i;cut(s2,s1,k1,k2);p=1;for (j=1;j<=m;j++) if (strcmp(s2,b[j])==0) {a[j]++;p=0;}if (p==1){m++; a[m]=1;strcpy(b[m],s2);}}}qsort (1,m);if (m>5) m=5;for (i=1;i<=m;i++) print("%s %d\n",b[i],a[i]);}int qsort (int l,int r){int i,j,k,m;char ss[256];i=l;j=r;m=(l+r)/2;while (i<=j){while (a[i]>a[m])||((a[i]==a[m])&&(strcmp(b[i],b[m])==1)) i++;while (a[j]<a[m])||((a[j]==a[m])&&(strcmp(b[m],b[j])==1)) j--;if (i<=j){k=a[i];a[i]=a[j];a[j]=k;strcpy(ss,b[i]);strcpy(b[i],b[j]);strcpy(b[j],ss);i++;j--;}}if (j>l) qsort(l,j);if (i<r) qsort(i,r);}int cut(char *s1,char *s2,int k1,int k2){int i;for (i=0;i<=k2-k1;i++) s1[i]=s2[k1+i];s1[i+1]='\0';}总结:1.分模块编程有助于快速查错,且便于统计与修改。
文件操作读写数据的基本方法文件操作是计算机编程中常用的技术之一,它能够读写数据并对文件进行处理。
在本篇文章中,我将介绍文件操作的基本方法,包括文件的打开、读取、写入和关闭等过程。
一、文件打开在进行文件操作前,我们首先需要打开一个文件。
文件可以有不同的模式,包括读取模式、写入模式和追加模式等。
下面是打开文件的基本步骤:1. 使用编程语言提供的文件操作函数,如Python中的open()函数。
2. 指定文件的路径和文件名。
可以是绝对路径或相对路径。
3. 指定文件的打开模式,如读取模式("r")、写入模式("w")或追加模式("a")。
4. 执行打开操作,并将文件对象保存到一个变量中,以便后续对文件进行操作。
下面是一个Python示例代码,展示了如何打开一个文本文件并将文件对象保存到变量file中:```pythonfile = open("example.txt", "r")```二、文件读取文件打开后,我们可以读取文件中的内容。
根据文件的类型和需求,可以选择逐行读取或一次性读取整个文件。
以下是文件读取的基本方法:1. 使用文件对象的读取函数,如Python中的readline()函数或read()函数。
2. 逐行读取可以使用循环结构,每次读取一行内容,并对其进行处理。
3. 一次性读取整个文件可以使用read()函数,将文件内容保存为一个字符串。
以下是一个Python示例代码,展示了如何逐行读取一个文本文件:```pythonfor line in file.readlines():# 处理每一行的内容print(line)```三、文件写入除了读取文件的内容,我们还可以向文件中写入数据。
在进行文件写入操作前,需要确保文件已经打开并且处于写入模式。
以下是文件写入的基本方法:1. 使用文件对象的写入函数,如Python中的write()函数或writelines()函数。
C语言文件操作读写文件和错误处理一、文件操作概述文件操作是指通过编程语言对计算机文件进行读取和写入的过程。
在C语言中,文件操作是通过标准库函数来实现的,主要包括打开文件、读写文件、关闭文件、错误处理等步骤。
本文将介绍C语言中文件操作的基本流程以及常见的错误处理方式。
二、打开文件在C语言中,可以使用fopen函数来打开文件。
其基本语法如下:FILE *fopen(const char *filename, const char *mode);其中,filename是要打开的文件名,可以是绝对路径或相对路径;mode是打开文件的模式,常见的模式包括:- "r":只读模式,打开文件进行读取- "w":写入模式,创建新文件,若文件已存在则先清空内容- "a":追加模式,打开文件进行写入,若文件不存在则创建新文件- "r+":读写模式,打开文件进行读写- "w+":读写模式,创建新文件,若文件已存在则先清空内容- "a+":读写模式,打开文件进行读写,若文件不存在则创建新文件,并在文件末尾添加内容打开文件后,会返回一个FILE型的指针,用于后续的读写操作。
三、读取文件1. 逐字符读取可以使用fgetc函数来逐字符读取文件内容。
其基本语法如下:int fgetc(FILE *stream);其中,stream是打开的文件的指针,函数会依次读取文件中的每个字符,并返回ASCII码值。
当读取到文件末尾时,返回EOF。
2. 逐行读取可以使用fgets函数来逐行读取文件内容。
其基本语法如下:char *fgets(char *str, int n, FILE *stream);其中,str是用来存储读取内容的字符数组,n是最大读取字符数(包括换行符),stream是打开的文件的指针。
函数会将读取到的一行内容(包括换行符)存储到str中,并返回str的地址。
hutool用法Hutool是一款基于Java语言的工具类库,可以提供各种常用的类和方法来简化Java开发过程中的操作,例如字符串操作、日期时间处理、文件操作、网络操作以及加密解密等。
下面是一些Hutool的常用用法:1. 字符串操作:Hutool中提供了大量的字符串操作方法,例如判断字符串是否为空,判断字符串是否为数字,字符串转换等等,如下所示:- 判断字符串是否为空:StrUtil.isEmpty(str)- 判断字符串是否为数字:NumberUtil.isNumber(str)- 字符串转换:Convert.toStr(Object obj)2. 日期时间处理:Hutool中提供了各种日期时间处理方法,例如日期格式化,日期比较等等,如下所示:- 日期格式化:DateUtil.formatDate(Date date, String pattern)- 日期比较:pare(Date date1, Date date2)- 日期计算:DateUtil.offsetDay(Date date, int offset)3. 文件操作:Hutool中提供了各种文件操作方法,例如文件读取、文件写入、文件复制等等,如下所示:- 文件读取:FileUtil.readUtf8String(String path)- 文件写入:FileUtil.writeUtf8String(String path, String content)- 文件复制:FileUtil.copy(String src, String dest, boolean isOverride)4. 加密解密:Hutool中提供了各种加密解密方法,例如MD5加密、AES加密等等,如下所示:- MD5加密:SecureUtil.md5(String str)- AES加密:AESUtil.encrypt(String content, String key)以上仅是Hutool提供的一些常用方法,它还提供了很多其他有用的功能和工具,具体可参考官方文档。
c语言常用的安全函数C语言常用的安全函数C语言是一种广泛应用于系统编程和嵌入式开发的高级编程语言。
而在进行C语言编程时,我们需要特别注意安全性,以避免程序出现潜在的漏洞和问题。
为了提高代码的安全性,C语言提供了许多常用的安全函数,用于处理字符串、内存分配、文件操作等。
本文将介绍C语言常用的安全函数,并对其使用方法和注意事项进行详细说明。
一、字符串处理函数1. strncpy:用于将指定长度的字符串复制到目标字符串中,避免溢出。
2. strncat:用于将指定长度的字符串连接到目标字符串的末尾,同样可以避免溢出。
3. snprintf:用于格式化输出字符串,并将结果存储到目标字符串中,可以避免缓冲区溢出。
4. strlcpy:用于将源字符串复制到目标字符串中,同时确保目标字符串以空字符结尾,避免缓冲区溢出。
5. strlcat:用于将源字符串连接到目标字符串的末尾,同时确保目标字符串以空字符结尾,同样可以避免缓冲区溢出。
在使用这些函数时,需要注意指定目标字符串的长度,以确保不会发生缓冲区溢出的情况。
二、内存分配函数1. calloc:用于在内存中分配指定数量的连续字节,并将其初始化为零。
这样可以避免使用未初始化的内存。
2. malloc:用于在内存中分配指定数量的连续字节,但不进行初始化。
在使用malloc分配内存时,需要注意在使用完毕后,及时使用free函数释放内存,避免内存泄漏问题。
3. realloc:用于重新分配之前分配的内存块的大小。
这个函数可以用于扩大或缩小内存块的大小。
同样需要注意在使用完毕后释放内存。
使用这些函数时,应该确保分配的内存足够,并且在使用完毕后及时释放内存,以避免内存泄漏和指针悬挂的问题。
三、文件操作函数1. fopen:用于打开一个文件,并返回一个文件指针。
在使用fopen函数打开文件时,应该确保文件存在,并且拥有足够的权限。
2. fclose:用于关闭一个已打开的文件。
文件处理方法文件处理是计算机科学中非常重要的一项任务。
它涉及到对文件进行创建、读取、写入、编辑、复制、移动等一系列操作。
合理的文件处理方法可以提高工作效率,提供更好的用户体验。
下面将介绍几种常见的文件处理方法。
一、文件创建文件创建是文件处理的基础操作之一。
在计算机中,可以通过编程语言或操作系统提供的接口来创建文件。
在Windows操作系统中,可以使用命令行或资源管理器来创建文件。
在Linux系统中,可以使用touch命令来创建文件。
此外,还可以使用文本编辑器等软件创建文件。
二、文件读取与写入文件读取与写入是文件处理中最常见的操作之一。
通过读取文件,可以获取文件中的数据或内容。
通过写入文件,可以向文件中写入数据或内容。
在文件读取时,可以使用编程语言提供的输入输出函数来读取文件内容。
在文件写入时,可以使用编程语言提供的输出函数来写入文件内容。
三、文件编辑文件编辑是对文件进行修改或调整的操作。
在文件编辑过程中,可以对文件进行插入、删除、替换等操作。
在文本文件中,可以使用文本编辑器来进行编辑。
在二进制文件中,可以使用十六进制编辑器来进行编辑。
此外,还可以使用专业的编辑软件来编辑特定类型的文件。
四、文件复制与移动文件复制与移动是文件处理中常用的操作之一。
通过复制文件,可以将文件从一个位置复制到另一个位置。
通过移动文件,可以将文件从一个位置移动到另一个位置。
在Windows操作系统中,可以使用命令行或资源管理器来复制或移动文件。
在Linux系统中,可以使用cp命令来复制文件,使用mv命令来移动文件。
五、文件删除与恢复文件删除与恢复是文件处理中的重要环节。
通过删除文件,可以将文件从存储设备中永久删除。
在Windows操作系统中,可以使用命令行或资源管理器来删除文件。
在Linux系统中,可以使用rm 命令来删除文件。
如果误删了文件,可以使用数据恢复软件来尝试恢复文件。
六、文件压缩与解压缩文件压缩与解压缩是文件处理中的常用操作之一。
计算机操作word文档1打开文件(文字处理素材\1\exam1.docx),并按照下列要求进行排版。
(1)将标题字体设置为“华文行楷”,字形设置为“常规”,字号设置为“小初”且居中显示。
(2)将“——陶渊明”的字体设置为“隶书”、字号设置为“小三”,文字右对齐加双曲线边框,线型宽度应用系统默认值显示。
(3)将正文行距设置为25磅。
操作完成后以原文件名保存。
文字解析:①单击“开始”选项卡按钮,选定“归去辞来”,在“字体”功能区中单击“字体”下拉按钮,在下拉列表中选定“小初”。
字体默认为“常规”。
②在“段落”功能区中单击“居中”命令按钮,将文字居中显示。
③选定“——陶渊明”,在“字体”功能区中单击“字体”下拉按钮,在下拉列表中选定“隶书”;在“字体”功能区中单击“字号”下拉按钮,在下拉列表中选定“小三”。
④在“段落”功能区中单击“文本右对齐”命令按钮,将文字右对齐显示。
⑤再次选定“——陶渊明”,单击“页面布局”选项卡,在“页面背景”功能区单击“页面边框”命令按钮,打开“边框和底纹”对话框;单击“边框”选项卡按钮,在“设置”列表框中选定“方框”,在“样式”列表框中选择双曲线,在“应用于”列表框中选择“文字”,单击“确定”按钮。
⑥选定正文,单击“开始”选项卡按钮,在“段落”功能区中单击对话框启动器,打开“段落”对话框;单击“行距”框右侧的下拉按钮打开下拉列表,选择“固定值”,然后将后面的“设置值”设置为25磅。
计算机操作word文档2打开文件(文字处理素材\2\exam2.docx),并按照下列要求进行排版。
(1)设置第一段首字下沉。
(2)将第一段(除首字)字体设置为“楷体”,字号设置为“四号”。
(3)将第二段字体设置为“方正舒体”,字号设置为“小四号”,加双横线下划线。
文字解析:①选定第一段,单击“插入”选项卡按钮,在“文本”功能区中单击,“首字下沉”命令按钮,在弹出的下拉列表中单击“下沉”。
②选定第一段(除首字),将其字体设置为“楷体”,将字号设置为“四号”。
文件的五种基本操作方法文件的五种基本操作方法文件是计算机中存储数据的一种方式。
对于文件的操作是计算机中常见而重要的操作之一。
文件的操作方法包括创建、打开、写入、读取和关闭。
下面将详细介绍文件的五种基本操作方法。
1. 创建文件:创建文件是指在计算机的硬盘或其他存储设备上新建一个空白文件。
创建文件的方法根据不同的操作系统略有差异。
在Windows操作系统中,可以通过“新建文件”选项或右键点击空白处然后选择“新建”再选择“文本文档”来创建一个空白文件。
在Linux操作系统中,可以使用touch命令来创建一个空白文件。
创建文件时可以指定文件的名称和格式,例如txt格式的文本文件。
2. 打开文件:打开文件是指将已经存在的文件加载到计算机的内存中,以便进行读取和写入等操作。
打开文件的方法也因不同的操作系统而略有差异。
在Windows操作系统中,可以通过双击文件或右键点击文件然后选择“打开”来打开文件。
在Linux 操作系统中,可以使用cat命令来打开文件。
打开文件后,计算机会将文件的内容加载到内存中的缓冲区,以便后续的操作。
3. 写入文件:写入文件是指将数据从计算机的内存中写入到文件中。
写入文件时可以将新的数据追加到文件的末尾,也可以将新的数据覆盖文件原有的内容。
在进行写入操作之前,需要先打开文件。
在Windows操作系统中,可以使用文件相关的API或者文本编辑软件来进行写入操作。
在Linux操作系统中,可以使用echo命令或者文本编辑器来进行写入操作。
写入的数据可以是文本、图像等各种格式的数据。
4. 读取文件:读取文件是指将文件中的数据读取到计算机的内存中以便后续的处理或显示。
读取文件也需要先打开文件。
在Windows操作系统中,可以使用文件相关的API 或者文本编辑软件来进行读取操作。
在Linux操作系统中,可以使用cat命令或者文本编辑器来进行读取操作。
读取文件时可以一次性读取整个文件的内容,也可以按照一定的规则分块读取文件的内容。
高级语言程序设计综合性试验文件操作与字符处理一、题目与运行说明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<stdio.h>#include<string.h>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;}elsecontinue;else{i++;j=0;}}for(;i>=0;)if(a[i].b[0]>'z'||'a'>a[i].b[0])i--;elsebreak;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;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);elsefor(i=0;i<5;i++)printf("%s %d\n",a[i].b,a[i].num);fclose(fp);return 0;}四、小结(收货和体会)思路虽然较为清晰,但题目中的要求比较多也比较细,代码量较大,经常写到一半就思路乱了导致要重写。
C语言程序设计综合性实验实验题目:文件操作与字符处理实验班级:2011级信管专业3班学生学号:学生姓名:任课老师:提交时间:2012-02-18华南农业大学信息(软件)学院综合性实验A(文件操作与字符处理)实验报告1. 题目及题目分析1.1 问题描述在当前目录下存在文件名为“case1.in”(其中case后为数字1,不是字母i,写错提交后会判错)的文本文件,其内容为一篇英文文章(以EOF作为结束标志)。
现要求读取该文本文件内容,统计该文本文章中每个单词出现的次数,并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,不足5个单词时,按序输出全部单词)。
程序中注意如下细节:(1)空格、标点符号与回车键起到分隔单词的作用;(2)名词缩写算一个单词;(3)单词不区分大小写;(4)输出时单词全使用小写;(5)包含多段文字,单词数不超过10000,每个单词不超过20个字符;(6)数字不算单词;(7)文中不包含连字符及类似I’m等情况;(如case1.in内容如下)I am a student. My school is SCAU. It is abeautiful university. I like it.(在屏幕上输出结果如下)a 2i 2is 2it 2am 11.2功能分析简单的说,这个实验要求我们读取一篇存储在一个文本文件中英文文章中的所有单词,然后统计其中单词出现的次数,并把其中出现最多的五个单词输出来并输出其出现的次数。
我们的任务是怎样把这篇英文文章中的单词读取出来,并把它的出现次数统计出来,并把其中出现最多的5个单词输出来。
然后我们再深度处理,按照题目要求作修改。
我们怎样才能把一个个单词读取出来,因为有些单词是不止一个字母的,我们又要怎样处理?我们又要怎样把这不止一个字母的单词通过比较来判断是否一个单词?还有怎样把出现次数最多的5个单词输出来,这要怎样处理?这些是比较难处理的。
2. 设计思路1.1总体结构设计要实现题目中的要求,我们要把程序设计成几个模块来实现。
第一个模块,就是用来读取英文文章中的单词,这就要用到文件这些知识,因为单词可能不止一个字母,所以我们先要用数组来保存,这就要用到数组的知识。
读取单词之后怎么样统计出现的次数,这又要另设一个模块。
到最后,判断出现次数最多的单词然后输出来是一个模块。
还有,在一开始要设计一个结构体来保存单词,这是一个模块。
所以,一共设计了4个模块。
其中,在第三个模块又要分开几个小方块,因为其中要处理单词分隔的时候,这里的处理是一个难点。
还有题目中不包含分隔符的情况。
我们把字母处理作为一个小方块,分隔符读取作为一个小方块,还有。
详细说明看以下内容。
1.2各个功能模块详细设计及功能模块之间关系设计首先,我们要做好预处理指令,在首行输入#include<stdio.h>,因为后面会用到字符串函数,所以我们还要在第二行输入#include<string.h>,把”string.h”文件包含到文件中。
然后,因为文件中的英文文章中的单词要储存和统计出现的次数。
要同时记录这两项数据要怎样处理好呢?没错,就是用结构体来储存,设立一个wordkeep的结构体类型,里面只需设立两个成员,第一个设立为字符串数组类型来保存文章中出现的单词,因为题目中规定每个单词的长度不超过20,所以字符数组的长度为20。
第二个设立为基本整型来保存单词出现的次数。
接着要定义变量。
因为题目中规定说单词数不超过10000,所以我们可以用一个word[10000]的结构体数组来实现。
结构体建立要放在预处理指令后面,这就是这个程序的第一个功能模块。
上述操作的代码如下图所示:结构体建立完毕后就是主函数了,主函数包含了三个模块,包括了读取文章中的每一个字母,判读每一个单词,判断每一个单词出现的次数,把出现次数最多的5个单词输出。
这里,我用一个简单的流程图来说明一下主函数执行的流程:上面的流程图大致的描画了实现这个实验的基本操作,基本思路,那么,我们现在就按照这个思路来编写程序。
以上的操作缺一不可且不能换序,因为你读入了一个单词才能分离一个单词,才能判断出现过没有,才能统计出现次数,才能准确的排序输出。
我们一定要仔细编写程序,因为每一个环节出差错,都会影响到下一个环节,牵一发而动全身。
第二个模块是单词的输入,这里要用到文件的知识,因为只是读取,所以我们只需要用一个fopen(文件名,使用文件方式)的调用方式打开文件,其中文件名已经是题目规定了的,是case1.in,而使用文件方式是只读,也就是r。
因为下面还要用到一些变量,所以我们预先在第一模块就把它们设置好先,其中,i,t和j是用来计数的,m和f是用来判断真假的,k用来统计所出现单词的次数(包括重复出现的),具体操作代码如下:我们打开了文件,然后就是读取文件中的单词,这里要用到fgetc(fp)的调用形式,即从fp 指向的文件中读入一个字符。
我们在当读取字母不是结束符号的时候就开始读入。
因为题目要求所统计单词不分大小写,所以,我们统一把所读取的字母先转化为小写字母,那么,我们在判断了所读入字母是否为结束符号之后,还要判断一下所读取字母是否为大写字母,如果是大写字母的话,就转化为小写字母。
这里还有一个问题,就是关于输入字符的类型。
这里,输入的字符可以分成两种类型。
一种是英文字母,一种是分隔符。
题目中说空格、标点符号与回车符起到分隔单词的作用,所以分隔符又分成空格、标点符号和回车符。
当我们读入字符时,一定要做好对分隔符的处理。
好了,现在先说说当读取到的是英文字母的时候,我们先统一转化为小写字母,然后用一个字符数组来先储存着。
因为有些单词不止是由一个单词组成的,那么,我们就要判断下一个读入字符是否为分隔符,如果所读取的字符不是分隔符的话,我们继续用那个字符数组来保存读入的字母,以此类推下去,注意保存时的下标要依次增加就行了。
这样一直直到出现了分隔符,因为所有的标点符号都是分隔符,如果我们逐一书写出来会比较的麻烦,刚好题目说明了不包含连字符,所以我们把出现连字符和下一个输入字符为回车键假设为假,然后除连字符之外的标点符号就为真了。
我们这样做要先设一个控制真假的变量,上面已经设之为f。
出现了分隔符,我们怎么处理已经储存在一个字符数组中的单词呢?好,我们把一个单词的最后一个字母后面再加一个空字符,宣告给系统知道这个单词读取结束了,然后与之前出现的单词相比较,看有没有相同的,比较前还要做一个判断,判断是否已经有输入的单词了,如果还没有输入单词,那就不用比较了,如果已经有了输入单词,就开始比较,比较时可以直接用字符数组和字符数组比较,就是用在主函数中用来临时保存保存单词的字符数组和在结构体中用来正式保存单词了字符数组来比较。
比较时我们可以用字符串函数中的strcmp函数来进行比较,如果比较出来的值为0,也就是两个单词相同,这时候,就令在结构体中保存这一单词的变量中的整型常量这一成员加一。
如果比较的时候没有一个单词是相同的,那就要另外增加一个统计项,把这个单词复制到结构体中保存,令其出现次数为一。
还有,我们在统计单词时注意要统计一共有几个单词,要实现这个我们可以设置一个整型常量,在每次新增统计项时令这个常量加一,我们在下面就把它设为了k,如下图所示。
这样一直读取下去,直到读取到结束符号,即EOF。
这时,我们要处理的是把出现次数最多的5个单词输出。
这时候,我们只需比较它们的出现次数,出现次数在结构体中有保存。
因为可能文章中的单词不超过5个,所以我们的条件务必要写成i<k&&i<5。
然后通过冒泡排序把出现次数最多的排在第一位,但是如果出现次数相同,我们怎么按照字典顺序排序呢?这样的话我们通过比较字符的大小来排序,因为ASCII码的排序是按照字典排序来排序的,所以我们可以通过比较字符在ASCII码中的值的大小来比较顺序的前后。
排序结束后就依次输出,输出后要记得关闭数据文件,就是在return 0前面写上fclose(fp)。
就这样,这个程序就基本上完成了。
1.3 数据结构的设计1.4 界面设计综上所述,实验所设计的界面如下简图所示:其中,主函数中有一个特殊的处理(判断除去连字符之外的所以标点符号),如下图所示。
3. 编程实现要实现编程,首先要建立一个wordkeep的结构体,这是为下面保存单词打下铺垫,我们还要建立一个结构体数组,如下左图所示:然后就是设好变量和读入数据,如上右图所示:然后,就是判读文章中读入的字符,该操作的流程图如下图所示:这一模块的主要功能模块的代码段片段及注解如下所示:最后,就是排序输出:就这样就可以实现编程了。
4. 运行测试现在,我们用一组数据来测试一下,就用题目中的数据来测试吧。
我们先建立一个case1.in 的文件放在保存改程序的目录下。
case1.in的位置和内容如下图所示:我们先打开编程软件,这里,我用的是C-Free5.0,我们先把程序代码输进去,如左图所示。
我们定义了文件指针,以读的方式打开文件。
然后开始读入字符。
第一个读入的字符是“I”,因其是大写字母,所以在第17行被转化为小写字母i。
在19行字母i被存入字符数组w中,其下标为0,计数变量i变为1,字符标志为1(即所读入字符为英文字母)。
然后转回第15行再读入字符“”(空格,下同),转到17行判断,不符合条件,转到18行判断,不符合条件,转到22行判断,不符合条件,转到25行,符合再跳到15读取下一个结构体变量,令j为0,比较保存在结构体中的单词的出现次数,如果出现次数较多的话,把其保存在结构体数组中的位置交换。
如果出现的次数不大于后面那个单词出现的次数,那么有可能是等于或小于,当出现次数相同的时候,我们比较单词的大小,即从首位开始比较其ASCII码的大小,这样就可以实现次数相同时按字典顺序输出,最后程序出来的结果如题目中所示。
为了能比较直接地观察程序运行的情况和各变量的变化,我专门设计了一个各变量各时间变化的表格,如下所示:注释:上表中没有字符的单元表示空格。
现在,我们开始实际运行程序,在运行程序前我们先编译一下看所写程序有没有错误:好了,程序没有错误,我们就可以开始运行了,运行所出来的结果如上所示,其结果与题目中所给答案完全一致。
预期结果与运行结果相同,所以我们这个程序是正确的。
为了更加准确的测试这个程序,我们不妨可以另外找一段文章来测试一下这个程序,我在网上找了一篇文章(文章在参考文献中)保存在case2.in中,预期结果是the有33个,of有25个,that有14个,as有10个,technology也有10个。
运行程序,其结果如下:很明显,预期结果和运行结果完全一致,更说明了这个程序的准确性。