您的位置:首页 > 编程语言

自顶向下,逐步求精------一条编程的捷径

2017-11-28 22:08 232 查看

引言

第一次听到这个思想时,我觉得这和那些形而上的指导方针是一个套路,就是说来听听,没有任何实际的应用价值。事实似乎也验证了我的这个猜想,在开始学习码代码的前两个月,我从来没有应用过这个思想,然而这也没有给我造成什么困扰。究其原因,大概就是题目简单,代码不长。终于,在前两天我完成了一个200行的程序,才第一次感受到了这个思想的重要性。

200行的代码,如果不通过“自顶向下,逐步求精”,将问题具体化,那么找bug,修改参数将是一件痛苦得不能再痛苦的事情。至此,才终于后悔“不听老人言”,没有在一开始就养成这个好习惯。

自顶向下,逐步求精

那么,什么叫自顶向下逐步求精呢?

简单来说,就是将问题分化,将大的问题分成小的问题,将每一个要实现的操作转变为一个函数,然后再在函数中继续这个过程。



图片来自网络

这样的编程思路,有助于我们修正代码,检查中间量,同时也有助于将问题分工,实现合作。下面我就通过一个具体的例子来解释一下。

举个例子

比如现在我们想要解决这样一个问题:将用户输入的10进制数转化为16进制数。(为了更好地体现这个思想,这里选择的方法可能较为复杂,请读者不要在意这些细节,体会思想就好)

首先我们敲出main函数,即这个程序的主体。

int main() {
int number1;
char number[10];
scanf("%d", &number1);
if (number1 >= 0) {
translate(number1, 0, number);
}
else {
number[0] = '-';
number1 = -number1;
translate(number1, 1, number);
}
print(number);
system("pause");
}


这里我们调用了两个函数,分别是translate—具体的转换函数,以及print—打印字符组的函数。下面我们分别敲出这两个函数。

void translate(int n, int i, char text[]) {
int j;
int y = len(n);
for (j = 0; j < y; j++) {
int x = n % 16;
n = n / 16;
if (x < 10) text[i + y - j - 1] = '0' + x;
else text[i + y - j - 1] = 'A' + x - 10;
//printf("%c ",text[i + j]);
}
text[i + y ] = '\0';
}

void print(char text[]) {
for (int i = 0; ; i++) {
if (text[i] == '\0') break;
printf("%c", text[i]);
}
}


在实现translate函数时,我们又用到了这个一个10进制的数在16进制下的位数。遇到这样一个问题时不急,我们先搁置,继续完成为剩下的部分。然后再转过头来实现这个新的函数len。

int len(int n) {
if (n == 0) return 1;
int count = 0;
while (n != 0) {
n = n / 16;
count++;
}
return count;
}


至此,这道题终于完成了,代码具有很高的可读性,而且我们完成题目的过程中思路也很清晰,不至于出现码着码着忘了自己要干嘛的情况。这就是“自顶向下,逐步求精”的代码思路了。怎么样,您学会了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: