c语言软件课设Word格式文档下载.docx
- 文档编号:22835628
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:27
- 大小:317.84KB
c语言软件课设Word格式文档下载.docx
《c语言软件课设Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c语言软件课设Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
函数的个数,函数的总行数,函数的平均行数,总函数,空行的行数,注释的行数,函数的平均长度的等级,注释等级,空行等级。
(5)测试数据:
C文本文件为本次练习中的1.cpp
二、设计过程
此次课程设计频繁的用到了文件的读写操作,牵扯到了关于缓存的一些细节问题,利用函数定义特性的格式与关键字排除方法相结合,实现所要求的功能。
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;
3、函数功能说明
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)//判断一行是否是函数的开头
4、详细设计说明
(1)主函数的设计
调用各个子函数,运用while和for循环语句,实现程序源代码的分析。
图1主函数流程图
(2)子程序StrEmpty()函数的设计
此为串的基本操作
检测是否为空串,若为空串,返回TRUE,若不是空串,返回FALSE。
图2StrEmpty()函数流程图
(3)子程序Find()函数的设计
查看S1中是否有值为S2的子串,若有则返回第一个子串的位置,若无则返回-1。
该函数主要是运用if语句和while语句,来实现功能。
图3Find()函数流程图
(4)子程序HaveLine()函数的设计
该函数所要实现的功能是读取文件中的一行字符。
若是一行的结尾则表示取完了一行,返回主函数。
图4HaveLine()函数流程图
(5)子程序IgnoreB()函数的设计
该函数所要实现的功能是忽略一行字符开头的空格和tab,返回截断后上的串指针。
图5lgnoreB()函数流程图
(6)子程序IsCom()函数的设计
该函数所要实现的功能是判断一行字符是不是注释。
若posc==0则表示此行仅有注释,无代码。
图6IsCom()函数流程图
(7)子程序IsBlank()函数的设计
该函数所要实现的功能是判断一行字符是不是空白。
如果是,返回TRUE;
如果不是,返回FALSE。
图7IsBlamk()函数流程图
(8)子程序printR()函数的设计
该函数所要实现的功能是按代码级别判定标准输出分析结果。
先根据课题给定的标准定义A、B、C、D四个阶段,A为最优阶段,D为最差阶段。
再分别运用if-else语句,判定代码、注释、空行的级别。
如此,便实现了课题的要求。
图8printR()函数流程图
三、调试过程及实验结果
1、调试过程:
在对“打印输出结果”进行编程时,将if(sum==0)误写为if(sum=0),程序出现错误。
错误结果如下图9
图9错误结果图
2、正确实验结果:
图10程序运行显示图
图11程序正确结果图
四、结论
从实验结果可以看出,程序很好的实现了课题所要求的功能。
为期两周的软件课设已然接近尾声,从刚拿到题目时的傻眼,到如今报告的完成,我收获了很多。
题目的难易很难论断,只是觉得,那是个我很陌生的领域。
在查阅了大量的相关资料及咨询同学和老师后,我才了解到课题的深意,逐步完成这项任务。
在程序运行时不可避免会遇到很多问题,比如函数不能调用,功能无法实现,编译错误等等,经过老师、同学的帮助,程序终于可以正常运行了。
我觉得出现错误并不可拍,重要的是要学会改正和排错的过程,在这个过程中,我锻炼了自学的能力并且培养出了百折不挠的信念,同时也增强了我的分析问题能力和实际操作能力,而这些恰恰是我日后工作所需要的。
这次课程设计,还让我对计算机软件技术基础有了更为深入的认识,并了解到了软件技术即所有计算机相关专业课的重要性,希望今后能多开设这样的课程。
最后,向我的指导教师致以深深的谢意,感谢您的耐心指导。
五、程序清单
conio.h>
voidcheckfile(char*filename,inti);
voidanaly(charfilename[COUNT][LEN],intn);
BOOLGetIn(int*n);
//函数属性结构
charfilename[20];
intlength;
intpos;
intcomments;
intcomment;
intblank;
Funfun[MAXSIZE];
intothers;
intfuncount;
//串的基本操作ADT
//检测是否为空串
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=='
intIsFunB(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;
voidprintR(intaver,intcomc,intblanks)
//按代码级别判定标准输出分析结果
inti;
charGrade[4][15]={"
A:
Excellent"
"
B:
Good"
C:
justSo-So"
D:
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)
=9&
=5)||comc<
=35&
=31)
5)||(comc>
35))
Grade%sroutinecommentingstyle\n"
//判定空行的级别
if(blanks<
blanks>
elseif((blanks<
=10)||blanks<
=5)||blanks<
=31)
5)||(blanks>
Grade%swhitespacestyle\n"
//打印输出结果
voidprint(Analy*An)
intsum=0,funcode=0;
inti,comc,blanks,aver,code;
for(i=0;
i<
An->
funcount;
i++)//求函数的代码总数
funcode+=An->
fun[i].length;
//求所有的代码总数
sum+=An->
blank;
comments;
comment;
others;
sum+=funcode;
if(sum==0)//防止除数sum为0
sum=1;
if(An->
funcount==0)//防止除数m为0
aver=0;
else
aver=funcode/An->
funcount;
comc=(An->
comments+An->
comment)*100/sum;
blanks=((An->
blank)*100)/sum;
code=100-comc-blanks;
//((funcode+An->
others)*100)/sum;
程序源代码分析结果如下所示\n\n"
代码行数:
%d\n"
sum-An->
blank-An->
comment-An->
comments);
注释行数:
An->
comment);
空行数:
%d\n"
blank);
代码注释空行\n"
*****************\n"
%d%%%d%%%d%%\n"
code,comc,blanks);
Theprogramincludes%dfunctions\n"
funcount);
Theaveragelengthofsectionoffunctionis%d\n"
aver);
\n"
printR(aver,comc,blanks);
voidcheckfile(char*filename,inti)
FILE*fp;
while((fp=fopen(filename,"
r"
))==NULL)
printf("
对不起!
文件不存在%s\n"
filename);
\n请重新输入第%d个源文件:
i+1);
scanf("
%s"
BOOLGetIn(int*n)//规范输入的数据,只能为数字
charc;
*n=0;
fflush(stdin);
c=getchar();
//当输入一串数据并按回车后,getchar()取出缓存队列中的第一个字符
while(c!
='
){
if(c=='
0'
&
n==0)
输入有误!
请重新输入....\n"
if(c>
c<
9'
*n=(*n)*10+c-48;
else{
fflush(stdin);
//清空(刷新)缓存里的内容,以防被下次getchar()取用
returnFALSE;
c=getchar();
voidanaly(charfilename[COUNT][LEN],intn)
//分析源文件指针
FILE*fpp;
//日志文件指针
AnalyAn;
//程序统计结构体
chars[200];
//存储每行的文件
BOOLbegin=0,start=0;
//设置函数开始标记
inti,j=-1,pos=0;
//函数的位置长度信息
//c检测函数内大括号的匹配,comtype是注释的类型
intc=0,comtype;
An.blank=0;
Aments=0;
Ament=0;
An.others=0;
An.funcount=0;
if((fpp=fopen("
log.txt"
w"
))==NULL)//建立日志文件
printf("
cannotopenthefile%s\n"
for(i=0;
n;
i++)//遍历所有的文件
if((fp=fopen(filename[i],"
filename[i]);
//输出filename[i]
getchar();
exit(0);
pos=0;
//函数在新一个文件中的位置初始化
while(!
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;
//大括号个数初始化为0
begin=TRUE;
strcpy(An.fun[j].filename,filename[i]);
//记录函数在哪个文件中
An.fun[j].pos=pos;
An.fun[j].length=1;
elseif(IsBlank(s))
An.blank++;
elseif(begin){
An.fun[j].length++;
if(Find(s,"
{"
=-1)//检测是否进入到了函数体内
{
c++;
start=TRUE;
}
}"
=-1)//检测是否一个函数的结束
c--;
if(c==0&
start)
begin=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 软件