统计程序中各种代码行数的课程设计.doc

上传人:小飞机 文档编号:4296230 上传时间:2023-04-14 格式:DOC 页数:16 大小:480KB
返回 下载 相关 举报
统计程序中各种代码行数的课程设计.doc_第1页
第1页 / 共16页
统计程序中各种代码行数的课程设计.doc_第2页
第2页 / 共16页
统计程序中各种代码行数的课程设计.doc_第3页
第3页 / 共16页
统计程序中各种代码行数的课程设计.doc_第4页
第4页 / 共16页
统计程序中各种代码行数的课程设计.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《统计程序中各种代码行数的课程设计.doc》由会员分享,可在线阅读,更多相关《统计程序中各种代码行数的课程设计.doc(16页珍藏版)》请在三一办公上搜索。

1、需求分析1) 问题描述读入一个C程序,统计程序中代码、注释和空行数以及函数的个数和平均行数,并利用统计信息分析评价该程序风格。2) 基本要求如下:(1)、把C程序文件按字符顺序读入源程序;(2)、边读入程序,边识别统计代码行、注释行和空行,同时还要识别函数的开始和结束,以便统计其个数及平均行数。(3)、程序风格分为代码注释和空行三方面。每方面分A、B、C、D四个等级。AB C D代码(函数的平均长度) 1015行89或1620 57或2124 24 注释(占总行数比例) 1525%1014或2630% 59或3135% 35% 空行(占总行数比率) 1525%1014或2630% 59或313

2、5% 35%3)输入输出范例以下是对程序文件ProgAnal.C分析的输出结果示例: The results of analysing program file ProgAnal.C: Lines of code :180 Lines of comments: 63 Blank lines: 52 Code Comments Space 61% 21% 18% The program includes 9 functions. The average length of a section of code is 12.9 lines. Grade A: Excellent routine si

3、ze style. Grade A: Excellent commenting style. Grade A: Excellent white space style.1. 概要设计1).头文件引用与宏定义:#include #include #include #define TRUE 1#define FALSE 0#define BOOL int#define MAXSIZE 5000#define COUNT20/可以统计的最大的文件个数#define LEN 20 / 文件名的最大长度2).所用存储结构/函数属性结构typedef struct char 20; /每一个函数的名字in

4、t length; /每一个函数的长度int pos;/每一个函数的位置Fun;/统计结构的声明typedef struct int comments; /纯注释的个数int comment; /混合注释个数int blank;/空行的个数Fun funMAXSIZE;/函数的属性int others;/除去函数中代码外其余的代码个数int funcount; /函数的个数Analy;2. 详细设计1).函数功能及声明BOOL StrEmpty(char *s)/S是不是空int Find(char *s1,char *s2)/查找S1中是否有值为S2的子串void HaveLine(FILE

5、 *fp,char *s)/重文件中获取一行char* IgnoreB(char *s)/截断一行的空字符int IsCom(char *s)/判断一行是不是注释BOOL IsBlank(char *s)/判断一行是不是空格BOOL IsFunB(char *s)/判断一行是否是函数的开头void PrintMax(Analy *An)/打印最大函数的信息void printR(int aver ,int comc,int blanks )/打印代码风格级别void print(Analy *An)/void check * i)/检测文件是否存在BOOL GetIn(int *n)/规范输入

