课前预习将手机调到静音认真做笔记及时完成作业上课要求了解数组的概念掌握定义和引用一维数组的方法掌握定义和引用二维数组的方法学习目标数组定义和引用一维数组定义和引用一维数组学习内容6.1数组的概念前几章使用的变量都属于基本类型,例如整型int、字符型char、浮点型(float、double)数据,这些都是简单的数据类型。对于有些数据,只用简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。30名学生成绩,需要用30个变量100名学生成绩,需要用多少个变量?用s1,s2,s3,……,s30表示成绩,能否体现内在联系?C语言用方括号中的数字表示下标,如用s[15]表示,s为数组名,15为数组中元素的个数。一组具有同一属性的数据数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号,如s[5]。用一个数组名和下标唯一确定数组中的元素。数组中的每一个元素都属于同一个数据类型。用循环对数组中的元素进行操作,可以有效地处理大批量的数据,大大提高效率。6.2.1定义一维数组6.2.2引用一维数组的元素6.2.3一维数组的初始化6.2.4一维数组程序举例6.2定义和引用一维数组6.2.1定义一维数组一维数组是最简单的数组。数组元素只有1个下标—一维数组,s[5],相当于“线”。数组元素有2个下标—二维数组,s[1][2],相当于“面”。数组元素有3个下标—三维数组,s[2][4][3],相当于“体”。………一维及多维数组的概念和用法是类似的。6.2.1定义一维数组定义数组的方法与定义变量的方法类似。inta;inta[5];不同的是数组一次定义一批有关联的变量;在定义数组时需要指定这批变量的类型、数组名称,数组中包含变量的个数。如inta[10];6.2.1定义一维数组定义一维数组的方式为:类型符数组名[常量表达式];数组名的命名规则和变量名相同,符合标识符的命名规则。常量表达式给出元素的个数。下标从0开始,如inta[10];a[0],a[1],a[2],…,a[9]注意没有a[10]这个元素。常量表达式中可以包括常量和符号常量,不能包含变量,即数组的大小不依赖于程序运行过程中变量的值。intn;scanf(“%d”,&n);inta[n];6.2.2引用一维数组的元素必须先定义数组,才能引用数组中的元素t=a[3],将a数组中序号为3的元素的值赋给变量t。只能逐个引用数组元素而不能一次引用整个数组中的全部元素。b=a[2];c=a[5];printf(“%d,%d,%d,%d,%d,%d\n”,a);6.2.2引用一维数组的元素引用数组元素的表示形式为:数组名[下标]a[0]=a[5]+a[2+1]-a[2*3]a[7/3],a[19%3]intn=5,a[10];a[n]=20;注意定义数组与引用数组元素的区别:形式上:inta[10];定义数组长度为10;t=a[6];引用a数组中序号为6的元素;简单的判别方法:如果在数组名[常量]前有类型名(char,int,float,double等),则为定义数组。如果没有类型名,则为引用数组元素。例6.1引用数组元素。利用循环给数组元素a[0]~a[9]赋值为0~9,然后按逆序输出各元素的值。解题思路:先用循环给数组元素a[0]~a[9]赋值0~9,这样,每个数组元素都有固定的值了,然后按a[9]到a[0]的顺序输出各元素的值。#includestdio.hvoidmain(){inti,a[10];for(i=0;i=9;i++)a[i]=i;for(i=9;i=0;i--)printf(%d,a[i]);printf(\n);}使a[0]~a[9]的值为0~90123456789a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]先输出a[9],最后输出a[0]6.2.3一维数组的初始化对数组元素的赋值既可以通过赋值语句来实现,也可以在定义数组时同时给予初值,这就称为数组的初始化。(1)定义数组时对全部数组元素赋初值inta[10]={0,1,2,3,4,5,6,7,8,9};a[0]=0,a[1]=1,a[2]=2;a[3]=3;a[4]=4;a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。(2)可以只给一部分元素赋值,未被赋值的根据数组类型自动赋值。inta[10]={0,1,2,3,4};inta[10]={0,1,2,3,4,0,0,0,0,0};(3)在对全部数组元素赋初值时,如果数据个数确定,则可以在定义数组时不指定数组长度,系统根据数据的数量确定数组的长度。inta[5]={1,2,3,4,5};可写为inta[]={1,2,3,4,5};注意:如果数组的长度与定义初值的个数不相同,则数组长度不能省略。如果数组a的长度为10,使用inta[]={1,2,3,4,5};数组只赋了5个初值,系统认为数组长度为5。应该写为a[10]]={1,2,3,4,5};6.2.4一维数组程序举例例6.2用数组来处理求Fibonacci数列问题。Fibonacci数列问题的含义见例P138(兔子生小兔子)。第几个月小兔子对数中兔子对数老兔子对数兔子总数110012010131012411135212563238753513┆┆┆┆┆解题思路:建立一个数组,将数列中第1个数放在数组第1个元素中,数列第2个数放在数组第2个元素中,…数组序号为i的元素的值是其前两个元素值之和。即:f[i]=f[i-2]+f[i-1]用循环来求出数组各元素之和)3()2(1)1(12121nFFFnFnFnnn费波那西(Fibonacci)数列#includestdio.hvoidmain(){inti;intf[20]={1,1};//f[0]和f[1]的值1,1for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];//求f[2]和f[19]的值for(i=0;i20;i++){if(i%5==0)printf(\n);//每行输出5个printf(%12d,f[i]);}printf(\n);}例5.8程序在顺序求出并输出各个数后,不能保存这些数据,如果要单独输出第10个数,是比较困难的。本例用数组处理时,把每个数据都保存在各数组元素中,如果要单独输出第10个数,是很容易的,直接输出f[9]即可。例6.3假如有n个人,各人年龄不同,希望按年龄将他们从小到大排列。解题思路:排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小把题目抽象为:“对n个数按升序排序”采用起泡法排序:先将第1个数和第2个数比较,如果第2个数比第1个数小,将两数交换,交换后大的放到第2个位置,将第2个数和第3个数比较,如果第2个数比第三个数小,将两数交换,交换后大的放到第3个位置,。。。。执行一次循环后,最大的书被沉到最后面。985420895420859420854920854290854209大数沉淀,小数起泡a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i5;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i4;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i3;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i2;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}204589024589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i1;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}for(i=0;i5;i++)if(a[i]a[i+1]){……}for(i=0;i4;i++)if(a[i]a[i+1]){……}for(i=0;i1;i++)if(a[i]a[i+1]){……}……for(i=0;i5-j;i++)if(a[i]a[i+1]){……}for(j=0;j5;j++)#includestdio.hvoidmain(){inta[10];inti,j,t;printf(input10numbers:\n);for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n);for(j=0;j9;j++)for(i=0;i9-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(thesortednumbers:\n);for(i=0;i10;i++)printf(%d,a[i]);printf(\n);}6.3二维数组的定义和引用6.3.1定义二维数组6.3.2引用二维数组的元素6.3.3二维数组的初始化6.3.4二维数组程序举例6.3.1定义二维数组二维数组定义的一般形式为类型符数组名[常量表达式][常量表达式];floata[3][4],b[5][10];定义a为3×4(3行4列)的数组b为5×10(5行10列)的数组注意不能写为floata[3,4],b[5,10];6.3.1定义二维数组a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]二维数组在内存中的存储顺序:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素,见图6.6,P156-P157。6.3.2引用二维数组的元素二维数组元素的表示形式为:数组名[下标][下标]b[1][2]=a[2][3]/2合法c[3/2][5%5],d[2+2][6-3]合法inta[3][4];a[3][4]=3;不合法6.3.3二维数组的初始化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},{5},{9}};等价于inta[3][4]={{1,0,0,0},{5,0,0,0},{9,0,0,0}};inta[3][4]={{1},{5,6}};等价于inta[3][4]={{1},{5,6},{0}};等价于inta[3][4]={{1,0,0,0},{5,6,0,0},{0,0,0,0}};6.3.3二维数组的初始化inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};等价于inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[][4]={{0,0,3},{},{0,10}};等价于inta[][4]={{0,0,3,0},{0,0,0,0},{0,10,0,0}};6.3.4二维数组程序举例例6.4将一个二维数组a的行和列的元素互换,存到另一个二维数组b中。654321a635241b编程思路:将a数组中第i行j列元素赋给b数组中j行i列元素例如a[0][0]赋给b[0][0]a[0][1]赋给b[1][0]a[0][2]赋给b[2][0],……可以用双层循环来处理,用外循环控制行的变化