版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章数组哈尔滨工业大学计算机科学与技术学院苏小红
sxh@
第8章数组哈尔滨工业大学本章学习内容对数组名特殊含义的理解数组类型,数组的定义和初始化向函数传递一维数组和二维数组排序、查找、求最大最小值等常用算法本章学习内容对数组名特殊含义的理解为什么使用数组(Array)?【例8.1】要读入5人的成绩,然后求平均成绩需定义5个不同名整型变量,需要使用多个scanf()
intscore1,score2,score3,score4,score5;
scanf("%d",&score1); scanf("%d",&score2);......而用数组,可共用一个scanf()并利用循环语句读取
intscore[5],i; for(i=0;i<5;i++){scanf("%d",&score[i]);
}保存大量同类型的相关数据为什么使用数组(Array)?【例8.1】要读入5人的成绩,8.1一维数组的定义和初始化
一维数组的定义
存储类型数据类型数组名[整数1][整数2]……[整数n];a[4]a[3]a[2]a[1]a[0]数组首地址inta[5];定义一个有5个int型元素的数组系统在内存分配连续的5个int空间给此数组直接对a的访问,就是访问此数组的首地址基类型下标从0开始8.1一维数组的定义和初始化一维数组的定义a[4]a[3]8.1一维数组的定义和初始化a[4]a[3]a[2]a[1]a[0]inta[5];数组大小必须是值为正的常量,不能为变量一旦定义,不能改变大小数组大小最好用宏来定义,以适应未来可能的变化 #define
SIZE5 inta[SIZE];
一维数组的定义
存储类型数据类型数组名[整数1][整数2]……[整数n];8.1一维数组的定义和初始化a[4]a[3]a[2]a[18.1一维数组的定义和初始化数组定义后的初值仍然是随机数一般需要进行初始化
inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};8.1一维数组的定义和初始化数组定义后的初值仍然是随机数8.1一维数组的定义和初始化数组的引用数组名
[下标]数组下标(index)都是从0开始使用a[0]、a[1]、a[2]、a[3]、a[4]这样的形式访问每个元素下标既可是常量,也可是整型表达式,允许快速随机访问,如a[i]可以像使用普通变量一样使用它们8.1一维数组的定义和初始化数组的引用如何使两个数组的值相等?main(){inta[5]={1,2,3,4,5},b[5];
b=a;
}解决方法方法1:逐个元素赋值
b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];方法2:通过循环赋值
inti;for(i=0;i<5;i++){
b[i]=a[i];}原因:数组名表示数组的首地址,其值不可改变!如何使两个数组的值相等?main()解决方法原因:8.1一维数组的定义和初始化【例8.2】编程实现显示用户输入的月份(不包括闰年的月份)拥有的天数8.1一维数组的定义和初始化【例8.2】编程实现显示用户输入8.1一维数组的定义和初始化下标越界是大忌!编译程序不检查是否越界下标越界,将访问数组以外的空间那里的数据是未知的,不受我们掌控,可能带来严重后果8.1一维数组的定义和初始化下标越界是大忌!b[0]b[1]b[2]b[3]b[4]caib[8]【例8.3】当下标值小于0或超过数组长度时
会出现什么情况?运行程序或单步执行观察变量变化情况可以看到,变量c和a的值因数组越界而被悄悄破坏了1234560784044484c5054585c6064686c#include<stdio.h>intmain(){inta=1,c=2,b[5]={0},i;
printf("%p,%p,%p\n",b,&c,&a);
for(i=0;i<=8;i++){b[i]=i;printf("%d",b[i]);}printf("\nc=%d,a=%d,i=%d\n",c,a,i);return0;}
9b[0]b[1]b[2]b[3]b[4]ca8.2二维数组的定义和初始化一维数组用一个下标确定各元素在数组中的顺序可用排列成一行的元素组来表示如inta[5];二维数组用两个下标确定各元素在数组中的顺序可用排列成i行、j列的元素组来表示如intb[2][3];n维数组用n个下标来确定各元素在数组中的顺序如intc[3][2][4];n≥3时,n维数组无法在平面上表示其各元素的位置a[0]a[1]a[2]a[3]a[4]b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]8.2二维数组的定义和初始化一维数组a[0]a[1]a[2]【例】以下程序的运行结果是什么?intmain(){inta[][3]={{1,2,3},{4,5},{6},{0}};printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);return0;}123450600000结果:5,0,0【例】若inta[][3]={1,2,3,4,5,6,7},则a数组的第一维大小是多少?
123456700二维数组的初始化【例】以下程序的运行结果是什么?123结果:5,数组的数据类型和存储类型根据数组的数据类型,为每一元素安排相同长度的存储单元根据数组的存储类型,将其安排在内存的动态存储区、静态存储区或寄存器区用sizeof(a)来获得数组a所占字节数short数组的数据类型和存储类型根据数组的数据类型,为每一元素安排相shortinta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放先顺序存放第0行元素,再存放第1行元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]需知道数组每行列数才能从起始地址开始正确读出数组元素二维数组的存储结构shortinta[2][3];a[0]a[1]a[1二维数组实例【例8.4】从键盘输入某年某月(包括闰年),编程输出该年的该月拥有的天数二维数组实例【例8.4】从键盘输入某年某月(包括闰年)
8.3向函数传递一维数组传递整个数组给另一个函数,可将数组的首地址作为参数传过去用数组名作函数参数只复制一个地址自然比复制全部数据效率高由于首地址相同,故实参数组与形参数组占用同一段内存在该函数内,不仅可以读这个数组的元素,还可以修改它们8.3向函数传递一维数组传递整个数组给另一个函数,可将数简单变量和数组作函数参数的区别简单变量和数组作函数参数的区别【例8.5】计算平均分计数控制的循环【例8.5】计算平均分计数控制的循环【例8.5】计算平均分计数控制的循环returnn>0?sum/n:-1;更安全
【例8.5】计算平均分计数控制的循环returnn>0【例8.6】计算平均分
当输入负值时,表示输入结束标记控制的循环——负值作为输入结束标记【例8.6】计算平均分
当输入负值时,表示输入结束标记控【例8.6】计算平均分
当输入负值时,表示输入结束标记控制的循环——负值作为输入结束标记【例8.6】计算平均分
当输入负值时,表示输入结束标记控【例8.7】计算最高分#include<stdio.h>#defineN40intReadScore(intscore[]);intFindMax(intscore[],intn);intmain(){ intscore[N],max,n;
n=ReadScore(score); printf("Totalstudentsare%d\n",n); max=FindMax(score,n);
printf("Thehighestscoreis%d\n",max);
return0;}【例8.7】计算最高分#include<stdio.h>max(i=0)max(i=2)max(i=3)计算最大值算法max(i=0)max(i=2)max(i=3)计算最大值算假设其中的一个学生成绩为最高
maxScore=score[0]; 对所有学生成绩进行比较,即
for(i=1;i<n;i++){
若score[i]>maxScore 则修改maxScore值为score[i]
}打印最高分maxScore【例8.7】计算最高分假设其中的一个学生成绩为最高【例8.7】计算最高分【例8.7】计算最高分【例8.7】计算最高分8.4排序和查找排序(Sorting)算法交换法排序选择法排序8.4排序和查找排序(Sorting)算法交换法排序交换法排序交换法排序交换法排序【例8.8】交换法从高到低排序交换法排序
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(score[j]>score[i])
"交换成绩score[j]和score[i]"
}}【例8.8】交换法从高到低排序交换法排序如何实现两数交换?temp=score[j];score[j]=score[i];score[i]=temp;
tempscore[j]score[i]?7050705070如何实现两数交换?temp=score[j];temps【例8.8】交换法从高到低排序voidDataSort(intscore[],intn)/*交换法排序*/{ inti,j,temp; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { if(score[j]>score[i])/*从高到低*/ {
temp=score[j]; score[j]=score[i]; score[i]=temp; } } }}【例8.8】交换法从高到低排序voidDataSort(i选择法排序k=1k=2k=0k=1选择法排序k=1k=2k=0k=1选择法排序k=3k=4k=3k=4选择法排序k=3k=4k=3k=4选择法排序选择法排序
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++){
if(score[j]>score[k])
记录此轮比较中最高分的元素下标k=j;
}
若k中记录的最大数不在位置i,则
"交换成绩score[k]和score[i]",
"交换学号num[k]和num[i]";
}选择法排序选择法排序voidDataSort(intscore[],longnum[],intn)/*选择法*/{
inti,j,k,temp1;
longtemp2;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){if(score[j]>score[k]){k=j;/*记录最大数下标位置*/}}if(k!=i)/*若最大数不在下标位置i*/{ temp1=score[k];score[k]=score[i]; score[i]=temp1;
temp2=num[k];num[k]=num[i];num[i]=temp2;}}}voidDataSort(intscore[],lon【例8.8】成绩从高到低顺序【例8.8】成绩从高到低顺序8.4排序和查找查找(Searching)算法顺序查找折半查找8.4排序和查找查找(Searching)算法【例8.10】顺序查找学号intLinSearch(longnum[],longx,intn){
inti;
for(i=0;i<n;i++){
if(num[i]==x){
returni;}}
return-1;}哈,找到了!事先不必排序【例8.10】顺序查找学号intLinSearch(lo【例8.11】折半查找学号哈,找到了!按升序排序1012210124101261012810130【例8.11】折半查找学号哈,找到了!按升序排序10122【例8.11】折半查找学号唉,没找到!1012210124101261012810130【例8.11】折半查找学号唉,没找到!101221012intBinSearch(long
num[],longx,intn){
intlow,high,mid; low=0; high=n-1;
while(low<=high) { mid=(high+low)/2;
if(x>num[mid]) { low=mid+1; }
else
if(x<num[mid]) { high=mid-1; }
else
{
returnmid; } }
return-1;}找到时返回下标位置找不到时返回-1若未按学号排序,则如何修改程序?intBinSearch(longnum[],lonvoidDataSort(intscore[],longnum[],intn)/*选择法*/{
inti,j,k,temp1;longtemp2;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){if(num[j]<num[k]){k=j;/*记录最大数下标位置*/}}if(k!=i)/*若最大数不在下标位置i*/{temp1=score[k];score[k]=score[i];score[i]=temp1;temp2=num[k];num[k]=num[i];num[i]=temp2;}}}按学号由小到大排序voidDataSort(intscore[],lon8.5向函数传递二维数组a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]实际传送的是数组第一个元素的地址shorta[2][3];8.5向函数传递二维数组a[0][0]a[1][1]a[0]8.5向函数传递二维数组在声明二维数组形参时,不能省略数组第二维的长度(列数),为什么?想想数组在内存中是如何分布的?元素a[i][j]在数组a中的位置是:i*N+j
元素地址:首地址+偏移量a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]实际传
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年心电遥测仪行业市场营销创新战略制定与实施分析研究报告
- 企业2025年数据安全应急演练合同
- 杨浦区2025-2026学年第二学期期末考试六年级数学学试卷及答案(上海新教材沪教版)
- 2025年中国烟草总公司海南省公司招聘考试真题
- 2007年浙江省金华市中考数学试卷【含答案】
- 大型企业员工培训计划制定与执行策略手册
- 建筑公司员工年度工作总结
- 小王子读书笔记(15篇)
- 绿色地球我们共同的责任:小学主题班会课件
- 2026大数据库面试题及答案
- 2026重庆巴南区招聘辅警100人笔试参考题库及答案解析(完整版)
- 2026年新疆第二 师铁门关市高校毕业生“三支一扶”计划招募(251人)考试备考试题及答案详解
- 2026年公文写作考试题库(含参考答案)
- 不同年龄段患者雾化吸入护理技巧
- 2026年贵州铝业集团第二次公开招聘考试模拟试题及答案详解
- 2026浙江丽水缙云县国有企业招聘工作人员43人笔试备考试题及答案详解
- 2026年无人机驾驶证通关题库及答案详解(典优)
- (2026年)萍乡市莲花县辅警考试公安基础知识考试真题库及参考答案
- 铝合金牺牲阳极的国家标准与行业规范
- 2026年高中政治教师招聘经典试题及答案
- 3-4、HJ 75-2017 固定污染源烟气(SO2、NOX、颗粒物)排放连续监测技术规范【现行】
评论
0/150
提交评论