WC个人软件工程
1. github项目地址
https://github.com/Sranmi/WC.git
2. 项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
3.预计耗费时间
4.解题思路
根据题目要求,要实现的内容大致如下:
(1) 基本功能
- -c 统计字符数
- -w 统计单词数
-l 统计行数
(2)扩展功能
- -s 递归处理目录下符合条件的文件
- -a 统计代码行、空行、注释行
支持各种文件
(3 )高级功能
- -x 显示图形界面选择单个文件,并显示所有统计信息
- 基本的Windows GUI 程序操作
通过图形界面展现文件信息
5.设计实现过程
- 建立c# window窗体应用项目
- 完善窗口界面
- 编写两个类:一个作为执行流程函数,另中一个用于写计算函数
计算字符数 CharCount
单词数 WordCount
行数 LineCount
代码行、空行、注释行 SuperCount
总执行流程 Operator
选择文件 OpenFile
执行一次后清除数据 CleanData
用窗口输出字符串功能以及按钮点击功能展示计算结果
确认计算按钮 button2_Click
文件选择按钮 button1_Click
6.代码说明
下面用扩展功能的supercount举例说明,其他计算函数大致相同,都需要打开数据流。
/// <summary>
/// 扩展功能:统计代码行、空行、注释行
/// </summary>
/// <param name="sr"></param>
/// <param name="notelinecount"></param>
/// <param name="nulllinecount"></param>
/// <param name="codelinecount"></param>
public void SuperCount (string filename, ref int notelinecount,ref int nulllinecount,ref int codelinecount,ref string showdata)
{
//文件流打开文件读取字符
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
StreamReader sr = new StreamReader(fs);
string line;
while((line =sr.ReadLine ())!=null )
{
line = line.Trim(' ');
line = line.Trim('\t');
//空行
if(line ==""||line .Length <=1)//代码中单括号为空行
{
nulllinecount++;
}
//注释行
else if(line.Substring (0,2)=="//"||line .Substring (1,2)=="//")
{
notelinecount++;
}
//代码行
else
{
codelinecount++;
}
}
//读取完需关闭数据流
sr.Close();
//在字符串showdata增加计算结果
showdata += "代码行:" + codelinecount.ToString() + "\n" + "空行:" + nulllinecount.ToString() + "\n" + "注释行:" + notelinecount.ToString() + "\n";
}
打开文件选择窗口,并且设置为单选。
private void OpenFile()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = "D:\\";
ofd.Filter = "所有文件|*.*|文本文件|*.txt";
ofd.RestoreDirectory = true;
ofd.Multiselect = false;//一次只能选择单个文件
if (ofd.ShowDialog() == DialogResult.OK)
{
filename = ofd.FileName;
}
}
每次计算完后要清除数据,否则计算结果会累加上一次的数据。
/// <summary>
/// 输出一次数据后 将数据清零
/// </summary>
private void ClearData()
{
this.charcount = 0;
this.wordcount = 0;
this.linecount = 0;
showdata = null;
}
界面“确定“按钮,执行函数,以字符串的形式窗口输出数据结果,计算结束清除数据。
private void button2_Click(object sender, EventArgs e)
{
Operator();
if (showdata != null)
MessageBox.Show(showdata);
ClearData();
}
参数的判断流程,当参数为-x时要跳出循环,因为-x参数只能单独存在。
/// <summary>
/// 查询总操作流程
/// </summary>
private void Operator()
{
//读取用户输入的文件名和参数(其中多个参数以空格分开)
filename = textBox2.Text;
parameter = textBox1.Text.Split(' ');
foreach (var s in parameter)
{
if (s != "-c" && s != "-w" && s != "-l" && s != "-s" && s != "-a" && s != "-x")
{
MessageBox.Show("参数输入有误,请重新输入,注意多参数之间必须用空格隔开");
break;
}
//参数-x输出图形界面选择文件并读取文件名
if (s == "-x")
{
OpenFile();
}
//判断文件是否存在
if (File.Exists(filename))
{
Function fc = new Function();
if (s == "-c" || s == "-x")
{
fc.CharCount(filename, ref charcount, ref showdata);
}
if (s == "-w" || s == "-x")
{
fc.WordCount(filename, ref wordcount, ref showdata);
}
if (s == "-l" || s == "-x")
{
fc.LineCount(filename, ref linecount, ref showdata);
}
if (s == "-a" || s == "-x")
{
fc.SuperCount(filename, ref notelinecount, ref nulllinecount, ref codelinecount, ref showdata);
}
}
else
{
MessageBox.Show("文件名不存在,请重新输入");
break;
}
//参数为"-x"时只能单独使用,跳出循环
if (s == "-x")
break;
}
}
7.测试运行
WC窗口界面
测试文本
输入数据,支持多参数输入
弹出结果
当输入系数或者文件目录有误
当输入-x或者点击三点按钮时,弹出文件选择窗口,选择文件后,所有数据随即输出。
计算扩展-a功能
8.项目小结
项目过程中遇到的困难:
1.项目是要用命令行的形式还是window窗口应用来实现,最后选择了视觉上较美观的window窗口应用。
2.构思基本功能函数结构时,三个函数分开的话,数据流需要分别执行,但函数可以单独计算,最后选择了单独计算。
3.参数判断时,循环遇到-x时要跳出,以及要如何实现计算函数的运行,最后以计算函数为出发点,符合条件的函数即执行。
4.数据结果该如何呈现,弹出另外一个窗口相比直接输出messagebox较难,最后用字符串在messagebox上执行。
5.运行计算第二次时,发现数据呈叠加状态,即添加一个数据清空函数CleanData。
总结:通过这次个人完成的项目,了解了个人软件工程的设计流程,以及编程过程遇到的问题要在实践中逐步完善。软件工程每个流程的预计时间和设计,到具体的操作和实现,通过查找相关资料,对我这次的软件工程起到了很大的作用。