什么是好代码?如何写出高质量代码?——你需要知道结构化编程

结构化编程的优点与反思

这周在上程序设计课的时候,老师的一个词让我印象很深刻,那就是结构化编程,也正是今天要谈论的主题。从八月份开始自学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多字,全部自己总结手打,若觉得有帮助,点赞、评论、收藏、一键三连拜托啦!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值