C语言语法入门-数组
9unk Lv5

数组

依次输入5名学生的分数,显示出他们的总分和平均分。

代码清单5-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*程序名:list0501.c*/
/*
输入5名学生的分数,并显示出他们的总分和平均分
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int wang, li, zhang, tian, song; //可以使用数组实现
int sum = 0;

printf("请输入5名同学的分数。\n");
printf("1号:"); scanf("%d", &wang); sum += wang;
printf("2号:"); scanf("%d", &li); sum += li;
printf("3号:"); scanf("%d", &zhang); sum += zhang;
printf("4号:"); scanf("%d", &tian); sum += tian;
printf("5号:"); scanf("%d", &song); sum += song;

printf("它们的总分是%5d,平均值是%.2f。\n", sum, (double)sum / 5);
system("pause");
return 0;
}

在对多个相同的变量做同一种处理时,可使用数组来实现。

数组的遍历

创建一个元素类型为 int,包含5个元素的数组,依次把1、2、3、4、5赋给它们并进行显示。

代码清单5-2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*程序名:list0502.c*/
/*
依次把1,2,3,4,5赋值给数组的每个元素并显示
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
//数组的声明
int v[5]; //int类型,V变量名,5个元素

//数组的赋值
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
v[4] = 5;

//数组的访问
printf("v[0] = %d\n", v[0]);
printf("v[1] = %d\n", v[1]);
printf("v[2] = %d\n", v[2]);
printf("v[3] = %d\n", v[3]);
printf("v[4] = %d\n", v[4]);
system("pause");
return 0;
}

反汇编

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//数组的赋值
v[0] = 1;
00FB1875 B8 04 00 00 00 mov eax,4
00FB187A 6B C8 00 imul ecx,eax,0
00FB187D C7 44 0D E8 01 00 00 00 mov dword ptr [ebp+ecx-18h],1
v[1] = 2;
00FB1885 B8 04 00 00 00 mov eax,4
00FB188A C1 E0 00 shl eax,0
00FB188D C7 44 05 E8 02 00 00 00 mov dword ptr [ebp+eax-18h],2
v[2] = 3;
00FB1895 B8 04 00 00 00 mov eax,4
00FB189A D1 E0 shl eax,1
00FB189C C7 44 05 E8 03 00 00 00 mov dword ptr [ebp+eax-18h],3
v[3] = 4;
00FB18A4 B8 04 00 00 00 mov eax,4
00FB18A9 6B C8 03 imul ecx,eax,3
00FB18AC C7 44 0D E8 04 00 00 00 mov dword ptr [ebp+ecx-18h],4
v[4] = 5;
00FB18B4 B8 04 00 00 00 mov eax,4
00FB18B9 C1 E0 02 shl eax,2
00FB18BC C7 44 05 E8 05 00 00 00 mov dword ptr [ebp+eax-18h],5

对数组的某个下标赋值时,反汇编会先计算指针,然后再将值传送到相应的地址处。

代码清单5-3

使用 for 循环对数组赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*程序名:list0503.c*/
/*
依次把1,2,3,4,5赋值给数组的每个元素并显示(for语句)
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5]; //int类型,V变量名,5个元素

v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
v[4] = 5;

for (int i = 0; i < 5; i++)
{
printf("v[%d] = %d\n", i,v[i]);
}
system("pause");
return 0;
}

代码清单5-4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*程序名:list0504.c*/
/*
将数组的全部元素赋值为0.0并显示
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
double x[7];

for (int i = 0; i < 7; i++)
{
x[i] = 0;
printf("x[%d] = %.1f\n", i,x[i]);
}
system("pause");
return 0;
}

数组初始化

在声明变量的时候,需要对变量进行初始化。数组的初始化操作如下:

int v[5] = {1,2,3,4,5};

数组的初始值就是大括号中的值(元素),各个元素的值用逗号隔开。

代码清单5-5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*程序名:list0505.c*/
/*
从头开始依次用1、2、3、4、5对数组元素进行初始化并显示
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5] = { 1,2,3,4,5 };

for (int i = 0; i < 5; i++)
{
printf("v[%d] = %d\n", i, v[i]);
}
system("pause");
return 0;
}

反汇编

1
2
3
4
5
6
//int v[5] = { 1,2,3,4,5 };
00391875 C7 45 E8 01 00 00 00 mov dword ptr [ebp-18h],1
0039187C C7 45 EC 02 00 00 00 mov dword ptr [ebp-14h],2
00391883 C7 45 F0 03 00 00 00 mov dword ptr [ebp-10h],3
0039188A C7 45 F4 04 00 00 00 mov dword ptr [ebp-0Ch],4
00391891 C7 45 F8 05 00 00 00 mov dword ptr [ebp-8],5

数组的初始化和局部变量初始化相同。数组是一段大小一样且连续的局部变量。

数组的复制

代码清单5-6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*程序名:list0506.c*/
/*
把数组中的全部元素复制到另一个数组中(局部变量)
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5] = { 17,23,36 };
int z[5];

for (int i = 0; i < 5; i++)
{
z[i] = v[i];
printf("z[%d] = %d\n", i, z[i]);
}
system("pause");
return 0;
}

代码清单5-6a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*程序名:list0506a.c*/
/*
把数组中的全部元素复制到另一个数组中(全局变量)
注:C++中全局变量是不允许使用这样的写法。
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

v[5] = { 17,23,36 };

int main(void)
{

int z[5];

for (int i = 0; i < 5; i++)
{
z[i] = v[i];
printf("z[%d] = %d\n", i, z[i]);
}
system("pause");
return 0;
}

反汇编

1
2
3
4
5
6
7
8
list0506.c
//int v[5] = { 17,23,36 };
002E187F C7 45 E4 11 00 00 00 mov dword ptr [ebp-1Ch],11h
002E1886 C7 45 E8 17 00 00 00 mov dword ptr [ebp-18h],17h
002E188D C7 45 EC 24 00 00 00 mov dword ptr [ebp-14h],24h
002E1894 33 C0 xor eax,eax
002E1896 89 45 F0 mov dword ptr [ebp-10h],eax
002E1899 89 45 F4 mov dword ptr [ebp-0Ch],eax
1
2
3
4
5
6
list0506a.c
//z[i] = v[i];
00D1188D 8B 45 DC mov eax,dword ptr [ebp-24h] //变量i
00D11890 8B 4D DC mov ecx,dword ptr [ebp-24h]
00D11893 8B 14 8D 34 A0 D1 00 mov edx,dword ptr [ecx*4+0088A034h] //全局数组v[i]
00D1189A 89 54 85 E8 mov dword ptr [ebp+eax*4-18h],edx //局部数组z[i]

把一个局部变量作为指针,那么这个局部(全局)变量是数组。同时可以看到局部变量是[ebp-xxx],而全局变量并没有用到 ebp或esp 。

1
2

C语言中局部变量区的数据都是不固定的,如果不初始化局部变量数据就有可能出问题,所以前面必须要有变量类型。而全局变量区默认数据都是0,所以全局变量可以不使用变量类型。

数组是以下标值来运算当前局部变量的指针。

输入数组元素值

从键盘输入数组元素的值并显示。

代码清单5-7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*程序名:list0507.c*/
/*
输入数组元素的值并显示
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5];

for (int i = 0; i < 5 ; i++)
{
printf("请输入v[%d]的值:", i); scanf("%d", &v[i]);
}

for (int i = 0; i < 5; i++)
{
printf("v[%d] = %d\n", i, v[i]);
}
system("pause");
return 0;
}

对数组的元素进行倒序排列

代码清单5-8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*程序名:list0508.c*/
/*
对数组元素进行倒序排序
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5];
int num = sizeof(num) / 2;

for (int i = 0; i < 5 ; i++)
{
printf("请输入v[%d]的值:", i); scanf("%d", &v[i]);
}

for (int k = 0; k <= num; k++)
{
int temp = v[4 - k]; //v[4]=5,temp=5
v[4 - k] = v[k]; //v[4] = v[0],v[4]=1
v[k] = temp;
}

for (int i = 0; i < 5; i++)
{

printf("v[%d] = %d\n", i, v[i]);
}
system("pause");
return 0;
}

使用数组进行成绩处理

代码清单5-9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*程序名:list0509.c*/
/*
输入5名学生的分数并显示出他们的总分和平均值。
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int i;
int student[5];
int sum = 0;

printf("输入5名学生的分数。\n");
for (i = 0; i < 5; i++)
{
printf("%2d号:", i);
scanf("%d", &student[i]);
sum += student[i];
}
printf("总分:%5d,平均分:%.2f\n", sum, (double)sum / 5);
system("pause");
return 0;
}

宏定义

我们写的代码有时定义数字太多,当分析代码或者需要修改其中的某一项时会很麻烦。为了解决这个问题C语言允许使用宏定义,将一个定义为常量。
#define指令,定义一个常量,语法如下:

#define 常量 值

代码清单5-10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*程序名:T5-10.c*/
/*
输入5名学生的分数并显示出他们的总分和平均值。
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define NUMBER 5 //用宏定义学生人数

int main(void)
{
int i;
int student[5];
int sum = 0;

printf("输入%d名学生的分数。\n", NUMBER);
for (i = 0; i < NUMBER; i++)
{
printf("%2d号:", i);
scanf("%d", &student[i]);
sum += student[i];
}
printf("总分:%5d,平均分:%.2f\n", sum, (double)sum / NUMBER);
system("pause");
return 0;
}

数组元素的最大值和最小值

使用数组判断学生成绩最高分和最低分各自是多少。

代码清单5-11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*程序名:list0511.c*/
/*
输入学生的分数并显示出其中的最高分和最低分
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define NUMBER 8

int main(void)
{

int i;
int tensu[NUMBER];
int max, min;

printf("请输入%d名学生的分数。\n", NUMBER);
for (i = 0; i < NUMBER; i++)
{
printf("%2d号:", i + 1);
scanf("%d", &tensu[i]);
}
min = max = tensu[0];

for (i = 1; i < NUMBER; i++)
{
if (tensu[i] > max) max = tensu[i];
if (tensu[i] < min) min = tensu[i];
}

printf("最高分:%d\n", max);
printf("最低分:%d\n", min);
system("pause");
return 0;
}

数组的元素的个数

我们现在定义的数组都很小,如果需要更大的数组空间,就需要修改对程序进行修改,重新编译执行。因此我们可以定义一个比较大的数组,然后从头开始仅使用其中需要的部分。

代码清单5-12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*程序名:list0512.c*/
/*
输入学生的分数并显示分布情况
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define NUMBER 80

int main(void)
{
int num;
int student[NUMBER];
int distribution[11] = { 0 };

/*输入学生人数*/
printf("请输入学生人数:");
scanf("%d", &num);
do
{
if (num<1 || num>NUMBER)
{
printf("\a请输入1~%d之间的数\n", NUMBER);
}
} while (num<1 || num>NUMBER);


