您好,欢迎访问三七文档
1教材第101页24.1一维数组思考:从键盘输入任意100个数,输出头尾两数的和。floata1,a2,a3,a4,…,a100;scanf(“%f,%f,…,%f”,&a1,&a2,…,&a100);printf(“%f”,a1+a100);printf(“%f”,a2+a99);…34.1一维数组思考:从键盘输入任意100个数,输出头尾两数的和。•数组是一种构造数据类型。•数组是有序数据的集合。•数组中的每一个元素都属于同一数据类型。•用一个统一的数组名和下标唯一地确定数组中的元素。4一维数组的定义:一维数组是指数组元素只有一个下标的数组。格式类型说明符数组名[常量表达式]举例inta[5];a[0]a[1]a[2]a[3]a[4](1)定义了一个名为a的一维数组。数组名的命名规则应遵循标识符的命名规则。(2)方括号中的5规定该数组最多容纳5个元素而非圆括号(3)类型名int规定了这5个元素均为整型变量。常量表达式表示元素的个数,即数组长度。(4)C语言规定数组第一个元素的下标(数组下标的下界)为0;因此最后一个元素的下标(数组下标的上界)为数组元素个数减1。使用数组时注意其下标不要越界。如果下标越界,程序无法得到正确的结果常量表达式中可以包含常量和符号常量,不能包含变量。#definen10main(){inta[n],b[n+10],C[2+3];……intm;scanf(“%d”,m);inta[m];//error}5(1)定义数组时不对数组元素赋初值。a、动态数组未加说明定义的数组均为动态数组,定义动态数组时不对元素赋初值,则数组元素的值为不确定值。数组元素的初始化b、静态数组定义时加static说明。定义数组时不对元素赋初值,则所有元素初值为0。如:staticintb[10];这样,数组b中各元素(b[0]~b[9])值均为0。62)定义数组时对元素赋初值。一般形式为:[static]类型名数组名[整型常量表达式]={常量1,常量2,…}例:inta[10]={1,2,3,4,5,6,7,8,9,10};该语句定义了一个动态数组,并对该动态数组进行了初始化。注意:1、所赋初值的类型必须与说明的类型一致。2、在指定初值时,第一个值赋给下标为0的元素。3、不可能跳过前面的元素给后面的元素赋初值。数组元素的初始化7一维数组的初始化1.定义数组时,对数组元素赋初值。2.如果初值的数据个数比数组元素少,则系统自动给后面的元素补赋初值0。3.要想使数组中全部元素数据为0,则采用如下形式。inta[10]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,1,2,3,4};等价于:inta[10]={0,1,2,3,4,0,0,0,0,0};inta[10]={0,0,0,0,0,0,0,0,0,0};4.在对全部数组元素赋初值时,可以不指定数组长度。inta[]={1,2,3,4,5};上机时可以使用:inta[10]={0};这里,花括号里列出了5个初始化数据,它隐含地定义了该数组共有5个元素。等价于:inta[5]={1,2,3,4,5};如果初值的数据个数比数组元素多,则在编译时提示出错信息:toomanyinitializers.8一维数组元素的引用格式数组名[下标]说明1.数组必须先定义,后使用。2.数组元素只能逐个引用,而不能一次引用整个数组。数组元素的引用与同类型的一般变量使用方式一样。……inta[10];a[0]=10;a[1+2]=a[0]*5;scanf(“%d”,&a[2*2]);printf(“%d”,a[5-1]);…………inti,a[10];for(i=0;i=9;i++)a[i]=i+1;for(i=0;i=9;i++)printf(“%2d”,a[i]);……3.当逐个使用数组中的每一个元素时,通常借助for循环语句。123456789109使用数组元素应注意:(1)系统在内存中为数组分配一块连续的存储单元,最低的地址对应于第一个数组元素,最高的地址对应于最后一个数组元素。每个数组元素等同于一个变量。(2)C语言中,不能对一个数组整体赋值。如:inta[10],b[10],k;for(k=0;k10;k++)scanf(“%d”,&a[k]);b=a;/*error*/for(k=0;k10;k++)b[k]=a[k];/*right*/10[例4.1]用数组来处理求Fibonacci数列问题。F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n=3)#includestdio.h#defineN40intmain(void){inti;longf[N]={1,1};/*数组部分元素初始化*/for(i=2;iN;i++)f[i]=f[i-2]+f[i-1];for(i=0;iN;i++){if(i%5==0)printf(\n);/*控制一行输出5个数*/printf(%12ld,f[i]);}}11使用循环控制变量作为数组下标•在例4-1中,变量i是for循环的循环变量,在程序中也用于指明所要处理的是哪个数组元素。将循环控制变量作为数组元素下标是很常见的,这样可以让程序员很方便地指定数组元素的处理顺序。每次循环控制变量的值增加时,就会自动地选中下一个数组元素。注意,这里i在两个for循环中在使用。这种变量的反复使用不是必须是,但却是允许的,因为循环控制变量总是在进入循环的时候初始化,即i被重新赋值了。1112例:顺序输入10个数据,倒序输出#includestdio.hvoidmain(){inta[10],i;printf(pleaseinputarraya:);for(i=0;i10;i++)scanf(%d,&a[i]);for(i=9;i=0;i--)printf(%3d,a[i]);printf(\n);}13经典算法介绍:排序问题是程序设计中的典型问题之一,它有很广泛的应用,比如给你一组学生成绩,要你输出前20名的成绩。这时你就要用到排序。再比如要问你中国的GDP排世界第几,你要先把各国GDP排个序,才知道中国在第几。所谓排序就是将数组中的各元素的值按从小到大的顺序或按从大到小的顺序重新排列。排序过程一般都要进行元素值的比较和元素值的交换。例4-3:冒泡法排序14冒泡排序法的基本思想是:第一:在a[0]到a[N-1]的范围内,依次比较两个相邻元素的值,若a[J]a[J+1],则交换a[J]与a[J+1],J的值取0,1,2,……,N-2;经过这样一趟冒泡,就把这N个数中最大的数放到a[N-1]中.看图示例:用冒泡排序法对8个整数{6,8,5,4,6,9,3,2}进行从小到大排序.15第二:再对a[0]到a[N-2]的范围内再进行一趟冒泡,又将该范围内的最大值换到了a[N-2]中.看图示二看图示三第三:依次进行下去,最多只要进行N-1趟冒泡,就可完成排序.看流程16现假设有8个随机数已经在数组中,开始排序初始状态:数组aa[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]68546932第一趟排序:两两相邻比较:总结回到思路一8584938692第一趟最后结果:917•第二趟冒泡排序开始:此时的待排序元素a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]654683295466328945632689同样对待排序元素两两比较后结果为:这是第三趟冒泡的待排序元素接着第三趟冒泡排序结果为:回到思路二18•同样第四趟结果为:23456689453266893245668943256689第六趟结果为:第七趟结果(最终)为:第五趟结果为:回到思路二看流程19冒泡法排序流程图•程序整体流程:开始结束输入数据输出数据冒泡排序细化输入数据流程:i=0i8scanf(“%d”,&a[i]);i++NY细化输出数据流程:i=0i8printf(“%d”,a[i]);i++NYfor(i=0;i8;i++)scanf(%d,&a[i]);for(i=0;i8;i++)printf(%d,,a[i]);20执行第i趟冒泡排序冒泡法排序流程图i++i=7i=1YN写程序j=0j=7-iNYj++比较相邻两元素的值并交换a[j]a[j+1]交换a[j]与a[j+1]的值YN21冒泡法程序main(){inti,j,a[8],temp;clrscr();for(i=0;i8;i++)scanf(%d,&a[i]);for(i=0;i8;i++)printf(%d,,a[i]);printf(\n);}{}注:对n个元素冒泡排序第i趟排序的待排序元素是a[0]到a[n-i-1]。这里的i表示数组的下标.流程图if(a[j]a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}for(j=0;j=7-i;j++)上一页for(i=1;i=7;i++)224-4选择法用选择排序法对键盘输入的N个数从小到大进行排序.基本思想:假设有N个数据放在数组a中,现要把这N个数从小到大排序.首先:在a[0]到a[N-1]的范围内,选出最小值与a[0]交换;然后:在a[1]到a[N-1]范围内,选出最小值与a[1]交换;接着是a[2]到a[N-1]的范围,这样依次进行下去,进行N-1次选择后就可完成排序.即第i趟排序的待排序范围是a[i]~a[N-1]的元素,要从中选出值最小的元素并与a[i]交换位置。23选择法a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]数组a68546932KKiKKK26每趟选择排序是找到待排序序列中最小的元素,把它交换到待排序的最前的位置。所以,一趟只有一次交换。回到冒泡图示iKK38455669824选择法排序main(){inti,j,k,a[8],temp;clrscr();for(i=0;i8;i++)scanf(%d,&a[i]);for(i=0;i8-1;i++){k=i;for(j=i+1;j8;j++)if(a[k]a[j])k=j;if(k!=i){temp=a[i];a[i]=a[k];a[k]=temp;}}for(i=0;i8;i++)printf(%d,,a[i]);printf(\n);}25二维数组的定义格式类型说明符数组名[常量表达式1][常量表达式2]举例inta[2][3];说明1。二维数组中元素的排列顺序是:先行后列。因此,可以把二维数组看成是一个矩阵。2。二维数组元素仍然是从a[0][0]开始。a[0][0],a[0][1],a[0][2]……a[1][0],a[1][1],a[1][2]…………(1)定义了一个名为a的二维数组。(2)该数组构成一个矩阵,共2行3列。数组元素的总个数为2*3=6个。(3)类型名int规定了这6个元素均为整型变量4.2二维数组不能写成inta[3,4],b[5,10];26二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素……一维数组在内存中的存放下图表示对a[3][4]数组存放的顺序4.2二维数组27二维数组的初始化说明1。分行给二维数组赋初值。2。按数组的排列顺序对各数组元素赋初值。(不提倡,易漏不易查)3.可以对部分元素赋初值。inta[2][3]={{1,2,3},{4,5,6}};intb[2][3]={1,2,3,4,5,6};intc[3][4]={{1},{5},{9}};4。在对全部数组元素赋初值时,数组第一维的长度可以不指定。inte[][3]={1,2,3,4,5,6};intd[3][4]={{1},{5,6},{0,9,7}};intf[][4]={{0,0,3},{0},{0,10}};123456123456100050009000100056000970123456003000000100028staticintb[10][2];/*这样,数组b中各元素值均为0。*/
本文标题:数组-1
链接地址:https://www.777doc.com/doc-3392867 .html