徐欢的第二次作业

news/2025/1/22 15:59:55/文章来源:https://www.cnblogs.com/xuhuanS/p/18511801
这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc
这个作业的目标 实现一个命令行文本计数统计程序。能正确统计导入的纯英文txt文本中的字符数,单词数,句子数。
姓名-学号 徐欢-2022329301135

作业码云地址:https://gitee.com/xuhuanspace/second-assignment

一、作业描述

(1)基础功能实现

   实现一个命令行文本计数统计程序。能正确统计导入的纯英文txt文本中的字符数,单词数,句子数。
具体命令行界面要求举例:
命令模式: wc.exe [-参数] [文件名]

wc.exe -c file.txt 统计字符数
wc.exe -w file.txt 统计单词数
  • 项目文档应包含项目说明,写入 README.MD
  • 码云上传的项目要求必须通过多次提交体现各个版本更迭和运行结果截图

(2)拓展功能实现

统计代码行、空行、注释行等,并提供相应命令接口
编写对应的单元测试
a. 实现基本功能的测试;
b. 单元测试包含更多的测试用例;
使用选用的IDE附带的工具进行performance test

二、项目目录


三、功能实现及功能测试

(1)V2.0

功能说明:该程序可以实现的功能是对输入的纯英文.txt文本中的字符数、单词数和句子数进行正确统计

  • 指令参数:-c输出字符数
    -w输出单词数
    -s输出句子数
  • 指令格式:wc.exe [-参数] [文件地址]
  • 功能实现代码展示
% 统计字符数(包括字母、数字)  
if isstrprop(char, 'digit') ||isstrprop(char, 'alpha')numChars = numChars + 1;  
end  % 统计单词数  
if isspace(char) || char == ',' || char == '.' || char == '?' || char == '!' || char == ':' || char == ';' || char == '-'  if wordInProgress  numWords = numWords + 1;  wordInProgress = false;  end  
elseif ~isspace(char) && ~ismember(char, {',', '.', '?', '!', ':', ';', '-'})  wordInProgress = true;  
end  % 统计句子数  
if char == '.' || char == '?' || char == '!'  % 检查句子结束符前面是否有字母或数字(避免缩写或数字后的点被误认为是句子结束)  if i > 1 && (isstrprop(fileContents(i-1), 'alpha')||  isstrprop(fileContents(i-1), 'digit'))numSentences = numSentences + 1;  end  
end  

程序保护:该程序可以判断用户输入参数、文件名是否正确,并在输入不正确时进行及时的提醒

% 检查参数数量  
if numel(args) < 2  disp('参数不足,请重新输入。');  continue;  
end  % 检查参数是否有效  
param = args{1};  
if ~ismember(param, validParams)  disp(['无效参数:', param, '。请输入 -c, -w, 或 -s。']);  continue;  
end  % 检查文件名是否存在  
filename = args{2};  
if ~exist(filename, 'file')  disp(['文件不存在:', filename, '。请检查文件名并重试。']);  continue;  
end  

进行测试:

测试集测试结果
对test中的三个文件分别进行测试,如下展示其中一个测试集的测试结果:

(2)V3.0

功能说明:该程序可以在上述的基础上,可以实现对输入的纯英文.txt文本中的句子数进行细分,实现对陈述句、问句和感叹句的统计,同时可以实现对内容的代码行数、空行数和注释行数的统计

  • 新增指令参数:-l输出代码行数
    -e输出空行数
    -r输出注释行数
  • 指令格式:wc.exe [-参数] [文件地址]
  • 新增部分的功能实现代码展示
% 判断空行if isempty(line)  numEmptyLines = numEmptyLines + 1; % 计为空行  else% 判断注释行if startsWith(line, '%')  numCommentLines = numCommentLines + 1; % 计为注释行  else% 非空且非注释行,计为代码行  numCodeLines = numCodeLines + 1; end% 遍历行中的每个字符  for j = 1:length(line)  A = line(j);    % 对非空行统计字符数(包括字母、数字)  %内容同上,不赘述% 统计单词数  %内容同上,不赘述% 统计句子数  if ismember(A, {'.', '?', '!'})  if j > 1 && (isletter(line(j-1)) || isdigit(line(j-1)))  numSentences = numSentences + 1;  % 分类句子类型if A == '.'  sumstr(1) = sumstr(1) + 1;  % 陈述句elseif A == '!'  sumstr(2) = sumstr(2) + 1;  % 感叹句elseif A == '?'  sumstr(3) = sumstr(3) + 1;  % 问句endend                    end  endend
end  % 检查文件末尾是否有一个未完成的单词  
if wordInProgress  numWords = numWords + 1;  
end  

