统计程序中各种代码行数的专业课程设计_第1页
统计程序中各种代码行数的专业课程设计_第2页
统计程序中各种代码行数的专业课程设计_第3页
统计程序中各种代码行数的专业课程设计_第4页
统计程序中各种代码行数的专业课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

需求分析问题描述读入一个C程序,统计程序中代码、注释和空行数和函数个数和平均行数,并利用统计信息分析评价该程序风格。基础要求以下:(1)、把C程序文件按字符次序读入源程序;

(2)、边读入程序,边识别统计代码行、注释行和空行,同时还要识别函数开始和结束,方便统计其个数及平均行数。

(3)、程序风格分为代码注释和空行三方面。每方面分A、B、C、D四个等级。 A B CD代码(函数平均长度)10~15行 8~9或16~205~7或21~24<5或>24注释(占总行数百分比)15~25% 10~14或26~30%5~9或31~35%<5%或>35%空行(占总行数比率)15~25% 10~14或26~30%5~9或31~35%<5%或>35%3)输入输出范例以下是对程序文件ProgAnal.C分析输出结果示例:

Theresultsofanalysingprogramfile"ProgAnal.C":

Linesofcode

:180

Linesofcomments:

63

Blanklines:

52

Code

Comments

Space

61%

21%

18%

Theprogramincludes9functions.

Theaveragelengthofasectionofcodeis12.9lines.

GradeA:Excellentroutinesizestyle.

GradeA:Excellentcommentingstyle.

