项目的gitee地址:https://gitee.com/ITtoto/WordCount
开发语言:C语言
PSP2.1表格
PSP2.1 | PSP阶段 | 预估耗时 (分钟) | 实际耗时 (分钟) |
Planning | 计划 | 20 | 16 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 27 |
Development | 开发 | 120 | 160 |
· Analysis | · 需求分析 (包括学习新技术) | 20 | 18 |
· Design Spec | · 生成设计文档 | 20 | 0 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 0 |
· Design | · 具体设计 | 30 | 50 |
· Coding | · 具体编码 | 100 | 150 |
· Code Review | · 代码复审 | 20 | 0 |
· Test | · 测试(自我测试,修改代码,提交修改) | 10 | 20 |
Reporting | 报告 | 20 | 13 |
· Test Report | · 测试报告 | 10 | 2 |
· Size Measurement | · 计算工作量 | 20 | 5 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 10 | 15 |
| 合计 | 480 | 476 |
WordCount需求说明
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
基本功能
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 //将结果输出到指定文件outputFile.txt
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。
参数及其约定如下:
参数名字 | 参数意义 | 用法示例 |
-c[必选] | 文件的字符数 | 示例:wc.exe -c file.c [表示返回文件file.c的字符数,并存储在result.txt中] |
-w[必选] | 文件单词总数 | 示例:wc.exe -w file.c [表示返回文件file.c的单词数,并存储在result.txt中] |
-l[必选] | 文件行数 | 示例:wc.exe -l file.c [表示返回文件file.c的总行数,并存储在result.txt中] |
-o[必选] | 输出文件名 | 示例:wc.exe –c file.c -o outfile.txt [表示返回文件file.c的字符数,并存储在outfile.txt中]
|
基本思路
根据C语言写的小程序,三个功能,分别输出文件的字符数、行数和单词数,每个功能写一个函数,在总函数中具体写输出格式,在具体函数中进行具体编码。代码中肯定要进行文件流的一些具体方法,fopen和fwrite等函数也会用到。在做这个的时候,我不想什么炫技的方法,指向一步一步的简单的做下来,所以if else就是一个很好的分类方法了,只要肯分,所有的命令肯定都规规矩矩的一个一个的都能实现,关键就是要看细节代码的部分了,不过对于分拣刘的操作,其实说到底就是那几部,没什么难的。。
详细设计 :
本次实现使用C语言,使用vs2013进行开发。
设置基础功能有三个类charcount、wordcount和linecount三个类分别对应的事字符数、单词数和行数的统计,最后一个main类收尾,代码如下:
字符数类:
1 int charcount(char file[]){ 2 FILE *fp= NULL; 3 int ccount = 0; 4 char c; 5 if (fopen_s(&fp, file, "r")){ 6 printf("找不到文件\n"); 7 exit(-1); 8 } 9 c = fgetc(fp); 10 while (c != EOF){ 11 c = fgetc(fp); 12 ccount++; 13 } 14 fclose(fp); 15 return ccount; 16 }
单词数类:
1 int wordcount(char file[]){ 2 FILE *fp = NULL; 3 int wcount = 0; 4 char c; 5 if (fopen_s(&fp, file, "r")){ 6 printf("找不到文件\n"); 7 exit(-1); 8 } 9 c = fgetc(fp); 10 while (c != EOF){ 11 if (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z' || c >= '0'&&c <= '9'){ 12 while (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z' || c >= '0'&&c <= '9' || c == '_'){ 13 c = fgetc(fp); 14 } 15 wcount++; 16 c = fgetc(fp); 17 } 18 c = fgetc(fp); 19 } 20 fclose(fp); 21 return wcount; 22 }
行数类:
1 int linecount(char file[]){ 2 FILE *fp = NULL; 3 int lcount = 0; 4 char c; 5 if (fopen_s(&fp, file, "r")){ 6 printf("找不到文件\n"); 7 exit(-1); 8 } 9 c = fgetc(fp); 10 while (c != EOF){ 11 if (c == '\n'){ 12 lcount++; 13 c = fgetc(fp); 14 } 15 else 16 { 17 c = fgetc(fp); 18 } 19 } 20 fclose(fp); 21 return lcount+1; 22 }
main类:
1 int main(){ 2 char order[100], file[100]; 3 printf("输入命令:c:字符数 l:行数 w:单词数 q:退出 \n"); 4 while (1){ 5 printf("请输入用户命令: wc.exe -"); 6 scanf_s("%s", &order,100); 7 if (order[0] == 'c'){ 8 printf("请输入文件名: "); 9 scanf_s("%s", &file,100); 10 printf("文件的字符数为: %d\n", charcount(file)); 11 continue; 12 } 13 if (order[0] == 'w'){ 14 printf("请输入文件名: "); 15 scanf_s("%s", &file, 100); 16 printf("文件的单词数为: %d\n", wordcount(file)); 17 continue; 18 } 19 if (order[0] == 'l'){ 20 printf("请输入文件名: "); 21 scanf_s("%s", &file, 100); 22 printf("文件的行数为: %d\n", linecount(file)); 23 continue; 24 } 25 if (order[0] == 'q'){ 26 break; 27 } 28 } 29 return 0; 30 }
测试设计:
总结:
刚拿到作业题的时候感觉头皮发麻,完全不知道从哪里下手,又要从文件流入手,又要兼顾命令,还要将结果输出到1个新文件中,还有写博客和一些乱七八糟的东西。无法下手,不过将老师的作业要求全部读了一遍之后,更让人迷糊了,所以干脆都不管了,只是将代码方面的设计下来之后,感觉剩下来的东西也就不是那么让人感到恐惧了,慢慢的也就熟悉上了,编码方面的问题虽然有时候会卡一会,不过通过查找网上的资料和询问同学之后也就搞定了都。感觉这次的作业让我适应了将来工作的一个流程,还有和网上程序员打交道的途径,提前将基础都打好很有利于我们将来的社会工作,我认为这次作业很有意义!