6、的数据,只能为数字void analy(char COUNTLEN,int n)/分析单个文件void savelog()/保存日志2)详细源代码/检测是否为空串BOOL StrEmpty(char *s)if(s0=0)return TRUE;return FALSE;/查看S1中是否有值为S2的子串,若有则返回第一个子串的位置,若无则返回-1;int Find(char *s1,char *s2)int i = 0,j = 0;if(strlen(s1) pos1 & posc j ? j : i;else if (i = -1)i = j;else if (1 = -1 & j = -1

7、)return FALSE;if (i pos)return FALSE;s = &si;s = IgnoreB(s);pos2 = Find(s,();if(*s = 0 | *s = ( |pos2 pos)return FALSE;return TRUE;/打印最大的函数属性void PrintMax(Analy *An)/FILE *fp;int i,j = 0;/ int len;for(i = 1;i funcount ;i+)if(An-funj.length funi.length)/找出最大的函数的位置j = i;if(An-funj.length funj.pos funj

8、.length);/打印长度printf(The pos of lengthest function is in %s the %dth linen,An-funj.funj.pos);/打印出函数所在的文件和位置printf(The length of lengthest function have %d lines n,An-funj.length);/打印长度void printR(int aver ,int comc,int blanks )/按代码级别判定标准输出分析结果int i;char Grade415 = Excellent,Good,So-So,Bad;/定义四个级别段/判

9、定代码的级别if (aver =10)i = 0;else if(aver = 16) | aver = 8)i = 1;else if(aver = 5) | aver =21)i = 2;else if (aver 24)i = 3;printf(Grade %s routine code stylen,Gradei);/判定注释的级别if (comc= 15)i = 0;else if(comc = 10) | comc =26)i = 1;else if(comc = 5) | comc =31)i = 2;else if(comc 35)i = 3;printf(Grade %s r

10、outine commenting stylen,Gradei);/判定空行的级别if (blanks = 15)i = 0;else if(blanks = 10) | blanks =26)i = 1;else if(blanks = 5) | blanks =31)i = 2;else if(blanks 35)i = 3;printf(Grade %s white space stylen,Gradei);/打印输出结果void print(Analy *An)int sum = 0,funcode = 0;int i, comc , blanks, aver ,code;for(i

11、= 0;i funcount ;i+)/求函数的代码总数funcode += An-funi.length;/求所有的代码总数sum += An-blank;sum += An-comments;sum += An-comment;sum += An-others;sum += funcode;if(sum = 0)/防止除数sum为0sum = 1;if(An-funcount = 0)/防止除数m为0aver = 0;elseaver = funcode/An-funcount;comc = (An-comments + An-comment)*100/sum;blanks = (An-b

12、lank)*100)/sum;code = 100 - comc - blanks; /(funcode + An-others)*100)/sum;printf(The results of analysing program file:nn);printf(Lines of code:%dn,sum - An-blank - An-comment - An-comments);printf(Lines of comments:%dn,An-comments + An-comment);printf(Blank lines:%dn,An-blank);printf(CodeCommentsS

13、pacen);printf(_n);printf(-n);printf(%d% %d%d%n,code,comc,blanks);printf(The program includes %d functionsn,An-funcount);printf(The average length of section of function is %dn,aver);PrintMax(An);printf(n);/按代码级别判定标准输出分析结果printR(aver,comc,blanks);void check * i)FILE *fp;while(fp = fopen(,r) = NULL)pr

14、intf(文件不存在 %sn,);printf(n请重新输入第%d个源文件: ,i+1);scanf(%s,);BOOL GetIn(int *n)/规范输入的数据,只能为数字char c;*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;elseprintf(输入有误!请重新输入.n);fflush(stdin);/清空(刷新)缓存里的内

15、容,以防被下次getchar()取用return FALSE;c = getchar();return TRUE;void analy(char COUNTLEN,int n)FILE *fp;/分析源文件指针FILE *fpp;/日志文件指针Analy An;/程序统计结构体char s200;/存储每行的文件BOOL begin = 0,start = 0;/设置函数开始标记int i,j = -1,pos = 0;/函数的位置 长度信息/c检测函数内大括号的匹配,comtype是注释的类型int c=0,comtype;An.blank = 0;Aments = 0;Ament = 0;

