1.Github项目地址:https://github.com/JameMo/WordCount-for-C
2.在程序的各个模块的开发上耗费的时间:
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
8 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
8 |
Development |
开发 |
350 |
350 |
· Analysis |
· 需求分析 (包括学习新技术) |
150 |
120 |
· Design Spec |
· 生成设计文档 |
20 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
15 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
30 |
25 |
· Coding |
· 具体编码 |
70 |
90 |
· Code Review |
· 代码复审 |
20 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
30 |
Reporting |
报告 |
60 |
60 |
· Test Report |
· 测试报告 |
30 |
35 |
· Size Measurement |
· 计算工作量 |
20 |
15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
10 |
合计 |
420 |
418 |
3. 解题思路:
首先,认真审题,将题目中的具体需求写出来,然后再思考具体模块。然后,细化到各个模块内,每个模块如何实现,如何满足需求,并判断自己是否能做到。接下来,将自己所需要的知识写下,并寻找自己所需要的资料,逐一学习,并开始着手打码。最后,对每个模块进行测试,并编辑博文。
4.设计实现过程:
代码一共含有九个函数(其中包含主函数)。其中char_num、word_num、line_num、blankline_num、codeline_num、commentline_num这六个函数为主要功能函数,而main、traverse两个函数主要是用来调用上面的六个函数,还有最后一个fun函数则是用来将两个字符串连接。
5.代码说明:
头文件:
#include<stdio.h>
#include<io.h>
具体函数:
①char_num函数
1 void char_num(char *file) 2 { 3 //查询file.c文件中字符数目的函数 4 int num = 0; 5 FILE *f; 6 char a; 7 f = fopen(file,"r"); 8 if(f!=NULL) 9 { 10 while((a = fgetc(f))!=EOF) 11 { 12 //避开空格、换行、Tab字符 13 if(a!=‘ ‘ && a!=‘\n‘ && a!=‘\t‘) 14 num++; 15 } 16 } 17 else 18 { 19 printf("this file does not exist.\n"); 20 } 21 fclose(f); 22 printf("char_num:%d\n",num); 23 }
②word_num函数
1 void word_num(char *file) 2 { 3 //查询file.c文件中单词数目的函数 4 int num = 0,flag; 5 FILE *f; 6 char a; 7 f = fopen(file,"r"); 8 if(f!=NULL) 9 { 10 while(!feof(f)) 11 { 12 a = fgetc(f); 13 //判断字符是否为大小写字母 14 if((a<=‘z‘&&a>=‘a‘)||(a<=‘Z‘&&a>=‘A‘)) 15 flag = 1; 16 //计算单词数目 17 else if(flag) 18 { 19 num++; 20 flag = 0; 21 } 22 } 23 } 24 else 25 { 26 printf("this file does not exist.\n"); 27 } 28 fclose(f); 29 printf("word_num:%d\n",num); 30 }
③line_num函数
1 void line_num(char *file) 2 { 3 //查询file.c文件中行数的函数 4 int num = 1; 5 FILE *f; 6 char a; 7 f = fopen(file,"r"); 8 if(f!=NULL) 9 { 10 while(!feof(f)) 11 { 12 a = fgetc(f); 13 //换行符为计数标志 14 if(a==‘\n‘) 15 num++; 16 } 17 } 18 else 19 { 20 printf("this file does not exist.\n"); 21 } 22 fclose(f); 23 printf("line_num:%d\n",num); 24 }
④blankline_num函数
1 void blankline_num(char *file) 2 { 3 //查询file.c文件中空行数的函数 4 int num = 0,count = 0,flag; 5 FILE *f; 6 char a; 7 f = fopen(file,"r"); 8 if(f!=NULL) 9 { 10 while(!feof(f)) 11 { 12 a = fgetc(f); 13 //换行时进行判断 14 if(a==‘\n‘) 15 { 16 //字符少于、等于1和不为注释行时进行计数 17 if(count<=1&&flag!=2) 18 num++; 19 count = 0; 20 } 21 else if(a!=‘\t‘&&a!=‘ ‘&&a!=‘/‘) 22 count++; 23 else if(a==‘/‘) 24 flag++; 25 } 26 } 27 else 28 { 29 printf("this file does not exist.\n"); 30 } 31 fclose(f); 32 printf("blankline_num:%d\n",num); 33 }
⑤codeline_num函数
1 void codeline_num(char *file) 2 { 3 //查询file.c文件中代码行数的函数 4 int num = 0,count = 0,flag = 0; 5 FILE *f; 6 char a; 7 f = fopen(file,"r"); 8 if(f!=NULL) 9 { 10 while(!feof(f)) 11 { 12 a = fgetc(f); 13 //先作字符分类,再进行判断 14 if(a!=‘ ‘&&a!=‘\t‘&&a!=‘\n‘&&a!=‘/‘) 15 count++; 16 else if(a==‘\n‘) 17 { 18 if(count>1&&flag!=2) 19 num++; 20 count = 0; 21 } 22 else if(a==‘/‘) 23 { 24 flag++; 25 } 26 } 27 } 28 else 29 { 30 printf("this file does not exist.\n"); 31 } 32 fclose(f); 33 printf("codeline_num:%d\n",num); 34 }
⑥commentline_num函数
1 void commentline_num(char *file) 2 { 3 //查询file.c文件中注释行数的函数 4 int num = 0,flag = 0; 5 FILE* f; 6 char a; 7 f = fopen(file,"r"); 8 if(f!=NULL) 9 { 10 while(!feof(f)) 11 { 12 a = fgetc(f); 13 //换行时标志归零 14 if(a==‘\n‘) 15 { 16 flag = 0; 17 } 18 //对注释符进行计数 19 else if(a==‘/‘) 20 { 21 flag++; 22 if(flag==2) 23 num++; 24 } 25 } 26 } 27 else 28 { 29 printf("this file does not exist.\n"); 30 } 31 fclose(f); 32 printf("commentline_num:%d\n",num); 33 }
⑦fun函数
1 char *fun(char *c1,char *c2) 2 { 3 //将两个字符串进行连接 4 int i,j; 5 char *ch; 6 for(i=0;c1[i]!=‘*‘;i++) 7 { 8 ch[i]=c1[i]; 9 } 10 for(j=0;c2[j]!=‘\0‘;j++,i++) 11 { 12 ch[i]=c2[j]; 13 } 14 ch[i]=‘\0‘; 15 return ch; 16 }
⑧traverse_all函数
1 void traverse_all(char *file_folder) 2 { 3 //文件夹内所有*.c文件的所有信息 4 long handle; 5 char *ch; 6 struct _finddata_t fileinfo; 7 handle = _findfirst(file_folder,&fileinfo); 8 if(handle==-1L) 9 return; 10 do 11 { 12 printf("file name:%s\n",fileinfo.name); 13 ch = fun(file_folder,fileinfo.name); 14 char_num(ch); 15 word_num(ch); 16 line_num(ch); 17 blankline_num(ch); 18 codeline_num(ch); 19 commentline_num(ch); 20 }while(!_findnext(handle,&fileinfo)); 21 }
⑨main函数
1 int main(int a,char* arg[]) 2 { 3 //运行wc.exe的主函数。 4 FILE *f; 5 while(1) 6 { 7 //判断文件是否存在 8 //对文件作不同的处理 9 if((f=fopen(arg[2],"r"))==NULL) 10 { 11 if(!strcmp("-s",arg[1])) 12 { 13 traverse_all(arg[2]); 14 } 15 else 16 { 17 printf("NO FILE NOW\n\n"); 18 scanf("%s%s%s",arg[0],arg[1],arg[2]); 19 continue; 20 } 21 } 22 else if(!strcmp("-c",arg[1])) 23 { 24 char_num(arg[2]); 25 } 26 else if(!strcmp("-w",arg[1])) 27 { 28 word_num(arg[2]); 29 } 30 else if(!strcmp("-l",arg[1])) 31 { 32 line_num(arg[2]); 33 } 34 else if(!strcmp("-a",arg[1])) 35 { 36 blankline_num(arg[2]); 37 codeline_num(arg[2]); 38 commentline_num(arg[2]); 39 } 40 else 41 { 42 printf("Out of specification\n\n"); 43 } 44 scanf("%s%s%s",arg[0],arg[1],arg[2]); 45 } 46 return 0; 47 }
6.测试运行。
测试文件:
①testing1.c
②testing2.c
测试结果:
①-c
②-w
③-l
④-a
⑤-s
7.项目小结:
这次项目是我做得最完整的一次项目,而且也是我的第一次做如此困难的项目。在这次项目中,我懂得了如何使用PSP去控制自己做项目的时间,此外,PSP还教会了我如何去完成一个项目。同时在这次项目中学会使用了许多新的函数,利用这些函数可以打开文件以及文件夹,从而在文件层面进行操作。我认为此次项目的最大的缺点是没有用到其他语言去实现,只停留在C语言中。
原文地址:https://www.cnblogs.com/JaneMo/p/12495554.html