码云代码地址:https://gitee.com/Z_jx/jjj/tree/master/bin
一:基本功能列表:(已完成)
jjj.exe -c 2.c //返回文件 2.c 的字符数 jjj.exe -w 2.c //返回文件 2.c 的词的数目 jjj.exe -l 2.c //返回文件 2.c 的行数
jjj.exe -o -o //手动按照顺序输入字符数,词,行数。
扩展功能:(未完成)
-s 递归处理目录下符合条件的文件。
-a 返回更复杂的数据(代码行 / 空行 / 注释行)
高级功能:(未完成)
-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
二:PSP2.1表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
1h |
1h |
· Estimate |
· 估计这个任务需要多少时间 |
1h |
1h |
Development |
开发 |
2h |
3h |
· Analysis |
· 需求分析 (包括学习新技术) |
1h |
2h |
· Design Spec |
· 生成设计文档 |
1h |
2h |
· Design Review |
· 设计复审 (和同事审核设计文档) |
1h |
2h |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
1h |
2h |
· Design |
· 具体设计 |
1h |
2h |
· Coding |
· 具体编码 |
4h |
6h |
· Code Review |
· 代码复审 |
1h |
2h |
· Test |
· 测试(自我测试,修改代码,提交修改) |
2h |
2h |
Reporting |
报告 |
1h |
1h |
· Test Report |
· 测试报告 |
1h |
1h |
· Size Measurement |
· 计算工作量 |
18h |
27h |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
3h |
3h |
|
合计 |
21h |
30h |
总结:由于这是第一次需要自己认真思考所需要每一个需要阶段所需要的时间,所以对自己所需要的时间不是很准确,估算的时间远远小于自己所要花费的时间,不过我相信,在一次次的实践中,我对自己的能力将会有一个很好的认识,也将会有一个很大的提升。
三:解题思路:
刚开始听到老师说这个的时候,我一头雾水,什么是wordcount,然后在网上看了他们对这个的理解,我才知道什么是wordcount,才对它有了大体的思路。
参考地址:https://www.cnblogs.com/m870100/p/9648510.html
下面是一些关键代码:
1.打开文件
1 //读取文件 2 int num,w,num1; 3 if(argc==3) 4 { 5 FILE *fp = fopen(argv[2],"r"); 6 if(!fp) 7 { 8 printf("文件打开失败!!!\n"); 9 return -1; 10 }
2.对文件字符数进行统计
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); }
3.对文件单词数进行统计
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); }
4.对文件单词行数进行统计
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); }
5.将文件的字符数,单词数,行数,手动输入到指定文件中
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); } }
6.对文件的参数进行判断
//1.参数过大 else{ printf("error:参数超出范围!!\n"); printf("允许参数:-c,-w,-l,-o\n"); } int n=fclose(fp); } //2.对参数数目进行判断。 else{ printf("error:运行参数必须要3个!!\n"); printf("use:jjj.exe [parameter] [file_name]\n"); } //暂停运行。 system("pause");
这是测试结果:
文件.
单元测试用例:
测试结果
文件:
总结:
我觉得这个项目对我来说i是一个挑战以前从未接触过的,但是同时我也觉得他十分有趣,因为我是用C语言写的,所以相当于我又对C语言进行了一个复习,我因为自己不是很会,所以我参照老师的步骤来做的,先写了一个PSP表格,对自己的这个项目进行了大致的评估,但是我却错误的估算了代码对我的难度,所以我的时间大大超出了我的预算,我下次一定会注意这个情况的。