16、An.others = 0;An.funcount = 0;if(fpp = fopen(log.txt,w) = NULL)/建立日志文件printf(cannot open the n,i);for (i = 0 ;i n; i+)/遍历所有的文件if(fp = fopen(i,r) = NULL)printf(cannot open the n,i);getchar();exit(0);pos = 0; /函数在新一个文件中的位置初始化while (!feof(fp)HaveLine(fp,s); /从文件中读取一行数据pos+; /每个函数在文件中开始的位置/分类统计文件中的代码个数c

17、omtype = IsCom(s); if (comtype =1)Ament+;continue;if (comtype = 2)Aments+;if (IsFunB(s)fprintf(fpp,%s n,s);/提取每个函数的名字写入到文件j+; /j为函数的个数-1;c = 0;/大括号个数初始化为0begin = TRUE;strcpy(An.funj.i); /记录函数在哪个文件中An.funj.pos = pos;An.funj.length = 1;else if(IsBlank(s) An.blank+;else if(begin) An.funj.length+;if (Fi

18、nd(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)主函数void main()int n,i;char c;char COUNTLEN;printf(t-n);printf(t 计算机学院网络工程三班*

19、-*张菲*-*学号3107007062n);printf(t-n);while(1)n=0;printf(tttIII-程序分析-IIIn);printf(请输入要分析的源文件的个数: );while(!GetIn(&n) | n = 0)printf(请输入要分析的源文件的个数: );for(i = 0 ;i n ;i+)printf(n请输入第%d个源文件: ,i+1);scanf(%s,i);checki,i);fflush(stdin);analy();printf(t*是否继续使用? Y/N*n); c = getchar();if(c = Y | c = y)continue;br

20、eak; 3. 调试分析1) 经验收获这个课程设计总体上难度不大,但细节问题很多,尤其是频繁的用到了文件的读写操作,牵扯到了关于缓存的一些细节问题,通过这次的课程设计,使我对C语言有了较深刻的了解,学习了很多以往不知道了语言特性,接触到了很多新的功能强大的函数,特别是对文件的读写有了比较熟练的掌握,知道了其基本的原理,与控制方法,本课程设计的一个难点是关于函数开头的判断问题,尝试了很多种的方法但是都不尽人意,最后经过大量数据的测试,利用了函数定义特性的格式与关键字排除方法相结合,基本上能应对常见的程序。在完成课程设计的过程中还有一点较大的收获是对编程环境的进一步的认识,这次编程用的是教熟悉的V

21、C,以往用过TC,他们有很多的不同的地方,例如有写TC中可以用的函数,特别是在COIN.H目录下的函数,在VC中是不能用的,这给编程带来了一定的麻烦,但是通过网上查阅资料,都一一解决了,在这个过程中就是对编程工具的比对认识。2)问题分析纵观整个程序,完成了题目要求的全部功能,另外增加了很多的题目以外的功能,这些功能都是有着很大的实际用途的,例如题目中为了使这个课程设计难度降低,规定了一行文件只能是代码,注释或者空行,但是实际的程序中代码后面紧跟着注释是很常见的,而且是一中很好的编程风格。另外本程序可以对多个庞大的文件一起分析,对于几万行的程序分析的结果是比较确的,从而增强了程序的实际用途,本程

22、序还能把要测试的代码文件中所有的函数声明提取出来,并保存为日志文件。3)未来展望由于时间和经验的关系,本程序还有很多不如人意的地方,以后将继续增加一些分析功能,例如,对文件中每个函数的信息,包括行数,位置,声明都按一定的格式保存到日志文件中,在就是把整个文件的分析结果也保存起来,以便与如后的查询。五.操作演示及结果截图若输入文件不存在或位置不对则报错说明:要分析的函数应该在生成的EXE文件的同个目录下;本软件的操作非常简单明了,按照提示即可操作。1. 输入文件名,当找不到文件时的情况2. 输入数据非法的情况源文件数必须是大于零的阿拉伯数字!3. 正确的输入4. 生成的日志文件(其中包含所有的函数声明)5. 测试结果1) 对本软件代码进行测试(小型源文件的测试)说明:本程序的源文件有两个分别是analy.h和analy.c;测试结果如图所示:2) 对开发工具里的源代码进行测试(中型源文件的测试,1万行左右)3) 对开发工具里的源代码进行测试(大型源文件的测试,2万行以上)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号