GradeA:Excellentwhitespacestyle.概要设计1).头文件引用和宏定义:#include<stdio.h>#include<stdlib.h>#include<string.h>#defineTRUE1#defineFALSE0#defineBOOLint#defineMAXSIZE5000#defineCOUNT 20 // 能够统计最大文件个数#define LEN 20//文件名最大长度2).所用存放结构//函数属性结构typedefstruct{ charfilename[20];//每一个函数名字 intlength; //每一个函数长度 intpos; //每一个函数位置}Fun;//统计结构申明typedefstruct{ intcomments;//纯注释个数 intcomment;//混合注释个数 intblank; //空行个数 Funfun[MAXSIZE]; //函数属性 intothers; //除去函数中代码外其它代码个数 intfuncount;//函数个数}Analy;具体设计1).函数功效及申明BOOLStrEmpty(char*s)//S是不是空intFind(char*s1,char*s2)//查找S1中是否有值为S2子串voidHaveLine(FILE*fp,char*s)//重文件中获取一行char*IgnoreB(char*s)//截断一行空字符intIsCom(char*s)//判定一行是不是注释BOOLIsBlank(char*s)//判定一行是不是空格BOOLIsFunB(char*s)//判定一行是否是函数开头voidPrintMax(Analy*An)//打印最大函数信息voidprintR(intaver,intcomc,intblanks)//打印代码风格等级voidprint(Analy*An)//voidcheckfile(char*filename,inti)//检测文件是否存在BOOLGetIn(int*n)//规范输入数据,只能为数字voidanaly(charfilename[COUNT][LEN],intn)//分析单个文件voidsavelog()//保留日志2)具体源代码//检测是否为空串BOOLStrEmpty(char*s){ if(s[0]=='\0') returnTRUE; returnFALSE; }//查看S1中是否有值为S2子串,若有则返回第一个子串位置,若无则返回-1;intFind(char*s1,char*s2){ inti=0,j=0; if(strlen(s1)<strlen(s2)) return-1;while(s1[i]!='\0'){ if(s1[i]==s2[j]) { i++; j++; if(s2[j]=='\0') returni-j; continue; } i++; j=0;} return-1; }//读取文件中一行字符voidHaveLine(FILE*fp,char*s){while(!feof(fp)) { *s=fgetc(fp); if(*s=='\n'){ //若果是一行结尾则表示取完了一行 *s='\0'; return; } s++; } *s='\0';}//忽略一行字符开头空格和tab,返回截断后上串指针char*IgnoreB(char*s){ while(*s==''||*s==' ') s++; returns;}//判定一行字符是不是注释intIsCom(char*s){ intposc,pos1,pos2; s=IgnoreB(s); posc=Find(s,"//"); if(posc==0)//此行仅有注释,无代码; return1; if(posc==-1) return0; pos1=Find(s,"\""); pos2=Find(&s[pos1+1],"\""); if(posc>pos1&&posc<pos2) return0; return2; }//判定一行字符是不是空白BOOLIsBlank(char*s){ s=IgnoreB(s); if(*s=='\0') returnTRUE; returnFALSE;}BOOLIsFunB(char*s){ inti,j,pos,pos2; //有分号,ifwhilefor不是函数开头 if(Find(s,";")!=-1||Find(s,"if")!=-1||Find(s,"for")!=-1||Find(s,"while")!=-1||Find(s,"switch")!=-1) returnFALSE; //没有小括号不是函数开头 if((pos=Find(s,"("))==-1) returnFALSE; s=IgnoreB(s); i=Find(s,""); j=Find(s," "); if(i!=-1&&j!=-1) i=i>j?j:i; elseif(i==-1) i=j; elseif(1==-1&&j==-1) returnFALSE; if(i>pos) returnFALSE; s=&s[i]; s=IgnoreB(s); pos2=Find(s,"("); if(*s=='\0'||*s=='('||pos2>pos) returnFALSE; returnTRUE; }//打印最大函数属性voidPrintMax(Analy*An){ // FILE*fp; inti,j=0; //intlen; for(i=1;i<An->funcount;i++) if(An->fun[j].length<An->fun[i].length)//找出最大函数位置 j=i; if(An->fun[j].length<0||An->fun[j].pos<0){ printf(" therearenotanyfunctioninthefiles");//打印出函数所在文件和位置 return; } printf(" Thelengthoflengthestfunctionhave%dlines\n",An->fun[j].length);//打印长度 printf(" Theposoflengthestfunctionisin%sthe%dthline\n",An->fun[j].filename,An->fun[j].pos);//打印出函数所在文件和位置 printf(" Thelengthoflengthestfunctionhave%dlines\n",An->fun[j].length);//打印长度}voidprintR(intaver,intcomc,intblanks){ //按代码等级判定标准输出分析结果 inti; charGrade[4][15]={"Excellent","Good","So-So","Bad"};//定义四个等级段 //判定代码等级 if(aver<=15&&aver>=10) i=0; elseif((aver<=20&&aver>=16)||aver<=9&&aver>=8) i=1; elseif((aver<=7&&aver>=5)||aver<=24&&aver>=21) i=2; elseif((aver<5)||(aver>24)) i=3; printf(" Grade%sroutinecodestyle\n",Grade[i]); //判定注释等级 if(comc<=25&&comc>=15) i=0; elseif((comc<=14&&comc>=10)||comc<=30&&comc>=26) i=1; elseif((comc<=9&&comc>=5)||comc<=35&&comc>=31) i=2; elseif((comc<5)||(comc>35)) i=3; printf(" Grade%sroutinecommentingstyle\n",Grade[i]); //判定空行等级 if(blanks<=25&&blanks>=15) i=0; elseif((blanks<=14&&blanks>=10)||blanks<=30&&blanks>=26) i=1; elseif((blanks<=9&&blanks>=5)||blanks<=35&&blanks>=31) i=2; elseif((blanks<5)||(blanks>35)) i=3; printf(" Grade%swhitespacestyle\n",Grade[i]); }//打印输出结果voidprint(Analy*An){ intsum=0,funcode=0; inti,comc,blanks,aver,code; for(i=0;i<An->funcount;i++)//求函数代码总数 funcode+=An->fun[i].length; //求全部代码总数 sum+=An->blank; sum+=An->comments; sum+=An->comment; sum+=An->others; sum+=funcode; if(sum==0)//预防除数sum为0 sum=1; if(An->funcount==0)//预防除数m为0 aver=0; else aver=funcode/An->funcount; comc=(An->comments+An->comment)*100/sum; blanks=((An->blank)*100)/sum; code=100-comc-blanks;//((funcode+An->others)*100)/sum; printf(" Theresultsofanalysingprogramfile:\n\n"); printf(" Linesofcode: %d\n",sum-An->blank-An->comment-An->comments); printf(" Linesofcomments: %d\n",An->comments+An->comment); printf(" Blanklines: %d\n",An->blank); printf(" Code Comments Space\n"); printf(" _____ ________ _____\n"); printf(" ----- -------- -----\n"); printf(" %d%%%d%% %d%%\n",code,comc,blanks); printf(" Theprogramincludes%dfunctions\n",An->funcount); printf(" Theaveragelengthofsectionoffunctionis%d\n",aver); PrintMax(An); printf("\n"); //按代码等级判定标准输出分析结果 printR(aver,comc,blanks); }voidcheckfile(char*filename,inti){ FILE*fp; while((fp=fopen(filename,"r"))==NULL) { printf("文件不存在%s\n",filename); printf("\n请重新输入第%d个源文件:",i+1); scanf("%s",filename); } }BOOLGetIn(int*n)//规范输入数据,只能为数字{ charc; *n=0; fflush(stdin); c=getchar();//当输入一串数据并按回车后,getchar()取出缓存队列中第一个字符 while(c!='\n'){ if(c=='0') printf("输入有误!请重新输入....\n"); if(c>='0'&&c<='9') *n=(*n)*10+c-48; else{ printf("输入有误!请重新输入....\n"); fflush(stdin);//清空(刷新)缓存里内容,以防被下次getchar()取用 returnFALSE; } c=getchar(); } returnTRUE; }voidanaly(charfilename[COUNT][LEN],intn){ FILE*fp;//分析源文件指针 FILE*fpp;//日志文件指针 AnalyAn;//程序统计结构体 chars[200];//存放每行文件 BOOLbegin=0,start=0;//设置函数开始标识 inti,j=-1,pos=0;//函数位置长度信息 //c检测函数内大括号匹配,comtype是注释类型 intc=0,comtype; An.blank=0; Aments=0; Ament=0; An.others=0; An.funcount=0; if((fpp=fopen("log.txt","w"))==NULL)//建立日志文件 printf("cannotopenthefile%s\n",filename[i]); for(i=0;i<n;i++)//遍历全部文件 { if((fp=fopen(filename[i],"r"))==NULL) { printf("cannotopenthefile%s\n",filename[i]); getchar(); exit(0); } pos=0;//函数在新一个文件中位置初始化 while(!feof(fp)) { HaveLine(fp,s);//从文件中读取一行数据 pos++;//每个函数在文件中开始位置 //分类统计文件中代码个数 comtype=IsCom(s); if(comtype==1) { Ament++; continue; } if(comtype==2) Aments++; if(IsFunB(s)) { fprintf(fpp,"%s\n",s);//提取每个函数名字写入到文件 j++;//j为函数个数-1; c=0;//大括号个数初始化为0 begin=TRUE; strcpy(An.fun[j].filename,filename[i]);//统计函数在哪个文件中 An.fun[j].pos=pos; An.fun[j].length=1; } elseif(IsBlank(s)) An.blank++; elseif(begin){ An.fun[j].length++; if(Find(s,"{")!=-1)//检测是否进入到了函数体内 { c++; start=TRUE; } if(Find(s,"}")!=-1)//检测是否一个函数结束 c--; if(c==0&&start) { begin=FALSE; start=FALSE; } } else An.others++; } fclose(fp);//关闭分析文件 } fclose(fpp);//关闭日志文件An.funcount=j+1;//把函数个数保留print(&An);//打印分析结果}3)主函数voidmain(){ intn,i; charc; charfilename[COUNT][LEN]; printf("\t-------------------------------------------------------------\n");printf("\t计算机学院网络工程三班*--------*张菲*--*学号\n"); printf("\t--------------------------------------------------------------\n"); while(1){ n=0; printf("\t\t\tIII-----程序分析----III \n"); printf("请输入要分析源文件个数:"); while(!GetIn(&n)||n<=0){ printf("请输入要分析源文件个数:"); } for(i=0;i<n;i++) { printf("\n请输入第%d个源文件:",i+1); scanf("%s",filename[i]); checkfile(filename[i],i); fflush(stdin); } analy(filename,n);printf("\t*************************是否继续使用?Y/N***************************\n"); c=getchar(); if(c=='Y'||c=='y') continue;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论