2016级计算机C++助教工作(4)数组定义 与 优美的写代码的姿势
2016-10-15 15:53
369 查看
数组定义:
首先提提数组的定义问题,由于同学们在定义数组的时候容易把数据开小了导致反正越界的问题。数组开小乐通常是Runtime Error有的时候也会出现 Restricted Function的结果,而其他未知的错误也是有可能的。
有些同学也喜欢采用定义临时变量的方式,如
int n; while(cin>>n){ int matrix[n+1]; }这种方法可能会出现两个问题:
1. 不注意,把范围定小了。
2. 消耗内存过多,导致内存不足。(这在空间要求高的时候会出现,如开一个10^5的数组的时候,这涉及到了堆和栈的问题,有兴趣的深挖)
那么助教推荐的一个方法,在打ACM时常用的方式(但是对于工程开发的话另说,因为可能就不适合了):
方式1:
#include<cstdio> using namespace std; int value[1000]; int matrix[1000]; int name[1000]; int main(){ }
我们在main函数的外部定义一个全局的数组。这样做的好处是可以开一个很大的数组。10^6级别也是可以的。
但是不建议把单个的变量 如int n,m.这样的变量定义成全局的,容易导致定义混乱,自己给忘记哪里定义过,然后程序出现莫名其妙的问题。
大家可能注意到,我定义数组的时候用的英文把名字长度不长,同时也像一个单词(就是),在codeblock中当变量名长度大于等于3时,通过双击该变量,可以高亮出所有该变量出现的位置,方便debug。同时定义一个有含义的变量,可以让自己明白它的含义,在思路出现混乱的时候,可以快速理清自己要做什么,在做什么。
如下图就是高亮的情况。
再细心思考的同学,可以注意我用了三个长度一样数组。引出第二种定义方法,带你们写出更优美的代码
using namespace std; #define maxn 1000 int value[maxn]; int matrix[maxn]; int name[maxn]; int main(){ }我们采用宏定义 #define maxn 1000 这句语句可以简单理解为,以后出现maxn,都会被编译器用1000替换。(兴趣深挖)
这样写的效果等价上一份代码。好处是,我只需要修改maxn的值,就可以改变三个数组的长度,在发现数据范围搞错的情况下,只需修改一处即可。
但是,每个数组的长度都不一样的是,最好不要采用多个宏定义的方式,可以选择最大的一个定义即可,然后把其他数组都开大一些。(this is called trick)
这里介绍一个ACM中常用的宏定义的方法
#define ll long long ll a = 0;
这里用ll代替 long long ,
我们定义一个长整型的整数的时候就可以用ll代替了,方便省事。
优美的代码格式
没错,这篇博客的目的,相比第二篇,是要告诉你一些显然的让自己B格能能够体现出来的方式,我们称之为 ‘姿势’,一个优美的代码姿势往往会给你带来不可思议的优势(等你们写多了就能体会)。姿势优美的代码能带来好处,
第一,作为助教能更清楚看懂你们的逻辑结构,快速定位错误。
第二,展现你们代码的成熟与优秀,区别出新手和专业人员。
talk is cheap, see the code !
#include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<cstdio> using namespace std; #define maxn 1000 //宏定义,能清晰地判断出数据范围是否考虑到了 int value[maxn]; //良好的变量定义,能明白这个变量的作用,也能快速定位这个变量出现的位置 int matrix[maxn]; int name[maxn]; int main(){ int n, m, u, v; // 用空格分开变量,让结构显的更加清晰 cin>>n; // 代码对齐属于同一层的代码缩进量相同, for(int i = 0;i < n; i++){ //助教强烈推荐的括号的使用方式,这种方式可以可以让代码 //显得更加简短,简洁干练本身就是一种优美 if(i == 0){ //第二层括号 u = i; //代码对齐 v = i; m = u * v + v; //这里还是体现空格的作用 } if( i != 0){ //注意,代码是紧凑的,请不要添加过多的无用的空白行 } } return 0; }
在实际写代码的过程中,发现有些同学会重复定义变量例如
int k=10; for(int i = 0;i < k; i++){ int k = 8; while(k--){ int k = 10 * 9; if(k > 9) break; } }这种情况会导致不可预知的错误。请注意每个变量的作用域。不要重复定义。
例子先简单的演示成这样,能做到这样,便离优秀的程序员越来越接近啦。
我不展示不太规范的代码,因为你们只需要看到和学习优秀的东西即可(^_^)。
相关文章推荐
- 2016级计算机C++助教工作(5) 第一次讲课内容
- 2016级计算机C++助教工作(10)第三次第四次上机题注意事项
- 2016级计算机C++助教工作(6)OJ上各种返回结果以及代表意思和可能涉及的原因
- 2016级计算机C++助教工作(8)第二次上课内容
- 2016级计算机C++助教工作(12) 第二次上机解题报告
- 2016级计算机C++助教工作(2)基本语法与资料查找方法
- 2016级计算机C++助教工作(9)第三次上课内容
- 2016级计算机C++助教工作(11) 第三次上机解题报告
- 2016级计算机C++助教工作(7)第一次上机题
- 2016级计算机C++助教工作(3) 提问方式 和 发送邮件的方式
- 2016级计算机C++助教工作(1) codeblocks的汉化与相关操作
- 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现 ——感想
- 《代码揭秘--从C/C++的角度探秘计算机系统》读书笔记(一)
- C++程序设计实验报告(二十)---实现冒泡排序算法,并将之定义为一个函数,其中参数是指向数组的指针变量
- C++ stack overflow 局部数组变量定义超过所分配的最大空间
- C++中如何定义某个数组的引用?
- vim编辑C++代码寻找标准库中结构的的定义
- C++ 实现动态定义三维内的数组
- 用数组实现小顶堆(二叉堆)的C++代码
- 一劳永逸:关于C/C++中指针、数组与函数复合定义形式的直观解释