/*录入学生成绩*/
printf("请输入%d人的分数。\n", num);

for (int i = 0; i < num; i++)
{
printf("%2d号:", i + 1);
do
{
scanf("%d", &student[i]);
if (student[i] < 0 || student[i]>100)
{
puts("分数在1~100之间。请重新输入。");
}
} while (student[i] < 0 || student[i]>100);

distribution[student[i] / 10]++;
}

/*显示学生成绩分布图*/
puts("\n-----分布图-----\n");

for (int i = 0; i < 10; i++)
{
printf("%d - %d: ", i * 10, i * 10 + 9);
for (int j = 0; j < distribution[i]; j++)
{
printf("*");
}
printf("\n");
}

/*单独处理100分*/

printf(" 100: ");
for (int i = 0; i < distribution[10]; i++)
{
printf("*");
}
printf("\n");
system("pause");
return 0;
}

多维数组

所谓多维数组,就是多个数组集合在一起形成的数组,即元素本身是数组的数组。

代码清单5-13

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*程序名:list0513.c*/
/*
求4名学生在两次考试中 3 门课程的总分并不显示
*/
#include <stdio.h>
#include <stdlib.h>


int main(void)
{
int testsu1[4][3] = { {30,40,50},{60, 70, 80},{70, 80, 90},{65,75,85} };
int testsu2[4][3] = { {75,85,95},{65, 75, 86},{74, 88, 97},{68,85,95} };
int sum[4][3];

/*求4名学生各科在两次考试的分数之和*/
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
sum[i][j] = testsu1[i][j] + testsu2[i][j];
}
}
/*显示第一次考试的分数*/
puts("第一次考试的分数");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%4d", testsu1[i][j]);
}
putchar('\n');
}
/*显示第二次考试的分数*/
puts("第二次考试的分数");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%4d", testsu2[i][j]);
}
putchar('\n');
}