对功能进行测试:
对test中的四个文件分别进行测试,可以实现拓展功能,如下展示其中一个测试集的测试结果:


单元测试:

classdef test_wc_main < matlab.unittest.TestCasepropertiestestFile % 存储测试文件的绝对路径endmethods (TestMethodSetup)function setTestFilePath(testCase)% 指定您创建的文件的绝对路径testCase.testFile = fullfile('E:', 'Todesk\大三上课程\软件技术基础\matlab代码\V3.0', 'myTestFile.txt');endendmethods (Test)function testCharacterCount(testCase)% 测试字符数统计param = '-c';expectedChars = 115; % 根据文件内容计算result = testCase.runWC(param);testCase.verifyEqual(result.numChars, expectedChars, 'Character count test failed.');endfunction testWordCount(testCase)% 测试单词数统计param = '-w';expectedWords = 31; % 根据文件内容计算result = testCase.runWC(param);testCase.verifyEqual(result.numWords, expectedWords, 'Word count test failed.');endfunction testSentenceCount(testCase)% 测试句子数统计param = '-s';expectedSentences = [3, 1, 1]; % 2陈述句, 1感叹句, 1问句result = testCase.runWC(param);testCase.verifyEqual(result.numSentences, sum(expectedSentences), 'Total sentence count test failed.');testCase.verifyEqual(result.numStatement, expectedSentences(1), 'Statement count test failed.');testCase.verifyEqual(result.numExclamatory, expectedSentences(2), 'Exclamatory count test failed.');testCase.verifyEqual(result.numInterrogative, expectedSentences(3), 'Interrogative count test failed.');endfunction testCodeLineCount(testCase)% 测试代码行数统计param = '-l';expectedCodeLines = 5; % 2行代码result = testCase.runWC(param);testCase.verifyEqual(result.numCodeLines, expectedCodeLines, 'Code line count test failed.');endfunction testEmptyLineCount(testCase)% 测试空行统计param = '-e';expectedEmptyLines = 1; % 1行空行result = testCase.runWC(param);testCase.verifyEqual(result.numEmptyLines, expectedEmptyLines, 'Empty line count test failed.');endfunction testCommentLineCount(testCase)% 测试注释行统计param = '-r';expectedCommentLines = 1; % 1行注释result = testCase.runWC(param);testCase.verifyEqual(result.numCommentLines, expectedCommentLines, 'Comment line count test failed.');endendmethodsfunction result = runWC(testCase, param, filename)% 模拟用户输入并执行 wc_main_v0_3 函数if nargin < 3filename = testCase.testFile; % 默认使用手动创建的测试文件end% 调用 wc_main_v0_3 函数并获取结果result = wc_main_v0_3(param, filename);endend
end

该段代码是一个 MATLAB 类定义(classdef),名为 test_wc_main,它继承自 matlab.unittest.TestCase。这个类是为了测试 wc_main_v0_3 的函数而设计的。

  • testCharacterCount:测试字符数统计功能。它期望 wc_main_v0_3 函数返回的结果中的字符数与预期的 115 个字符相匹配。
  • testWordCount:测试单词数统计功能。它期望单词数与预期的 31 个单词相匹配。
  • testSentenceCount:测试句子数统计功能。这里稍微复杂一些,因为它不仅测试总句子数(期望为 3+1+1=5 句),还分别测试了陈述句、感叹句和问句的数量。这意味着 * * * wc_main_v0_3 函数需要能够区分不同类型的句子,并分别计数。
  • testCodeLineCount:测试代码行数统计功能。这里有一个问题,注释中提到“2行代码”,但期望的代码行数被设置为 5。这可能是一个错误或者是对测试目标的误解。
  • testEmptyLineCount:测试空行统计功能。期望有 1 行空行。
  • testCommentLineCount:测试注释行统计功能。期望有 1 行注释。
    测试结果:
**性能测试:**
  1. 使用tictoc测量执行时间
tic; % 开始计时  
% 代码块  
toc; % 结束计时并显示时间
2. 使用`MATLAB Profiler` Profiler会显示每个函数的调用次数、总时间和自时间(不包括子函数调用)。 ```matlab profile on; % 代码块 profile viewer; profile off; ```
  1. 使用memory函数
    用来查看MATLAB工作区使用的内存情况。
memory; % 显示当前内存使用情况
whos; % 显示工作区中所有变量的详细信息,包括大小

四、新的感悟

  我对MATLAB的单元测试框架有了更深刻的理解。从属性的定义到方法的分类(包括设置方法、测试方法和辅助方法),每一个细节都让我对MATLAB的面向对象编程和测试实践有了更全面的认识。
在分析过程中,我遇到了路径处理、函数依赖、测试准确性等多个技术挑战。通过查阅文档、尝试不同的解决方案,并最终找到问题的答案,我感受到了克服技术难题的成就感。
由于前期主要是仅多次在matlab中进行多次检验和修正,并没有及时上传到gitee中,导致版本次数较少。后来在探索过程中意识到可以通过git log查看每一次历史记录,意识到了及时上传每次版本进行记录备份的有效性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/823539.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法学习】莫队

暴力骗分神器,神仙题的最终杀招!!大佬的博客 开幕雷击!我既然都贴上了大佬的博客,那还要我有什么用,但是我要是不记录的话早晚会忘,那既然是给自己看的话就象征性地写一下吧,等以后熟练了也不需要这博客了。 莫队虽然用到了分块,但是并不对分块进行操作,而是对分块的…

SQLServer性能优化(一)

(一)、查询步骤逻辑查询树 绑定(把逻辑树上的节点与数据库的实际对象进行绑定):索引,约束,看看都存不存在 绑定器进行优化阶段的输入:绑定树,尽可能寻找最优方案。优化方案太多了,inner join只有一种方案,三表关联有六种方案。有限的时间有限的资源它不一定会选择最…

【Java】若以框架(ruoyi-master)——11.新建业务模块

二次开发 修改项目名称 二次开发的第一步,当然是将项目名称、图标、项目目录等更改为自己的项目了。若依框架修改器,可以一键修改Ruoyi框架包名、项目名等的工具。 地址:https://gitee.com/lpf_project/RuoYi-MT/releases完成后,可以按【打开输出目录】按钮。找到项目。 新…

VictoriaMetrics 中文教程(10)集群版介绍

VictoriaMetrics 中文教程系列文章:VictoriaMetrics 中文教程(01)简介 VictoriaMetrics 中文教程(02)安装 VictoriaMetrics 中文教程(03)如何配置 Prometheus 使其把数据远程写入 VictoriaMetrics VictoriaMetrics 中文教程(04)对接 Grafana 同时介绍 vmui VictoriaMe…

《使用Gin框架构建分布式应用》阅读笔记:p234-p250

《用Gin框架构建分布式应用》学习第13天,p234-p250总结,总17页。 一、技术总结 1.message broker (1)RabbitMQ 书里使用的是RabbitMQ(https://www.rabbitmq.com/),这里补充一点说明: docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:4.0.2 a、访问管理…

Avalonia 已知问题 第二次 Composition Animation 无法播放

在 Avalonia 里面,如果多次加入 Composition 的 Animation 动画,将会看到第二次加入是停止播放动画的这是 Avalonia 的已知问题,我已经报告给官方,详细请看 https://github.com/AvaloniaUI/Avalonia/pull/17370 我尝试修复了此问题,请看 https://github.com/AvaloniaUI/Av…

读数据工程之道:设计和构建健壮的数据系统23批量获取的考虑因素

批量获取的考虑因素1. 批量获取的考虑因素 1.1. 批量获取,通常是获取数据的一种便捷方式1.1.1. 通过从源系统中抽取一个数据子集,根据时间间隔或累积数据的大小来获取数据1.2. 基于时间间隔的批量获取在传统ETL的数据仓库中很普遍1.2.1. 每天在非工作时间(也可以按其他频率)…

分段任意模型满足零样本6D对象姿态估计

6.11 SAM-6D:分段任意模型满足零样本6D对象姿态估计6.11.1 SAM-6D:分段任意模型满足零样本6D对象姿态估计概述零样本6D物体姿态估计涉及在杂乱场景中检测具有6D姿态的新物体,这对模型的可推广性提出了重大挑战。幸运的是,最近的Segment Anything Model(SAM)展示了非凡的零…

Educational Codeforces Round 171 div2(A~E)

Educational Codeforces Round 171 div2(A~E) Dashboard - Educational Codeforces Round 171 (Rated for Div. 2) - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <algorithm> #include <array> #include <bitset> #include <cassert&g…

基于STM32cubeMX 的 RT-Thread 的默认串口输出修改及内容修改

最近在学习RT-Thread, 随便做点小笔记, 方便焦虑小白找路 本随笔主要写两个问题, 1.默认UART2修改成其他UART; 2. 开机输出的内容修改 在RT-Thread 中 默认的系统输出串口是UART2; 如果想修改成其他串口(以UART1为例子), 分两步走, 1.1. 初始化 对应的串口 (也就是UART1) 1.2…

qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性

qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib、user32.lib 需要头文件:<dwmapi.h>、<windowsx.h>只显示重要代码1、去除原边框、加上阴影、Aero Snap以及其他动画特效 (1)头文件 #include &q…

Spring 框架:Java 开发者的春天

Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。一、关于Spring 1.1 简介 Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称…