




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子设计应用软件训练总结报告(二)一、题目分析1、问题描述读入一个C程序,统计程序中代码、注释和空行的行数以及函数的个数和平均行数,并利用统计信息分析评价该程序的风格。为方便,作以下约定:第一个字符是''的行称为注释行(该行不含语句)。除了空行和注释行外,其余均为代码行,每个函数都是全局的,没有嵌套函数。2、基本要求把 C程序文件作为TEXT文件读人源程序; 边读入程序,边识别统计代码行、注释行和空行,还要识别过程和函数的开始和结束,以便统计其个数和平均行数。评价分为代码、注释和空行3方面。分为A、B、C和D4个等级,等级的划分标准是: A级B级C级D级代码(过程平均长度)10
2、15行89行或1620行57行或2124行5或24行注释(占总行数比率)1025%1014%或2630%59%或3135%5%或35%空行(占总行数比率)1525%1014%或2630%59%或3135%5%或35%以下是对程序文件ProgAnalC分析的输出结果示例: The results of analysing program file“ProgAnal。C”:Lines of code:180 Iines of comments:63 Blanklines:52 Code Comments Space 61 21 18The program includes 9 procedures
3、 and 4 functionsThe average length of a section of code is 129 linesGrade A。EXCellent routine Size StyleGrade A:Excellent commenting styleGrade A:Excellent white space style3、需求分析(1)文本串非空且以C程序文件形式存放,文件由用户建好并设立路径。(2)把C程序文件按字符顺序读入源程序;(3)边读入程序,边识别统计代码行、注释行和空行,同时还要识别函数的开始和结束,以便统计其个数和平均行数。(4)在计算机终端输出的结果是
4、:函数的个数,函数的总行数,函数的平均行数,总函数,空行的行数,注释的行数,函数的平均长度的等级,注释等级,空行等级。(5)测试数据:C文本文件为本次练习中的1.cpp二、设计过程此次课程设计频繁的用到了文件的读写操作,牵扯到了关于缓存的一些细节问题,利用函数定义特性的格式与关键字排除方法相结合,实现所要求的功能。1、头文件引用与宏定义:#include <stdio.h>#include <stdlib.h>#include <string.h>#define TRUE 1#define FALSE 0#define BOOL int#define MAX
5、SIZE 5000#define COUNT20/可以统计的最大的文件个数#define LEN 20 / 文件名的最大长度2、程序所用存储结构 /函数属性结构typedef struct char filename20; /每一个函数的名字 int length; /每一个函数的长度 int pos;/每一个函数的位置Fun;/统计结构的声明typedef struct int comments; /纯注释的个数 int comment; /混合注释个数 int blank;/空行的个数 Fun funMAXSIZE;/函数的属性 int others;/除去函数中代码外其余的代码个数 in
6、t funcount; /函数的个数Analy;3、函数功能说明BOOL StrEmpty(char *s)/S是不是空int Find(char *s1,char *s2)/查找S1中是否有值为S2的子串void HaveLine(FILE *fp,char *s)/重文件中获取一行char* IgnoreB(char *s)/截断一行的空字符int IsCom(char *s)/判断一行是不是注释BOOL IsBlank(char *s)/判断一行是不是空格BOOL IsFunB(char *s)/判断一行是否是函数的开头4、详细设计说明(1)主函数的设计 调用各个子函数,运用while和
7、for循环语句,实现程序源代码的分析。图1 主函数流程图(2)子程序StrEmpty()函数的设计 此为串的基本操作 检测是否为空串,若为空串,返回TRUE,若不是空串,返回FALSE。图2 StrEmpty()函数流程图 (3)子程序Find()函数的设计 查看S1中是否有值为S2的子串,若有则返回第一个子串的位置,若无则返回-1。该函数主要是运用if语句和while语句,来实现功能。图3 Find()函数流程图 (4)子程序HaveLine()函数的设计 该函数所要实现的功能是读取文件中的一行字符。若是一行的结尾则表示取完了一行,返回主函数。图4 HaveLine()函数流程图(5)子程序
8、IgnoreB()函数的设计 该函数所要实现的功能是忽略一行字符开头的空格和tab,返回截断后上的串指针。图5 lgnoreB()函数流程图(6)子程序IsCom()函数的设计 该函数所要实现的功能是判断一行字符是不是注释。若posc = 0则表示此行仅有注释,无代码。图6 IsCom()函数流程图(7)子程序IsBlank()函数的设计 该函数所要实现的功能是判断一行字符是不是空白。如果是,返回TRUE;如果不是,返回FALSE。图7 IsBlamk()函数流程图(8)子程序printR()函数的设计 该函数所要实现的功能是按代码级别判定标准输出分析结果。先根据课题给定的标准定义A、B、C、
9、D四个阶段,A为最优阶段,D为最差阶段。再分别运用if-else语句,判定代码、注释、空行的级别。如此,便实现了课题的要求。图8 printR()函数流程图三、调试过程及实验结果1、调试过程: 在对“打印输出结果”进行编程时,将if (sum=0)误写为if (sum=0),程序出现错误。错误结果如下图9图9 错误结果图2、正确实验结果:图10 程序运行显示图图11 程序正确结果图四、结论 从实验结果可以看出,程序很好的实现了课题所要求的功能。为期两周的软件课设已然接近尾声,从刚拿到题目时的傻眼,到如今报告的完成,我收获了很多。题目的难易很难论断,只是觉得,那是个我很陌生的领域。在查阅了大量的
10、相关资料及咨询同学和老师后,我才了解到课题的深意,逐步完成这项任务。在程序运行时不可避免会遇到很多问题,比如函数不能调用,功能无法实现,编译错误等等,经过老师、同学的帮助,程序终于可以正常运行了。我觉得出现错误并不可拍,重要的是要学会改正和排错的过程,在这个过程中,我锻炼了自学的能力并且培养出了百折不挠的信念,同时也增强了我的分析问题能力和实际操作能力,而这些恰恰是我日后工作所需要的。这次课程设计,还让我对计算机软件技术基础有了更为深入的认识,并了解到了软件技术即所有计算机相关专业课的重要性,希望今后能多开设这样的课程。最后,向我的指导教师致以深深的谢意,感谢您的耐心指导。五、程序清单#inc
11、lude <stdio.h>#include <stdlib.h>#include <string.h>#define TRUE 1#define FALSE 0#define BOOL int#define MAXSIZE 5000#define COUNT20/可以统计的最大的文件个数#define LEN 20 / 文件名的最大长度#include <stdio.h>#include <stdlib.h>#include <conio.h> void checkfile(char *filename,int i);v
12、oid analy(char filenameCOUNTLEN,int n);BOOL GetIn(int *n);/函数属性结构typedef struct char filename20; /每一个函数的名字int length; /每一个函数的长度int pos;/每一个函数的位置Fun;/统计结构的声明typedef struct int comments; /纯注释的个数int comment; /混合注释个数int blank;/空行的个数Fun funMAXSIZE;/函数的属性int others;/除去函数中代码外其余的代码个数int funcount; /函数的个数Anal
13、y;/串的基本操作ADT/检测是否为空串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) < strlen(s2)return -1; while (s1i!='0') if(s1i = s2j)i+;j+;if(s2j='0')return i-j;continue;i+;j=0; re
14、turn -1;/读取文件中的一行字符void HaveLine(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+;return s;/判断一行字符是不是注释int IsCom(char *s)int posc,pos1,
15、pos2;s= IgnoreB(s);posc = Find(s,"/");if(posc = 0)/此行仅有注释,无代码;return 1;if(posc = -1)return 0;pos1 = Find(s,""");pos2 = Find(&spos1+1,""");if(posc > pos1 && posc < pos2)return 0;return 2;/判断一行字符是不是空白BOOL IsBlank(char *s)s= IgnoreB(s);if(*s=
16、39;0')return TRUE;return FALSE;int IsFunB(char *s)int i,j,pos,pos2;/有分号,if while for的不是函数开头if(Find(s,"") != -1 | Find(s,"if") != -1 | Find(s,"for") != -1 | Find(s,"while") != -1|Find(s,"switch") != -1)return FALSE;/没有小括号的不是函数开头if(pos = Find(s,&qu
17、ot;(") = -1)return FALSE;s = IgnoreB(s);i = Find(s," ");j = Find(s,"");if (i != -1 && j != -1)i = i > j ? j : i;else if (i = -1)i = j;else if (1 = -1 && j = -1)return FALSE;if (i > pos)return FALSE;s = &si;s = IgnoreB(s);pos2 = Find(s,"(")
18、;if(*s = '0' | *s = '(' |pos2 > pos)return FALSE;return TRUE; void printR(int aver ,int comc,int blanks )/按代码级别判定标准输出分析结果int i;char Grade415 = "A: Excellent","B: Good","C: just So-So","D: Bad"/定义四个级别段/判定代码的级别if (aver <= 15 && aver
19、 >=10)i = 0;else if(aver <=20 && aver >= 16) | aver <= 9 && aver >= 8)i = 1;else if(aver <=7 && aver >= 5) | aver <= 24 && aver >=21)i = 2;else if (aver <5) | (aver > 24)i = 3;printf("Grade %s routine code stylen",Gradei);/判定
20、注释的级别if (comc<= 25 && comc >= 15)i = 0;else if(comc <=14 && comc >= 10) | comc <= 30 && comc >=26)i = 1;else if(comc <=9 && comc >= 5) | comc <= 35 && comc >=31)i = 2;else if(comc <5) | (comc > 35)i = 3;printf("Grade %s
21、 routine commenting stylen",Gradei);/判定空行的级别if (blanks <= 25 && blanks >= 15)i = 0;else if(blanks <=14 && blanks >= 10) | blanks <= 30 && blanks >=26)i = 1;else if(blanks <=9 && blanks >= 5) | blanks <= 35 && blanks >=31)i =
22、2;else if(blanks <5) | (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 = 0;i < An->funcount ;i+)/求函数的代码总数funcode += An->funi.length;/求所有的代码总数sum += An->blank;sum +=
23、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->blank)*100)/sum;code = 100 - comc - blanks; /(funcode +
24、 An->others)*100)/sum;printf(" 程序源代码分析结果如下所示nn");printf("代码行数:%dn",sum - An->blank - An->comment - An->comments);printf("注释行数:%dn",An->comments + An->comment);printf("空行数:%dn",An->blank);printf("代码 注释 空行n");printf("* *n"
25、;);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);printf("n");/按代码级别判定标准输出分析结果printR(aver,comc,blanks);void checkfile
26、(char *filename,int i)FILE *fp;while(fp = fopen(filename,"r") = NULL)printf("对不起!文件不存在 %sn",filename);printf("n请重新输入第%d个源文件: ",i+1);scanf("%s",filename);BOOL GetIn(int *n)/规范输入的数据,只能为数字char c;*n = 0;fflush(stdin);c = getchar();/当输入一串数据并按回车后,getchar()取出缓存队列中的第一
27、个字符while(c != 'n')if(c = '0' && n = 0)printf("输入有误!请重新输入.n");if(c >= '0' && c <= '9')*n = (*n) * 10 +c - 48;elseprintf("输入有误!请重新输入.n");fflush(stdin);/清空(刷新)缓存里的内容,以防被下次getchar()取用return FALSE;c = getchar();return TRUE;void ana
28、ly(char filenameCOUNTLEN,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;An.others = 0;An.funcount = 0;if(fpp = fopen("log.tx
29、t","w") = NULL)/建立日志文件printf("cannot open the file %sn");for (i = 0 ;i < n; i+)/遍历所有的文件if(fp = fopen(filenamei,"r") = NULL)printf("cannot open the file %sn",filenamei); /输出filenameigetchar();exit(0);pos = 0; /函数在新一个文件中的位置初始化while (!feof(fp)HaveLine(fp,
30、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;/大括号个数初始化为0begin = TRUE;strcpy(An.funj.filename,filenamei); /记录函数在哪个文件中An.funj.pos = pos;An.funj.length = 1;else if(IsBlank(s) An.blank+;else if(begin) An.funj.length+;if (Find(s,&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年楚雄货运从业资格证怎么考
- 个人装修水电合同
- 2025年宜昌道路运输从业资格证考试内容是什么
- 2025年平顶山货运从业资格模拟考
- 2025年室外装修承包合同8篇
- 《数据可视化技术应用》1.2 开启数据可视化之门-教案
- 2025年陕西货运从业资格证考试题技巧
- 旋片真空泵竞争策略分析报告
- 产品订单合同范本
- 电安装施工合同范本
- 五年级下册道德与法治教学计划
- 读书分享-于永正-我怎样教语文
- 2024工贸企业重大事故隐患判定标准解读
- 高中语文(统编版)选必中册-第二单元教材分析解读课件
- 哈尔滨铁道职业技术学院单招《语文》考试复习题库(含答案)
- 华东师范大学《政治学概论》2023-2024学年第一学期期末试卷
- 1医学图像处理绪论课件
- 校园门禁系统升级方案
- 第七讲推动构建新时代的大国关系格局32024秋形势与政策
- 汽车行业职位职级管理制度实施方案
- 八年级物理上册课程纲要
评论
0/150
提交评论