项目概述
本项目主要用于实现对较大(英文版)文件的字符数、单词数、英语语句数进行统计,通过自定义函数的调用在命令行窗口中显示出文件统计数据结果。本项目的基础功能包含count_zifushu.m 、count_dancishu.m 、count_zifushu.m三个文件,其主要的功能会在下文中一一介绍。三个自定义函数分别实现对文件字符数、单词数、语句数的统计功能。
项目扩展功能
本项目在基础功能的前提下又加入了一部分的扩展功能,如统计代码行、空行、注释行等,注释行功能通过count_chengxu.m文件实现,空行功能通过count_konghangshu.m文件实现,代码行功能通过count_hangshu.m文件实现。
各个自定义函数的功能
文件名 | 函数功能 |
---|---|
count_zifushu.m | 该文件中定义的函数通过读入所要统计的 shuju.txt文件,实现对该文件中英文字母的个数统计 |
count_dancishu.m | 该文件中定义的函数通过读入所要统计的 shuju.txt文件,实现对该文件中单词的个数统计 |
count_juzishu.m | 该文件中定义的函数通过读入所要统计的 shuju.txt文件,实现对该文件中英文语句句数的统计 |
count_chengxu.m | 该文件中定义的函数通过读入所要统计的 程序文件(如count_juzishu.m),实现对该程序注释行行数的统计 |
count_konghangshu.m | 该文件中定义的函数通过读入所要统计的 程序文件(如count_juzishu.m),实现对该程序空行行数的统计 |
count_hangshu.m | 该文件中定义的函数通过读入所要统计的 程序文件(如count_juzishu.m),实现对该程序代码行行数的统计 |
自定义函数的用法
所有的函数都可以在命令行窗口输入相应的指令与函数名来实现文件的统计。首先我们需要调入我们的TXT文件,之后输入我们对应的函数名来实现特定的功能,最后在命令行窗口中将会展示我们想要得到的统计结果。
各函数的调用及运行结果显示
count_zifushu.m 文件中的函数——count_zifushu()通过与向量s = [',','.',';',' ',':','"','"','-','!','?']中的符号对比进而删除TXT文件中的符号,将得到的纯英文字符存储到另一个向量中,最后计算该向量的长度即可得到该TXT文件的英文字母数;
count_dancishu.m 文件中的函数——count_dancishu()通过将TXT文件中的标点符号全部转化为空格,之后regexp()函数根据空格作为划分依据,存储到另一个向量中,最后通过计算向量的长度即可得到文件的单词数;
count_juzishu.m 文件中的函数——count_juzishu()通过与向量Y= '.'中的符号对比,通过循环每找到一个符号“ . ”就累加一次,最后则会得到文件中的英语语句句数;
count_chengxu.m 文件中的函数——count_chengxu()通过查找符号%,来实现注释语句的统计,方法同上;
count_konghangshu.m 文件中的函数——count_konghangshu()通过判断语句检查是否到最后一行,并检测是否为空语句(if isempty(line)),通过累加来实现对程序的空语句的统计;
count_hangshu.m 文件中的函数——count_hangshu()通过判断语句检查是否到最后一行,通过累加来实现对程序的代码行的统计;
各函数源码
- 字符数统计源码
function [num] = count_zifushu()
data = textread ('shuju.txt','%1s');%读入全文
x = char(data);%转换数据类型
s = [',','.',';',' ',':','"','"','-','!','?'];%写出文章中可能有的英文标点符号
for i = s
x(x==i)=[];
num=numel(x);%输出数组X的长度,即得到该文章的字符个数
end
end
- 单词数统计源码
function [changdu] = count_dancishu()
Q = fileread('shuju.txt');%读入全文
W = regexprep (Q,'\W',' ');%不是字符的,都转换为空格。作用:是为了去掉标点符号
X = lower(W);%所有字母变成小写字母
Y = regexp(X,' ','split');%根据空格分隔为单词
changdu=numel(Y);%输出单词的数量
end
- 英文语句句数统计
function [sum1] = count_juzishu()
text=fopen('shuju.txt');%读入数据
q=fscanf(text,'%c');%把读入的数据存入向量中
N=length(q);%计算出向量的长度
Y='.';%要查找的字符
k=length(Y);%Y的长度
sum1=0;%给sum1赋初值0
for i=1:N-k+1
if(strcmp(q(i:i+k-1),Y)) %strcmp函数用于比较向量q中的每一位与字符串Y是否相等
sum1=sum1+1; %若相等则使sum1+1
end
end
end
- 注释语句数统计
function [sum1] = count_chengxu()
text=fopen('count_juzishu.m','r');%读入数据
q=fscanf(text,'%c');%把读入的数据存入向量中
N=length(q);%计算出向量的长度
Y='%';%要查找的字符
k=length(Y);%Y的长度
sum1=0;%给sum1赋初值0
for i=1:N-k+1
if(strcmp(q(i:i+k-1),Y)) %strcmp函数用于比较向量q中的每一位与字符串Y是否相等
sum1=sum1+1; %若相等则使sum1+1
end
end
end
- 空语句数统计
function [count] = count_konghangshu()
fid = fopen('count_juzishu.m','r');
count = 0;
while ~feof(fid)
line = fgetl(fid);
if isempty(line)
count = count + 1;
end
end
fclose(fid);%关闭文件
end
- 代码行行数
function [sum2] = count_hangshu()
hang=fopen('count_juzishu.m','r'); % 打开文件
sum2=0;
while ~feof(hang) % 是否读取到文件结尾
[~]=fgets(hang); %或者fgetl
sum2=sum2+1; % 行数累加
end
fclose(hang); % 及时关闭文件
end
项目总结
通过对本次项目的练习,使我们熟练的掌握了matlab中的编程语言,对其语法结构有所认识。学会了自定义函数的编写,对我们以后的编程学习有了一定的促进作用,并且学会了对matlab工具的使用,对我们今后的科研有很大的帮助。