1、1第第第第第第6 6 6 6 6 6章章章章章章 数数数数数数 组组组组组组2022-12-1522022-12-15384x0 x1 x2 x29 2022-12-154 为了方便地使用为了方便地使用一组具有相同数据类型的一组具有相同数据类型的数据,数据,C C语言提供了一种语言提供了一种构造数据类型:构造数据类型:数组数组数组数组是一个是一个相同数据类型相同数据类型变量的变量的集合体集合体。例如:存储例如:存储3030个成绩,定义一个具有个成绩,定义一个具有3030个实型变量个实型变量的实型数组的实型数组 floatfloat score30score30;其中:其中:scorescore
2、是数组名。是数组名。该数组有该数组有3030个个数组元素数组元素,score0,score1,score29score0,score1,score29。可以存放可以存放3030个成绩。个成绩。数组元素在数组中的位置,称为数组元素在数组中的位置,称为下标下标。数组元素数组元素也称为也称为下标变量下标变量。2022-12-155l数组元素的下标从数组元素的下标从0开始开始l一维数组的数组元素在一维数组的数组元素在内存里按顺序存放。内存里按顺序存放。l数组元素是带有下标的数组元素是带有下标的变量变量,可以存放数据;,可以存放数据;数组名不是变量数组名不是变量,是一,是一个地址常量,代表数组个地址常量
3、,代表数组的首地址,即数组中第的首地址,即数组中第1个元素的地址。个元素的地址。ls与与&s 0相等相等,都表示第都表示第一个元素的地址一个元素的地址s 0s 1s 2s 3s 49134677284低地址低地址高地址高地址s数组数组int s 5;数组元素地址的两种表示方法:数组元素地址的两种表示方法:(1)&s0,&s1,&s4(2)s,s+1,s+2,s+42022-12-156数据类型数据类型 数组名数组名整型常量表达式整型常量表达式;2022-12-157数组定义之后,不能整体数组定义之后,不能整体使用,只能使用数组中的使用,只能使用数组中的数组元素数组元素下标变量下标变量2022-
4、12-158例如:例如:int x5;数组数组x中有中有5个数组元素,分别是个数组元素,分别是x0、x1、x2、x3、x4,可以存放,可以存放5个个int型整数。型整数。数组元素又称为下标变量数组元素又称为下标变量。其中:。其中:(1)(2)2022-12-1591,1,2,3,5,8,13,score+i用数组用数组求斐波求斐波那契数那契数列的前列的前2020项和项和2022-12-1510 int a10;/*,这里的,这里的 是一个标记是一个标记*/a10=90;/*下标越界下标越界*/a3=30;/*,这里的,这里的 是一个运算符是一个运算符*/C编译系统不做越界检查,如果引用的数组元
5、素编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。超出数组范围会破坏其他变量的值。两个两个10的意义不一样的意义不一样int a10;该语句中的该语句中的10表示数组表示数组a中有中有10个下标变量个下标变量a10中的中的10越界越界2022-12-1511 是是下标运算符下标运算符,引用引用数组元素数组元素时,时,先根据数组的先根据数组的首地首地址址和和下标下标数,计算数,计算出该元素的实际地出该元素的实际地址,再取出该地址址,再取出该地址的的内容内容进行操作。进行操作。如引用如引用 score2:(1)计算计算 2000+2*4=2008(2)取出取出2008的内容
6、的内容2000H2004H2008H200CH2110Hscore0score1score2score3score491.534.567.572.084.0如:如:float score5;.printf(“%6.1fn”,score2);一维数组中的数组元素一维数组中的数组元素的地址计算公式:的地址计算公式:数组首元素地址数组首元素地址+下标下标或或 数组名数组名+下标下标2022-12-1512初始化:在定义数组时给数组元素赋初值。初始化:在定义数组时给数组元素赋初值。1在定义数组时,对全部数组元素赋初值在定义数组时,对全部数组元素赋初值 例如:例如:int a5=0,1,2,3,4;此时
7、可以省略数组长度,例如:此时可以省略数组长度,例如:int a=0,1,2,3,4;2在定义数组时,对部分数组元素赋初值在定义数组时,对部分数组元素赋初值 例如:例如:int a5=1,2,3;系统为其余元素赋系统为其余元素赋 0。3当初值的个数多于数组元素的个数时,编译出错当初值的个数多于数组元素的个数时,编译出错 例如:例如:int a5=0,1,2,3,4,5;2022-12-1513【例例6.16.1】将将1010个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。#define N 10#include void main()int i;float scoreN;fo
8、r(i=0;i=0;i-)printf(%6.1f,scorei);printf(n);运行情况如下:运行情况如下:67 74 89 92 34 67 83 95 73 78 78.0 73.0 95.0 83.0 67.0 34.0 92.0 89.0 74.0 67.0scanf(“%f”,score+i);2022-12-1514l求最大求最大/小值采用打擂台的方法。小值采用打擂台的方法。l定义一维数组定义一维数组a,a,读入被比较的数。读入被比较的数。l定义变量定义变量 max:max:存放最大值,存放最大值,minmin:存放最小值存放最小值 k k:存放最大值下标存放最大值下标 ,
9、j j:存放最小值下标存放最小值下标l各数依次与擂主进行比较,各数依次与擂主进行比较,若若aai imax max 则则:maxmax=a=ai i;k k=i i;若若aai imin min 则则:minmin=a=ai i;j=;j=i i;l当所有的数都比较完之后,当所有的数都比较完之后,将将aj=aj=maxmax;aak k=minmin;l输出输出a a数组。数组。2022-12-1515程序运行情况如下:程序运行情况如下:5 7 2 3 1 5 1 2 3 72022-12-1516程序运行情况如下:程序运行情况如下:5 7 2 3 1 5 1 2 3 7如果只要求出它们的最如
10、果只要求出它们的最大值和最小值和平均值,大值和最小值和平均值,程序如何修改?程序如何修改?2022-12-15172022-12-1518第一趟排序第一趟排序(通过两两比较将最大的数放到最后通过两两比较将最大的数放到最后)情况如下:情况如下:3 7 5 6 8 0第一次第一次 3和和7比较,不交换比较,不交换 3 7 5 6 8 0第二次第二次 7和和5比较,交换比较,交换 3 5 7 6 8 0第三次第三次 7和和6比较,交换比较,交换 3 5 6 7 8 0第四次第四次 7和和8比较,不交换比较,不交换 3 5 6 7 8 0第五次第五次 8和和0比较,交换比较,交换 3 5 6 7 0
11、8在第一趟排序中,从前向后两两比较,在第一趟排序中,从前向后两两比较,6个数比个数比较了较了5次次,把,把6个数中的最大数个数中的最大数8排在了最后。排在了最后。2022-12-15192022-12-1520冒泡法排序遵循两个规律:冒泡法排序遵循两个规律:(1)外循环控制趟数)外循环控制趟数j:n个数,需要个数,需要n-1趟,趟,j的范围的范围1,n-1(或(或0,n-2)(2)内循环完成两两比较:在)内循环完成两两比较:在0,n-1-j(或(或0,n-2-j)范围内,从第范围内,从第1个数开始,相邻的两个数比较个数开始,相邻的两个数比较2022-12-1521 冒泡法排序冒泡法排序for(
12、i=0;iN;i+)输入输入ai for(j=1;jN;j+)for(i=0;iai+1 T F ai与与ai+1交换交换输出输出a0aN-12022-12-1522 int aN;int i,j,t,n;printf(“请输入请输入%d个整数个整数,用空格隔开用空格隔开n”,n);for(i=0;in;i+)scanf(%d,&ai);for(j=1;j=n-1;j+)/*控制控制趟数趟数*/for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;printf(“从小到大的排序结果从小到大的排序结果:n);for(i=0;in;i+)printf(%4d,ai);printf(“
13、n”);程序运行情况如下:程序运行情况如下:请输入请输入6个整数个整数,用空格隔开用空格隔开3 7 5 6 8 0 0 3 5 6 7 82022-12-1523以以6个数:个数:3、7、5、6、8、0为例。为例。思路:思路:第一趟:第一趟:将第一个数将第一个数依次和后面的数比较,如依次和后面的数比较,如果后面的某数小于果后面的某数小于第一个数第一个数,则两个数,则两个数交换交换,比较,比较结束后,结束后,第一个数第一个数则是则是最小最小的数。的数。第二趟:第二趟:将将第二个数第二个数依次和后面的数比较,如依次和后面的数比较,如果后面的某数小于果后面的某数小于第二个数第二个数,则两个数,则两个
14、数交换交换,比较,比较结束后,结束后,第二个数第二个数则是则是次小次小的数;的数;。2022-12-1524 交换法排序for(i=0;iN;i+)输入输入ai for(j=0;jN-1;j+)for(i=j+1;iai T F aj与与ai交换交换 输出输出a0aN-12022-12-1525for(j=0;jN-1;j+)/*确定趟数确定趟数*/for(i=j+1;iai)t=aj;aj=ai;ai=t;程序运行情况如下:程序运行情况如下:96 78 65 86 40 The sorted numbers:40 65 78 86 962022-12-1526以以6个数:个数:3、7、5、6
15、、8、0为例。为例。思路:思路:第一趟:第一趟:通过比较找出通过比较找出6 6个数中最小数的个数中最小数的下标下标,然后将这个最小数与第然后将这个最小数与第1 1个数比较,如果不相等,则个数比较,如果不相等,则交换。交换。则第则第1 1个数是最小的个数是最小的。第二趟:第二趟:通过比较找出后面通过比较找出后面5 5个数中最小数的个数中最小数的下下标标,然后将这个最小数与第,然后将这个最小数与第2 2个数比较,如果不相等,个数比较,如果不相等,则交换。则交换。则第则第2 2个数是次小的个数是次小的。2022-12-1527for(j=0;jN-1;j+)/*确定趟数确定趟数*/min=j;/*每趟最小值位置的初值每趟最小值位置的初值*/for(i=j+1;iai)min=i;if(j!=min)t=aj;aj=amin;amin=t;程序运行情况如下:程序运行情况如下:96 78 65 86 40 The sorted numbers:40 65 78 86 962022-12-1528