回 帖 发 新 帖 刷新版面

主题:求助代码精灵程序代码

一、    背景介绍
程序员们编写代码,不仅仅是为了与计算机交流,控制计算机,也是为了与他人交流,分享自己的工作。编码工作的一小部分是写让计算机读的程序,大部分工作是写让他人看懂的程序。好的布局是可读性的关键,而不同的项目组通常又遵循着各自不同的代码风格。如何统一整个项目中代码文件的代码风格,也是一个不容忽视的问题。用一款小型的软件来统一格式化代码文件就是一种非常有效的解决方案。
二、    功能描述
根据题目要求的代码风格来修改C语言源码的代码风格,并收集代码的有效行数,函数调用关系(OutLine)等简单信息。
三、    基本要求
1.    编程语言 运行平台的限制
允许使用的编程语言包括:C、C++、Java、C#、Delphi、VB。
允许使用的运行平台包括:WindowsXP、Windows Vista、Windows7、Linux。
2.    运行方法
1)    Windows平台
生成可执行文件为code-genius.exe,执行方法如下:
在命令行窗口中输入:
code-genius.exe <source-file>
举例说明,设待格式化C语言文件为code.c(位于C:\code-genius目录),则执行方式为:
C:\code-genius>code-genius.exe code.c
生成的格式化后的c代码置于执行文件同目录的 out子文件夹内,即若可执行文件位于“C:\code-genius”,则生成文件位为“C:\code-genius\out\code.c”。
2)    Linux平台
生成可执行文件为code-genius,执行方法如下:
./code-genius <source-file>
举例说明,设待格式化C语言文件为code.c,则执行方式为:
root@~/code-genius$ ./code-genius code.c
生成的格式化后的c代码置于执行文件同目录的 out子文件夹内,即若可执行文件位于“C:\code-genius”,则生成文件位为“C:\code-genius\out\code.c”。
四、    详细功能
1.    代码格式化
注:用于格式化的源代码中没有任何语法错误,且不包含任何注释及ASCII码以外内容,即无需做代码逻辑性正误、注释、以及字符编码方式的判断。
在以下代码格式化需求中,我们定义“空白”为单个或多个空格、Tab字符、回车换行。
1)    函数名与其左边圆括号
本检查约定函数名与左边圆括号之间不许出现“空白”。在函数名"wrongStyleMethod" 后面紧跟的是个“空白”,而不是"()":
void wrongStyleMethod   (String para1, String para2)
{
......
}
方法名与圆括号不是一行也是不允许的,如:
void wrongStyleMethod 
(String para1, String para2)
{
...
}
以上情况均应改为:
void wrongStyleMethod(String para1, String para2)
{
}
2)    圆括号中的“空白”
不允许圆括号左括号右边有“空白”,也不允许右圆括号左边有“空白”。例如下面的代码不符合代码风格要求:
void wrongStyleMethod( int para1, int para2 )
{
...
}

for( i = 0; i < MAX_NUM; i++ )
{
...
}

int myObject = ( int )other;
...
把对应的“空白”去掉才是正确的:
void wrongStyleMethod(int para1, int para2) {
...
}

for(i = 0; i < MAX_NUM; i++) {
...
}

int myObject = (int)other;
3)    代码缩进
代码应该按照所在层次进行缩进,每个层次需比上一层多向右缩进4个空格。
代码中不允许使用TAB字符进行缩进。TAB占位符('\t') 因为在不同的编辑器下所占用的长度不同,会造成代码格式混乱,如windows记事本中TAB占8个空格(如),而当前大多数IDE中占4个空格。Tab字符应该改为空格缩进,缩进所使用的空格固定为4。switch语句后的case,default也需缩进。
for(a = 1; a < MAX_NUM; a++)
{
    printf(%d, a); // pirntf需要缩进
}
switch (ch)
{
    case 1:
    default: //case和default均需缩进
}
4)    特定符号后的空格
检查某些特定符号后需要有空格。如果没有,就添加;如果有多个,则只保留一个。这些符号包括逗号、分号。则以下代码:
int a,b,c;
for(a = 1;a < 10;a++)
{
}
需要被修改为:
int a, b, c;
for(a = 1; a < 10; a++)
{
}
5)    特定区域后的大括号
对于一些关键字,如if,其后面只有一条语句时 ,该语句可以用大括号包围,也可以不用,也就是说:
if (condition) a= 0;

......
if (condition)

a = 0;
}
它们是都可以通过编译的。 但是良好的代码规范,都需要使用后者的风格。我们统一将代码格式化为后一种风格。需要支持的区域包括:do, else, if, for, while。
6)    空语句
删除代码中的空语句。比如下面代码的第二行的";"就是一个空语句,应该删除:
int a = 0;  //正常
;     // 这里就是一个空的语句
;   // 这里就是一个空的语句
long ans;
for (ans = 1; n > 1; n--)
{
     ans *= n;
}
; // 这里就是一个空的语句
int b = 0;  //正常
7)    语句换行
每一行只允许写一句语句(for语句的圆括号内除外),需到下面的代码要自动换行:
int numA = 1; int numB = 2; int numC = 3;
应该改为以下形式:
int numA = 1;
int numB = 2;
int numC = 3;
8)    大括号对齐
不同的开发团队可能要求的大括号的左括号是否换行要求不同,如:
if (true)
{
if(true)
{
}
}
//或为以下风格
if (true) {
if(true){
}
}
现在要求所有使用第一种风格,对于其他风格的代码,必须统一格式化为第一种风格。
2.    代码行数统计
代码行数统计是估计程序复杂度和项目工作量的一个重要的参考指标,但是很多IDE并未提供此功能。实现此功能的基本要求如下:
1)    统计未格式化前的源代码行数,不包括空行(即只有空格或TAB的行)。
2)    待统计的代码中不含注释。
3)    完成代码格式化之后,在out子文件夹下生成Info.txt文件。输出待统计的所有源代码文件所含代码的行数,格式如下:
Lines=<Inter>
如有574行代码,则输出:
Lines=574
3.    Outline
为了便于阅读代码,了解程序的流程和结构,程序员常常需要知道函数之间的调用关系。如果能生成这样的关系,则对程序员了解程序结构有很大帮助。
对于如下所示的一份代码,要求生成如下格式的信息。
Filename:Outline.c
#include <stdio.h>

void LogError()
{
}

int FindSubStrPos(char * strSrc, char * strSub)
{
     int bError = 0;
if(bError)
{
LogError();
}
}

void main()
{
char SrcStr[] = "fdagsagabcfdager"
    char SubStr[] = “sag”
    int iResult;
iResult = FindSubStrPos(SrcStr, SubStr);
if (Result < 0)
{
        LogError();
}
else
{
printf("%d",iResult);
}
}
输出文件
输出信息
FunctionName:FindSubStrPos
Caller:Main
Called:LogError

FunctionName:LogError
Caller:FindSubStrPos,Main
Called:

FunctionName:Main
Caller:
Called:FindSubStrPos,LogError
FunctionName:用户自定义的函数的名字,不考虑如printf等库函数。
Caller:调用FunctionName的函数的名字,没有则留空。
Called:FunctionName调用的函数的名字,没有则留空。
输出时,函数按照其函数名首字母的ASCII值由小到大(若首字母相同则比较第二个字母,依次类推)顺序输出,在Caller和Called后的函数名也按照此规则排序。
仅考虑所有代码在一个.C文件中,并且只对文件中自定义的函数生成OutLine信息。生成信息保存于Info.txt中(同功能4.代码行数统计)。

回复列表 (共2个回复)

沙发


一看就知道学校是武汉的某高校,“高德种子杯”,像这种比赛是给大家提供一个提高自己的平台,用这种方式来获得源代码未免有点太龌龊了吧。

板凳

这不扯淡嘛,点团队的题目嘛

我来回复

您尚未登录,请登录后再回复。点此登录或注册