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

上传人:夺命阿水 文档编号:1791558 上传时间:2024-12-27 格式:DOCX 页数:15 大小:51.28KB
返回 下载 相关 举报
统计程序中各种代码行数的课程设计.docx_第1页
第1页 / 共15页
统计程序中各种代码行数的课程设计.docx_第2页
第2页 / 共15页
统计程序中各种代码行数的课程设计.docx_第3页
第3页 / 共15页
统计程序中各种代码行数的课程设计.docx_第4页
第4页 / 共15页
统计程序中各种代码行数的课程设计.docx_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《统计程序中各种代码行数的课程设计.docx》由会员分享,可在线阅读,更多相关《统计程序中各种代码行数的课程设计.docx(15页珍藏版)》请在课桌文档上搜索。

1、希求分析1)问题描述读入一个C程序,统计程序中代码、注择和空行数以及函数的个数和平均行数,并利用统计信息分析评价该程序风格,2)根本要求如下,“),把C程序文件按字符顺序读入源程序:(2)、边读入程序,边识别统计代码行、注释行和空行,同时还要识别函数的开始和结束,以便统计其个数及平均行数。(3)、程序风格分为代码注粹和空行三方面,每方面分A、B、C,D四个等级,ABCD代码(曲数的平均长度)10-15行87162057或212424注郭(占总行数比例)15*25%10142630%59或3135%35%空行(占总行数比率)15-25%HrI4或2630%59或3135%5%35%3)人出范例以

2、下是对程序文件ProgAna1.C分析的输出结果例如:Theresu1.tsofana1.ysingprogramfi1.eProgAna1.C:1.inesofcode:1801.inesofcomments:63B1.ank1.ines:52CodeCommentsSpace61%21%18%Theprograminc1.udes9functions.Theaverage1.engthofasectionofcodeis12.91.ines.GradeA:Exce1.1.entroutinesizesty1.e.GradeA:Exce1.1.entcommentingsty1.e.Grad

3、eA:Exce1.1.entwhitespacesty1.e.1 .概要设计i)头文件引用与宏定义:Sinc1.udeWincIudeinc1.udedefineTRIE1SdefineFA1.SE0defineK)01.intdefine阳XS1.ZE5000CdcfineCOCNT20Sdefine1.EN202).所用存储结构函数腕性结构/可以统计的最大的文件个数/文件名的最大长度IyPedefstruct1charfi1.ename20;年一个函数的名字int1.ength:每一个函数的长度i11tpos;每一个函数的位置)Fun:统计结构的声明typedofstructintcomm

4、ents:/纯注样的个数iniCUmBcut;混合注择个数intb1.ank:空行的个数FUnfunMAXSIZE;函数的M性intothers;除去函数中代码外其余的代码个数intfuncount:/函数的个数Ann1.y;2 .惮钿设计。的数功能及声明BOO1.Str1.pty(char*s)S是不是空intFind(char*s1.,char*s2)SiS1.中是否有但为S2的子申voidHave1.ine(FI1.E*fp,char*s)重文件中获取一行char*IgnOreBchar*S)截断一行的空字符intIsCom(char*s)/判断一行是不是注择B(X)1.IsB1.ank

5、(char*s)/判断一行是不是空格Boa1.SFUnB(Char*s)判断一行是否是函数的开头voidPrintMaX(AnaIy*An)/打印最大函数的信息voidprintR(intaver,intcoc,intb1.anks)/打印代码风格级别voidprint(Ana1.y*An)/voidcheckfi1.e(charfi1.e11ame.inti)检测文件是否存在Boo1.Get1.n(int*n)标准输入的数据.只能为数字voidanaIy(charfi1.enaeCOUNTj1.EN,intn)分析单个文件voidSaYeIon。保存日志2)惮细源代码“检测是否为空申BOO1

