免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1431 | 回复: 6
打印 上一主题 下一主题

C语言统计指标工具,高手帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-03 11:27 |只看该作者 |倒序浏览
下面是一个实际项目中的例子,为一个韩国项目中,外方提出的要求,当然可以通过C语言编程解决,但是如果
全部通过 SHELL 来实现,如何解决,各位高手帮忙想想办法。

要求: 对 .c 源程序进行如下的统计
1 统计空行行数
2 统计注释行行数
3 统计debug 行数
4 统计异常处理行数

注意事项:不能重复统计,要求得到净行数
解释:
1) 空行中有可能包含空格或 TAB 。
2) 注释行:位于/* 与 */ 之间的行。
3) debug行指位于 #ifdef DB[123] .... #endif 之间的行,要去掉中间的空行与注释行,
4) 异常处理行数指位于 if( iRet != 0 ){ 与匹配的 }之间的行(含标志行),要去掉中间的空行、注释行、debug 行。


源程序举例如下

a.c

#include <stdio.h>

main()
{
   int iRet;
   int iArgv;
   char szArgv[ 80 ];

   memset( szArgv, 0, sizeof( szArgv ) );

   /* this is comment */
   /* this is comment */
   
   /* this is comment
      this is comment2
   */

   #ifdef DB1

   /* 输出 DB1 级debug */
   printf( " DB1 level debug \n" );

   #endif

   #ifdef DB2

   /* 输出 DB2 级debug */
   printf( " DB2 level debug \n" ); /*   注释,不算注释行数       */

   #endif

   #ifdef DB3

   /* 输出 DB3 级debug */
   printf( " DB3 level debug \n" );

   #endif

   iRet = iCallFun( iArgv, szArgv );  /*   注释,不算注释行数       */

   if( iRet != 0 ){
     #ifdef DB2
     printf( " 出现错误\n" );
     #endif
     
     /*   注释行         */
     printf( " 出现错误\n" );  /*   注释,不算注释行数       */
   }

}

论坛徽章:
0
2 [报告]
发表于 2003-08-03 11:38 |只看该作者

C语言统计指标工具,高手帮忙!

是对一个文件还是对一堆文件进行统计?
if( iRet != 0 )这样的语句应该是条件断定吧?倒底是统计所有条件断定"if(){}",还是只统计“iRet!=0{}”里的的语句,问题不是很清楚.     

还有就是

  1. /* 注释开始

  2. 注释结束*/
复制代码

中间那行是算注释还是算空行?

论坛徽章:
0
3 [报告]
发表于 2003-08-03 15:04 |只看该作者

C语言统计指标工具,高手帮忙!

1、是对一个文件还是对一堆文件进行统计?
      解释: 外方要求对src下的所有文件进行统计,但是实现时只要完成对一个就行了,余者类推。
    2、if( iRet != 0 )这样的语句应该是条件断定吧?倒底是统计所有条件断定"if(){}",还是只统计“iRet!=0{}”里的的语句,问题不是很清楚。
      解释: 只要求统计if( iRet != 0 ){   
                      ........
                      ........
                         }
          中的部分,可以将if( iRet != 0 ) 作为条件。行数要包含if( iRet != 0 ){   与 } 行,不要只统计中间部分。
       对 debug 行的要求同样要讲 #ifdef DB[123] 与 #endif 计算在内。

    3、代码:

/* 注释开始

注释结束*/


中间那行是算注释还是算空行?
     解释: 算空行,不能算注释行,注释行中必须有非空格与 TAB的字符,要将空行滤掉,如果 /* 与  */ 单独占一行,应该统计在注释行内。
    4、不清楚之处,请提出。

论坛徽章:
0
4 [报告]
发表于 2003-08-03 16:42 |只看该作者

C语言统计指标工具,高手帮忙!

偶认为写一个专门的awk脚本或者perl脚本来处理一个*.c比较好,然后写一个shell脚本把目录里头的都处理完。

论坛徽章:
0
5 [报告]
发表于 2003-08-03 19:17 |只看该作者

C语言统计指标工具,高手帮忙!

就是那个if(iRet的比较麻烦,其它的都比较简单.
要好好想想看.  

论坛徽章:
0
6 [报告]
发表于 2003-08-03 20:20 |只看该作者

C语言统计指标工具,高手帮忙!

if(iRet)的处理可以查阅一下相关的编译原理的书籍的语法分析的部分

论坛徽章:
0
7 [报告]
发表于 2003-08-03 20:31 |只看该作者

C语言统计指标工具,高手帮忙!

[quote]原帖由 "powerplane"]if(iRet)的处理可以查阅一下相关的编译原理的书籍的语法分析的部分[/quote 发表:
     

查资料?晕
想了半天也没想出什么办法把这个if(Ret)的处理代码控制在15行以内。晕了。
不知哪位有什么高见。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP