蜗牛998 2016-06-06 09:15 采纳率: 25%
浏览 1120
已结题

新手,求帮忙整理出完整代码

这是一个课程设计,要求,分析和详细的设计方法已给出,求帮整理出完整的代码,小生在此感激不尽~

需求分析
1、文本串非空且以C程序文件形式存放,文件由用户建好并设立路径。

2、把C程序文件按字符顺序读入源程序;

3、边读入程序,边识别统计代码行、注释行和空行,同时还要识别函数的开始和结束,以便统计其个数和平均行数。

4、在计算机终端输出的结果是:函数的个数,函数的总行数,函数的平均行数,总函数,空行的行数,注释的行数,函数的平均长度的等级,注释等级,空行等级。

5、测试数据:C文本文件为本次练习中的hello.c.
三 概要设计
1、程序采用对文件逐个顺寻读入字符,存放在数组的方法,边读入便统计。以下便是统
计的具体过程。
A: 打开文件,读取文件,于数组中存放。
B: 调用去掉左右空格的函数,为了节省栈的空间。
C: 计算注释行数,包含三种下情况的注释行计算。
D: 行为空,则记录空行行数。
E: 计算函数个数,函数总行数,平均行数。主要
是运用右小括号和左大括号匹配。
F: 计算函数平均行数等级,注释行数等级,空行行数等级。
2、本程序包含2个模块
A、主程序模块,其中主函数为
void main()
{ 定义变量;
统计文件中的注释行数,空格的行数,函数个数,函数的个数,函数总行数,函
数的平均行数;
判断函数的平均长度的等级,注释等级,空行等级;
输出测试结果;
}
B、去掉左空格函数;void StrLTrim(char * pszStr)
去掉右空格函数;void StrRTrim(char * pszStr)

四 详细设计

1、各类行数计算的过程全部包含的在主函数mian()中。
A: 打开文件,读取文件,于数组中存放。
printf("请输入你要验证的文件:");
scanf("%s",&filepath);
FILE* fp = NULL;

fp = fopen(filepath,"r");                //打开文件
if ( !fp ) {
    printf("can't find the file.\n",filepath);
    return -1;
}
for(line=0; fgets(buf,sizeof buf,fp)!=NULL; line++) //读取文件的每一行放到数组file内,一行最大的字节数为1024
{
    file[line] = (char*)malloc(strlen(buf) +1);
    strcpy(file[line],buf);

}
B: 调用去掉左右空格的函数,为了节省栈的空间。
for(i=0; i<line; i++){
StrLTrim(file[i]); //去掉左空格
StrRTrim(file[i]); //去掉右空格
linelength = strlen(file[i]);
/* if ( linelength == 0 ) {
continue;
}
/
C: 计算注释行数,包含三种下情况的注释行计算。
if ( (file[i][0] == '/') && (file[i][1] == '/') ) //如果出现'//'证明出现了一行注释
{
cometline++;
}
if ( (file[i][0] == '/') && (file[i][1] == '
') ) //
{
if ( (file[i][linelength-2] == '*') && (file[i][linelength-1] == '/' ) ) //如果在同一行的结束就有注释的结束标志 "*/"
{
cometline++;
cometBegin = 0;
free(file[i]);
continue;
}
else {
if ( cometBegin == 0 ) {
cometBegin = 1; //注释的结束标志不在同一行,设置变量cometBegin
cometline++;
free(file[i]);
continue;
}
}
}
if ( (file[i][linelength-2] == '*') && (file[i][linelength-1] == '/' ) ) {
if ( cometBegin == 1 ) //遇到注释结束标志并且前面已经有了注释的开始标志“/*”
{
cometline++;
cometBegin = 0;

}
}
if ( cometBegin == 1 ) //注释的开始算一行
{
cometline++;
free(file[i]);
continue;
}

    if ( strcmp(file[i],"") == 0 && cometBegin == 0 ) //如果这一行为空,而且不是在注释范围内
    {  
       blankline++;
    } 

D: 行为空,则记录空行行数。
if ( strcmp(file[i],"") == 0 && cometBegin == 0 ) //如果这一行为空,而且不是在注释范围内
{

blankline++;
}
E: 计算函数个数,函数总行数,平均行数。主要
是运用右小括号和左大括号匹配。
for(j=0;j<linelength;j++)
{
if(file[i][j]==')') //遇到右小括号进行标识 tag1
{
tag1++;
}

       if(file[i][j]=='{'&&tag1!=0)  //如果在有小括号的前提下遇到左大括号
       {
         tag2++;   //大括号标识加1
         flag=1;   //证明已经遇到过 "){"
         if(tag1==1)  //第一次遇到"){"代表着函数的开始
         {
             function_start[func_number]=i;  //记录函数的开始行数
         }
       }
       if(file[i][j]=='}'&&flag==1)
       {
         tag2--;  //遇到结束,-1
       }
       if(tag2==0&&flag!=0)   //如果已经出现过"){",而且已经匹配完“{”和“}”了
        {
          function_end[func_number++]=i;   //记录函数结束的行数
          flag=0;
          tag1=0;
        }
     }

    free(file[i]);
}
flag=0;   //借用变量flag
for(i=0;i<func_number;i++)
{
   flag+= function_end[i] - function_start[i]; //计算函数总行数
}

flag =flag/func_number; //计算函数平均行数
F: 计算函数平均行数等级,注释行数等级,空行行数等级中的范例以及输出。
printf("The number of functions are:%i\n",func_number);
printf("The average of function line is:%i\n",flag);
if(flag>=10&&flag<=15) {
printf("The level of function is:A\n");
}
if(flag>=8&&flag<=9 || flag>=16&&flag<=20)
{
printf("The level of function is:B\n");
}
if(flag>=5&&flag<=7 || flag>=21 && flag<=24)
{
printf("The level of function is:C\n");
}
if(flag24)
{
printf("The level of function is:D\n");
}
flag =100*cometline/line; //计算注释行数占总代码行数的百分比
printf("The total note lines are:%i\n",cometline);
if(flag>=15&&flag<=25)
{
printf("The level of note is:A\n");
}
if(flag>=10&&flag<=14 || flag>=26&&flag<=30)
{
printf("The level of note is:B\n");
}
if(flag>=5&&flag<=9 || flag>=31&&flag<=35)
{
printf("The level of note is:C\n");
}
if(flag35)
{
printf("The level of note is:D\n");
}

  • 写回答

3条回答 默认 最新

  • 小灸舞 2016-06-06 09:48
    关注

    对学习编程者的忠告:
    眼过千遍不如手过一遍!
    书看千行不如手敲一行!
    手敲千行不如单步一行!

    代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
    提醒:再牛×的老师也无法代替学生自己领悟和上厕所!

    单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器