6、.StrEepty(char*s)(if(s0=,0)returnTRUE:returnFA1.SE:查看S1.中是否有值为S2的子:也假设有那么返回第一个子串的位置,假设无那么返回-1:intFind(char*s1.,char*s2)(inti=O,j=O;if(str1.en(si)0,)(if(s1.i=s2j)(i+;J+:if(s2j=O)returni-j;continue;i:j=O:return1;读取文件中的一行字符voidIIave1.ine(FI1.E*fp,char*s)(whiIe(Ifeof(Cp)*S=fgetc(fp);if(*s=n,)(假设果是一行的结尾那

7、么表示取完了一行s=0,:return;S+;*s=,0,;)忽略一行字符开头的空格和tab,返回截断后上的串指针char*IgnoreB(char*s)(whi1.e(s=,*s=)s+;returns:/判断一行字符是不是注择intIsCom(char*s)intpose,pos1.,pos2:s=IgnoreB(三);pose=Find(S1.VZr);if(pose0)此行仅有注择,无代码;return1;if(pose=-1)return0:pos1.=Find(SO;pos2二Find(spos1.1.,*);if(posePOSI&aposej?j:i;e1.seif(i=-1)

8、e1.seif(1=-1i&j=I)returnFA1.SE:if(ipos)returnFA1.SE:s=isi;s=IgnoreB(三);pos2=Find(s,-(,):if(*s=,0,*s=(ipos2os)returnFA1.SE:returnTREE:打印股大的函数属性voidPrintMax(na1.y*An)(/FI1.Efp:i11ti,j=0;int1.en:for(i=1.;ifuncount:i+)if(An-funj.1.engthfuni.1.ength)/找出山大的函数的位置j=i;if(An-funj.1.engthfunj.posfunj.1.ength);

9、打印长度Printf(TheposofIengthestfunctionisin%sthedthIinen*,n-funj.fi1.ename,An-funj.pos);打印出函数所在的文件和位置PrintfrThe1.engthofIengthestfunctionhave%d1.inesnAn-funj.1.ength);/打印长度voidPrintR(intaver,intcome,intb1.anks)按代码级别判定标i输出分析结果inti:charGrade415=Exce1.1.ent,Good,So-So,Bad;/定义四个级别段判定代码的级别if(aver=10)i=O;e1.

10、seif(aver=16)aver=8)i=1;e1.seif(aver=5)!aver=21)i=2;e1.seif(aver24)i=3:printf(Grade%sroutinecodeS1.yIen”,GradeiD;判定注糅的级别if(comc=25&co=15)i=0;e1.seif(ccnc=10)come=26)i=1:e1.seif(come=5)ico三c=31)i=2;e1.seif(coac35)i=3:printf(,Grade%sroutineCOimenIingsty1.en*,Gradei):判定空行的级别ifb1.anks=15)i=O;e1.seif(b1.

11、anks=10)Ib1.anks=26)i=1;e1.seif(b1.anks=5)b1.anks=31.)i=2;e1.seif(b1.anks35)i=3;printf(*Grade%swhitespacesty1.en*,Gradei):打印输出结果voidprint(Ana1.y*n)(intsum=O,funcode=O:inii,come,b1.anks,aver,code;for(i-0;ifuncount:i)求函数的代码总数funcode+=An-funi.1.ength;求所有的代码总数sum=An-b1.ank;sum+=A11-cocome11t:sum+=n-othe

12、rs;sum+=funcode:if(su三-0)/防止除数SUfn为0sum=1;if(An-funcount=0)防止除数为0aver=0:e1.seaver=funcodeAn-funcount;ComC=(An-co11ncn1.s+Ar-co11mcnt)100sum:b1.anks-(11b1.ank)*100)sum;code=100-come-b1.anks:/(funcode+An-others)b1.ank-n-coco三ments):printf(*1.inesofcor11nents:%dn*,.4n-cownents+.n-co11ment);printf(*B1.a

13、nk1.ines:%dn*,An-b1.ank):printfCodeCownentsSpacen*);printf(*n*):Printf(n*);printf(,W%d%(i%n,tcode,cofuncount);printf(*Theaverage1.engthofsectionoffunctionis%dn*.aver):PrintMax(An);printf(,*):按代码级别判定标准输出分析结果printR(e,b1.anks):voidcheckfiIe(charfiIename,inti)FI1.Efp;whi1.e(fp三fopen(fiIenaae1.*r*)NU1.1.

14、)(Printfr文件不存在%sn,1.fi1.ena三e):printfn请一新输入第%d个源文件:,i+1.;scanf(*%s*wfi1ename);BOO1.Get1.n(int*n)标准物入的数据,只能为数字(charc:n=0:ff1.ush(stdin);c=gchar;/当就入一中数据并按I可车后,getchar取物线存队列中的第一个字符whi1.e=,0,Ac=,9)n=(*n)*10+c-48:e1.soPrintf(怆入有误!请重新输入.n):ff1.ush(stdin):清空(刷新)缓存里的内容,以防被下次getchar。取用returnFA1.SE;c=getchar

15、();)returnTRUE:voidana1.y(charfi1.enaeCOUNT1.EN.inin)(FI1.E*fp:分析源文件指针FI1.E*fpp11忐文件指针Ana1.yAn;程序统计结构体CharS200;存储每行的文件B(X)I.begin=0,start=0:设置函数开始标记inti,j=-1.pos=0:/函数的位置长度信息/c检测函数内大括号的见配,cum1.ypc是注择的类型intc-0,comtype:An.b1.ank=0;AnInentS=0;Anmcnt=0;n.others=0;An.funcount=0:if(fpp=fopenC1.og,6CO)=NU1

16、.1.)/建立日志文件PrintfCcanno1.openthefi1.e%sr,fiIenamci):for(i=0;in;i+)7ifi历所有的文件if(f=fopen(fi1.enamei1*r-)=MI1.1.)printf(*,cannotopenthefi1.e%snfiIcnamei):getchar();exit(0);P。S-O;函数在新一个文件中的位置初始化whiIe(!feof(fp)HaVe1.ine(fp,s);从文件中读取一行数据posi;每个函数在文件中开始的位置分类统计文件中的代码个数COmtype=IsCoe(三):if(Com1.yPe=1)nroent+;

17、continue;if(comtype=三2)Anroents+;if(IsFunB(三)fprintf(fpp,*%sns);提取每个函数的名字写入到文件j+;j为函数的个数-I:c=0;/大括号个数初始化为0begin=TRUE:strcpy(An.funj.fi1.enae,fi1.enanei);记录函数在哪个文件中An.funj.pos=pos:An.funj.1.ength=1;e1.seif(IsB1.ank(三)An.b1.ank+:e1.seif(begin)(n.funj.1.ength+;if(Find(S1T)!=-1)/检测是否进入到了函数体内(c+;start=TR

18、tJR;if(FindsJ)!=-D检测是否一个函数的结束c-:if(c=0start)bein=FA1.SE:start=FA1.SE:e1.seAn.others+;fc1.ose(fp);关闭分析文件)rc1.osc(f叩);关闭日志文件An.Cuncnunt=j+1;把函数的个数保存PrinIgRn);打印分析结果3)主函数voidain()i11tn,i;charc;charfiIename1.COUNT1.EN:printf(*tn”):printft计分机学院网络工程三班*张养*学号3107007062n):printf(*tn*):whi1.c(1.)n=0;printfttt

19、I11程序分析HIn):Printfr请输入要分析的源文件的个数:whi1.e(!GetIn(An)n=0)(Printf(请怆入要分析的源文件的个数:;for(i=0:in:i+)(printf(n请输入第却个源个件:*i+1.):scanf%s*,fi1.enamoi);checkfi1.e(fi1.enanei,i);ff1.ush(stdin):ana1.y(fi1.ename,n):Printf(1.*是否继续使用?科科科科科科/科科科科科科n,);c=Rdchar():if(c=W1.1.c=,y,)continue;break;3.调试分析1)粒舱收获这个课程设计总体上难度不大,

20、但细节问题很多,尤其是频繁的用到了文件的读写操作,牵扯到了关于援存的一些细节问题通过这次的课程设计,使我对C谙吉有了技深刻的了解.学习了很多以往不知道了语言特性,接触到了很多新的功能用大的函数,特别地对文件的读写有了比拟熟练的掌握,知道了其根本的原理,与控制方法,本课程设计的一个班由是关于函数开头的判断问题,宏试了很多种的方法但是都不尽人意,最后经过大愤数据的测试,利用了函数定义特性的格式与关惯字排除方法相结令,根本上能应对常见的程序.在完成课程设计的过程中还有一点较大的收获是对编程环境的进一步的认识,这次编程用的是教熟悉的VC,以往用过T3他们有很多的不同的地方,例如有写TC中可以用的函数,

21、特别是在COIN.H目录下的函数,在YC中是不能用的,这给编程带来了一定的麻烦,但是通过网上荏问资料,那一一解决了.在这个过程中就是对编程工具的比对认识。2)问J分析纵观整个程序,完成了双目要求的全部功能.另外增加了很多的双目以外的功能,这些功能都是有褶很大的实际用途的,例如SS日中为了使这个课程设计难度降低,规定了一行文件只能是代码,注择或者空行,但是实际的程序中代码后面紧跟芾注锋是很常见的,而且是一中很好的编程风格。另外本程序可以对多个庞大的文件一起分析,对于几万行的程序分析的结果是比拟确的.从而增强了程序的实际用途,本程序还能把要测试的代码文件中所有的函数声明提取出来,并保存为日志文件.

22、3)未来及Ia由于时间和经5金的关系,本程序还有很多不如人意的地方,以后将维续增加一些分析功能.例如,对文件中每个函数的信息,包括行数,位置,声明都按一定的格式保存到日志文件中,在就是把整个文件的分析结果也保存起来,以便与如后的森询。五.操作演示及结果截图说明:要分析的函数应该在生成的EXE文件的同个目录下:木软件的慢作非常猛总明了,他暧趣示即可操作。假设输入文件不存在或位置不对那1 .入文件名,当找不到文件时的情况么报错I1.I-程序分斫港输入要分析的源文件的个数:6董艳入毅个流文件:1文件不存在11.篁新输入第1个源文件:1.CPP2 .入数据非法的情况源文件数必须是大于零的阿拉卜施字!!

23、1.桎序分析11U数数数数个:个不:个件入b件文An)uoidprintR(intauer9intcone9intb1.:PC9fgF1.w-八uistoVMWUV次?JJ*计算机学院网络工程三班嘛菲一学号31U7WJ7H62III程序分析III输入要分析的源文件的个数:2输入第1个源文件:ana1.y.C请输入第2个源文件:n1.y.hTheresu1.tsofana1.ysingprogrnfi1.e:1.inet1.inesBIankCodeofcode:ofCOiwienta:1.ines:Corutcnts3388076Space69%IGZISXTheTheprograninc1.

24、udes15functionsaverage1.engthOfsectionoffunction1920The1.engthofIengthestfunctionhave731.inesThcpoaofIcngthcstfunctionisinana1.y.ctheThe1.engthofIengthestfunctionhave731.ines84th1.ineGradeB:Goodroutinecodesty1.eGradeA:Exce1.1.entroutineconnentinjsty1.eGradeA:Exce1.1.entuhiteapacesty1.etMMHM*WMWMWXX否

25、矣用?HW*WWM2)对开发工具里的春代砒行试(中期,文件的试,1万行左右)计算机学院网络工程三班A-菲-学号3187H07062I1.I程序分析U1.青输入要分析的源文件的个数:3月输入第1个源文件:2-cpp低输入第2个源文件:5cpp后输入第3个源文件:9.cppTheresu1.tsofCmaIytSingprogranfi1.o:1.ines1.inesB1.ankCodofcode:ofCOiwients:1.ines:Confnts6?9812411424SPaCo72x13z15Theprogrninc1.udes418functionsThcAUcragc1.engthofs

