个人项目作业
1.github项目地址:https://github.com/tryanddie/wordcount
2.实现程序前,模块开发预计时间
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
|
· Estimate |
· 估计这个任务需要多少时间 |
10 |
|
Development |
开发 |
160 |
|
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
|
· Design Spec |
· 生成设计文档 |
5 |
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
|
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
|
· Design |
· 具体设计 |
40 |
|
· Coding |
· 具体编码 |
15 |
|
· Code Review |
· 代码复审 |
15 |
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
|
Reporting |
报告 |
40 |
|
· Test Report |
· 测试报告 |
20 |
|
· Size Measurement |
· 计算工作量 |
10 |
|
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
|
合计 |
|
210 |
|
3.解题思路
编程语言的选择
使用c语言开发
需要用到的新知识
c的文件读取与isspace函数,git的基本操作,
结构的分析
根据操作指令表进行相关操作即可
遇到的困难
首先,在如何用c打开文件的问题上就花费了很多的时间。
其次,实现各种功能时,在面对如何处理避免空格回车等输入影响字符统计等的功能的问题上也是花费我大量时间的一个问题
4.设计实现过程
设计实现主要有一个主函数,通过用户输入的指令选择相应的函数进行处理
5.代码说明
wc主程序
1 int main() 2 { 3 int test=1; 4 char control; //对应的命令 5 char File[50]; //对应的文件地址 6 while(test) 7 { 8 printf("请输入用户命令(查询指令表请输入k)wc.exe-"); 9 scanf(" %c",&control); 10 if(control=='k'){ 11 printf("c 统计字符数;\t w 统计单词数;\tl 统计行数; \na 返回文件基本情况; \t 0 退出"); 12 break; 13 } 14 //printf("\n"); 15 printf("请输入文件的地址"); 16 scanf("%s",File); 17 //printf("\n") 18 switch(control){ 19 case 'c': Countcharacter(File); 20 break; 21 case 'w': Countword(File); 22 break; 23 case 'l': Countline(File); 24 break; 25 case 'a': Countother(File); 26 break; 27 case '0': return 0; //输入0,则直接退出 28 default : printf("无此指令,请重新输入\n"); 29 break; //根据对应的指令进行对应的处理 30 } 31 } 32 }
-c统计文件字符数
1 void Countcharacter(char File[]) //字符数计算函数 2 { 3 int count=0; //字符数计数 4 char ch=' '; 5 FILE *f_read=fopen(File,"r"); 6 if(f_read==NULL){ 7 printf("打开文件出现错误或者没有此文件,请重试\n"); 8 return ; 9 } 10 while((ch=fgetc(f_read))!=EOF) 11 { 12 if(isspace(ch)==0) 13 ++count; 14 } 15 fclose(f_read); 16 printf("文件的字符数(不包含空格回车)为%d\n",count); 17 system("pause"); 18 }
-w 统计文档单词数
1 void Countword(char File[]){ 2 int count=0; //单词数计数 3 char ch=' '; 4 FILE *f_read=fopen(File,"r"); 5 if(f_read==NULL){ 6 printf("打开文件出现错误或者没有此文件,请重试\n"); 7 return ; 8 } 9 while((ch=fgetc(f_read))!=EOF) 10 { 11 if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){ 12 while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //一连串的字符组成一个单词 13 ch=fgetc(f_read); 14 ++count; 15 } 16 } 17 fclose(f_read); 18 printf("文件的单词数为%d\n",count); 19 system("pause"); 20 }
-l 统计文件行数
1 void Countline(char File[]){ 2 int count=0; //行数计数 3 char ch[1024]; 4 int status=0; //用于规避空文件的行数统计问题 5 FILE *f_read=fopen(File,"r"); 6 if(f_read==NULL){ 7 printf("打开文件出现错误或者没有此文件,请重试\n"); 8 return ; 9 } 10 while(!feof(f_read)){ 11 fgets(ch,1024,f_read); 12 if(status==0&&ch[0]=='\0') break; //第一行全无内容,且为空行则行数为0 13 else status=1; 14 count++; 15 } 16 fclose(f_read); 17 printf("文件的行数为%d\n",count); 18 system("pause"); 19 }
5.-a(统计文档的代码行数,注释行数与空白行数)
1 void Countother(char File[]){ 2 int count[3]={0}; 3 char ch[1024]={0}; 4 int status=0; 5 FILE *f_read=fopen(File,"r"); 6 if(f_read==NULL){ 7 printf("打开文件出现错误或者没有此文件,请重试\n"); 8 return ; 9 } 10 while(!feof(f_read)){ 11 fgets(ch,1024,f_read); 12 if(status==0){ 13 if(strstr(ch,"//")!=NULL||strstr(ch,"/*")!=NULL||strstr(ch,"*/")!=NULL) count[0]++; 14 else { 15 int diff=0; //字符数 16 int site=0; //位置 17 while(site<strlen(ch)||diff<1){ 18 if(isspace(ch[site])==0) diff++; 19 site++; 20 } 21 if(diff>1) count[1]++; //两个字符以上即为代码行 22 else count[2]++; 23 } 24 } 25 else count[0]++; 26 if(strstr(ch,"/*")!=NULL) status=1; 27 if(strstr(ch,"*/")!=NULL) status=0; 28 } 29 fclose(f_read); 30 printf("文件的注释行数为%d\n文件的代码行数为%d\n文件的空行数为%d\n",count[0],count[1],count[2]); 31 system("pause"); 32 }
6.测试运行
程序实现功能
本程序实现了-c、-l、-w指令以及-a的全部指令
(1)代码
(2)空文件
(3)一个字符
(4)一行
7.实现完成程序后,实际花费时间
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
10 |
· Estimate |
· 估计这个任务需要多少时间 |
10 |
10 |
Development |
开发 |
160 |
210 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
90 |
· Design Spec |
· 生成设计文档 |
5 |
15 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
0 |
0 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
5 |
5 |
· Design |
· 具体设计 |
40 |
30 |
· Coding |
· 具体编码 |
15 |
15 |
· Code Review |
· 代码复审 |
15 |
15 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
40 |
Reporting |
报告 |
40 |
35 |
· Test Report |
· 测试报告 |
20 |
15 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
10 |
合计 |
|
210 |
255 |
8.小结:
这次作业让我学会了很多,像github的基本使用和c语言对于文件的处理和isspace函数。
而我的问题在这次作业中也暴露无遗,温故而知新,这两者我无一做得好的,像java本来自从学会后就再也没用过,到现在一点都不会用了,才导致我退而求其次的选择了用c来完成本次作业,而别人做的作业也给我很大打击,像什么图形界面,即使我百度后也感觉力不从心,让深刻明白自己做的不够多也不够好,而在下次二人作业做也与别人约好用java来完成所以接下来也会重拾java的一些知识,但在这此实验中我也深刻体会到了百度的力量,很多知识都是通过百度进行学习,也算是这次作业给我的最大收获,尤其是https://blog.csdn.net/weixin_44950987/article/details/102619708以及https://blog.csdn.net/weixin_43524214/article/details/104184808?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task这两篇文章更是我完成这次作业的关键,接下来我也会利用好百度来进行更快更好的学习同时弥补以前的不足