最近解答了好多疑问,对大家的期末考试十分堪忧啊

答应我,下面这些错误不要再犯了好吗。

#一些小的知识点

  • 数组定义时必须指定固定常数的长度,不能使用变量。
    1
    2
    3
    4
    5
    6
    // 错误示例
    int n=10;
    int a[n];

    // 正确示例
    int a[10];

#变量在使用前,一定要初始化

变量在使用前,一定要初始化!
变量在使用前,一定要初始化!
变量在使用前,一定要初始化!

举个 🌰:

1
2
3
4
5
6
7
8
9
10
11
min = 10000;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (min > a[i][j])
{
min = a[i][j];
}
}
}

上面是一个很简单的求 a[i][*] 中最小值的方法,但是 min 在一轮循环后 未被初始化为0,这样就会导致后面的所有 min 错误,正确的写法如下:

1
2
3
4
5
6
7
8
9
10
11
for (i = 0; i < 5; i++)
{
min = 10000;
for (j = 0; j < 5; j++)
{
if (min > a[i][j])
{
min = a[i][j];
}
}
}

还有一个很容易被人忽视的点,再举个例子,我想得到数组最小的值及其所在的位置:

1
2
3
4
5
6
7
8
9
10
11
12
13
int min,index;
for (i = 0; i < n; i++)
{
min = a[i][0];
for (j = 0; j < n; j++)
{
if (min > a[i][j])
{
min = a[i][j];
index = j + 1;
}
}
}

这种错误很隐蔽,因为只有当碰巧  a[i][0] 最小的时候才会出错,因为 index 没被初始化为 0

这种同时带了多个值的情况,所有的值都要初始化,很容易漏掉,需要注意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int min,index;
for (i = 0; i < n; i++)
{
min = a[i][0];
//同时对index进行赋值
index = 0;
for (j = 0; j < n; j++)
{
if (min > a[i][j])
{
min = a[i][j];
index = j + 1;
}
}
}

#书写格式要规范

#合理使用tab缩进

虽然C语言是写给机器的语言,不论你写的多乱机器都能识别,但当你程序出现错误要查错的时候,良好的缩进习惯可以帮你快速地阅读代码。

1
2
3
4
5
6
7
8
for(j=0;j<5;j++){float avr;
avr=0;
int sum=0;
for(i=0;i<5;i++)
sum=sum+a[i][j];
avr=sum/5;
printf("%.2f ",avr);
}
1
2
3
4
5
6
7
8
9
10
for (j = 0; j < 5; j++)
{
float avr;
avr = 0;
int sum = 0;
for (i = 0; i < 5; i++)
sum = sum + a[i][j];
avr = sum / 5;
printf("%.2f ", avr);
}

#合理使用花括号{}

在C语言里 for while 等循环可以接单个语句达到循环的作用,如下段代码所示:

1
2
for (i = 0; i < 5; i++)
sum = sum + a[i][j];

假如我们需要在循环里做些别的事情,比如我突然要记录 i 的值,惯性思维的改法如下:

1
2
3
for (i = 0; i < 5; i++)
sum = sum + a[i][j];
index = i;

乍一看没有任何问题,但实际上这个 i 的值固定为 5
所以一定要合理使用 {},不要因为这种错误平白浪费时间。

1
2
3
4
5
for (i = 0; i < 5; i++)
{
sum = sum + a[i][j];
index = i;
}