第四节 编程细节

细节决定成败,态度决定一切。

  在我们程序编写的过程中,有一些细节我们需要注意,这对你以后的代码质量都会有很大的影响。下面,我会介绍一些常见的细节。

合理的缩进

  虽然编译器会忽略代码中一切空格和换行,但是一段乱奇葩早的缩进的代码真的是能逼死强迫症的。

  常见的缩进方式是使用Tab键,默认4个空格。相同等级的语句不缩进,次级语句需要缩进,比如:

1
2
3
for(int i=1;i<=100;i++)
sum+=i;
printf("%d\n",sum);

  在上面的代码中,我们看到循环体是累加计算,属于循环语句的次级语句,所以应当缩进。而输出是和循环同一等级的,所以要和for循环对齐。

  除此之外,大括号的缩进也很重要,这一点在下面会介绍。

统一的大括号

  大括号也是决定一个程序是否整齐的关键,我们常用以下两种方法:

1
2
3
4
5
6
7
8
9
10
int main()
{
int sum=0;
for(int i=1;i<=100;i++)
{
sum+=i;
}
printf("%d\n",sum);
return 0;
}

1
2
3
4
5
6
7
8
9
public class Main() {
public static void main(String args[]) {
int sum=0;
for(int i=1;i<=100;i++) {
sum+=i;
}
System.out.println(sum);
}
}

不同类型数据之间的计算

  这种情况经常出现在ACM的题目中,就比如hdu2002和hdu2009。如果是把int型数据赋值给double是没有问题的,但是如果是double数据给int,就会出现精度的损失,造成计算的失误。

  hdu2002中的分数4/3。如果直接在程序里这么写,程序会当成4整除3来计算,应当写成4.0/3.0

  hdu2009题如果想要写成m=sqrt(m)的话,就要保证m的类型是double类型,否则在赋值时会损失精度。

程序的模块化

  模块化思想很重要,像C++和Java都是面向对象的编程语言,集成化程度很高。但是并不意味着我们写C就不要模块化。模块化的程序可读性高,便于修改。

  比如hdu2005,判断是否是闰年的题目。我在判断是否是闰年时,写了一个函数,功能是:如果是闰年返回1,否则返回0。

  当然不仅限于如此,假设某程序需要按照一个公式进行计算,但是后来我们突然想要改变计算过程,如果你把公式写在函数里,那么只需要修改函数就行了,避免了对主函数的修改。

关于数组

  关于数组有两点需要注意。

  首先是对下标的确定。我们知道,数组的下标和元素的序号是刚好相差1的。那么我们可以抛弃数组的第一个元素,只使用数组的第二个往后的元素,这样可以统一下标和元素序号,比如:

1
2
3
4
int a[101];
for(int i=1;i<=100;i++) {
scanf("%d",&a[i]);
}

  再者,在申请数组大小的时候,我们可以多申请几个。有时候也可能要同时申请多组,这时候,推荐大家使用宏定义,比如:

1
2
#define N 10010
int a[N],b[N],c[N];