/*显示总分*/
puts("总分");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%4d", sum[i][j]);
}
putchar('\n');
}
return 0;
}

总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*程序名:chapmaraya.c*/
/*
第 5 章总结
*/
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5 //使用宏来定义数组元素的个数

int main(void)
{
int sum;

/*数组a和b是int[5]型的一维数组*/
int a[SIZE]; //使用不定值对数组进行初始化
int b[SIZE] = { 1,2,3 };
int c[2][3] = { {11,22,33},{44,55,66} };

/*将数组b的所有值赋值给数组a*/
for (int i = 0; i < SIZE; i++)
{
a[i] = b[i];
}

/*显示数组a的所有元素*/
printf("显示数组 a 的所有元素\n");
for (int i = 0; i < SIZE; i++)
{
printf("%5d,", a[i]);
}
printf("\n");

/*显示数组b的所有元素值*/
printf("显示数组 b 的所有元素\n");
for (int i = 0; i < SIZE; i++)
{
printf("%5d,", b[i]);
}
printf("\n");

/*计算并显示数组a的所有元素的和*/
sum = 0;
for (int i = 0; i < SIZE; i++)
{
sum += a[i];
printf("计算并显示所有数组 a 的所有元素的和=%d\n",sum);
}

/*显示数组 c 的全部构成元素的值*/
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("c[%d][%d] = %d\n", i, j, c[i][j]);
}
}
return 0;
}

