单词统计和替换

题目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)    
  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretty Boy Fox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值