题目2.1(单词统计和替换)
题目描述
对任意一篇英文文章,统计其中每个单词分别出现的次数,并可替换指定的单词,同时可以实现逐个替换或全部替换。
⑴ 英文文章以文件形式输入。
⑵ 统计的结果保存到文件。
⑶ 对单词进行替换时,允许用户选择全部替换或逐个替换。替换完成后,将文章保存到文件。
功能需求
(1)自行建立一个包含一篇英文文章的文件,系统初始化时导入内存,用于统计其中的不同单词分别出现的次数,并可替换指定的单词。
(2)用户可以从菜单中选择相应的功能。比如,单词统计,单词替换,以及退出系统。用户可自主选择,进行单词统计与替换功能后,会返回到主菜单,又可以重新选择。
(3)若选择单词统计,原文件会被读取于内存中,计算不同单词及其数量,随后,在屏幕上显示相应的单词统计结果,并且也将其结果存储于一个文件中。
(4)若选择单词替换,原文件会被读取于内存中,同时也会显示两个替换项,其为全部替换,逐个替换。
(5)用户可以输入需要替换的单词和新单词,随后,替换后的内容,会存储于一个文件中。此外,全部替换与逐个替换,替换后的内容,存储的文件是不相同的。
(6)原文件(包含一篇英文):passage.txt;单词统计文件:wordcount.txt;
单词全部替换文件:passage_all.txt;单词逐个替换文件:passage_one.txt。
(7)用户选择退出时,会显示出:谢谢使用,随后退出系统。
功能模块
“单词统计和替换”的功能模块图如图2所示:
图 2 系统功能模块图
根据各模块的功能,确定各模块及接口设计如下:
Column 1 | Column 2 |
---|---|
void startchoice(); //选择界面 | void countWords(); //统计单词 |
char menu(); //主菜单 | void replaceOne(); //逐个替换单词 |
void wordcount(); //单词统计 | void replaceAll(); //替换全部单词 |
void wordreplace(); //单词替换 | int main(); //主函数 |
测试情况
系统主要功能模块的运行结果如图2.1.1~2.1.8所示:
图2.1.1 系统主菜单
图2.1.2 输入合法选择项的运行结果(单词统计)
图2.1.3 输入合法选择项的运行结果(原单词存在,替换全部单词)
图2.1.4 输入合法选择项的运行结果(原单词存在,逐个替换单词)
图2.1.5 输入合法选择项的运行结果(原单词不存在,替换全部单词)
图2.1.6 输入合法选择项的运行结果(原单词不存在,逐个替换单词)
图2.1.7 输入不合法选择项的运行结果
图2.1.8退出系统
代码内容
/************************************
program:(C)2.1:单词统计和替换
wrintten by Duan Linchuan.
01/01/2024.Copyright 2024
************************************/
//copyeight 中文翻译:版权
/**********************************************************************
>>>设计思路:
>>>编写程序,对任意一篇英文文章,实现单词统计和替换。
1.首先,写出相应的头文件,声明相应的函数,
定义结构体数组,其包含有单词和个数的变量。
并写出初始界面,主菜单menu(),以及开始界面startchoice()。
2.其次,关于文件,先建立一个文件passage.txt,其含有一篇英文。
随后,再写三个文件,其一,为关于单词统计的文件wordcount.txt;
其二,为关于单词全部替换的文件passage_all.txt;
其三,为关于单词逐个替换的文件passage_one.txt。
3.再次,写出两个被主函数调用的函数,
其一为单词统计的函数wordcount(),
其二为单词替换的函数wordreplace()。
(1)单词统计函数的功能:
*首先,定义结构体数组,最大单词数为1000,
定义记录不同单词数的变量,并且同时分别定义文件指针file,count,
表示passage.txt文件,wordcount.txt文件,再分别判断文件是否为空。
若为空,分别输出:打开文件失败。随后,调用统计单词的函数countWords()。
*然后,将计算出的单词数及其个数,存储于文件wordcount.txt中。
最后,分别关闭passage.txt文件,wordcount.txt文件,输出:单词统计成功。
按任意键返回到主菜单menu()。
(2)单词替换函数的功能:
*首先,定义两个用于存储需替换单词与新单词的数组,单词长度最大为50。
其次,会输出:y:全部替换;n:逐个替换。选择后,定义文件指针file,
表示passage.txt文件,并判断该文件是否为空,若为空,输出:打开文件失败。
若选择全部替换后,会调用全部替换函数replaceAll();
*随后,按任意键返回到主菜单menu()。
若选择逐个替换后,会定义字符型变量str,
从passage.txt文件中逐个字符输出于屏幕,
随后,调用逐个替换函数replaceOne(),最后,按任意键返回到主菜单menu()。
4.然后,被主函数调用的两个函数,
也调用了统计单词函数,全部替换,逐个替换这三个函数。
(1)统计单词函数countWords()的功能:
*首先,会传入文件指针file,表示passage.txt的文件,结构体数组,
以及整型指针,便于记录文件passage.txt中不同的单词的数量。
*其次,定义一个用于存储单个单词的字符型数组,定义字符型变量ch,
定义整型变量wordStsrt,便于读取文件passage.txt时,
用于计数单个单词长度,初始赋为0。
*再次,开始遍历文件passage.txt,若字符为字母字符,
会赋给一个存储单个单词的数组words[]中,下标wordStart加1,若有大写字母,
会用toliwer函数来将大写变成小写,再赋给数组words[]。
*随后,如果字符为除了大小写字母字符以外的其他字符时,
会进行else语句,
会定义整型变量found,来表示文件passage.txt中单词是否重复出现的情况,
初始赋0,以及将刚才从文件passage.txt读取的单词的末尾加'\0'。
*随后,进行for语句,此for语句为判断是否有单词重复出现,
若重复出现,found赋1,作为重复的标志。
然后结构体中的关于单词个数的变量加1,跳出循环。
*然后,若found为0,表示从文件passage.txt读取出来的单词为新单词words[],
随后将新单词用strcpy赋给结构体中的关于不同单词的变量,
并使结构体中的关于单词个数的变量赋1,
以及不同单词的数量的变量(*numWords)加1。
*最后,用于计数单个单伺长度的变量wordStart,初始化,赋0。
第一次结束后,又返回去重新开始,以此类推,
直至文件passage.txt中的英文被读取完。
这样可以,统计不同单词数以及其数量。
此外,将计算出的不同单词数以及其数量,输出于屏幕。
(2)逐个替换函数replaceOne()的功能:
*首先,会传入替换单词,新单词。
随后,分别定义文件指针file,onefile,
分别表示passage.txt文件,passage_one.txt文件。
并分别判断文件是否为空,若为空,分别输出:打开文件失败。
*其次,定义原来单词的变量oldwords[],定义字符型变量ch,
定义整型变量wordStsrt,便于读取文件passage.txt时,
用于计数单个单词长度,初始赋为0。
同时也定义记录替换次数的变量count,初始赋0。
*再次,然后,开始遍历文件passage.txt,若字符为字母字符,
会赋给一个存储单个单词的数组oldwords[]中,下标wordStart加1。
若字符为除字母字符以外的字符,进行else语句,
若下标大于0,将刚才从文件passage.txt读取的单词的末尾加'\0'。
否则,将刚才读取的一个非字母字符,
存储于onefile中,表示passage_one.txt的文件。
*随后,在下标大于0的情况下,进行原来单词与替换单词比较是否相同,
若相同,会输出:是否要替换。
若是,会将新单词,存储于onefile中,表示passage_one.txt的文件。
若否,会将原来单词,存储于onefile中。
若原来单词与替换单词不同,会将原来单词,存储于onefile中。
*然后,将单词后的空格或标点标号,存储于onefile中。
随后,用于计数单个单伺长度的变量wordStart,初始化,赋0。
第一次结束后,又返回去重新开始,以此类推,
直至文件passage.txt中的英文被读取完。
这样可以,实现单词逐个替换的功能。
*最后,若记录替换次数的变量count为0,即无替换单词,逐个替换失败。
若不为0,即替换成功。分别关闭passage.txt文件,关闭passage_one.txt文件。
(3)全部替换函数replaceAll()的功能:
其思路与逐个替换基本相同。其部分区别在于:
其一,此函数中,定义文指针allfile,表示passage_all.txt文件;
其二,原来单词或新单词会存储于allfile中;
其三,无选择项,直接进行全部单词替换。
5.最后,其程序还有其他的优点:
(1)有良好的交互界面,其包含有较多的文字叙述,
运用较多的停顿函数Sleep()函数,以增可观感。
(2)并且所定义的函数以及变量,以英文来命名。
例如:开始,用英文start来命名;选择,用英文chioce来命名;
单词统计,用英文wordcount来命名;单词替换,用英文wordplace来命名;
以此来增加程序的可读性,便于阅读与理解。
>>>总体来说,回文数判断系统,其所写的程序可读性较高,
所体现的功能较完善,所体现的交互性也较完善。
简言而之,这程序基本可运行,可实现相应的功能。
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <windows.h>
//宏定义
#define MAX_WORDS 1000 // 最大单词数
#define MAX_WORD_LENGTH 50 //最大单个单词的长度
//定义结构体
typedef struct wordCount
{
//定义一个用于存储单个单词的字符型数组
char word[MAX_WORD_LENGTH];
int count; //用于记录文件中不同的单词数的变量
} Count;
//声明函数
int main(); //主函数
void startchoice(); //选择界面
char menu(); //主菜单
void wordcount(); //单词统计
void wordreplace(); //单词替换
//统计单词
void countWords(FILE* file, Count* wordCounts, int* numWords);
//逐个替换单词
void replaceOne(char* replaceWord, char* newWord);
//替换全部单词
void replaceAll(char* replaceWord, char* newWord);
//统计单词
void countWords(FILE* file, Count* wordCounts, int* numWords)
{
//定义一个用于存储单个单词的字符型数组
char words[MAX_WORD_LENGTH];
char ch;
int wordStart=0; //读取文件时,用于计数单个单词长度的变量
*numWords=0; //用指针传入的变量,用于记录文件中不同的单词的数量
while((ch=fgetc(file))!=EOF)