




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章1第1页掌握一维、二维数组定义和引用方法、存放结构和初始化方法。数组作为函数参数排序和查找算法
本章关键点第2页数组概念—概念引入用基本数据类型能够处理全部问题吗?比如:对某班学生成绩按由高到底次序进行排序。
3名?
30名?floatx,y,z;floata,b,c,d,e,f…;第3页数组是一组有序同类型数据。数据称为数组元素。数组第4页保留大量同类型相关数据如矩阵运算,表格数据等
数组用处快速地随机访问一旦定义,不能改变大小数组特点第5页数组(Array)定义定义
存放类型
数据类型数组名[整数1][整数2]……[整数n];a[9]a[8]a[7]a[1]a[0]…数组首地址inta[10];定义一个有10个int型元素数组系统会在内存分配连续10个int空间给此数组直接对a访问,就是访问此数组首地址第6页数组(Array)定义定义
存放类型
数据类型数组名[整数1][整数2]……[整数n];a[9]a[8]a[7]a[1]a[0]…inta[10];数组大小必须是常量表示式(常量或符号常量),其值必须为正,不能为变量。数组一旦定义,不能改变大小数组大小最好用宏来定义,以适应未来可能改变#define
SIZE10inta[SIZE];第7页一维数组和多维数组一维数组用一个下标确定各元素在数组中次序可用排列成一行元素组来表示如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页#include<stdio.h>voidmain(){
inti,j;
floatx[20],y,z;
inta[97.8];……
x[i+j*2]=i+j;z=x[y*2];printf("%f",x[0]);printf("%f",x[20]);scanf("%f",&x);scanf("%f",&x[3]);printf("%f",x);
floaty[20];y=x;y[10]=x[10];}下标表示式值必须是一个整数下标表示式值应大于等于0小于数组大小定义数组大小必须是一个正整数常量数组不能作为一个整体直接输入输出,用元素数组不能作为一个整体相赋值,用元素第9页普通方法
比如:inta[10]={0,1,2,3,4,5,6,7,8,9};
等价于a[0]=0a[1]=1a[2]=2…a[9]=9初始化部分元素
比如:inta[10]={0,1,2,3};当全部赋初值时,能够省略数组下标变量大小
比如:inta[]={1,2,3,4,5}即a[5]所赋初值元素从数组第0个元素开始,无赋初值元素均为0{0,1,2,3,0,0,0,0,0,0}一维数组初始化{}不能省略第10页分行给二维数组赋初值比如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};全部数据写在一个{}内,按存放次序依次赋值比如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};能够对部分元素赋初值
比如:inta[3][4]={{1},{0,6},{0,0,11}};依据给定初值,系统自动定行数
比如:inta[][3]={{1},{2},{3,4,5}};即a[3][3]
staticinta[][3]={1,2,3,4,5,6};注意:此时只能省略第1维值。C依据初始化数据数量,自动确定第1维大小10000600
00110注意外面{}不能省略
100200345二维数组初始化
12345612345678
9101112第11页【例一】以下程序运行结果是什么?main(){inta[][3]={{1,2,3},{4,5},{6},{0}};printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);}123450600000结果:5,0,0【例二】若inta[][3]={1,2,3,4,5,6,7},则a数组第一维大小是多少?
123456700二维数组初始化示例第12页数组存放结构依据数组数据类型,为每一元素安排相同长度存放单元依据数组存放类型,将其安排在内存动态、静态存放区或存放器区用sizeof(a)来取得数组a所占字节数short第13页二维数组存放结构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]需要知道数组每一行有多少列,这么从起始地址开始,才能正确读出数组元素第14页数组引用数组名[下标1][下标2]……[下标n]下标都是从0开始,养成从0开始查数职业病使用a[0]、a[1]、a[2]、……、a[9]这么形式访问每个元素数组下标(index)既能够是常量,也能够是整型表示式,允许快速地随机访问,如a[i]能够像使用普通变量一样使用它们第15页数组定义使用注意事项:数组名命名规则与变量名相同数组名后只能用方括号括起常量表示式,不能使用圆括号常量表示式表示元素个数,即数组长度常量表示式中不能包含变量数组说明必须在可执行语句之前只能逐一引用数组元素,不能一次引用整个数组下标都是从0开始下标越界是大忌!编译程序不检验是否越界,下标越界,将访问数组以外空间可能带来严重后果比如:floatmark(100);×定义:类型说明符数组名[常量表示式]
使用:数组名[下标]第16页怎样使两个数组值相等main(){inta[4]={1,2,3,4},b[4];
b=a;
}处理方法法1:逐一元素赋值
b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];法2:经过循环赋值
inti;for(i=0;i<4;i++){
b[i]=a[i];}原因:数组名表示数组首地址,其值不可改变!第17页怎样使两个数组值相等怎样使两个二维数组值相等?经过双重循环赋值
inta[4][2]={1,2,3,4,5,6,7,8};intb[4][2];inti,j;for(i=0;i<4;i++){for(j=0;j<2;j++){
b[i][j]=a[i][j];}}第18页输入方法:inta[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);数组输入和输出一维数组只能逐一对数组元素进行操作(字符数组例外)第19页二维数组使用双重循环
inta[4][2];inti,j;for(i=0;i<4;i++){for(j=0;j<2;j++){
scanf("%d",&a[i][j]);}}数组输入和输出第20页max(i=0)max(i=2)max(i=3)计算最大值算法01234第21页例—打印最高分从键盘输入学生人数n;从键盘输入全部学生学号和成绩分别存入数组num和score假设其中第一个学生成绩为最高
maxScore=score[0]; 对全部学生成绩进行比较,即
for(i=1;i<n;i++){
若score[i]>maxScore
则修改maxScore值为score[i]
}打印最高分maxScore第22页......main(){ ......
for(i=0;i<n;i++) { scanf("%ld%f",&num[i],&score[i]); }
maxScore=score[0];
for(i=1;i<n;i++) {
if(score[i]>maxScore) {
maxScore=score[i];
} } printf("maxScore=%.0f\n",maxScore);}例—打印最高分第23页......main(){ ......
for(i=0;i<n;i++) { scanf("%ld%f",&num[i],&score[i]); }
maxScore=score[0];
maxNum=num[0];
for(i=1;i<n;i++) {
if(score[i]>maxScore) {
maxScore=score[i];
maxNum=num[i];
} } printf("maxScore=%.0f,maxNum=
%ld\n",maxScore,
maxNum);}例—打印最高分
及其学生序号用函数实现?第24页......main(){ ......
for(i=0;i<n;i++) { scanf("%ld%f",&num[i],&score[i]); } maxScore=score[0];
maxNum=num[0];
for(i=1;i<n;i++) {
if(score[i]>maxScore) { maxScore=score[i];
maxNum=num[i];
} } printf("maxScore=%.0f,maxNum=
%ld\n",maxScore,
maxNum);}例—打印最高分
及其学生序号确定函数
入口和出口?第25页......main(){ ......
for(i=0;i<n;i++) { scanf("%ld%f",&num[i],&score[i]); } maxScore=score[0];
maxNum=num[0];
for(i=1;i<n;i++) {
if(score[i]>maxScore) { maxScore=score[i];
maxNum=num[i];
} } printf("maxScore=%.0f,maxNum=
%ld\n",maxScore,
maxNum);}例—打印最高分
及其学生序号确定函数
入口和出口?第26页
floatFindMax(floatscore[],intn) { floatmaxScore;inti;
maxScore=score[0];
for(i=1;i<n;i++) {
if(score[i]>maxScore) { maxScore=score[i];
} } returnmaxScore;}例—打印最高分
确定函数
入口和出口?第27页1、传值方式:系统将实参中数值复制一份给形参,实参加形参分别有各自存放单元,被调过程中操作是在形参自己存放单元中进行,过程调用结束后,形参存放单元被系统回收。回顾:函数参数传递两种方式4.3数组作为函数参数第28页1、传值10
实参a20实参b
只是x,y值交换10形参x20形参yx形参y2010形参x子函数内部main(){…….inta=10,b=20;swap(a,b);……..}swap(intx,inty){intt;t=x;x=y;y=t;}第29页2、传址方式:
实参将自己地址传递给形参,可了解为实参加形参共用一个地址单元。所以,对形参操作就是对实参操作4.3数组作为函数参数第30页2、传址
1020
p[0]p[1]
a[0]a[1]
起始地址ffd4main(){…….inta[2]={10,20};swap(a);……..}ffd4实参数组名a形参数组名pffd4swap(intp[]){intz;z=p[0];p[0]=p[1];p[1]=z;}2010p[0]p[1]20p[0]10p[1]函数体内第31页4.3数组作为函数参数数组元素作函数参数一维数组名作函数参数二维数组名作函数参数第32页【例4-7】voidmain(void){inta[8]={26,1007,956,705,574,371,416,517};intb[8]={994,631,772,201,262,763,1000,781};intc[8],i;
for(i=0;i<8;i++)c[i]=gcd(a[i],b[i]);/*求数组a,b对应元素最大条约数*/for(i=0;i<8;i++)
printf("%d\t",c[i]);printf("\n");}214327811第33页/********************************************算法:求两个整数a和b最大条约数返回值:返回a和b最大条约数*********************************************/intgcd(inta,intb){ intr,t;
if(a<b)
/*确保第一个参数大于第二个参数*/
{ t=a;a=b;b=t; }
r=a%b;
while(r!=0){ a=b;b=r;r=a%b;}
returnb;}求最大条约数算法
第34页
数组名作函数参数将数组首地址作为参数传过去用数组名作函数参数只拷贝一个地址自然比拷贝全部数据效率高因为首地址相同,故实参数组与形参数组占用同一段内存在该函数内,不但能够读这个数组元素,还能够修改它们第35页
数组名做函数实参和形参在主调函数和被调函数中分别定义数组。实参数组和形参数组类型应一致。实参数组和形参数组大小不一定一致,形参数组能够不指定大小,但形参数组名后面方括号不能省略。
因为数组名代表数组起始地址,故数组名做函数实参和形参时不是“值传递”,而是“地址传递”。所以,形参数组各元素值假如发生改变,会使实参数组各元素值发生一样改变。第36页例:求学生平均成绩
#include<stdio.h>
floataverage(intstu[10],intn);main(){intscore[10],i;floatav;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);av=average(score
,
10);printf("Averageis:%.2f",av);}floataverage(int
stu[],intn){inti;floatav,total=0;for(i=0;i<n;i++)total+=stu[i];av=total/n;returnav;}实参用数组名形参用数组定义..2109score569372….….88stu双向传递实参和形参数组类型应一致10n第37页向函数传递二维数组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];第38页【例4-13】(矩阵转置)求矩阵a转置矩阵,所谓矩阵转置就是将矩阵行变成列,列变成行,要求输出转置前后矩阵。第39页矩阵输出函数voidprintm(inta[][3],intm,intn){ inti,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%3d",a[i][j]);printf("\n");}}第40页矩阵转置函数
voidtranspose(inta[][3],intm,intn){inti,j,t;for(i=0;i<3;i++)for(j=0;j<i;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}}第41页主函数voidmain(){inta[][3]={{1,2,3},{4,5,6},{7,8,9}};printf("beforetranspose\n");
printm(a,3,3);printf("aftertranspose\n");
transpose(a,3,3);
printm(a,3,3);}运行结果:beforetranspose123456789aftertranspose147258369第42页作业P161填空题(做在书上)P164编程问题1.用筛法求出100~1000之间全部素数。12.有一个3×5矩阵,设计一个C语言程序,求其最大元素和次大元素。第43页【例】求出3~100之间全部素数(质数),并要求每行输出5个素数
35791113151719212325272931333537394143450000000000思绪:--定义一个数组prime[49],存放下奇数:
3、5、7、9、11、13……95、97、99--从第0个元素开始,其后各个元素若是第0个元素倍数,则将其值置为0,表示该元素不是素数--再从第一个元素开始……--一直到从第47个元素开始,其后元素如是第47个
元素倍数,则将其值置位0--这时数组prime中不为0元素是素数第44页voidmain(){intprime[49],j=3,i;for(i=0;i<49;i++){prime[i]=j;j+=2;}for(i=0;i<48;i++)if(prime[i])for(j=i+1;j<49;j++) if(prime[j]&&prime[j]%prime[i]==0)
prime[j]=0;j=0;for(i=0;i<49;i++)if(prime[i]){ printf("%d",prime[i]); j++; if(j%5==0)printf("\n");}}数组prime[49]存放奇数
3、5、7、9…97、99假如prime[i]不为0,表示是素数,每行输出5个元素假如数组元素prime[j]不整除它之前全部元素prime[i],则它就是素数第45页⑴变量设置及初始化:我们用数组prime表示1~N之间全部素数,数组prime按以下规律初始化:intprime[]={2,3,5,7,9,……},设置一个指示变量k作数组prime下标,用prime[k]作筛子,k初值为1,为了后面解释方便,称k为筛下标变量。【例4-12】埃拉托斯特尼(Eratosthene)筛法求不超出正整数N素数
3579111315171921232527293133353739414345第46页⑵算法框架依据筛法思想,能够写出下面框架①初始化数组prime,初始化筛下标变量k=1;②假如prime[k]>=sqrt(N)转第⑥步,不然执行第③步;③取出prime[k],从数组中删除prime[k]倍数;④确定k下一个值k',prime[k+1]~prime[N]中最小素数必定是下一个可用筛子,这个最小素数下标即为k';⑤k=k',转第②步;⑥输出数组prime中非0元素,即为1~N之间全部素数。【例4-12】埃拉托斯特尼(Eratosthene)筛法求不超出正整数N素数
35791113151719212325272931333537394143450000000000第47页算法名:筛法求素数begin
初始化数组prime;初始化k=1;
while(prime[k]<sqrt(n)){k=sieve(prime,k);//用prime[k]作筛子,对数组prime作筛选
}output(prime);end【例4-12】埃拉托斯特尼(Eratosthene
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 司机雇佣劳务合同范本
- 化学助剂采购合同范本
- 丹厦店面租房合同范本
- 中央团校培训心得体会
- 运城小学英语试卷
- 低压电工试题库含参考答案
- 会员服装租赁合同范本
- 体现返利合同范本
- 中级电工考试模拟题(附参考答案)
- 烹饪原料知识模考试题含参考答案
- 部编版语文小学五年级下册第一单元集体备课(教材解读)
- 暖通12yn5通风与防排烟工程
- GB/T 26559-2011机械式停车设备分类
- GB/T 1598-2010铂铑10-铂热电偶丝、铂铑13-铂热电偶丝、铂铑30-铂铑6热电偶丝
- 数字化转型中数据底座湖仓一体化
- 保护野生动物
- 统编版五年级下册道德与法治全册优秀课件
- 《教育管理学》课件
- 净水设备技术参数要求
- 《M公司员工忠诚度分析案例报告》
- 脑血管造影护理课件
评论
0/150
提交评论