课后练习

练习5-1

3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*程序名:lx5-1.c*/
/*
对代码5-3中的程序进行修改,从头顺次为数组中的元素赋值0,1,2,3,4.
依次把1,2,3,4,5赋值给数组的每个元素并显示(for 语句)
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5] = { 0,1,2,3,4 };

for (int i = 0; i < 5; i++)
{
v[i] = i + 1;
printf("v[%d] = %d\n", i, v[i]);
}
system("pause");
return 0;
}

练习5-2

4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*程序名:lx5-2.c*/
/*
对代码5-3中的程序进行修改,从头顺次为数组中的元素赋值5,4,3,2,1
依次把1,2,3,4,5赋值给数组的每个元素并显示(for 语句)
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int v[5] = { 5,4,3,2,1 };

for (int i = 0; i < 5; i++)
{
v[i] = i+1;
printf("v[%d] = %d\n", i, v[i]);
}
system("pause");
return 0;
}

练习5-3

5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*程序名:lx5-3.c*/
/*
从头开始依次用1,2,3,4,5对数组各元素进行初始化并显示.
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int array1[5] = { 1,2,3,4,5 };

for (int i = 0; i < 5; i++)
{
printf("array[%d]=%d\n", i, array1[i]);
}
system("pause");
return 0;
}

练习5-4

6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*程序名:lx5-4.c*/
/*
对代码5-6进行修改,将数组a中的元素按照倒序复制到数组b中。
把数组中的全部元素复制到另一个数组中
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a[5] = { 1,2,3,4,5 };
int b[5];
int j = 4;

for (int i = 0; i < 5; i++)
{
b[j] = a[i];
j--;
}

for (int i = 0; i < 5; i++)
{
printf("b[%d] = %d\n", i, b[i]);
}
system("pause");
return 0;
}

练习5-5

7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*程序名:lx5-5.c*/
/*
对代码5-8中的程序进行修改,改为用对象式宏来定义元素的个数。注意需要找到有关元素交换次数的规则。
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define ARRAYNUM 5

int main(void)
{
int v[ARRAYNUM];
int num = ARRAYNUM / 2;

for (int i = 0; i < ARRAYNUM; i++)
{
printf("请输入v[%d]的值:", i); scanf("%d", &v[i]);
}

for (int k = 0; k <= num; k++)
{
int temp = v[4 - k]; //v[4]=5,temp=5
v[4 - k] = v[k]; //v[4] = v[0],v[4]=1
v[k] = temp;
}

for (int i = 0; i < ARRAYNUM; i++)
{

printf("v[%d] = %d\n", i, v[i]);
}
system("pause");
return 0;
}

练习5-6

8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*程序名:lx5-6.c*/
/*
假设变量a是double型,变量b是int型,请说明经过下述赋值后a和b的值分别是多少。
a = b = 1.5;
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define ARRAYNUM 5

int main(void)
{
double a;
int b;
a = b = 1.5;
printf("a=%lf,b=%d\n", a, b);
system("pause");
return 0;
}

练习5-7

9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*程序名:lx5-7.c*/
/*
编写一段程序,像右边这样读取数组中的数据个数和元素值并显示。显示时,各值之间用逗号和空格分割,并用大括号将所有值括起来。
注意利用对象式宏来声明数组的元素个数,如代码5-12
数据个数:4
1号:23
2号:74
3号:9
4号:835
{23,74,9,835}
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define NUMBER 80

int main(void)
{
int num;
int student[NUMBER];
int distribution[11] = { 0 };

/*输入数据个数*/
printf("数据个数:");
scanf("%d", &num);
do
{
if (num<1 || num>NUMBER)
{
printf("\a请输入1~%d之间的数\n", NUMBER);
}
} while (num<1 || num>NUMBER);


