已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构与程序设计专题实验报告 实验报告 一、实验任务 实验题目:数据结构与程序设计专题实验二、实验内容实验二:基于串的程序分析(一)实验目的:熟练掌握串的运用,以及线性表、栈、队列等基本操作。(二)基本要求: 1)把C程序文件按字符顺序读入源程序;2)边读入程序,边识别统计代码行、注释行和空行,同时还要识别函数的开始和结束,以便统计其个数和平均行数;3)程序的风格主人评价分为代码、注释和空行三个方面。每个方面为A,B,C,D四个等级。(三)内容提要:读入一个C程序,统计程序中代码、注释和空行的行数以及函数的个数和平均行数,并利用统计信息分析评价该程序风格。注:等级的划分标准是: A级 B级 C级 D级代码(函数平均长度) 10-15行8-9或16-20行 5-7或21-24行 24行注释(占总行数比率) 15-25%10-14或26-30% 5-9或31-35% 35%空行(占总行数比率) 15-25%10-14或26-30% 5-9或31-35% 35%三、要点分析题目中涉及的主要知识点有:1、 文件。打开源文件,读入程序做统计,同时还要将识别到的函数记录到文件 “log.txt”中。2、 串(字符串)。整个程序的各种功能都是基于对串的操作实现的。如判断是否 为空串、在串中查找子串、返回截断的串等等。3、 结构体。设置结构体变量,记录统计数据。4、 函数。编写各种功能的函数,主函数通过调用函数实现程序的功能。四、解题步骤编程平台:Microsoft Visual C+ 6.0编程平台应用:第一步:打开Microsoft Visual C+ 6.0运行软件;第二步:在主菜单中选文件新建。第三步:在出现的如下界面中选取“工程”项,选择“Win32 Console Application”,填写工程名称,选择存储路径,点击“确定”。第四步:勾选“一个简单的程序”复选框。第五步:在出现的编译环境中编写程序。五、程序的算法描述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 filename20; /每一个函数的名字 int length; /每一个函数的长度 int pos; /每一个函数的位置 Fun; /统计结构的声明 typedef struct int comments; /纯注释的个数 int comment; /混合注释个数 int blank;/空行的个数 Fun funMAXSIZE;/函数的属性 int others; /除去函数中代码外其余的代码个数 int funcount; /函数的个数 Analy;其中纯注释是指一行中只有注释和无其他,而混合注释是指一行中除注释外还有其他语句等。3、 程序中各函数的简要说明:1) 、BOOL StrEmpty(char *s)判断字符串是否为空串,如果字符串的第一个字符为“0”,则为 空串。 2)、int Find(char *s1,char *s2)查看S1中是否有值为S2的子串,若有则返回第一个子串的位 置,若无则返回-1。首先比较两个字符串的长度,若s1长度小于s2长度,则返回false;当 s1长度大于s2长度时,设置i和j俩个变量分别指向俩个字符串,比较s1i和s2j的当前的 值,相同则i,j同时加1,直至s2比较完;否则i加1,j置零,从下一个字符开始重新比较。3)、void HaveLine(FILE *fp,char *s)读取文件中的一行字符。借助文件指针fp和函数fgetc, 从源文件中提取字符,并存入字符串s中,当遇到“n”时表示一行读取完成。并在字符串 后加“0”,表示字符串结束。4)、char* IgnoreB(char *s)忽略一行字符开头的空格和tab,返回截断后的串指针。利用字符 串指针将字符串传到函数中,函数检测字符串开头是否为空格,若是指针加1,直到指针当 前指示字符不是空格,并返回指针(即字符串中第一个不是空格的字符的地址)。 5)、int IsCom(char *s)判断一行字符是不是注释。首先在字符串s中查找子串“”,若无则此 行无注释;若有,但当“”出现在“”中时,不是注释,只是输出项,须予以排除;当有 子串“”并且子串位置在最开始,则此行只有注释,用1表示此类型。其他类型注释用2 表示。6)、BOOL IsBlank(char *s)判断一行字符是不是空白。在此函数中先调用IgnoreB函数,返回截 断后的字符,检测此时字符串的首字符是否为“0”,若是则为空串,否则不是。7)、BOOL IsFunB(char *s)判断一行是不是函数开头。函数的开头格式: “数据类型 函数名(参数列表)” 应用排除的方法,字符串中有;、if、while、for、switch等不是函数开头。函数开头必有 括号包含参数列表,没有括号的排除。之后检测是否存在数据类型和函数名之间的空格,如 果在“(”之前无空格则不是函数。如果有双括号也不满足,排除。 8)、void printR(int aver ,int comc,int blanks )按代码级别判定标准输出分析结果。将aver (代码行百分比)、comc(注释行百分比)、blanks(空行百分比)作为参数传给函数,在函 数中利用if、else if,判断所属的等级并输出判断结果。9)、void print(Analy *An)打印输出结果。此函数中对各种原始统计数据做处理并输出统计结 果。 10)、void checkfile(char *filename,int i)检查文件是否合法。将文件名和文件个数作为参 数,在函数中利用fopen函数打开文件,如果成功则继续运行,否则返回出错信息,并提示 用户从新输入文件名。11)、BOOL GetIn(int *n)规范输入的数据,只能为数字。12)、void analy(char filenameCOUNTLEN,int n)文件统计分析函数。在函数中打开要分析 的文件,并将统计结构体An中的各计数变量清零。从文件中读取一行字符串,调用各个类型 判断函数,判断此行的类型,并将相应的计数器加1.设置pos变量记录当前读取的行数,记 录函数的起始位置。设置begin和start变量作为函数开始和处于函数体的标志,c记录括号 数,利用“”和“”的数目必然相等,检测到函数开头后,进入循环,当检测到“”时, c加1,当检测到“”时,c减1,当函数结束时,c必会从新变为零,作为判断函数结束的标 志。 13)、int main()主函数。主函数中首先输出交互界面,提示用户输入统计的文件个数以及每个 文件的文件名。用户边输入文件名,边调用checkfile函数检测文件是否合法,同时根据能 否打开文件进行下一步操作。当所有文件输入完毕后,调用analy函数分析文件并输出结果。4、源代码完整程序及相应说明如下;#include #include #include #define TRUE 1#define FALSE 0#define BOOL int#define MAXSIZE 5000#define COUNT20 /可以统计的最大的文件个数#define LEN 20 / 文件名的最大长度/函数属性结构typedef struct char filename20; /每一个函数的名字int length;/每一个函数的长度int pos;/每一个函数的位置Fun;/统计结构的声明typedef struct int comments; /纯注释的个数int comment; /混合注释个数int blank;/空行的个数Fun funMAXSIZE;/函数的属性int others;/除去函数中代码外其余的代码个数int funcount; /函数的个数Analy;/检测是否为空串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)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 printR(int aver ,int comc,int blanks )int i;char Grade4=A,B,C,D;/定义四个级别段/判定代码的级别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 %c 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 %c routine 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 %c white space stylen,Gradei);/打印输出结果void print(Analy *An)int sum = 0,funcode = 0;int i, comc , blanks, aver ,code;for(i = 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-blank)*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(CodeCommentsSpacen);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(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()取出缓存队列中的第一个字符while(c != n)if(c = 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 analy(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.txt,w) = NULL)/建立日志文件printf(cannot open the file %sn,filenamei);for (i = 0 ;i n; i+)/遍历所有的文件if(fp = fopen(filenamei,r) = NULL)printf(cannot open the file %sn,filenamei);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;/大括号个数初始化为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) /检测是否进入到了函数体内c+;start = TRUE;if (Find(s,) != -1) /检测是否一个函数的结束c-;if (c=0 & start)begin = FALSE;start = FALSE;elseA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年油画考研试卷真题及答案
- 产品研发过程质量控制标准化模板
- 幼师考编美术题库及答案
- 2025年农业行业农产品质量安全和绿色农产品认证研究报告及未来发展趋势预测
- 线上个人借贷合同模板(3篇)
- 会议效率提升及时间管理工具
- 2025年文化创意行业全球文化产业发展与创新研究报告及未来发展趋势预测
- 质量控制检查清单与问题跟进模板
- 会议管理与文档归档标准化流程
- 企业合规管理工具及指引
- 【生鲜农产品供应链管理分析的国内外文献综述4000字】
- 2025年广东省中考语文试卷真题(含答案解析)
- 书法六级理论考试试题及答案
- 护理职业生涯发展
- 卫生院优先使用集采药品培训
- 系统思考培训课件
- 《学前教育简史》课件-8学前教育简史 (第二版)
- 2025年春季学期国家开放大学《毛泽东思想和中国特色社会主义理论体系概论》终考任务一:学习行为表现
- 2025重大火灾隐患判定规则解读
- 护理事业十五五发展规划(2026-2030)
- 七五班《正确处理男女同学的交往》主题班会课件1
评论
0/150
提交评论