wordcount作业二
一、代码地址:https://gitee.com/wwlpf/codes/8z93cibltqn2sohj0yemp39
二:功能
基本功能:(已完成)
wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的单词总数
wc.exe -l file.c //返回文件 file.c 的总行数
wc.exe -o outputFile.txt file.c //将结果输出到指定文件outputFile.txt
扩展功能:(未完成)
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)
高级功能:(未完成)
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
三:PSP表格
psp2.1 | psp阶段 |
估计耗时(分钟) |
实际耗时(分钟) |
Planning | 计划 | 1h | 45min |
· Estimate | · 估计这个任务需要多少时间 | 1h | 55min |
Development | 开发 | 2h | 90min |
· Analysis | · 需求分析 (包括学习新技术) | 3h | 120min |
· Design Spec | · 生成设计文档 | 2h | 70min |
· Design Review | · 设计复审 (和同事审核设计文档) | 1h | 50min |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0.5h | 30min |
· Design | · 具体设计 | 1h | 50min |
· Coding | · 具体编码 | 3h | 120min |
· Code Review | · 代码复审 | 0.5h | 50min |
· Test | · 测试(自我测试,修改代码,提交修改) | 2h | 120min |
Reporting | 报告 | 1h | 70min |
· Test Report | · 测试报告 | 0.5h | 40min |
· Size Measurement | · 计算工作量 | 0.1h | 5min |
· Postmortem & ProcessImprovement Plan |
· 事后总结, 并提出过程改进计划 | 0.2h | 25min |
合计 | 18.8h | 850min |
四:解题思路:
审题以后大致思路如下:
1、资料可以通过诸如百度、谷歌等搜索引擎获取
2、程序可以分为:命令参数分析、输入输出文件定位、执行命令三个主体部分Main,Count,File
Main:程序的主函数类,实现整个程序的所有功能的调用,实现要执行功能的判断、各种统计功能的调用和最后的信息输出的功能,其中含有以下方法:
main():作为主函数。
int main(int argc, char *argv[]):命令分析函数,对终端中传入的参数进行判断,统计需要执行的功能;
在主函数中一次对命令参数进行分析,定位输入输出文件并创建类WordCount的对象,最后调用该对象的方法进行响应的统计功能即可。
3、测试,即单元测试,在Test类中对上述的各种方法执行测试,主要采用的方法为语句覆盖测试。对每个方法采用2-3个用例对其进行测试。
五、代码展示
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include<iostream> int main(int argc, char *argv[]) { //读取文件 int num,w,num1; if(argc==3) { FILE *fp = fopen(argv[2],"r"); if(!fp) { printf("文件打开失败!!!\n"); return -1; } //对参数进行判断 if( !strcmp(argv[1],"-c")) { //字符数 char temp; num = 0; temp = fgetc(fp); while(temp!=EOF) { temp = fgetc(fp); num++; } printf("该文本文件的字符数为:%d\n",num); fprintf(fp,"%d",num); } else if(!strcmp(argv[1],"-w")) { //单词数 w=0; char a=fgetc(fp); while(a!=EOF) { if((a>='a' && a <='z') || ( a >='A' && a <='Z') || ( a >='0' && a <='9')) { while((a>='a' && a <='z') || ( a >='A' && a <='Z') || ( a >='0' && a <='9')) a =fgetc(fp); w++; a =fgetc(fp); } else a =fgetc(fp); } printf("该文本文件的单词数为:%d\n",w); fprintf(fp,"%d",w); } else if( !strcmp(argv[1],"-l") ) { //行数 char temp; num1 = 1; temp = fgetc(fp); while(temp != EOF ) { //putchar(temp); if(temp == '\n') { //字符需要用单引号扩住 num1++; } temp = fgetc(fp); } printf("该文本文件的行数为:%d\n",num1); fprintf(fp,"%d",num1); } else if(!strcmp(argv[1],"-o")) { if(argc==3) { FILE *fp1= fopen(argv[1],"w"); if(!fp) { printf("文件打开失败!!!\n"); return -1; } printf("字符数,单词数,行数:\n"); scanf("%d %d %d",&num,&w,&num1); fprintf(fp1,"该文本文件的字符数为:%d\n",num); fprintf(fp1,"该文本文件的单词数为:%d\n",w); fprintf(fp1,"该文本文件的行数为:%d\n",num1); fclose(fp1); } } else{ printf("error:参数超出范围!!\n"); printf("允许参数:-c,-w,-l,-o\n"); } int n=fclose(fp); } else{ printf("error:运行参数必须要3个!!\n"); printf("use:wc.exe [parameter] [file_name]\n"); } system("pause"); return 0; }
六、测试截图展示
七:总结
用c语言完成的作业。还有很多不足之处,就是因为平时积累的编程经验太少了,导致很多时候在做无用功。写了一个PSP表格,对自己的这个项目进行了大致的评估。但是时间远远超出预算。说明我的专业技能还有待加强。本次实验的结果基本与预期的结果一样,主要是在实现三个功能-------字符数上,行数,词数上花费的时间比较多。