/*录入数据*/
for (int i = 0; i < num; i++)
{
printf("%2d号:", i + 1);
do
{
scanf("%d", &student[i]);
if (student[i] < 0 || student[i]>1000)
{
puts("分数在1~1000之间。请重新输入。");
}
} while (student[i] < 0 || student[i]>1000);

}

/*显示数据*/

for (int i = 0; i < num; i++)
{
if (i == 0)
{
printf("{ %d,", student[i]);
}
else if (i > 0 && i < num-1)
{
printf("%d,", student[i]);
}
else if (i == num-1)
{
printf("%d }", student[i]);
}

}
printf("\n");
system("pause");
return 0;
}

练习5-8

10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*程序名:lx5-8.c*/
/*
编写一段程序,逆向显示代码清单5-12的分布图。
100:
90~99:
80~89:
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define NUMBER 80

int main(void)
{
int num;
int student[NUMBER];
int distribution[11] = { 0 };

/*输入学生人数*/
printf("请输入学生人数:");
scanf("%d", &num);
do
{
if (num<1 || num>NUMBER)
{
printf("\a请输入1~%d之间的数\n", NUMBER);
}
} while (num<1 || num>NUMBER);


/*录入学生成绩*/
printf("请输入%d人的分数。\n", num);

for (int i = 0; i < num; i++)
{
printf("%2d号:", i + 1);
do
{
scanf("%d", &student[i]);
if (student[i] < 0 || student[i]>100)
{
puts("分数在1~100之间。请重新输入。");
}
} while (student[i] < 0 || student[i]>100);

distribution[student[i] / 10]++;
}

/*单独处理100分*/

printf(" 100: ");
for (int i = 0; i < distribution[10]; i++)
{
printf("*");
}
printf("\n");


/*显示学生成绩分布图*/
puts("\n-----分布图-----\n");

for (int i = 9; i > 0; i--)
{
printf("%d - %d: ", i * 10, i * 10 + 9);
for (int j = 0; j < distribution[i]; j++)
{
printf("*");
}
printf("\n");
}

system("pause");
return 0;
}

练习5-9

11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*程序名:lx5-9.c*/
/*
编写一段程序,像右边这样纵向显示练习5-8中得到的分布图。
*
* * *
* * * * * * * * * *
-----------------------------------------------------------
0 10 20 30 40 50 60 70 80 90 100
*/
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#define NUMBER 80

