结构化编程的优点与反思
这周在上程序设计课的时候,老师的一个词让我印象很深刻,那就是结构化编程,也正是今天要谈论的主题。从八月份开始自学C语言,懵懵懂懂的学习了一些语法,会初步使用指针与函数。也接触了一些基本算法,如排序算法中的桶排序、快速排序、冒泡排序,深度优先搜索,简易贪心、栈、队列、枚举算法等等。
经过两个月的刷题训练,回想起每次的做题流程,我记得很清楚当时我做的第一道编程题是“韩信点兵”。一开始是完完全全的懵,虽然学会了一些语法,但完全不知从何下手,再加上那道题是别人博客里面的,没办法在平台提交检测,导致检验方法有限。
之后学习了进阶的语法,也开始在平台写题了,没有思路的时候我会用//打注释来帮助自己一步一步的推敲算法,或者在草稿纸上设计步骤。
再然后,一方面是自己实力的增加,一方面是懒!所以现在做题就完全不打注释也不用草稿了(在写技术博客时会适当添加注释帮助读者理解)基本上看完题(因为看得很潦草,所以有时候经常因为看错题而卡题…)就直接按照自己的思路往下打代码,这就会导致整个的代码一团乱,让人很难以阅读(就连我在复盘再次阅读时都很吃力)的理解。
质量差的代码:
#include <stdio.h>
int main(void){
int x;
int one, two, five;
====================================================================
scanf("%d", &x);
for( one = 1; one < x*10; one++ ){
for ( two = 1; two < x*10/2; two++ ){
for ( five = 1; five < x*10/5; five++ ){
if ( one + two*2 + five*5 == x*10 ){
printf("可以用%d个1角和%d个2角和%d个5角合成%d元\n",
one, two, five, x);
goto out;
}
}
}
}
====================================================================
out:
return 0;
}
虽然这道题AC了,但上面框起来的部分就是不太好的写法,首先是for的多重循环结构会让人很晕,第一眼很难理解(也有可能只是对于我而言hhh)再其次就是结构化编程很忌讳的goto,跳来跳去的结构一不小心就会导致一碗面的惨剧。
高质量的代码:
原题地址:笨小猴
#include<cstdio>
#include<cstring>//strlen函数
using namespace std;
====================================================================
char s[110];
const int prime[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};//打表
int sum[26];//记录和
====================================================================
int main(){
====================================================================
int maxn=0,minn=110;//最大值和最小值,注意初始化
scanf("%s",s);//用scanf读入字符数组时,注意不用加&
int len=strlen(s);//求字符串长度的函数
====================================================================
====================================================================
for(int i=0;i<len;i++){//遍历字符串
sum[s[i]-'a']++;//见上
}
====================================================================
====================================================================
for(int i=0;i<26;i++){//遍历26个字母
if(sum[i]>maxn) maxn=sum[i];//比较maxn
if(sum[i]>0&&sum[i]<minn) minn=sum[i];//比较minn,只比较出现过的字母
}
====================================================================
====================================================================
for(int i=0;i<25;i++){//遍历25个质数
if(maxn-minn==prime[i]){//满足条件了
printf("Lucky Word\n%d",maxn-minn);//输出,注意格式
return 0;//返回
}
}
====================================================================
printf("No Answer\n0");//不满足的情况,注意输出0
return 0;//华丽结束
}
仔细找了找自己写过的代码,发现代码质量都不高… 然后我就在洛谷找到了一位同学的代码,质量特别高,和大家一起分析下,附上原地址链接,若有侵权,请联系我删除。
我将原博主的代码通过===符号进行了分区,这样大家可以清楚的看到,博主写的代码模块化特别明显,基本上可以分为一块一块的顺序结构,外人理解起来也特别快和方便,每一部分都执行着每一部分的功能,也没有结构内部的跳转。
老师在上课时说好的代码是可移植性高的,就是说在我这里可以用,给你的团队、客户他们也能用,你写的代码不仅仅要在这个工程中用,以后在类似的工程中,只要微微修改,也能用在别的工程中,这就是易于修改和维护的特性,就好像一个黑盒,别人在用时只用担心我要输入什么,如何输出的并不需要关心。
如何写高质量代码?
上周刚接触了传统的流程图和NS流程图,在写作业时特别痛苦,你让我直接写代码我是可以很快的,但你要我画图,还要按照结构化的方式(尤其是只有一个入口、只有一个出口,每一部分都可能执行卡了我很久,总是错)这也说明了我的基础并不牢固,之前我写的算法,并不是只有一个入口,也并不是只有一个出口,甚至可能出现死循环的问题。
之前每次遇到死循环问题时我总是对自己说哎呀,只是自己不小心,下次注意一下这行代码就好了。真的如此吗?
老师的一句话也让我印象深刻:“很多同学觉得NS流程图很难画,甚至没有必要画,的确,前期的题都很简单,不画也行,但到后面你会越画越顺,看到题目信手拈来直接就可以画出流程图,然后根据流程图编写程序,”
突然想起高中数学老师经常举得一个例子,现在移植一下:
为什么你不会画流程图
因为我流程图没学好
为什么你流程图没学好
因为我不会画流程图
为什么你不会画流程图
…
正是因为你不会画流程图所以你要训练你的流程!
共1600多字,全部自己总结手打,若觉得有帮助,点赞、评论、收藏、一键三连拜托啦!