| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5967 人关注过本帖
标题:求问大神,程序的可读性是个什么概念?如何提高程序的可读性?
只看楼主 加入收藏
超电磁场
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-10-3
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:7 
求问大神,程序的可读性是个什么概念?如何提高程序的可读性?
我自己写出来的程序,我都看不懂了,天啊,我当时是怎么写出来的......
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int map[5][5];
    int visit[5][5];
    int pre[100];  
    struct node
    {
        int x;
        int y;
    }list[100];
    int dir[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };
    int go(int x, int y)
        {
            if (0 <= x&&x<5 && 0 <= y&&y<5 && map[x][y] == 0)
                return 1;
            return 0;
        }
    void print(int x)
        {
            int t;
            t = pre[x];
            if (t == 0)
                {
                    printf("(0, 0)\n");
                    printf("(%d, %d)\n", list[x].x, list[x].y);
                    return;
                }
            else
                print(t);
            printf("(%d, %d)\n", list[x].x, list[x].y);
        }
    void bfs()
        {
            int i, head, tail;
            int x, y, xx, yy;
            memset(visit, 0, sizeof(visit));
            head = 0;
            tail = 1;
            list[0].x = 0;
            list[0].y = 0;
            pre[0] = -1;
            while (head<tail)
                {
                    x = list[head].x;
                    y = list[head].y;
                    if (x == 4 && y == 4)
                        {
                            print(head);
                            return;
                        }
                    for (i = 0; i<4; i++)
                        {
                            xx = x + dir[i][0];
                            yy = y + dir[i][1];
                            if (!visit[xx][yy] && go(xx, yy))
                                {
                                    visit[xx][yy] = 1;
                                    list[tail].x = xx;
                                    list[tail].y = yy;
                                    pre[tail] = head;
                                    tail++;
                                }
                         }
                    head++;
                }
            return;
            }
    int main()
        {
            int i, j;
            for (i = 0; i<5; i++)
                for (j = 0; j<5; j++)
                scanf("%d", &map[i][j]);
            bfs();
            return 0;
        }

只记得这是一道要走迷宫的题.....我觉得我这样的版面应该。。没有什么问题吧?
2016-10-12 22:17
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:2 
我只想说写那么多代码都没有一行注释,人才啊
2016-10-12 22:34
lautition
Rank: 2
等 级:论坛游民
威 望:1
帖 子:24
专家分:21
注 册:2016-3-16
收藏
得分:2 
结构清晰加注释,但是我们经常自己写程序的时候完全不是这样
多年以后把自己写的程序拿出来看,尼玛谁写的,完全看不懂
2016-10-12 23:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:2 
尽可能地让人家看得懂
2016-10-13 05:51
worldlc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:44
专家分:117
注 册:2016-10-13
收藏
得分:2 
每到  关键 步骤 或者  自己 专属的 思路时  可以 下个 注释(第一方便自己 以后 检查 自己写的程序。   第二方便 开源时 方便 读者 阅读。)
2016-10-13 15:02
StadyC
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:182
专家分:430
注 册:2016-10-13
收藏
得分:2 
程序易懂,变量、函数名字让人一看就明白(变量、函数最好不要依赖注释才让人明白该变量、函数的作用。例如加法函数,直接命名为Add。一个用于计数的变量,直接命名为count。那样别人不需要看注释也能大概明白这个变量或函数的作用),编程风格良好(缩进、还有比如a = a + b这样的运算符中间加个空格,别挤一块),尽可能减少if的嵌套,例如有些:
if(a)
{
    if(b)
    {
        if(c)
        {

        }
    }
}
//end if
这样内部if、外部if都没有else的,那你直接可以写成if(a && b && c)。

还有就是循环的选用了。一般来说,需要初始化变量并循环的最好选用for循环,例如:(for(a = 0; a < 100; ++a){//循环体})。如果是要判断函数返回值是否为某个数的,最好选用while循环,因为如果选用for,看起来就会有些不好看,例如:(while(scanf("%d", &integer) == 1){//循环体})。还有那个strcmp()字符串比较函数,如果用它的返回值,最好不要写成if(!strcmp(str1, str2)  //如果两字符串相等,建议不要这样写,应该写成if(0 == strcmp(str1, str2))。再来函数过长的,可以考虑换几行。函数的声明一般放在一个头文件xxx.h,然后再新建一个与之名字相同的xxx.cpp来进行函数的定义。在一些逻辑晦涩难懂的地方必须加清晰明了的注释,因为如果你不加,可能过几天,连你自己都忘了自己是怎么想的。
然后,宏定义最好用大写表示例如:#define MAX 256(如果是C99及以上的标准,可以用const来定义: const int MAX = 256也是最好大写),宏定义最好不要加下划线。

最后有一些技巧和一些要注意的东西:
if(a)
    if(b)
    {
        //DoSomething
    }
else
{
    //DoSomething
}
那问题来了,那这个else是匹配哪一个if的呢?答案是,匹配if(b),规则是,else总与离它最近的if相匹配(没有大括号的前提下),写这种最好的写法是:
if(a)
{
    if(b)
    {
        //DoSomething
    }
    else
    {
        //DoSomething
    }
}
这样写让人一看就明白,如果像刚刚那种写法,想else匹配if(a)那怎么办?可以这样写:
if(a)
{
    if(b)
    {
        //DoSomething
    }
}
else
{
    //DoSomething
}

2016-10-14 09:03
StadyC
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:182
专家分:430
注 册:2016-10-13
收藏
得分:0 
有个技巧就是如果判断一个变量和一个常数是否相等,那可以写成if(0 == a)你可能会问,为什么要把0写前面?因为,如果你写if(a == 0)有时候可能心不在焉或者其他原因,你就会写成
if(a = 0)这样一来的话,变成了赋值语句,而且编译器是不会检查出这样的错误的。而如果写成if(0 == a)就算你少写了一个=,编译器也能够发现这个错误,因为对于赋值符号=左值必须是可以改变的值,这样就可以很容易发现这个错误。最后注意一下,C语言在C99标准前是没有//注释的,也没有bool变量的(要用bool,请使用int代替)。在C99以后C语言新增了_Bool关键字和一个叫stdbool.h的头文件,这个_Bool就是bool变量,在这个头文件里,有一句typedef _Bool bool;所以C99以后,C语言也可以用bool定义布尔变量。
这些标准造成的编译错误,要注意一下,有些书籍的编写是基于C99的,要是照着书打也运行不了,请查看一下是否标准问题。
2016-10-14 09:13
StadyC
Rank: 6Rank: 6
等 级:侠之大者
威 望:6
帖 子:182
专家分:430
注 册:2016-10-13
收藏
得分:0 
最后,尽量不要依赖VC++ 6.0没有生存周期这个东东了,例如:
for(int i = 0; i < 10; ++i)
{
    //循环体
}
i = 0;
在VC++ 6.0中,上面这一段代码没有任何错误。但是在一些新一点的IDE中,这段代码会报错。原因是,i的生存范围仅仅在这个for循环之内,出了循环,程序会认为i没有定义。这个就是生存周期的概念,如果是在一个大括号里面定义一个变量然后操作,那么这个变量也是只能在这个大括号内有效,例如:
{
    int a;
    //doSomething
}    //出了大括号,a将死去,不能再使用

最后再补充一点哈,C99标准之前,变量的定义不允许在程序的任何地方,变量的定义只能在最开始的地方,先于任何操作(除了初始化赋值)。
例如:
printf("Hello World");
int a, b;
这样程序会报错,因为a,b的定义应该在调用printf函数之前。如果在C99之前想要在程序任何地方定义变量,那么请使用.cpp文件写C语言(因为C++是兼容C的,所以你用C任何的语句,只要正确,C++文件都可以运行)。如果是支持C99以后的标准那么用.c文件写也可以。

最后,还是要你自己多写,多练,培养良好的编程风格,这才能写出让人易懂的代码。
学C编程推荐你看:C Primer Plus第六版(涵盖了C99和最新的C11标准,而且包含一点数据结构)、零基础学数据结构、你必须知道的495个C语言问题(这本书有很多C语言经常遇到的难题)、C缺陷与陷阱、C与指针、零基础学算法(算法很重要,语言只是一个工具,但是算法是解决问题的思想,算法好,你将来学其他语言都是非常简单的事,因为解决问题的思想是一样的,并不会因为语言的不同而改变,改变的顶多就是语法和该语言的规则。)。看完弄懂这些我想你C语言功底已经算可以了,接下来就可以过渡到C++了,C++看一本C++ Primer Plus第六版就OK了。然后就可以看一些项目宝典啊之类的,了解多线程编程啊,Socket编程这些。如果是VS还要学学MFC。如果不用VS,那可以学Qt(这些是做界面的)。后面可以看看Windows核心编程,这个有点难,可能需要多花时间,自己多上网搜搜相关的资料,多敲敲代码,这样进步会比较快。对了,还要学学SQL(结构化查询语言),以后做项目肯定是要用到数据库的什么SQL Server啊,MySQL啊,Oracle啊等等,虽然数据库不同,但它们的SQL语句还是差不多的。


[此贴子已经被作者于2016-10-14 09:55编辑过]

2016-10-14 09:49
快速回复:求问大神,程序的可读性是个什么概念?如何提高程序的可读性?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029714 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved