1、2023-1-301l7.1 一维数组l7.2 二维数组l7.3 字符数组l7.4 程序举例本章要点2023-1-302 数组在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C 语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。2023-1-3031、一维数组的定义 数组类型说明在C 语言中使用数组必须先进行类型说明,而后才可以使
2、用。数组说明的一般形式为:类型说明符类型说明符 数组名数组名 常量表达式常量表达式,;其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。2023-1-304例如:int a10;说明整型数组a,有10个元素。float b10,c20;说明实型数组b,有10个元素,说明实型数组c,有20个元素。char ch20;说明字符数组ch,有20个元素。2023-1-305 对于数组类型说明应注意以下几点:(1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。(2)数组名的
3、书写规则应符合标识符的书写规定。2023-1-306(3)数组名不能与其它变量名相同,例如:void main()int a;float a10;/*变量与数组同名*/是错误的。2023-1-307(4)方括号中常量表达式表示数组元素的个数,如a5表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为:a0,a1,a2,a3,a4。2023-1-308 (5)不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:#define FD 5void main()int a3+2,b7+FD;是合法的。2023-1-309但是下述说明方式是错误的。void main(
4、)int n=5;int an;/*用变量定义数组*/2023-1-3010(6)允许在同一个类型说明中,说明多个数组和多个变量。例如:int a,b,c,d,k110,k220;在上述声明中,定义了四个整形变量a,b,c,d和两个数组变量k1,k2。2023-1-30112、一维数组元素的表示(引用)数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名数组名下标下标 其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a5,ai+j,ai+都是合法的数组元素。2023-1-3012
5、 数组元素通常也称为下标变量。必须先必须先定义数组,才能使用下标变量定义数组,才能使用下标变量。在 C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10 个元素的数组必须使用循环语句逐个输出各下标变量的值:for(i=0;i10;i+)printf(%d,ai);而不能用一个语句输出整个数组,下面的写法是错误的:printf(%d,a);2023-1-3013例EX7_1 数组元素的输入(赋值)和输出(打印)#includevoid main()int i,a10;for(i=0;i=0;i-)printf(%d,ai);printf(n%d%dn,a5.2,a5.8);2
6、023-1-30143、一维数组的初始化 数组的赋值给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。数组初始化赋值是指在数组说明时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。2023-1-3015 初始化赋值的一般形式为:static 类型说明符类型说明符 数组名数组名常量表达式常量表达式 =值值,值值,值值;其中static表示是静态存储类型(可以省略不写),C语言规定只有静态存储数组和外部存储数组才可作初始化赋值。在 中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:static int a10=0,1,2,
7、3,4,5,6,7,8,9;相当于a0=0,a1=1,.,a9=9.2023-1-3016 C语言对数组的初始赋值还有以下几点规定:(1)可以只给部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。例如:int a10=0,1,2,3,4;表示只给a0a45个元素赋值,而后面5个元素自动赋0值。2023-1-3017(2)只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:int a10=1,1,1,1,1,1,1,1,1,1;,而不能写为:int a10=1;或 int a10=1;(3)如不给可初始化的数组赋初值,则全部元素均为0值。2023-1-3
8、018(5)动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。以下例子说明这种操作。(4)如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:int a5=1,2,3,4,5;,可写为:int a=1,2,3,4,5;。2023-1-3019例EX7_2 从键盘输入10个数据,并把其中最大的数输出。#includevoid main()int i,max,a10;printf(Input 10 numbers:n);for(i=0;i10;i+)scanf(%d,&ai);max=a0;for(i=1;imax)max=ai;p
9、rintf(maxmum=%dn,max);2023-1-30204、一维数组程序举例 例EX7_3 输入10个整数,并按从小到大的顺序输出(选择排序法)。void main()int i,j,k,t,a10;printf(Input 10 numbers:n);for(i=0;i10;i+)scanf(“%d,&ai);for(i=0;i9;i+)k=i;for(j=i+1;jaj)k=j;if(k!=i)t=ai;ai=ak;ak=t;for(i=0;i10;i+)printf(%4d,ai);printf(“n”);2023-1-3021例EX7_4 用冒泡排序法对10个数进行排序。#i
10、ncludevoid main()int i,j,t,a10;printf(“Input 10 numbers:n”);for(i=1;i11;i+)scanf(“%d,”,&ai);printf(“n”);for(i=1;i=9;i+)for(j=1;jaj+1)t=aj;aj=aj+1;aj+1=t;printf(“The sorted numbers is:n”);for(i=1;i11;i+)printf(“%5d”,ai);printf(“n”);2023-1-3022前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C
11、语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。2023-1-3023 二维数组类型说明二维数组类型说明的一般形式是:类型说明符类型说明符 数组名数组名常量表达式常量表达式1 常量表达式常量表达式2;其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。2023-1-3024例如:int a34;说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有34个,即:a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a2
12、3。2023-1-3025 二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。在 C 语言中,二维数组是按行排列的。在P126图7.4中,按行顺次存放,先存放a0行,再存放a1行,最后存放a2行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个
13、字节。2023-1-3026二维数组的元素也称为双下标变量,其表示的形式为:数组名数组名 下标下标 下标下标 其中下标应为整型常量或整型表达式。例如a23。下标可以是整型表达式,如a2-12*2-1。不要写成a2,3,a2-1,2*2-1形式。2023-1-3027数组元素可以出现在表达式中,也可以被赋值,例如:b12=a23/2。在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内,以防止下标越界(超出定义的范围)。如定义a为34的数组,即int a34,那么它的行下标最大值为2,列下标最大值为3。如果用a34表示数组的一个元素,则超过了数组的定义范围。2023-1-3028 请严格
14、区分在定义数组时用的a34和引用元素时的a34是有区别的。前者a34用来定义数组的维数和各维的大小,后者a34中的3和4是下标值,a34代表某一个元素,不在定义的范围内。一般情况下,只有在定义数组时才被认定为数组,即在int a34时,a34被视为数组,除此以外,都被视为数组的元素。(也就是说除声明部分所说明的以外,其余任何情形都被视为数组元素。2023-1-3029 二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a53:(1)按行分段赋值可写为:int a53=80,75,92,61,65,71,59,63,70,85,87,90,7
15、6,77,85;2023-1-3030(2)按行连续赋值可写为:int a53=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85;(3)也可以对部分元素赋值:int a34=1,5,9;它的作用是只对各行的第1列的元素赋初值,其余元素的值自动为0。赋值后数组各元素的值为:0009000500012023-1-3031(4)如果对全部元素都赋初值(即提供全部初始数据),则在定义数组时对第一维的长度可以不指定,但第二维的长度不能省略。如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;与下面的定义等价:int a4=1,2,3,4,5,
16、6,7,8,9,10,11,12;2023-1-3032 但应注意,下面的两种赋值方式是不等价的:int a23=1,3,5,7;/*不成立,超过定义的行数*/int a3=1,3,5,7;/*成立,可将5,7赋予第三行*/这两种赋初值的结果是不相同的。2023-1-3033 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C 语言允许用这种分解二维数组a34,可分解为三个一维数组,其数组名分别为a0,a1,a2。对这三个一维数组不需
17、另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a0的元素为:a00,a01,a02,a03。必须强调的是,a0,a1,a2不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。2023-1-3034例EX7_5 矩阵的转置。例如:654321a635241bb矩阵为a矩阵的转置,即a矩阵的行换为b矩阵的列。程序如下:2023-1-3035#includevoid main()int a23=1,2,3,4,5,6,b32,i,j;printf(“Array a:n”);for(i=0;i2;i+)for(j=0;j3;j+)printf(“%4d”,aij);bji=aij
18、;/*转置*/printf(“n”);printf(“nArray b:n”);for(i=0;i3;i+)for(j=0;j maxfor i=0 to 2for j=0 to 3T aijmax Faij=maxi=rowj=colum 输出:输出:max和和row,colum2023-1-3037程序如下:#includevoid main()int i,j,row=0,colum=0,max;int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for(i=0;i3;i+)for(j=0;jmax)max=aij;row=i;colum=j;print
19、f(“Max=%d,row=%d,colum=%dn”,max,row,colum);2023-1-3038例EX7_7 一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。姓名 常微近代 C 张 8075 92 王 6165 71 李 5963 70 赵 8587 90 周 7677 85 可设一个二维数组a53存放五个人三门课的成绩。再设一个一维数组ave3存放所求得各分科平均成绩,设变量aver为全组各科总平均成绩。编程如下:2023-1-3039#includevoid main()int i,j;float s,aver,ave3;int a53=8
20、0,75,92,61,65,71,59,63,70,85,87,90,76,77,85;for(i=0;i3;i+)s=0;for(j=0;j5;j+)s=s+aji;avei=s/5;aver=(ave0+ave1+ave2)/3;printf(常微常微:%5.2fn近代近代:%5.2fnC :%5.2fn,ave0,ave1,ave2);printf(Total aver:%5.2fn,aver);2023-1-3040 用来存放字符数据的数组称为字符数组。字符数组中的每一个元素只存放一个字符。1、字符数组的定义 字符数组类型说明的形式与前面介绍的数值数组相同。例如:char c10;由于
21、字符型和整型通用,也可以定义为 int c10;但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组,例如:char c510;即为二维字符数组。2023-1-3041例如:char c10;/*定义了一个有10个元素的字符数组*/c0=I;c1=;c2=a;c3=m;c4=;c5=h;c6=a;c7=p;c8=p;c9=y;/*为数组的各元素赋值*/定义c为字符数组,包含10个元素。在赋值后数组的状态如下所示:c0 c1 c2 c3 c4 c5 c6 c7 c8 c9I_am_happy2023-1-3042(1)对字符数组的初始化,最简单的方法是逐个把字符赋给数组中的各元
22、素。如:char c10=I,a,m,h,a,p,p,y;如果花括号中提供的初值个数(即字符个数)大于数组的长度,则按语法错误处理;如果初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其余的元素自动定为空字符(即0)。2023-1-3043例如:static char c10=C,p,r,o,g,r,a,m;赋值后各元素的值为:c0 c1 c2 c3 c4 c5 c6 c7 c8 c9C_program0 其中c9未赋值,由系统自动赋予0值。当对全体元素赋初值时也可以省去长度说明。这时c数组的长度自动定为9。2023-1-3044(2)也可以在定义时初始化一个二维字符数组,如:c
23、har diamond55=,*,*,*,*,*,*,*,*;用它代表一个钻石形的平面图形,见P131图7.9和程序例7.7。2023-1-3045(3)还可以在赋值时不指定第一维的长度,但第二维的长度不能省略。如:char a5=B,A,S,I,C,d,B,A,S,E;它等价于char a25=B,A,S,I,C,d,B,A,S,E;2023-1-3046 可以引用字符数组中的一个元素,得到一个字符。例EX7_8 打印一个字符串#includevoid main()int i;char c10=C,p,r,o,g,r,a,m;for(i=0;i10;i+)printf(“%c”,ci);pr
24、intf(“n”);2023-1-3047例EX7_8_2 打印二维字符数组中的字符#includevoid main()int i,j;char a5=B,A,S,I,C,d,B,A,S,E;for(i=0;i2;i+)for(j=0;j5;j+)printf(%c,aij);printf(n);2023-1-3048在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,并且总是以0作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符0存入数组,并以此作为该字符串是否结束的标志。有了0标志后,就不必再用字符数组的长度来判断字符串的长度了。2023-1-3049 C 语言
25、允许用字符串的方式对数组作初始化赋值。例如:char c=C,p,r,o,g,r,a,m;可写为:char c=C program;或去掉写为:char c=C program;2023-1-3050 用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志0。上面的数组c在内存中的实际存放情况为:C program0。0是由C编译系统自动加上的。由于采用了0标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。在采用字符串方式后,字符数组的输入输出将变得简单方便。2023-1-3051 除了上述用字符串赋初值的办法外,还可用printf函数函数和scanf函数函
26、数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。字符数组的输入输出可以有两种方法:(1)逐个字符输入输出。用格式符“%c”输入或输出一个字符(例7_8)。(2)将整个字符串一次输入或输出。用格式符“%s”。2023-1-3052例EX7_9 字符串的输入和输出#includevoid main()char c=BASICndBASE;printf(%sn,c);注意在本例的printf函数中,使用的格式字符串为“%s”,表示输出的是一个字符串。而在输出表列中给出数组名则可。不能写为:printf(%s,c);2023-1-3053EX7_9_2 字符串的输入和
27、输出二#includevoid main()char str15;printf(Input string:n);scanf(%s,str);printf(%sn,str);本例中由于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志0。2023-1-3054应该说明的是:(1)对一个字符数组,如果不作初始化赋值,则必须说明数组长度。(2)字符数组并不要求它的最后一个字符为0,甚至可以不包含0;但将字符串赋予字符数组后,系统会自动加上0,这是字符数组和字符串的一个重要区别,应予以特别注意。2023-1-3055(3)还应该特别注意的是,当用scanf函数输
28、入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如当输入的字符串中含有空格时,运行情况为:Input string:This is a book.从输出结果可以看出空格以后的字符都未能输出。2023-1-3056例EX7_10 用scanf函数输入字符串#includevoid main()char str30;printf(Input string:n);scanf(%s,str);printf(%sn,str);2023-1-3057为了避免这种情况,可多设几个字符数组分段存放含空格的串。程序可改写如下:EX7_10_2 用scanf函数输入字符串二#includevoid
29、 main()char str16,str26,str36,str46;printf(Input string:n);scanf(%s%s%s%s,str1,str2,str3,str4);printf(%s%s%s%sn,str1,str2,str3,str4);2023-1-3058(4)在前面介绍过,scanf的各输入项必须以地址方式出现,如&a,&b等。但在例EX7_10_2中却是以数组名方式出现的,这是为什么呢?这是由于在语言中规定,数组名就代表了该数组的首地址。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c10,在内存可表示为P135图7.14。设数组c的首地
30、址为2000,也就是说c0单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf(%s,&c);则是错误的。在执行函数printf(%s,c)时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志0为止。2023-1-3059 C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数,在使用前应包含头文件“stdio.h”;使用其它字符串函数则应包含头文件“string.h”。下面介绍几个最常用的字符串函数。2023-1-30
31、60(1)字符串输出函数 puts 格式:puts(字符数组名字符数组名)功能:把字符数组中的字符串(以0结束的字符序列)输出到显示器。即在屏幕上显示该字符串。例EX7_9_3 用puts改写EX7_9#includestdio.hvoid main()char c=BASICndBASE;puts(c);2023-1-3061 从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数输出一行后会自动换行,而不必加n。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。2023-1-3062(2)字符串输入函数gets 格式:
32、gets(字符数组名字符数组名)功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。例EX7_11 输入并输出一个串#includestdio.hvoid main()char str15;printf(Input a string:n);gets(str);puts(str);2023-1-3063 可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。2023-1-3064(3)字符串连接函数strcat(string catenate 链接)格式:
33、strcat(字符数组名字符数组名1,字符数组名,字符数组名2)功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“0”。本函数返回值是字符数组1的首地址。2023-1-3065例EX7_12 连接两个串#include#includevoid main()static char str130=My name is;char str210;printf(Input your name:n);gets(st2);strcat(st1,st2);puts(st1);2023-1-3066(4)字符串拷贝函数strcpy(string copy)格式:strcpy
34、(字符数组名字符数组名1,字符数组名,字符数组名2)功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“0”也一同拷贝。字符数组名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。2023-1-3067例EX7_13 字符串复制#include#includevoid main()char str115;char str2=C Language;strcpy(str1,str2);printf(“String 1:”);puts(str1);printf(“String 2:”);puts(str2);2023-1-3068(5)字符串比较函数strcmp(compa
35、re)格式:strcmp(字符数组名字符数组名1,字符数组名,字符数组名2)功能:按照ASCII码值顺序比较两个数组中的字符串,并由函数返回值返回比较结果。字符串1字符串2,返回值0;字符串2 字符串2,返回值 0;字符串1 字符串2,返回值 0。本函数也可用于比较两个字符串常量,或比较数组和字符串常量。2023-1-3069例EX7_14 字符串比较#include#includevoid main()int k;char str115,str2=C Language;printf(Input a string:n);gets(str1);k=strcmp(st1,st2);if(k=0)p
36、rintf(st1=st2n);if(k0)printf(st1st2n);if(k0)printf(st1st2n);2023-1-3070(6)测字符串长度函数strlen(string length)格式:strlen(字符数组名字符数组名)功能:测字符串的实际长度(不含字符串结束标志0)并作为函数返回值。例EX7_15 测字符串长度#include#includevoid main()int k;char str=C language;k=strlen(str);printf(The length of the string is%d characters.n,k);2023-1-30
37、71(7)大写字母转换为小写字母函数strlwr(string lowercase)函数的作用是将字符串中大写字母转换成小写字母。(8)小写字母转换为大写字母函数strupr(string uppercase)函数的作用是将字符串中小写字母转换成大写字母。2023-1-3072 以上介绍了常用的八种字符串处理函数,应当再次强调:库函数并非C语言本身的组成部分,而是人们为使用方便而编写、提供大家使用的公共函数。各系统提供的函数数量、函数名和函数功能不尽相同,使用时要小心,必要时查阅一下库函数手册。2023-1-3073 例EX7_16 输入一行字符,统计其中有多少个单词,单词之间用空格隔开。这个
38、问题的算法是:单词的数目可以由空格出现的次数决定(连续的若干空格作为出现一次;一行开头的空格不统计在内)。如果测出某一个字符为非空格,而它前面的字符是空格,则表示新的单词开始,此时使num(单词数)累加1。如果当前字符为非空格而其前面的字符也是非空格,则意味着仍然是原来的单词,num不累加。前面一个字符是否为空格可以从word的值确定,若word=1,则表示前一个字符是空格;如果word=0,意味着前一个字符为非空格。2023-1-3074N-S框图为:输入一个字符串给输入一个字符串给string0=i当当(c=stringi)0)T c=空格空格 F1=wordT word=1 F0=wor
39、dnum+1=num i+1=i输出:输出:num2023-1-3075#includevoid main()char string80;int i,num=0,word=1;char c;gets(string);for(i=0;(c=stringi)!=0;i+)if(c=)word=1;else if(word=1)word=0;num+;printf(“There are%d words in the line.n”,num);2023-1-3076 例EX7_17 把一个整数插入一个已排好序的数组中,插入后数组仍有序。算法:1、把原来给定的数按从大到小(也可以从小到大)进行排序;2、
40、从键盘输入一个整数,下一步工作就是要确定该数插入的位置;2023-1-3077 3、把输入的数据与数组的每个元素进行比较(方向从大到小,也就是从左到右),若该数大于数组中的第一个数,则应将此数插入到数组的第一个位置(记住下标);若该数比数组中最后一个元素小,则该数应插入数组的末尾;若该数比数组中的第i个数小,而比第i+1个数大,则该数应插入第i+1个位置。由此确定这个整数应插入到数组中的位置。2023-1-3078 4、把数组中从最后一个元素到第i+1个元素,每个元素向后移动一个位置,然后用该数去覆盖第i+1个元素。至此插入操作完成。从大到小的排序插入与此正好相反。下面给出程序:2023-1-
41、3079#includeint Num,S=0;/*全局变量*/void main()int i,j,t,a11=127,3,6,28,54,68,87,105,162,18;for(i=0;i9;i+)for(j=i+1;j10;j+)if(aiaj)t=ai;ai=aj;aj=t;/*顺序排序*/printf(“Output a array before insert:n”);for(i=0;i10;i+)printf(%5d,ai);printf(“n”);/*输出数组*/2023-1-3080printf(nInput a number for insert:n);scanf(“%d”
42、,&Num);/*输入Num*/for(i=0;iai)S=i;/*查找插入位置*/if(S=0)for(i=9;i=0;i-)ai+1=aia0=Num;elsefor(i=9;iS;i-)ai+1=aiaS+1=Num;/*插入操作*/2023-1-3081for(i=0;i11;i+)printf(%5d,ai);printf(“n”);/*输出插入后的数组*/2023-1-3082 例EX7_18 在二维数组a中选出各行最大的元素组成一个一维数组b。a34=3,16,87,65,4,32,11,108,10,25,12,37,b=87,108,37。本题的编程思路是,在数组A的每一行中
43、寻找最大的元素,找到之后把该值赋予数组B相应的元素即可。程序如下:2023-1-3083#includevoid main()inta4=3,16,87,65,4,32,11,108,10,25,12,27;int b3,i,j,t;for(i=0;i3;i+)t=ai0;/*将第i行第0个元素赋予t*/for(j=1;jt)t=aij;/*找最大元素并赋予t*/bi=t;/*将t赋予b数组的第i个元素*/2023-1-3084printf(nArray a:n);for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,aij);printf(n);/*输出a数组*/pr
44、intf(nArray b:n);for(i=0;i3;i+)printf(%5d,bi);printf(“n”);/*输出b数组*/2023-1-3085 例EX7_19 输入五个国家的名称按字母顺序排列输出。本题编程思路如下:五个国家名应由一个二维字符数组来处理。语言规定可以把一个二维数组当成多个一维数组处理。因此本题又可以按五个一维数组处理,而每一个一维数组就是一个国家名字符串。用字符串比较函数比较各一维数组的大小,并排序,输出结果即可。程序如下:2023-1-3086#includevoid main()char str20,cs520;int i,j,p;printf(Input c
45、ountrys name:n);for(i=0;i5;i+)gets(csi);printf(n);2023-1-3087for(i=0;i5;i+)p=i;strcpy(str,csi);for(j=i+1;j5;j+)if(strcmp(csj,st)0)p=j;strcpy(st,csj);if(p!=i)strcpy(str,csi);strcpy(csi,csp);strcpy(csp,str);puts(csi);printf(n);2023-1-3088 1、数组是程序设计中最常用的数据结构。数组可分为数值数组(整数组,实数组),字符数组以及后面将要介绍的指针数组,结构数组等。2、数组可以是一维的,二维的或多维的。3、数组类型说明由类型说明符、数组名、数组长度(数组元素个数)三部分组成。数组元素又称为下标变量。数组的类型是指下标变量取值的类型。4、对数组的赋值可以用数组初始化赋值,输入函数动态赋值和赋值语句赋值三种方法实现。对数值数组不能用赋值语句整体赋值、输入或输出,而必须用循环语句逐个对数组元素进行操作。2023-1-3089
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。