int main(void)
{
int num, space, min, max = 0;
int student[NUMBER];
int distribution[11] = { 0 };
int nums[11] = { 0 };
char xh[2] = { '*',0x20};

/*输入学生人数*/
printf("请输入学生人数:");
scanf("%d", &num);
do
{
if (num<1 || num>NUMBER)
{
printf("\a请输入1~%d之间的数\n", NUMBER);
}
} while (num<1 || num>NUMBER);


/*录入学生成绩*/
printf("请输入%d人的分数。\n", num);

for (int i = 0; i < num; i++)
{
printf("%2d号:", i + 1);
do
{
scanf("%d", &student[i]);
if (student[i] < 0 || student[i]>100)
{
puts("分数在1~100之间。请重新输入。");
}
} while (student[i] < 0 || student[i]>100);

}


/*显示学生成绩分布图*/
puts("\n-----分布图-----\n");

//把0~100分的成绩分布写入数组,变量max判断最多要打印几行
for (int i = 1; i <= 10; i++)
{
//每次循环min重置
min = 0;
for (int j = 0; j < num; j++)
{
if ((student[j]>(i-1)*10)&&(student[j] <= i * 10))
{
distribution[i-1]++;
}
}
printf("\n\n");
if (distribution[i-1] > max)
{
max = distribution[i-1];
}
}


//打印星号
for (int i = 1; i <= max; i++)
{
printf(" ");
for (int j = 0; j < 10; j++)
{
if (distribution[j]>0)
{
printf("%c", xh[0]);
printf(" ");
distribution[j]--;
}
else
{
printf(" ");
}
}
printf("\n");
}

printf("\n------------------------------------------------\n");
for (int i = 0; i <= 10; i++)
{
printf("%d", i * 10);
printf(" ");
}

/*单独处理100分*/

printf("\n");

system("pause");
return 0;
}

练习5-10

12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*程序名:lx5-10.c*/
/*
编写一段程序,求4行3列矩阵和3行4列矩阵的乘积。各构成元素的值从键盘输入。
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int num[2][2] = { 0 };
int len = sizeof(num) / sizeof(num[0][0]);

for (int i = 0; i < len / 2; i++)
{
//每计算一个结果,乘积变量置零。
int produ = 0;
printf("请输入第 %d 个矩形的长和和宽:\n", i + 1);
for (int j = 0; j < len / 2; j++)
{
scanf("%d", &num[i][j]);
if (j == 0)
{
produ += num[i][j];
}
else
{
produ *= num[i][j];
}
}
printf("该矩形的乘积是:%d\n", produ);
}

return 0;
}

练习5-11

13

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*程序名:lx5-11.c*/
/*
编写一段程序,输入6名学生2门课程(语文,数学)的分数,显示各门课程的总分和平均分,以及各个学生的总分和平均分。
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int num[6][2] = { 0 };
int len = sizeof(num) / sizeof(num[0][0]);

for (int i = 0; i < len/2; i++)
{

//每计算一个结果,乘积变量置零。
int sum = 0;
int equ = 0;
printf("请输入第 %d 个学生的语文和数学成绩:",i+1);
for (int j = 0; j < len / 6; j++)
{
scanf("%d", &num[i][j]);
sum += num[i][j];
}
printf("学生 %d 的总分是:%d,平均分是:%d\n\n", i+1,sum,sum/2);
}

return 0;
}

练习5-12

14

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*程序名:lx5-12.c*/
/*
修改代码5-13的程序,将两次考试的分数存储在三维数组tensu中。
求4名学生在两次考试中3门课程的总分并显示
*/
#include <stdio.h>
#include <stdlib.h>


int main(void)
{
int testsu[2][4][3] =
{
{{30,40,50},{60, 70, 80},{70, 80, 90},{65,75,85}},
{{75,85,95},{65, 75, 86},{74, 88, 97},{68,85,95}}
};

int len = sizeof(testsu)/sizeof(testsu[0][0][0]);
int sum[4][3] = { 0 };

/*求4名学生各科在两次考试的分数之和*/
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < 3; k++)
{
sum[j][k] += testsu[i][j][k];
}

}
}

/*显示第一次考试的分数*/

for (int i = 0; i < 2; i++)
{
printf("第 %d 次考试的分数",i+1);
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < 3; k++)
{
printf("%4d", testsu[i][j][k]);
}
}
putchar('\n');
}

/*显示总分*/
puts("总分");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%4d", sum[i][j]);
}
putchar('\n');
}

return 0;
}


void test(void)
{




/*显示第二次考试的分数*/
puts("第二次考试的分数");
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
//printf("%4d", testsu2[i][j]);
}
putchar('\n');
}


}
  • 本文标题:C语言语法入门-数组
  • 本文作者:9unk
  • 创建时间:2023-06-08 16:54:00
  • 本文链接:https://9unkk.github.io/2023/06/08/c-yu-yan-yu-fa-ru-men-shu-zu/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!