统计程序中各种代码行数的课程设计报告书Word下载.docx
《统计程序中各种代码行数的课程设计报告书Word下载.docx》由会员分享,可在线阅读,更多相关《统计程序中各种代码行数的课程设计报告书Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
Linesofcomments:
63
Blanklines:
52
Code
Comments
Space
61%
21%
18%
Theprogramincludes9functions.
Theaveragelengthofasectionofcodeis12.9lines.
GradeA:
Excellentroutinesizestyle.
Excellentcommentingstyle.
Excellentwhitespacestyle.
1.概要设计
1).头文件引用与宏定义:
#include<
stdio.h>
stdlib.h>
string.h>
#defineTRUE1
#defineFALSE0
#defineBOOLint
#defineMAXSIZE5000
#defineCOUNT20//可以统计的最大的文件个数
#defineLEN20//文件名的最大长度
2).所用存储结构
//函数属性结构
typedefstruct{
charfilename[20];
//每一个函数的名字
intlength;
//每一个函数的长度
intpos;
//每一个函数的位置
}Fun;
//统计结构的声明
intcomments;
//纯注释的个数
intcomment;
//混合注释个数
intblank;
//空行的个数
Funfun[MAXSIZE];
//函数的属性
intothers;
//除去函数中代码外其余的代码个数
intfuncount;
//函数的个数
}Analy;
2.详细设计
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]!
='
{
if(s1[i]==s2[j])
{
i++;
j++;
if(s2[j]=='
returni-j;
continue;
}
i++;
j=0;
}
return-1;
//读取文件中的一行字符
voidHaveLine(FILE*fp,char*s)
while(!
feof(fp))
*s=fgetc(fp);
if(*s=='
\n'
){//若果是一行的结尾则表示取完了一行
*s='
;
return;
s++;
}
*s='
//忽略一行字符开头的空格和tab,返回截断后上的串指针
char*IgnoreB(char*s)
while(*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)
return2;
//判断一行字符是不是空白
BOOLIsBlank(char*s)
if(*s=='
BOOLIsFunB(char*s)
inti,j,pos,pos2;
//有分号,ifwhilefor的不是函数开头
if(Find(s,"
)!
=-1||Find(s,"
if"
for"
while"
=-1||Find(s,"
switch"
=-1)
returnFALSE;
//没有小括号的不是函数开头
if((pos=Find(s,"
("
))==-1)
s=IgnoreB(s);
i=Find(s,"
"
j=Find(s,"
if(i!
=-1&
j!
i=i>
j?
j:
i;
elseif(i==-1)
i=j;
elseif(1==-1&
j==-1)
if(i>
pos)
s=&
s[i];
pos2=Find(s,"
if(*s=='
||*s=='
('
||pos2>
returnTRUE;
//打印最大的函数属性
voidPrintMax(Analy*An)
//FILE*fp;
inti,j=0;
//intlen;
for(i=1;
i<
An->
funcount;
i++)
if(An->
fun[j].length<
fun[i].length)//找出最大的函数的位置
j=i;
0||An->
fun[j].pos<
0){
printf("
therearenotanyfunctioninthefiles"
//打印出函数所在的文件和位置
printf("
Thelengthoflengthestfunctionhave%dlines\n"
An->
fun[j].length);
//打印长度
Theposoflengthestfunctionisin%sthe%dthline\n"
fun[j].filename,An->
fun[j].pos);
voidprintR(intaver,intcomc,intblanks)
//按代码级别判定标准输出分析结果
inti;
charGrade[4][15]={"
Excellent"
"
Good"
So-So"
Bad"
};
//定义四个级别段
//判定代码的级别
if(aver<
=15&
aver>
=10)
i=0;
elseif((aver<
=20&
=16)||aver<
=9&
=8)
i=1;
=7&
=5)||aver<
=24&
=21)
i=2;
elseif((aver<
5)||(aver>
24))
i=3;
printf("
Grade%sroutinecodestyle\n"
Grade[i]);
//判定注释的级别
if(comc<
=25&
comc>
=15)
elseif((comc<
=14&
=10)||comc<
=30&
=26)