1、第5章 数组,c语言还提供了构造类型的数据,它们有:数组类型、结构体类型、共用体类型。 构造类型数据是由基本类型数据按一定规则组成的,因此有的书称它们为“导出类型”。 数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。,数组的特点:,常用于处理大批量数据; 数据特点:存在内在联系; 数组具有相同数据类型的变量集合; 这些变量都有相同名字,但下标不同; 称这些变量为数组元素; 只有一个下标一维数组; 有两个下标二维数组。,本章将介绍的内容,51 一维数组 52 字符串 53 二维数组 实例的部分程序,5.1 一维数组 P124,5.1
2、.1 一维数组的定义和引用 5.1.2 一维数组的初始化 5.1.3 一维数组程序举例,5.1.1 一维数组的定义和引用 P124,【例5.1】一维数组示例。 #define N 10 main( ) int i,a3; float bN; a0=2; a1=4; a2=a0+a1; for ( i=0; iN; i+ ) scanf(“%f“, ,N为符号常量,给数组a的元素赋值,运行结果:,1 2 3 4 5 6 7 8 9 10,2 4 6,1 2 3 4 5 6 7 8 9 10,数组a的元素值,数组b的元素值,int a3; 表示: a为一维数组名; a的长度为3,即含3个元素; 元
3、素为a0、a1、a2 ; 元素类型均为整型。,说明:,每个元素都是变量,下标:02,float bN; 表示: 数组名为b; b数组的长度为N; N个元素分别为b0,b1,b2,bN-1; 各元素的类型为单精度型。,不能含变量,数组元素代表内存中的一个存储单元; 数组元素像普通变量一样使用; 数组元素用下标形式表示; 常用循环对数组进行输入输出操作。,为a数组分配3个连续的存储单元:(2字节3=6个字节) 为b数组分配N个连续的存储单元:(4字节N),用 #define N 10 定义符号常量N,方便修改程序。例如,要将数组b的长度改为20,只需把命令行改为#define N 20。程序其他部
4、分无需改动。,【例5.2】存放字符的数组示例。 #include main( ) int i; char ch4; ch0=G; ch1=o; ch2=o; ch3=d; for ( i=0; i4; i+ ) putchar(chi); ,运行结果: Good,ch0,ch1,ch2,ch3,ch,ch数组的存储单元,一维数组的一般定义形式:类型名 数组名1 常量表达式1 ,数组名2 常量表达式2 , ; 例如,int a5, b6+3;,注意: 数组名定名规则与变量名相同; 数组名后是方括号, 例如:int a5; 而不是圆括号,下面用法不对: int a(5); 常量表达式表示元素的个数
5、,下标从零开始。 数组的大小是固定的,不能动态定义。例如: int n; scanf(“%d”, 是错误的。,一维数组元素的引用:数组必须先定义,然后使用; 一个数组占有一串连续的存储单元; c语言规定只能逐个引用数组元素而不能一次引用整个数组。,引用数组元素的形式:数组名 下标 例如,a2,bi,bi+1是合法引用 下标可以是常量、变量或表达式; 其值必须确定、且是整型; 系统不做下标越界检查。,【例5.3】输入若干学生的成绩(用负数结束输入),计算其平均成绩,并统计不低于平均分的学生人数。,编程点拨:,为了统计不低于平均分的学生人数,先把学生成绩存起来,等到计算平均成绩后,再与平均分比较;
6、 如果使用普通变量,过程就会很繁琐; 选用数组简化程序 。,#define N 40 main( ) int i, n=0, count=0;float score,total=0,aN,ave; printf(“data:n“); scanf(“%f“,学生人数不能多于40,a中存放成绩,ave=total/n; for ( i=0; i=ave ) count+; printf(“ave=%f,count=%d“,ave,count); ,运行结果: data: 55 66 77 88 99 100 1 ave=80.833336,count=3,计算平均成绩,统计不低于平均分人数,思考题
7、,输入十个学生的成绩,统计低于平均分的人数。,for(i=0; i10; i+) scanf(“%d”,for ( i=0; i=ai ) count+;,输入并计算平均分,统计低于平均分人数,printf(“%f,%d“,ave,count);,5.1.2 一维数组的初始化,当系统为所定义的数组在内存中开辟一串连续的存储单元时,这些存储单元中并没有确定的值;可以在定义语句中为所定义的数组赋初值。 定义数组的同时,给数组元素赋初值的方法称为数组的初始化。,【例5.4】一维数组的初始化示例。 (1)在定义数组时对数组元素赋以初值。将数组元素的初值依次放在一对花括弧内。,int i; int a5
8、=1,2,3,4,5; for( i=0; i5; i+ ) printf(“%5d“,ai);,等价于,(2)可以只给一部分元素赋值。,int i; int b5=2,3,4; for( i=0; i5; i+ ) printf(“%5d“,bi);,等价于,int b5=2,3,4,0,0;,(3)若初始化时不指定数组元素的个数,则默认其长度为后面提供的数据的个数。但若被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。,int i; int c =3,4,5,6,7; for( i=0; i5; i+ ) printf(“%5d“,ci);,等价于,int c5=3,4,5,6,
9、7;,(4)不能给数组整体赋初值。若想使一个数组中全部元素值为0,可以表示为: int a5= 0,0,0,0,0; 不能写成: int a5= 05;,int i; int d5=0; for( i=0; i5; i+ ) printf(“%5d“,di);,等价于,int d5=0,0,0,0,0;,(5)若没有进行初始化,也没有给数组元素赋值,则其数组元素的值是不确定的。,int i; int e5; for( i=0; i5; i+ ) printf(“%5d“,ei);,未初始化,不能写成 int e ;,输出不确定值,(6)所赋初值多于所定义数组的元素个数时,在编译时将给出出错信息
10、。,int i; int f5=1,2,3,4,5,6,7,8;,提供数据过多,报错,定义数组的同时,给数组元素赋初值数组的初始化,【例5.5】存放字符的数组初始化示例。 #include main( ) int i; char a4=G,o,o,d; char b4=G; char c4= 0 ; for ( i=0; i4; i+ ) printf(“%c“,ai);printf(“n“);for ( i=0; i4; i+ ) printf(“%c“,bi);printf(“n“);for ( i=0; i4; i+ ) printf(“%c“,ci); ,等价于,0,运行结果: Goo
11、d G ,0在屏幕上无显示0的ASCII码值为0,【例5.6】定义含有10个元素的数组,并按顺序和逆序输出各元素的值。 #include main( ) int i,j,t;int a10=1,2,3,4,5,6,7,8,9,10; for( i=0; i=0; i- ) printf(“%4d“,ai); printf(“n“); ,运行结果:1 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1,【例5.7】定义含有10个元素的数组,并将数组中的元素按逆序重新存放后输出。,a,a,值变化,逆序输出和逆序存放不同,a,b,按逆序将a数组的值赋给b数组,按顺序将b数组
12、的值赋给a数组,a,方法1:开辟另一个数组,for( i=0; i10; i+) bi=a10-i-1;,for( i=0; i10; i+) ai=bi;,#include main( ) int i,a10=1,2,3,4,5,6,7,8,9,10,b10; for( i=0; i10; i+ ) printf(“%4d“,ai); printf(“n“);for( i=0; i10; i+ ) bi=a10-i-1;for( i=0; i10; i+ ) ai=bi; for( i=0; i10; i+ ) printf(“%4d“,ai); printf(“n“); ,运行结果:1 2
13、 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1,方法2:只开辟一个存储单元t,1 2 3 4 5 6 7 8 9 10,a,通过,交换,通过,交换,t,通过,交换,通过,交换,通过,交换,#include main( ) int i,t,a10=1,2,3,4,5,6,7,8,9,10; for( i=0; i10; i+ ) printf(“%4d“,ai); printf(“n“);for(i=0; i10/2; i+ ) t=ai; ai=a10-i-1; a10-i-1=t; for( i=0; i10; i+ ) printf(“%4d“,ai); pri
14、ntf(“n“); ,能改成i10?,5.1.3 一维数组程序举例 P128,【例5.8】观察运行情况,int i,t,a10=1,2,3,4,5,6,7,8,9,10;,t=a0;,for ( i=0; i9; i+ ) ai=ai+1;,a9=t;,for ( i=0;i10;i+) printf(“%4d“,ai);,1,2,3,4,5,6,7,8,9,10,1,向左移动,int i,t, b10=1,2,3,4,5,6,7,8,9,10;,t=b9;,for ( i=9; i0; i- ) bi=bi-1;,b0=t;,for ( i=0;i10;i+) printf(“%4d“, b
15、i);,10,2,3,4,5,6,7,8,9,10,1,向右移动,5.1.3 一维数组程序举例 P128,【例5.8】观察运行情况,【例5.9】数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。,编程点拨:,使用循环将输入的数和数组元素逐个进行比较; 如果找到相等的元素,用k记住该元素下标值; 输出k的值 。,if( k!=-1 ) printf(“下标值=%dn“,k);,#include main( ) int i, x, , a10=1,2,3,4,5,6,7,8,9,10;for ( i=0; i10; i+ ) printf(“%4d“,ai);pri
16、ntf(“n“);,printf(“Input x:“); scanf(“%d“,for( i=0; i10; i+ ),if ( x=ai ) k=i;,输入需查找的数,若找到,用k记下标值,k=-1,else printf(“没找到 %dn“,x);,程序编写过程:,不能赋09之间的值,运行过程:,第一次运行: Input x:61 2 3 4 5 6 7 8 9 10 下标值=5 第二次运行: Input x:121 2 3 4 5 6 7 8 9 10 没找到 12,优化程序:,main( ) int i, x, k=-1 , a10=1,2,3,4,5,6,7,8,9,10;prin
17、tf(“Input x:“); scanf(“%d“, ,break;,i10,i,【例5.10】输入十个互不相同的整数并存在数组中,找出最大元素,并删除。,编程点拨:,第一步:求最大值所在元素下标。不必用max记住最大值,只要用k记住最大值所在的元素下标。 第二步:删除最大值。从最大值开始将其后面元素依次前移一个位置。,#include main( ) int i,k,a10;printf(“Input data:“);for ( i=0; i10; i+) scanf(“%d“,a,k,k=0;,if ( aka1 ),k=1;,真,执行,0,1,2,3,4,5,6,7,8,9,if (
18、aka2 ),k=2;,假,不执行,if ( aka3 ),k=3;,真,执行,下标=,k=0; for ( i=1; i10; i+ )if ( akai ) k=i;,a,for ( i=0; i9; i+)printf(“%4d“,ai);printf(“n“); ,最先,a 3 =a 3 +1;,最后,a8=a8+1;,k8,for ( i=k; i9; i+ ) ai=ai+1;,a,k,k,【例5.11】在数组中找出最小元素,并与第一个元素对调 。,第一步:求最小值所在元素下标,k=0; for ( j=1; jaj ) k=j;,编程点拨:,第二步:最小元素与第一个元素对调 te
19、mp=a0; a0=ak; ak=temp;,#include main( ) int j,k,temp,a10;for ( j=0; j10; j+ ) scanf(“%d“,k=0; for( j= 0 +1; jaj ) k=j;,8,1,temp=a0; a0=ak; ak=temp;,5,for ( j=0; j10; j+ ) printf(“%4d“,aj); ,a,新的问题:,在后9个元素中,最小值与第二个元素对调。,a,k= 1 ; for( j= 1+1 ; jaj ) k=j;,9,2,temp=a1; a1=ak; ak=temp;,3,a,k= 1 ; for( j=
20、 1 +1 ; jaj ) k=j;,10,3,temp=a2; a2=ak; ak=temp;,7,2,2,a,for( ; i= ; i+) ,k= 3 ; for( j= 3 +1 ; jaj ) k=j;,temp=a 3 ; a 3 =ak; ak=temp;,i,i,或k+1,i=0 8,由小到大的顺序排序,a,i,i,8,9,4,【例5.12】将10个数由小到大的顺序排序。 方法1:用选择法排序 。前面介绍的算法就是选择法排序的过程。,main( ) int i,j,k,temp,a10=10,9,8,2,5,1,7,3,4,6;for ( i=0; iaj ) k=j;temp
21、=ai; ai=ak; ak=temp;for ( i=0; i10; i+ ) printf(“%4d“,ai); ,方法2:用冒泡法排序。参见教材中的方法2。 方法3:参见教材【例5.13】。,【例5.14】将键盘输入的一个数,插入到已按降序排列的数组中,要求按原来的排序规律插入。编程点拨: 定义数组时多开辟一个存储单元; 找合适的插入位置; 向右移动插入点后的元素; 插入 。,#include main( ) int i,j=0,k,a11=20,18,16,14,12,10,8,6,4,2;for ( i=0; i10; i+ ) printf(“%4d“,ai);printf(“n“
22、);printf(“Input k:“); scanf(“%d“, ,15,k,15,j=0 aj k?,j=1 aj k? 即18 15 ? 是 j+,j=2 aj k? 即16 15 ? 是 j+,j=3 aj k? 即14 15 ?,while( aj=k ,找不到比k小的元素时也要退出循环,不是,结束循环,j=3,3,找合适的插入位置,即20 15 ? 是 j+,k,15,while( aj=k ,向右移动插入点后的元素,2,4,6,8,10,12,14,a10=a9;,a 4 =a 3 ;,10j+1,aj=k;,for ( i=10; i=j+1; i- ),ai=ai-1;,插入
23、k的值,j+1,j,while( aj=k ,【例5.15】掷100次骰子,统计各点数出现的次数。 编程点拨: 用for循环 i:1100 。 每次点数为16间数,用random(6)+1表示random(k):随机产生0,k-1内整数。 定义数组a7,用ai统计出现点数为i的次数例如,若产生3,则执行:a3=a3+1;,#include #include ,main( ) int i, n, a7=0;,for ( i=1; i=100; i+ ), n=random(6)+1; an=an+1; ,for ( i=1; i=6; i+ ) printf(“%8d“,ai); ,random
24、ize( );,不用a0,随机产生0至5,缺点:每次运行时产生与上次相同数,解决方法,要加,5.2 字符串 P140,5.2.1 字符串的概念和字符串的输入输出 5.2.2 字符串处理函数和实现相应功能的自编程序,5.2.1 字符串的概念和 字符串的输入输出,字符串用双引号括起来,例如,”abc”; 用字符型数组存放字符串,存放时,系统在有效字符后自动加0; 称0为空值,是字符串结束标志,占用存储空间,但不计入串的实际长度;用以区别a和“a”。 有效字符的个数称为字符串长度。例如,”abc”的长度为3,但占4个字节(0占一位) 。,5.2.1 字符串的概念和 字符串的输入输出 P140,注意:
25、在写字符串时不必加0 , 0字符是系统自动加上的。字符串 “a” 实际上包含2个字符:a 和 0,因此把它赋给只能容纳一个字符的字符变量c: c = “a” ; 是错误的。 用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。,【例5.17】字符串示例 #include main( ) int i=0; char a =“K“; char b = “Sit down“ ; while(ai!=0) putchar(ai); i+; printf(“n“);i=0;while(bi!=0) putchar(bi); i+; ,省略了2,常用0判断是否结束循环,等价于K,0,”K”
26、和K不同; ”和也不同。” ”是空串,占一个字节,存放0;是字符常量,也占一个字节,存放空格。0的ASCII码值为0;空格的ASCII码值为32 。,【例5.18】字符串的输入输出示例。 #include main( ) char a10, b10; gets(a); scanf(”%s”,b);puts(a); printf(”%sn”,b); ,必须开辟足够大的空间,运行结果: Sit down Sit down Sit down Sit,遇空格、跳格符或回车符,认为字符串输入结束,%s,【例5.19】输入一个字符串,统计其中单词个数。单词之间用空格隔开。,编程点拨:,要找的字符,whil
27、e( ai= ) i+;,找第一个非空格字符。,用count统计单词数,步骤如下:,编程点拨:,用count统计单词数,步骤如下: 找第一个非空格字符,是有效字符,单词数增1,if ( ai != 0 ) count+;,判断找到的字符是否有效字符。,编程点拨:,用count统计单词数,步骤如下: 判断找到的字符是否有效字符,每找到一次,count增1,判断一个空格和非空格字符是否连续。,不能为0,#include main( ) char a80; int i=0, count=0;gets(a);while( ai= ) i+; if ( ai != 0 ) count+; while(
28、ai != 0 ) if(ai= ,5.2.2 字符串处理函数和 实现相应功能的自编程序,字符串处理函数在使用时,必须在程序前面,用命令行指定包含标准头文件 include 求字符串长度; 字符串复制 ; 字符串连接; 字符串比较 。,【例5.20_1】求字符串长度函数的使用。 Strlen: 是String Lenght(字符串长度)的缩写。它是测试字符串长度的函数。函数的值为字符串中的实际长度,不包括0在内。,#include #include main( ) char a80; int count; gets(a);count=strlen(a); printf(“%s: %dn“,a,
29、count); ,运行结果: I am OK I am OK: 7,问:strlen(“Good”)的值?,【例5.20_2】求串长自编程序 。#include main( ) char a80; int i=0,count=0; gets(a);while( ai != 0 ) count+; i+; printf(“%s: %dn“,a,count);,【例5.21_1】字符串复制函数的使用。 Strcpy:是String Copy(字符串复制)的缩写。它是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。,#include #include main( ) char a50,b8
30、0;gets(a); strcpy(b,a); puts(b); ,运行结果: I am OK I am OK,给a输入,输出b中串,char a5=”ABCD”,b5=”abcd”; char temp5; strcpy(temp,a); strcpy(a,b); strcpy(b,temp);,交换两个数组中字符串:,【例5.21_2】字符串复制的自编程序。,a,b, ,while( ai!=0 ) bi=ai; i+; ,bi=0;,#include main( ) int i=0; char a50,b80;gets(a);while( ai!=0 ) bi=ai; i+; bi=0;
31、 puts(b); ,【例5.22_1】字符串连接函数的使用。 Strcat:是string catenate(字符串连接)的缩写。其作用是:连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。,#include #include main( ) char a80,b30;gets(a); gets(b);strcat(a,b); puts(a); ,运行结果: abc ABCD abcABCD,a的长度 应足够大,【例5.22_2】连接字符串的自编程序。,b,a b c 0,a,找a中串的尾, ,【例5.22_2】连接字符
32、串的自编程序。,b,a b c 0,a,找a中串的尾, ,b中串赋值到a,A,B,C,D,人为地赋0,ai=0;,#include main( ) int i=0,j=0; char a80,b30;gets(a); gets(b);while( ai!=0 ) i+; while( bj!=0 ) ai=bj; i+; j+; ai=0; puts(a); ,【例5.23_1】字符串比较函数的使用。 Strcmp: string compare(字符串比较)的缩写。作用是比较字符串1和字符串2。,规则:对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到0为
33、止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。,结果: (1) 如果字符串1=字符串2,函数值为0。 (2) 如果字符串1字符串2,函数值为一正整数。 (3) 如果字符串1字符串2,函数值为一负整数。 注意:对两个字符串比较,不能用以下形式: if(Str1=Str2) printf(“yes“); 而只能用 if(StrcmP(Str1,Str2)=0) printf(“yes”);,b o o k 0,b o y 0,=,=,“boy”“book”,比较串的规则:,按ASCII码值比较,比较字符串的过程:,#include #include ma
34、in( ) char a30,b30;gets(a); gets(b);if( strcmp(a,b) 0 ) printf(“第一个串大于第二个串n“);if( strcmp(a,b) = 0 ) printf(“两串相等n“);if( strcmp(a,b) 0 ) printf(“第一个串小于第二个串n“); ,不能写成if( ab ),【例5.23_2】编写字符串比较的程序。 #include main( ) int i=0; char a30,b30;gets(a); gets(b);while( ai=bi ,找第一个不相等的字符,二维数组的定义: 方式: 类型说明符 数组名常量表
35、达式常量表达式;例: float a34; 定义a为34(3行4列)的数组int b55; 定义b为55(5行5列)的数组 存放方式:按行存放: 在内存中先顺序存放第一行元素, 再存放第二行元素,。,5.3 二维数组,二维数组的引用 二维数组的元素的表示形式为:数组名下标下标 如:a23 下标可以是整型表达式,如: a2-12*2-1不要写成a2,3,a2-1,2*2-1形式。,5.3 二维数组,数组元素可以出现在表达式中,也可以被赋值,例如: b12=a23/2 在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。常出现的错误是: int a34; a34=3; 定义a为34的数组
36、,它可用的行下标值最大为2,列下标值最大为3。用a34超过了数组的范围。,5.3 二维数组,注意: 请大家严格区分在定义数组时用的a34和引用元素时的a34的区别。 前者a34用来定义数组的维数和各维的大小,后者a34中的3和4是下标值,a34代表某一个元素。,5.3 二维数组,二维数组的初始化 可以用下面的方法对二维数组初始化: (1) 分行给二维数组赋初值。 如: int a34= 1,2,3,4,5,6,7,8,9,10,11,12 ; 这种赋初值方法比较直观,把第1个花括弧内的数据给第1行的元素,第2个花括弧内的数据赋给第2行的元素即按行赋初值。,5.3 二维数组,(2) 可以将所有数
37、据写在一个花括弧内,按数组排列的顺序对各元素赋初值。 如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 效果与前相同。 但以第1种方法为好,一行对一行,界限清楚。用第2种方法如果数据多,写成一大片,容易遗漏,也不易检查。,5.3 二维数组,(3) 可以对部分元素赋初值。 int a34=1,5,9; 它的作用是只对各行第1列的元素赋初值,其余元素值自动为0。赋初值后数组各元素为 1 0 0 0 5 0 0 0 9 0 0 0,5.3 二维数组,也可以对各行中的某一元素赋初值: int a34=1,0,6,0,0,11; 初始化后的数组元素如下: 1 0 0 0 0 6
38、 0 0 0 0 11 0 这种方法对非0元素少时比较方便,不必将所有的0都写出来,只需输入少量数据。,5.3 二维数组,也可以只对某几行元素赋初值: int a34=1,5,6; 数组元素为: 1 0 0 0 5 6 0 0 0 0 0 0 第3行不赋初值。也可以对第2行不赋初值: int a34=1,9;,5.3 二维数组,(4) 如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。 如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 与下面的定义等价:int a4=1,2,3,4,5,6,7,8,9,10,11
39、,12; 系统会根据数据总个数分配存储空间,一共12个数据,每行4列,当然可确定为3行。,5.3 二维数组,在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。 如:int a4=0,0,3,0,10; 这样的写法,能通知编译系统;数组共有3行。数组各元素为0 0 3 00 0 0 00 10 0 0,5.3 二维数组,从本节的介绍中可以看到: c语言在定义数组和表示数组元素时采用 a这种两个方括弧的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。,5.3 二维数组,5.3 二维数组,有两个下标的数组,a00,a01,a10,a11,a20,a21,1,2,3,
40、4,5,6,a,行下标,列下标,【例5.24】二维数组的示例。 #include main( ) ,初始化二维数组,给第一行输入数据,定义b为两行五列数组,1 2 3 4 5,for(j=0; j5; j+) scanf(“%d“,给第二行输入数据,6 7 8 9 0,for(j=0; j5; j+) scanf(“%d“,int a32=1,2,3,4,5,6;,int i,j,b25;,for(j=0; j5; j+) scanf(“%d“,for(j=0; j5; j+) scanf(“%d“,【例5.24】二维数组的示例。 #include main( ) ,int a32=1,2,3
41、,4,5,6;,int i,j,b25;,for(i=0; i2; i+) for(j=0; j5; j+) scanf(“%d“,【例5.24】二维数组的示例。 #include main( ) int a32=1,2,3,4,5,6; int i,j,b25;for(i=0; i2; i+) for(j=0; j5; j+) scanf(“%d“, ,外循环控制行下标,内循环控制列下标,给数组赋值,for(i=0; i3; i+) for(j=0; j2; j+) printf(“%5d“,aij);printf(“n“); printf(“Array b:n“);for(i=0; i2;
42、 i+) for(j=0; j5; j+) printf(“%5d“,bij);printf(“n“); ,按矩阵形式输出时需加此行,运行结果: 1 2 3 4 5 6 7 8 9 0 Array a: 1 2 3 4 5 6 Array b: 1 2 3 4 5 6 7 8 9 0,int a32 =1,2,3,4,5,6; 表示a为二维数组名,a含6个元素,且各元素均为整型; 常用双层for处理二维数组;在内存中为a分配6个连续的存储单元(按行)。,说明:,1 2 3 4 5 6,a00,a01,a10,a11,a20,a21,a,【例5.25】打印如下杨辉三角形。11 11 2 11 3
43、 3 11 4 6 4 11 5 10 10 5 1,编程点拨: 杨辉三角形有如下特点: 只有下半三角形有确定的值; 第一列和对角线上的元素值都是1,其他元素值均是前一行同一列元素与前一行前一列元素之和 。,#define N 6 main( ) int aNN,i,j;for(i=0; iN; i+)for(i=2; iN; i+)for(j=1; ji; j+) for(i=0; iN; i+) for(j=0; j=i; j+) printf(“%5d“,aij); printf(“n“); ,给第一列、对角线赋1,给其它元素赋值,ai0=aii=1;,aij=ai-1j-1+ai-1j;,【例5.26】定义46的实型数组,并将各行前五列元素的平均值分别放在同一行的第六列上。,float a46;,定义46的实型数组,计算第一行平均值,sum=0; for(j=0; j5; j+)sum=sum+a 0 j ; a 0 5 =sum/5;,二,1,1,三,2,2,四,3,3,for(i=0; i4; i+) ,【例5.26】定义46的实型数组,并将各行前五列元素的平均值分别放在同一行的第六列上。,计算第一行平均值,sum=0; for(j=0; j5; j+)sum=sum+a 0 j ; a 0 5 =sum/5;,