C语言【清华大学出版社】西安交通大学课件第07章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第七章数组•掌握一维数组、二维数组的定义、初始化和引用。•掌握字符串和字符数组的概念及其处理函数。•掌握用数组进行编程的技术。先看一个例子:例:给出10个儿童的体重,要求计算平均体重并打印出低于平均体重的数值。用变量来解决问题:main(){intw1,w2,w3,w4,w5,w6,w7,w8,w9,w10;intt;scanf(%d%d%d%d%d%d%d%d%d%d,&w1,&w2,&w3,w4,&w5,&w6,&w7,&w8,&w9,&w10);t=(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)/10;if(w1t)printf(%d\n,w1);if(w2t)printf(%d\n,w2);if(w3t)printf(%d\n,w3);if(w4t)printf(%d\n,w4);if(w5t)printf(%d\n,w5);if(w6t)printf(%d\n,w6);if(w7t)printf(%d\n,w7);if(w8t)printf(%d\n,w8);if(w9t)printf(%d\n,w9);if(w10t)printf(%d\n,w10);}用数组来解决问题:main(){intw[10];/*定义1个整型数组存放体重*/intt,i;for(i=0;i10;i++)scanf(%d,&w[i]);for(t=0,i=0;i10;i++)t=t+w[i];t=t/10;for(i=0;i10;i++)if(w[i]t)printf(%d\n,w[i]);}数组及其相关概念数组是一组有序的、类型相同的数据的集合,这些数据被称为数组的元素。数组下标每个数组都有一个名字,我们称之为数组名。为标识数组中的每个元素,我们需要对它们进行编号,这种编号我们称之为数组元素的下标。由于有了下标,元素在数组中的位置(或排列顺序)就被唯一地确定下来。我们用数组名加上下标就可以准确地访问数组中的某个元素了。如:w[0]代表数组w中的第一个元素w[9]代表数组w中的第十个元素注意:C语言规定下标从0开始。说明:数组名代表数组的起始地址。数组元素在内存中是连续存储的。7.1一维数组的定义和引用一、一维数组的定义定义一维数组的一般方式:类型说明符数组名[常量表达式];指明数组元素的数据类型指明数组所含的元素个数例如:inta[10];/*定义的整型数组a含10个元素*/floatb[20];/*定义的实型数组b含20个元素*/说明:⑴数组名的命名规则同变量名的命名规则一样;⑵数组名后用方括号[],不能用()⑶常量表达式必须是大于0的整型常量表达式,不能包含变量。即C语言不允许对数组的大小作动态定义,即定义数组时,数组的长度必须是确定的,其大小不依赖程序运行过程中变量的值。inta(10);例如:intn;inta[n]charname[0];floatweight[10.3];floatarray[-100];二、一维数组的初始化1.定义时初始化方法:将初值依此写在花括号{}内。如:inta[5]={2,4,6,8,10};存储形式:存储单元说明:⑴如果在定义一维数组时给出了全部元素的初值,则数组的下标允许省略。此时编译系统将自动根据初始化数据的个数来确定数组的长度。如:inta[]={2,4,6,8,10};inta[];╳⑵初始化的数据个数允许少于数组的长度,但不能多于数组的长度。当初始化的数据个数(至少要有一个)少于数组的长度时,未初始化部分将被编译系统自动用0赋值。如:inta[5]={2,4};相当于:a[0]=2,a[1]=4,a[2]=0,a[3]=0,a[4]=0inta[5]={1,2,3,4,5,6,7,8};╳(3)如果想使一个数组中全部元素值为0,可以写成如:inta[5]={0,0,0,0,0};或inta[5]={0};不能写成inta[5]={0*10};╳2.使用其它方法初始化⑵利用输入语句初始化main(){charas[26];inti;for(i=0;i26;i++)scanf(%c,&as[i]);…...}⑴利用赋值语句初始化main(){charas[26],ch;for(ch='A';ch='Z';ch++)as[ch-'A']=ch;…...}三、一维数组的引用数组元素类似于单个变量,可以自由地存取。但是,它与一般变量相比,有以下特殊之处:⑴数组元素是通过数组名加上该元素在数组中的位置(即数组元素的下标)来访问的。表示形式:数组名[下标]如:a[3]其中,下标可以是整型常量、整型变量或整型表达式。如:inta[10];inti=3;a[i]=10;floati=3;a[i]=10;⑵数组元素的下标是从0开始的。如:inta[2];scanf(“%d,%d”,&a[1],&a[2]);⑶数组元素的赋值是逐个元素进行的,不允许把一个数组作为一个整体赋给另一个数组。除了数组初始化外,也不允许用在花括号中列表的方式对数组整体赋值。例1:inta[5]={2,4,6,8,10},b[5];b[5]=a[5];例2:inta[5];a[5]={2,4,6,8,10};⑷数组名a代表的是数组a在内存中的首地址,因此,可以用数组名a来代表数组元素a[0]的地址。等价于scanf(“%d”,&a[0]);scanf(“%d”,a);四、一维数组应用举例例1:从键盘上输入10个实型数存入数组,然后按输入顺序的逆序输出这10个数。main(){floata[10];inti;for(i=0;i10;i++)scanf(“%f”,&a[i]);for(i=9;i=0;i--)printf(“%10.2f”,a[i]);}例7.2:用数组来处理求斐波纳契数列:1,1,2,3,5,8…的前20个数。main(){intf[20]={1,1};for(i=2;i20;i++)/*f[2]是数组第3个元素*/f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){printf(“%10d”,f[i]);if(i%2==0)printf(“\n”);/*每行打印2个数*/}}数学表示:f(0)=f(1)=1,f(n)=f(n-2)+f(n-1)例7.3:用冒泡法对10个数排序(由小到大)。冒泡法的思路是:将相邻两个数比较,将小的调到前头。988888895555559444444922222290000009第一轮排序,比较了5次,获得第一次结果。剩数轮数5142332415main(){inta[11],i,j,t;printf(“Input10numbers:\n”);for(i=1;i11;i++)scanf(“%d”,&a[i]);printf(“\n”);for(j=1;j=9;j++)/*控制9轮排序*/for(i=1;i=10-j;i++)/*每轮排序比较次数*/if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}for(i=1;i=10;i++)printf(%d,a[i]);}7.2二维数组的定义和引用先看一个例子:某校近三年招收各专业毕业生情况如下:计算机电子管理数学19999040803020001005090402001954510050要把这些数据组织起来,可以有两种选择:⑴按从左到右从上到下的顺序存入一个一维数组中。(查询困难)⑵每年用一个一维数组,把这些数据分别存入三个数组中。(增加一年数据困难)一、二维数组的定义•定义二维数组的一般方式:类型说明符数组名[常量表达式1][常量表达式2];如:inta[3][4];这种格式是错误的:inta[3,4]•存储形式:二维数组在内存中是按行的顺序存放的,即先存放第一行的元素,再存放第二行的元素。说明:二维数组除了维数比一维数组多一维外,其它性质与一维数组是全部类似的。看看下面写法是否正确?①inta[0][3];用于定义数组长度的常量表达式的值必须是大于0的正整数。②inti=3,j=4;inta[i][j];定义数组元素的个数必须使用常量表达式,而不能使用变量。二、二维数组的初始化这里主要介绍定义时初始化,其它方法初始化和一维数组类似。定义时初始化有两种方法:⑴分行初始化例如:inta[2][3]={{1,2,3},{4,5,6}};即把第一个花括弧内的数据给第一行的元素,第二个花括弧的数据给第二行的元素。⑵省略掉内层的花括号即按数组元素在内存中排列的顺序赋初值。例如:inta[2][3]={1,2,3,4,5,6};这种方法效果与前相同,但以第一种方法为好,一行对一行,界限清楚。第二种方法容易遗漏。说明:⑴在对二维数组初始化时,也可以只对部分数组元素初始化,未被初始化的数组元素将自动赋0。inta[2][3]={{5,6},{7,8}};inta[2][3]={5,6,7,8};如:得到的数组为:560780得到的数组为:567800⑵在对二维数组初始化时,如果对全部元素都赋初值,或分行赋初值(每行至少一个数据),则可以省略第一维数组长度。但是,第二维数组长度不允许省略。如:inta[][3]={1,2,3,4,5,6,7,8,9};inta[][4]={{1,2},{3,4,5,6},{7}};系统按3行处理floatf[2][]={1.1,2.2};三、二维数组的引用与引用一维数组元素一样,是用下标法引用二维数组元素的。表示形式:数组名[行下标][列下标]其中,行下标和列下标是整型常量、整型变量或整型表达式。其编号是从0开始的。例如:若有inta[2*5][3*4],i=15;则使用a[3*3][0],a[1][i-5]都是合法的。说明:数组名a代表的是数组a在内存中的首地址,因此,可以用数组名a来代表数组元素a[0][0]的地址。四、二维数组应用举例例1:使用数组保存“九九表”,然后输出。main(){inta99[10][10],i,j;for(i=1;i10;i++)for(j=1;j=i;j++)a99[i][j]=i*j;for(i=1;i10;i++){for(j=1;j=i;j++)printf(“%6d,a99[i][j]);printf(“\n”);}}例7.4:矩阵的转置。(书中例7.4)a=123456b=142536转换成main(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf(arraya:\n);for(i=0;i=1;i++){for(j=0;j=2;j++){printf(%5d,a[i][j]);b[j][i]=a[i][j];}printf(\n);}printf(\narrayb:\n);for(i=0;i3;i++){for(j=0;j2;j++)printf(%6d,b[i][j]);printf(\n);}}例7.5:求3*4数组中的最大值及其下标。main(){intmax,row,colum,i,j;inta[][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};max=a[0][0];for(i=0;i3;i++)for(j=0;j4;j++)if(a[i][j]max){max=a[i][j];row=i;colum=j;}printf(max=%d,row=%d,colum=%d,max,row,colum);}7.3字符数组和字符串一、字符数组当数组的元素类型为字符型时,被称为字符数组。如:charc[10];则c为字符数组。字符数组的定义、初始化和元素的引用与一般的数组相同。如:main(){charch[5]={‘c’,‘h’,‘i’,‘n’,‘a’};for(i=0;i5;i++)printf(“%c”,ch[i]);}说明:⑴定义字符数组的类型说明符一般为char,如:charc[10];由于字符型与整型的互相通用性,因此,上面定义

1 / 53
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功