26、ectionofFunctionis12The1.engthofIengrthestfunctionhave1241.inesTIwposofIeng1.hestfunctionisinS.CPPthe3630thThe1.engthofIengthetCfunctionhave1241.ines1.ineGradeA:Exce1.1.entroutinecodesty1.eGradeB:GoodroutineCofW1.bnCingtfty1.oGradeA:Exce1.1.entwhitespacesty1.eHMMMMM”是否维缥使用?YzN.3)对开发工具里的代码进行窝试(大型源文件的

27、评试,2万行以上)112S1.上03amRekfotV“T53年6。加式831MaiyW第3个敷件:3.CPP请输小第4个源文件:4.cpp第5个源文件:5.cpp第6个源文件:6.CPP第7个源文件:7.cpp第8个源文件:8.CPP请假入第9个源文件:9.cppIh第18个源文件:1.cppTheresu1.tsofnna1.yg1.ngprogramfi1.e:1.ines1.inesB1.AnkCodeofcode:ofconsents:1.ine:Coiwicnts283133696124Space76zTheTheTheTheThe8zp*oganinc1.udes16z1868functionsaverage1.engthofsectionof1.engthof1.enthestfunctionposofIongthestfunctionis1.engthofIengthestfunctionfunctionhave124in5.cpphave124is111.inesthe363Hth1.ine1.inesGradeA:Exce1.1.entroutinecodesty1.eGradeC三So-Soroutineconsentingsty1.eGradeA:Exce1.1.entwhitespacesty1.e是否继续使用?Y/N-

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

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


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号