1.项目GitHub地址:https://github.com/WFzhao0530/WFzhao
2.解题思路:分析这个程序的基本需求,将其功能分为多个函数来调用,找到功能的逻辑关系和计算方式,找资料学习文件调用函数等技术。
3.设计分为主函数和6个功能实现函数,分别为主函数main(),功能函数Ccount()、Wcount()、Lcount()、blankcount()、codecount()、notecount(),主函数检测输入选择调用功能函数。
4.代码说明:
头文件:
#include <stdio.h> #include <string.h>
主函数main():
void main(int a,char **fname){ FILE *file; while(1){ file=fopen(fname[2],"r"); if(file==NULL){//检查文件是否存在 printf("no file\n"); scanf("%s%s%s",fname[0],fname[1],fname[2]); continue; }else if(!strcmp(fname[1],"-c")) Ccount(fname[2]); else if(!strcmp(fname[1],"-w")) Wcount(fname[2]); else if(!strcmp(fname[1],"-l")) Lcount(fname[2]); else if(!strcmp(fname[1],"-a")){ blankcount(fname[2]); codecount(fname[2]); notecount(fname[2]); } printf("\n"); scanf("%s%s%s",fname[0],fname[1],fname[2]); } }
字符数目计算函数Ccount():
void Ccount(char *file){//查询字符数函数 FILE *f; char a; int num=0; f=fopen(file,"r"); if(f==NULL) printf("no file\n"); else while(!feof(f)){ a=fgetc(f); if(a!=' '&&a!='\n'&&a!='\t')//检测是否为空格、换行符、tab num++; } fclose(f); if(f!=NULL) printf("the char number is:%d\n",num); }
单词数目计算函数Wcount():
void Wcount(char *file){//查询词数函数 FILE *f; char a; int num=0; int tag=0; f=fopen(file,"r"); if(f==NULL) printf("no file\n"); else while(!feof(f)){ a=fgetc(f); if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) tag=1; else if(tag==1){//a不是字母且标志为1时则说明刚检测完一个单词 num++; tag=0; } } fclose(f); if(f!=NULL) printf("the word number is:%d\n",num); }
行数计算函数Lcount():
void Lcount(char *file){//查询行数函数 FILE *f; char a; int num=0; f=fopen(file,"r"); if(f==NULL) printf("no file\n"); else while(!feof(f)){ a=fgetc(f); if(a=='\n') num++; } num++;//由于文件结束时无换行符,但当前行也算一行,故要加一 fclose(f); if(f!=NULL) printf("the line number is:%d\n",num); }
空行数计算函数blankcount():
void blankcount(char *file){//查询空行函数 FILE *f; char a; int num=0; int tag=0; f=fopen(file,"r"); if(f==NULL) printf("no file\n"); else while(!feof(f)){ a=fgetc(f); if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) tag=1;//标志位为1表示本行有字符 else if(a=='\n'&&tag==0){//本行无单词字符且读取到换行符则计数加一 num++; } else if(a=='\n'&&tag==1){//本行有单词字符且读取到换行符则标志位复位到0 tag=0; } } if(tag==0) num++; fclose(f); if(f!=NULL) printf("the blankline number is:%d\n",num); }
代码行数计算函数codecount():
void codecount(char *file){//查询代码行函数 FILE *f; char a; int num1=0,num2=0,num; int tag=0; f=fopen(file,"r"); if(f==NULL) printf("no file\n"); else while(!feof(f)){ a=fgetc(f); if(a=='\n') num1++;//num1统计行数 if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) tag=1;//num2统计空行数 else if(a=='\n'&&tag==0){ num2++; } else if(a=='\n'&&tag==1){ tag=0; } } num1++; if(tag==0) num2++; num=num1-num2;//代码行等于行数减空行数 fclose(f); if(f!=NULL) printf("the codeline number is:%d\n",num); }
注释行数计算函数notecount():
void notecount(char *file){//查询注释行函数 FILE *f; char a; int num=0; int tag=0; f=fopen(file,"r"); if(f==NULL) printf("no file\n"); else while(!feof(f)){ a=fgetc(f); if(a=='/'&&tag==0) tag=1;//当检测到第一个‘/’时如果下一个字符为‘/’或者‘*’则代表一行注释 else if((tag==1&&a=='/')||(tag==1&&a=='*')){ num++; tag=0; } } fclose(f); if(f!=NULL) printf("the noteline number is:%d\n",num); }
5.测试运行:
测试文件:
测试结果:
6.项目小结:
这次项目可以算是我真正意义上做的实用的项目,为了完成这次项目,又深入学习了C语言的很多关于文件调用的函数,实现程序中调用文件。除此之外,学会了用PSP表格去记录自己完成的时间,以供事后分析。此次项目也充分认识到了C语言的繁琐和复杂,没有能做出-s的功能,这是我技术上的不足。
7.各个模块开发上耗费的时间:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 20 | 10 |
·Estimate | ·估计这个任务需要多少时间 | 240 | 180 |
Development | 开发 | 150 | 150 |
·Analysis | ·需求分析(包括学习新技术) | 30 | 30 |
·Design Spec | ·生成设计文档 | 10 | 20 |
·Design Review | ·设计复审(和同事审核设计文档) | 20 | 10 |
·Coding Standard | ·代码规范(为目前的开发制定合适的规范) | 10 | 10 |
·Design | ·具体设计 | 20 | 15 |
·Coding | ·具体编码 | 60 | 90 |
·Coding Review | ·代码复审 | 20 | 20 |
·Test | ·测试(自我测试,修改代码,提交修改) | 60 | 40 |
Reporting | 报告 | 30 | 30 |
·Test Report | ·测试报告 | 15 | 15 |
·Size Measurement | ·计算工程量 | 10 | 10 |
·Postmortem & Process Improvement Plan | ·事后总结,并提交过程改进计划 | 10 | 10 |
合计 | 335 | 310 |