项目的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个新文件中,还有写博客和一些乱七八糟的东西。无法下手,不过将老师的作业要求全部读了一遍之后,更让人迷糊了,所以干脆都不管了,只是将代码方面的设计下来之后,感觉剩下来的东西也就不是那么让人感到恐惧了,慢慢的也就熟悉上了,编码方面的问题虽然有时候会卡一会,不过通过查找网上的资料和询问同学之后也就搞定了都。感觉这次的作业让我适应了将来工作的一个流程,还有和网上程序员打交道的途径,提前将基础都打好很有利于我们将来的社会工作,我认为这次作业很有意义!