81数组.docx
《81数组.docx》由会员分享,可在线阅读,更多相关《81数组.docx(10页珍藏版)》请在冰豆网上搜索。
![81数组.docx](https://file1.bdocx.com/fileroot1/2023-2/7/0dbb3acc-d071-4625-b00d-2c582098331b/0dbb3acc-d071-4625-b00d-2c582098331b1.gif)
81数组
第七章数组(一维数组)
一、一维数组的定义
变量定义的格式:
类型说明符变量名;inta;
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。
这些按序排列的同类数据元素的集合称为数组。
数组定义的格式:
类型说明符数组名[常量表达式];
例:
inta[10];
它表示定义了一个整型数组,数组名为a,此数组有10个元素。
说明:
1.类型说明符:
表明该数组所属类型,即数组元素的类型。
(例:
学生成绩都是0~100的整数,所以定义为整型)
2.数组名:
数组名的命名规则和变量名相同,遵循标识符命名规则。
3.[]:
下标运算符,可通过该运算符的个数反映出数组的维数
(必须为中括号,其他符号都是错误的)
4.常量表达式:
表示元素的个数,即数组长度。
例如:
指定a[5],表示a数组有5个元素。
注意:
下标是从0开始的,这5个元素是:
a[0],a[1],a[2],a[3],a[4]。
请特别注意,按上面的定义,不存在数组元素a[5]。
intj,a[5];
j=a[0];
5.常量表达式:
常量表达式中可以包括常量和符号常量,不能包含变量。
如下面的例子,是不行的。
例:
intn;
scanf(“%d\n”,&n);/*在程序中临时输入数组的大小*/
inta[‘A’];
二、一维数组元素的引用
1.引用方式:
数组名[下标]
2.说明:
下标为整型常量或整型表达式。
3.注意:
定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”的区别:
inta[10];/*定义数组长度为10*/
t=a[6];/*引用a数组中序号为6的元素,此时6不代表数组长度*/
4.一维数组元素引用的规定:
(1)数组必须先定义后使用
(2)数组元素只能逐个被引用,不能一次引用整个数组
(3)对数组中所有元素逐个引用时,通常可使用循环结构
例:
#include
main()
{
inti,a[10];
for(i=0;i<=9;i++)
a[i]=i;
for(i=9;i>=0;i--)
printf(“%d”,a[i]);
}
结果为:
9876543210
程序使a[0]~a[9]的值为0~9,然后按逆序输出。
三、一维数组的初始化
数组的初始化:
指定义数组时,对数组元素赋以初值
格式:
类型符数组名[表达式]={初值表};
说明:
1.在定义数组时给数组的全部元素赋初值
例:
inta[10]={0,1,2,3,4,5,6,7,8,9};
2.可以只给一部分元素赋初值
例:
inta[10]={0,1,2,3,4};/*定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素为0*/
3.给全部元素赋初值时,可不指定数组的长度
例:
inta[]={0,1,2,3,4,5,6,7,8,9};
四、一维数组程序举例
如果一对兔子每月能生一对小兔(一雄一雌),而每对小兔
在它出生后的第三个月里,又能开始生一对小兔,假定在
不发生死亡的情況下,由一对出生的小兔开始,10个月后会有
多少对兔子?
时间(月)
初生兔子(对)
成熟兔子(对)
兔子总数(对)
1
1
0
1
2
0
1
1
3
1
1
2
4
1
2
3
5
2
3
5
6
3
5
8
7
5
8
13
8
8
13
21
9
13
21
34
10
21
34
55
#include
main()
{
inti;
intf[10]={1,1};
for(i=2;i<10;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<10;i++)
{
if(i%5==0)printf(“\n”);
printf(“%12d”,f[i]);
}
printf(“\n”);
}
五、一维数组经典算法
(一)冒泡法排序(每年的上机、笔试题都考)
用冒泡法对10个数排序
t
借助中间变量t来交换两个变量的值
8
7
4
6
3
2
9
1
5
0
7
4
6
3
2
8
1
5
0
9
4
6
3
2
7
1
5
0
8
9
4
3
2
6
1
5
0
7
8
9
3
2
4
1
5
0
6
7
8
9
…………
0
1
2
3
4
5
6
7
8
9
#include
#defineN10
voidsort(inta[],intn);
main()
{
inta[N],i;
printf(“请输入十个数:
\n”);
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
sort(a,10);
printf(“\n”);
printf(“排序以后的结果为:
\n”);
for(i=0;i<10;i++)
printf(“%d”,a[i]);
}
voidsort(inta[],intn)/*n表示元素个数*/
{
inti,j,t;/*主要是为了调换,所以t应该与数组元素的类型相一致*/
for(j=0;jfor(i=0;iif(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
排序过程:
1.比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;以此类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被放在最后一个元素位置上。
2.对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在地n-1个元素位置上。
3.重复上述过程,共经过n-1趟冒泡排序后,排序结束。
(二)选择法排序(通常考程序填空题)
用选择法对6个数排序
22
44
11
55
33
66
#include
main()
{
inta[6],i,j,k,x;
printf(“请输入6个整数:
\n”);
for(i=0;i<6;i++)
scanf(“%d”,&a[i]);
for(i=0;i<5;i++)
{
k=i;
for(j=i+1;j<6;j++)
if(a[j]if(i!
=k)
{
x=a[i];
a[i]=a[k];
a[k]=x;
}
}
printf(“排序后的结果为:
\n”);
for(i=0;i<6;i++)
printf(“%d”,a[i]);
}
排序过程:
1.首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换——第一趟选择排序,结果最小的数被安置在第一个元素位置上。
2.再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第一个数交换——第二趟选择排序。
3.重复上述过程,共经过n-1趟排序后,排序结束。
(三)在一个有序的一维数组中插入一个元素,保证有序。
步骤:
1.定位,在数组中找到该元素应该在的位置
2.找到的位置,就是要插入元素应该在的位置,此时,应该将每个元素向后移动,将元素向后移动时,应该注意要从后向前,将每个元素依次向后移动
3.插入
#include
#defineN10
voidinsert(inta[],intk);/*声明函数,该函数是以数组名作参数,k表示要插入的值*/
main()
{
inta[N]={1,5,8,12,15,23,27,29},i,k;/*将数组初始化时只存入8个值,由于要插入元素,所以原数组内必须要有剩余空间*/
printf(“请输入要插入的元素:
\n”);
scanf(“%d”,&k);
insert(a,k);/*调用插入的函数,注意实参是数组名*/
for(i=0;a[i]!
=0;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
voidinsert(inta[],intk)
{
inti,j;
for(i=0;a[i]!
=0;i++)/*定位,将i停在第一个大于k的位置上*/
if(a[i]>k)
break;
for(j=0;a[j]!
=0;j++)/*将j指到数组的最后,也就是第一个内容为0的元素上*/
for(;j>i;j--)
a[j]=a[j-1];/*将每个元素依次向后移动*/
a[i]=k;
}
(二)在一个数组中删除给定的元素
步骤:
1.地位,找到与要删除元素相同的地址
2.将其后的每个元素向前移动,将之覆盖
#include
#defineN10
voiddelete(inta[],intk);
main()
{
inta[N]={1,5,8,12,15,23,27,29},i,k;
printf(“请输入要删除的元素:
\n”);
scanf(“%d”,&k);
delete(a,k);
for(i=0;a[i]!
=0;i++)
printf(“%d”,a[i]);
printf(“\n”);
}
voiddelete(inta[],intk)
{
inti;
for(i=0;a[i]!
=0;i++)
if(a[i]==k)
break;
for(;a[i]!
=0;i++)
a[i]=a[i+1];
}