项目地址
码云地址 https://gitee.com/a130888599/wc.exe
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | 300) | 500) |
· Analysis | · 需求分析 (包括学习新技术) | 150 | 250 |
· Design Spec | · 生成设计文档 | 200 | 300 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 15 |
· Design | · 具体设计 | 120 | 135 |
· Coding | · 具体编码 | 30 | 30 |
· Code Review | · 代码复审 | 20 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 150 |
Reporting | 报告 | 45 | 70 |
· Test Report | · 测试报告 | 20 | 30 |
· Size Measurement | · 计算工作量 | 15 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 |
项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] file_name
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数
扩展功能:
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
代码行:本行包括多于一个字符的代码。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
} //注释
在这种情况下,这一行属于注释行。
高级功能:
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
需求举例:
wc.exe -s -a *.c
返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。
解题思路
课外自学内容较少,只能利用c来解决这些功能,需要学习新的函数来实现用。
控制台输入文件路径的方式计算对应文件中的字符、词、行数。
据搜索: 学习如何用C读入写入文档
文件 file.c 的字符数 :使用fgetc() 函数从所指向的输入文件中一个一个地读取字符,然后累计。
返回文件 file.c 的词的数目:使用fgetc() 函数从所指向的输入文件有条件地读取a(A)-->z(Z)组成的单词,再累计单词数量。
返回文件 file.c 的行数:使用fgetc() 函数在所指向的输入文件中遇到换行符“ ”后累计加1 。
返回代码行 、 注释行:当fgetc() 函数获取的字符遇到“//”和“/”就开始累计注释行数量,如果是“//”遇到换行符“ ”或文件结束符则停止累计,如果是“/”则遇到“*”停止累计。代码行则是运用之前累计行数的函数返回的结果减去注释行即可得到。
具体代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int CCount(char file[])
{
FILE *pf = NULL;
int ccount = 0;
pf = fopen(file, "r");
if (pf == NULL)
{
printf("未寻找到目标文件
");
exit(-1);
}
char mychar;
mychar = fgetc(pf);
while (mychar != EOF)
{
if(mychar != '
' && mychar != '
' && mychar != ' ') {
ccount++;
}
mychar = fgetc(pf);
}
fclose(pf);
return ccount;
}
int WCount(char file[])
{
FILE *pf = NULL;
int wcount = 0;
pf = fopen(file, "r");
if (pf == NULL)
{
printf("未寻找到目标文件
");
exit(-1);
}
char mychar;
mychar = fgetc(pf);
int isSpace = 1;
while (mychar != EOF)
{
if(mychar == ' ' || mychar == '
')
isSpace = 1;
else {
if(isSpace)
wcount ++;
isSpace = 0;
}
mychar = fgetc(pf);
}
fclose(pf);
return wcount;
}
int LCount(char file[])
{
FILE *pf = NULL;
int lcount = 0;
pf = fopen(file, "r");
if (pf == NULL)
{
printf("未寻找到目标文件
");
exit(-1);
}
char mychar;
mychar = fgetc(pf);
while (mychar != EOF)
{
if (mychar == '
')
{
lcount++;
mychar = fgetc(pf);
}
else
{
mychar = fgetc(pf);
}
}
fclose(pf);
return lcount + 1;
}
int main()
{ //
char input[20], File[200];
while (1)
{
printf("请输入用户命令:wc.exe-");
scanf("%s", &input);
if (input[0] == 'c')
{
printf("请输入文字名:");
scanf("%s", &File);
int charcount = 0;
charcount = CCount(File);
printf("文件的字符数为:%d
", charcount);
continue;
}
if (input[0] == 'w')
{
printf("请输入文件名:");
scanf("%s", &File);
int wordcount = 0;
wordcount = WCount(File);
printf("文件的词数为:%d
", wordcount);
continue;
}
if (input[0] == 'l')
{
printf("请输入文件名:");
scanf("%s", &File);
int lcount = 0;
lcount = LCount(File);
printf("文件的行数为:%d
", lcount);
continue;
}
}
system("pause");
return 0;
}
测试文件
空文件
换行符
源代码
总结反思
通过这次个人项目,发现自己对项目的时间把控能力太差,对自身能力没有较清晰的认识,导致实际完成时间较多超于预算时间。
此外编程语言的掌握浅薄且少,目前只掌握C,后续仍需扩充语言如pyhton和java,因为相同的项目任务,不同的编程语言完成效率不同,代码简易程度也不同。
对C的掌握还不够深,仍有许多函数与算法需要接下来自主学习。