第7章 数组.docx
- 文档编号:8455893
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:27
- 大小:106.86KB
第7章 数组.docx
《第7章 数组.docx》由会员分享,可在线阅读,更多相关《第7章 数组.docx(27页珍藏版)》请在冰豆网上搜索。
第7章数组
第7章数组(Arrays)
【计划课时】授课6课时+上机4课时
7.1一维数组的定义和引用
7.1.1一维数组的定义
同变量一样,数组也必须先定义,后使用。
定义内容:
·数组名(同变量名:
字母、下划线、数字;字母或下划线开头;长度≤32)
·类型(存储属性/数据类型)
·大小(维数/元素个数)
定义的一般形式:
存储属性数据类型数组名[常量表达式][常量表达式]…
[]中为数组长度,用于规定数组元素最大个数;
【注意】数组长度必须是常量表达式——常量或符号常量,其值必须为正,不能为变量。
错误:
正确:
intn=5;#defineN5
inta[n];inta[N];
正确:
inta[10],b[5][4];
charname[8],ch[2][3];
staticfloatx[8*2+1],table[2][3][4];
#defineNUM40;
inta[NUM],b[NUM+2];
7.1.2一维数组元素的引用
常量表达式表示元素的个数,即数组长度.例如在a[5]中,5表示该数组有5个元素,下标从0开始,这5个元素是a[0],a[1],a[2],a[3],a[4].注意不能使用数组元素a[5].
相同类型的数组或变量可以在一个类型说明符下一起说明,互相之间用逗号隔开.例如:
inta[5],b[10],i;
数组元素只能逐个引用而不能一次引用整个数组
引用数组元素要注意下标不要出界(编译程序不检查是否“出界”)。
讨论:
如果下标值小于0或超过数组长度时会出现什么情况?
例:
main()
{
inta=1,b[5],c=2,i;
for(i=0;i<=5;i++)
b[i]=i;
printf(“%d,%d\n”,a,c);
}
运行程序或单步执行观察变量变化情况可以看到,变量c的值因数组越界被破坏了。
比较:
错误正确
(1)inta[3];inta[3]={1,2,3};
a[3]={1,2,3};或inta[]={1,2,3};
a={1,2,3};或inta[3];a[0]=1,a[1]=2,a[2]=3;
(2)intn;inta[5];
scanf(“%d”,&n);for(i=0;i<5;i++)
inta[n];printf(“%d\n”,a[i]);
定义时不可用变量作下标引用时可以用整型变量及表达式作下标
数组长度必须是整型常量及其表达式,不得为变量,而数组元素下标可以是变量!
7.1.3一维数组的初始化
可以在程序运行后用赋值语句或输入语句使数组中的元素得到值,也可以使数组在程序运行之前(即编译阶段)就得到初值,后者称为数组的初始化。
对数组元素的初始化可以用以下方法实现:
1.在定义数组时对数组元素赋以初值,如:
ints[5]={78,87,77,91,60};
2.也可以只给一部分元素赋值。
例如:
ints[5]={78,87,77};
其结果是:
s[0]=78,s[1]=87,s[2]=77,s[3]=0,s[4]=0,即花括号内的值只赋给了数组的前几个元素,后几个元素的值为0。
3.如果想使一个数组中全部元素值为0,可写成:
ints[5]={0,0,0,0,0};或ints[5]={0};
不能写成:
ints[5]={0*10};(不能给数组整体赋初值)
4.若对全部数组元素赋初值时,可以不指定数组长度。
例如:
ints[5]={1,2,3,4,5};可以写成:
ints[]={1,2,3,4,5};(系统自动定义数组长度为5)
但若被定义的数组长度与提供的初值的个数不等,则数组长度不能省略.如想定义数组长度为10,而初值只有5个,则数组长度不能省略,必须写成:
inta[10]={1,2,3,4,5};
5.一维数组元素是按下标递增的顺序连续存放的,即数组占有连续的存贮空间。
如a数组在内存中的存贮示意如图所示。
a[0]
a[1]
a[2]
a[3]
a[4]
7.1.4一维数组的程序举例
与数值数组有关的常用算法
·排序:
起泡法/选择法/插入法
·查找:
顺序查找法/折半查找法
1、常用排序算法
①起泡法(冒泡法/气泡法)P124
有n个杂乱无序的数,要求将这n个数从小到大(或从大到小)排序后输出。
【例一】设n=5。
排序示意图如下:
第1轮(i=1)
○○○○○
比4次
第2轮(i=2)
○○○○○
比3次
第3轮(i=3)
○○○○○
比2次
第4轮(i=4)
○○○○○
比1次
共需进行n-1=4轮
从第1个开始,两两比较,大者交换到后面(右边)。
每轮从第1个比到第n-i个
这种排序方法之所以叫“冒泡法”,是因为在排序过程中,较小的数象气泡一样逐渐往前冒(向上冒),大的数逐渐向后沉,最终完成排序。
流程图和程序如下:
#defineN5
main()
{
inti,j,t,a[N+1];
for(i=1;i<=N;i++)
scanf("%d",&a[i]);
for(i=1;i<=N-1;i++)
for(j=1;j<=N-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=1;i<=N;i++)
printf("%d",a[i]);
}
②选择法
从算法优化的角度对“冒泡法”进行改进。
冒泡法每一轮都要将数组中的数两两比较,并根据大小交换之——效率低。
选择法改进处:
两两比较后并不马上交换,而是找到最小数后记下其下标。
在一轮比较完毕后,再将最小的数一次交换到位。
——比较次数不变,交换次数减少。
流程图如下:
程序如下:
(设要求排序的数列为5,10,-7,3,7共5个数,要求升序排列)
法1:
从左到右依次从小到大排放
#defineN5
main()
{inti,j,t,p,a[N+1]={0,5,10,-7,3,7};
for(i=1;i<=N-1;i++)
{p=i;
for(j=i+1;j<=N;j++)
if(a[p]>a[j])p=j;/*<号为降序*/
if(p!
=i)
{t=a[p];a[p]=a[i];a[i]=t;}
}
for(i=1;i<=N;i++)
printf("%d",a[i]);
printf("\n");
}
法2:
从右到左依次从大到小排放
#defineN5
main()
{inti,j,t,p,a[N+1]={0,5,10,-7,3,7};
for(i=1;i<=N-1;i++)
{p=N-i+1;
for(j=1;j<=N-i;j++)
if(a[j]>a[p])p=j;/*<号为降序*/
if(p!
=N-i+1)
{t=a[p];a[p]=a[N-i+1];a[N-i+1]=t;}
}
for(i=1;i<=N;i++)
printf("%d,",a[i]);
printf("\n");
}
③插入法
如果有N个元素,也是要比较N-1轮,但每轮取第i个(i从1开始)元素的值为暂存值m,然后与左边的各数(从j=i-1开始)比较一直到左边第一个(j=0)为止。
如果m比左边大,就让左边的值右移,最后将该轮的第i个数插到左边的合适位置(如果它比较大的话)。
注意:
第一轮后,左边的数总是从大到小排列的,只有当第i个数大于左边的数时,才会发生交换。
main()
{inta[5]={4,7,2,5,1};
inti,j,m;
for(i=1;i<5;i++)
{m=a[i];
j=i-1;
while(j>=0&&m>a[j])
{a[j+1]=a[j];
j--;
}
a[j+1]=m;
}
for(i=0;i<5;i++)
printf("%d",a[i]);
printf("\n");
}
结果:
75421(插入排序——降序)
【讨论】如果要求升序(结果为12457)呢?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 数组