




已阅读5页,还剩81页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章,数组,问题:给一组数排序,这组 数该 如何存放呢,? 这些数据如何存放才便于排序,1,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,第六章 数组,主要内容,6.1 一维数组的定义和引用 6.2 二维数组的定义和引用 6.3 字符数组,第六章 数组,6-1 一维数组的定义和引用,问题:有如下几组数据,它们分别该如何存储呢?,一个班学生的学习成绩 一行文字 一个矩阵,这些数据的特点是: 1、具有相同的数据类型 2、使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。,1、一维数组的定义格式为: 类型说明符 数组名常量表达式; 例如: int a10; 它表示定义了一个整形数组,数组名为a,此数组有10个元素。, 6.1.1一维数组的定义 p143,2、说明: (1)数组名定名规则和变量名相同,遵循标识符定名规则。,(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。 例如,指定a10,表示a数组有10个元素 注意下标是从0开始的,这10个元素是: a0,a1,a2,a3,a4, a5,a6,a7,a8,a9。 注意:按上面的定义,不存在数组元素a10。,(3)常量表达式中可以包括常量和符号常量,但不能包含变量。 也就是说,C语言不允许对数组的大小作动态定义。 数组的大小不依赖于程序运行过程中变量的值。,错误示例: int n; scanf(“%d,, float a0; /* 数组大小为0没有意义 */ int b(2)(3); /* 不能使用圆括号 */ int k, ak; /* 不能用变量说明数组大小*/,数组申明中常见的错误,3、一维数组在内存中的存放,每个数据元素占用的字节数,就是其定义类型的字节数 float类型,每元素占4个字节,一维数组: float mark100;,#include “stdio.h“ #include “time.h“ #include “stdlib.h“ #define N 5 void main() long aN; int i; srand(time(NULL); /设定随机数种子 printf(“随机生成%d个数:nn“,N); for( i=0; iN; i+ ) /数组元素赋初值 ai=rand()%100; /生成0-100的随机数赋值给ai switch(sizeof(a0) case 1: printf(“字符型(char)数组, 每元素占1个字节nn“);break; case 2: printf(“短整型(short int)数组,每元素占2个字节nn“);break; case 4: printf(“整型(int)数组,每元素占4个字节(VC)nn“);break; printf(“ 数组元素 元素地址 值nn“) ; for(i=0;iN;i+) /循环从a0-a9 printf(“ a%d: | %ld | %2d |n“,i, ,数组名下标 下标可以是整型常量或整型表达式。例如: a0=a5+a7-a2*3, 6.1.2一维数组元素的引用 p144,1、数组元素的引用方式:,2、一维数组元素引用的程序实例,#include void main() int i,a10; for (i=0; i=0; i-) printf(“%d“,ai); printf(“n“); ,运行结果如下: 9 8 7 6 5 4 3 2 1 0 程序使a0到 a9的值为09,然后按逆序输出。,1、对数组元素初始化的实现方法:,(1)在定义数组时对数组元素赋以初值。例如: int a10=0,1,2,3,4,5,6,7,8,9; 将数组元素的初值依次放在一对花括弧内。 经过上面的定义和初始化之后: a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。, 6.1.3一维数组的初始化,(3)如果想使一个数组中全部元素值为0, 可以写成 int a10=0,0,0,0,0,0,0,0,0,0; 或int a10=0; 不能写成:int a10=0*10; 注意: 不能给数组整体赋初值。,2)可以只给一部分元素赋值。例如: int a10=0,1,2,3,4; 定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。,4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。 例如:int a5=1,2,3,4,5; 也可以写成 int a=1,2,3,4,5; 在第二种写法中,花括号中有5个数,系统就会据此自动定义a数组的长度为5。 但若数组长度与提供初值的个数不相同,则数组长度不能省略。 例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成 int a10=1,2,3,4,5; 只初始化前5个元素,后5个元素为0。,课堂练习,下列的数组定义哪个是正确的,(1) int a; float a10;,数组元素赋初值,#define N 5 #include “stdio.h“ void main() int aN=0,1; int b=1,2,3,4,5; char c4=f,g,h,97; int i; for (i=0; iN; i+) printf(“a%d = %dn“,i, ai); printf(“n“); for (i=0; i5; i+) printf(“b%d = %dn“,i, bi); printf(“n“); for (i=0; i4; i+) printf(“c%d = %c - %dn“,i, ci,ci); ,练习:从键盘中输入10个数字,比较并输出其中最大的数。 编程思路: 定义一个数组 给数组赋值 (输入10个数) 逐个比较每个数的大小 输出最大的数,1) 定义一个数组,可包含十个数字,未指定数据类型,设定为浮点型。,float a10;,2) 给数组赋值(输入10个数),提示语句: printf(“input 10 numbers:n“);,for (i=0;i10;i+) /*循环给每个数组元 素赋初值*/ scanf (“%f”, /ai为数组元素,3)逐个比较每个数的大小,找出最大的数,先定义一个中间变量max,依次与数组的每一个元素比较,将大数存储在中间变量中,max=a0;,for (i=1; imax) max=ai;,printf( “maxmum=%fn“, max);,最后打印出max的值,源程序如下: #include “stdio.h“ main() int i; float max, a10; printf(“input 10 numbers:n“); for( i=0; imax ) max=ai; printf(“max=%fn“,max); ,如果将赋初值的程序行改为: printf(“input 10 numbers:n“); for(i=0;i10;i+) /数组元素赋初值 printf(“%ld - a%d=“, a+i, i); scanf(“%f“,a+i); 结果会怎样呢?,#include “stdio.h“ main() int i; float max, a10; printf(“input 10 numbers:n“); for( i=0; imax ) max=ai; printf(“max=%4.2fn“,max); ,#include “stdio.h“ #include “time.h“ #include “stdlib.h“ void main() char a10; int i, max; srand(time(NULL); /设定随机数种子 printf(“随机生成10个数:nn“); for( i=0; imax ) max=ai; /比较,将大值赋给max printf(“n max=%d“,max); ,/*错误编程*/ main() int a4=1,2,3,4,b4; a=b; ,解决方法 法1:逐个元素赋值 b0=a0; b1=a1; b2=a2; b3=a3; 法2:通过循环赋值 int i; for (i=0;i4;i+) bi=ai;,原因: 数组名表示数组的首地址,其值不可改变!,如何使两个数组的值相等:,#include “stdio.h“ main() int i,j,p,q,s,a10; printf(“n input 10 numbers:n“); for(i=0;i10;i+) scanf(“%d“, ,阅读程序,说明下列程序的功能,第一部分: #include “stdio.h“ main() int i, j, p, q, s, a10 ; printf(“n input 10 numbers:n“); for(i=0;i10;i+) scanf(“%d“,用于输入10个元素的初值。,for(i=0;i10;i+) p=i; q=ai; for(j=i+1;j10;j+) if (q aj ) p=j;q=aj; ,if(i!=p) s=ai; ai=ap; ap=s; printf(“%dt“,ai); ,for(j=i+1;j10;j+) if (q aj ) p=j;q=aj; /*循环将ai与ai+1, ai+2,a9相比较,找出其中最大的数,*/,/如果ip, ai, ap互换 if(i!=p) s=ai; ai=ap; ap=s; printf(“%dt“,ai);,#include “stdio.h“ main() int i,j,p,q,s,a10; printf(“n input 10 numbers:n“); for(i=0;i10;i+) scanf(“%d“, ,6-2 二维数组的定义和引用, 6.2.1二维数组的定义,二维数组定义的一般形式为 类型说明符 数组名常量表达式常量表达式; 例如:定义a为34(3行4列)的数组,b为510(5行10列)的数组。如下: float a34,b510;,不能写成 float a3,4,b5,10;, 6.2.1二维数组的定义,二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素,二维数组在内存中的存放,下图表示对a34数组存放的顺序,地址 值 数组元素,b00 b01 b02 b10 b11 b12 b20 b21 b22,3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H,例如:整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;,1 2 3,4 5 6,789,问题:有了二维数组的基础,那么多维数组如何定义呢?,定义三维数组: float a234; 多维数组元素在内存中的排列顺序:第一维的下标变化最慢,最右边的下标变化最快。, 6.2.1二维数组的定义,#include “stdio.h“ #include “time.h“ #include “stdlib.h“ #define N 3 #define M 4 void main() int aNM; int i,j; srand(time(NULL); /设定随机数种子 printf(“随机生成%d个数:nn“,N); for( i=0; iN; i+ ) for( j=0; jM; j+) aij=rand()%100; /生成0-100的随机数赋值给aij switch(sizeof(a00) case 1: printf(“字符型(char)数组, 每元素占1个字节nn“);break; case 2: printf(“短整型(short int)数组,每元素占2个字节nn“);break; case 4: printf(“整型(int)数组,每元素占4个字节(VC)nn“);break; printf(“ 数组元素 元素地址 值nn“) ; for(i=0;iN;i+) for(j=0; jM; j+) printf(“ a%d%d: | %ld | %2d |n“,i,j, ,二维数组元素的表示形式为:数组名下标下标 例如: a23 下标可以是整型表达式,如 a2-12*2-1,数组元素可以出现在表达式中,也可以被赋值,例如:b12=a23/2, 6.2.2二维数组的引用,常出现的错误有: int a34; /* 定义a为34的数组 */ a34=3;,在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。,可以用下面4种方法对二维数组初始化,数据类型 数组名 常量表达式1常量表达式2 初始化数据 ;,(1) 分行给二维数组赋初值。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,(2) 可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;, 6.2.3二维数组的引用,(3) 可以对部分元素赋初值。如 int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,也可以对各行中的某一元素赋初值,如 int a34=1,0,6,0,0,11;,1 0 0 0 0 6 0 0 0 0 0 11,1 0 0 0 5 6 0 0 0 0 0 0,也可以只对某几行元素赋初值。如: int a34=1,5,6;,(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,12;,在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0, 6.2.3二维数组的引用, 6.2.4二维数组程序举例,例6.4 将一个二维数组行和列元素互换,存到另一个 二维数组中。,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(“array a:n“); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(“%5d“,aij); bji=aij; ,printf(“n“); printf(“array b:n“); for (i=0; i=2;i+) for(j=0;j=1;j+) printf(“%5d“,bij); printf(“n“); /*程序结束*/,运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,字符数组,字符数组是每个元素存放一个字符型数据的数组。 字符数组的定义形式和元素的引用方法与一般数组相同。,说明: C语言中没有专门的字符串变量,因此利用字符型数组来处理字符串。,6-3 字符数组, 6.3.1字符数组的定义,定义方法与前面介绍的类似。例如: char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h;c6=a; c7=p;c8=p;c9=y;,对字符数组初始化,最容易理解的方式是逐个字符 赋给数组中各元素。如: char c10=I, , a,m, , h,a,p,p,y;, 6.3.2字符数组的初始化,char c=I, ,a,m, ,h, a,p,p,y;数组c的长度自动定为10。,char diamond55= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,* , 6.3.3字符数组的引用,例6.6 输出一个字符串。,程序如下: #include void main() char c11=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(“%c“,ci); printf(“n“); ,运行结果:I am a boy,例6.7 输出一个钻石图形,#include void main() char diamond5= , ,*,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(“%c“,diamondij); printf(“n“); ,运行结果 * * * * * * * *, 6.3.3字符数组的引用, 6.3.4字符串和字符串结束标志,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符0作为标志。如果有一个字符串,前面9个字符都不是空字符(即0) ,而第10个字符是0,则此字符串的有效字符为9个。系统对字符串常量也自动加一个0作为结束符。,0代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。,可以用字符串常量来使字符数组初始化。 例如 char c=I am happy; 也可以省略花括弧,直接写成 char c=“I am happy; 它与下面的数组初始化等价 char c =I, ,a,m, ,h,a,p,p,y,0,注意,再比如 char c10=“China; 数组c的前5个元素为C,h,i,n, a,第6个元素为0,后4个元素也设定为空字符。, 6.3.4字符串和字符串结束标志,3. 字符串常量是用双引号包围的字符序列。 如: “china”,作为字符串的结束标志的0 可 以不显式写出.,2. C语言中约定用0 作为字符串的结束标志,它占内存空间,但不计入串的实际长度。,字符常量与字符串常量的区别,字符常量 字符串常量 单引号 双引号 1个字符 多个字符 字符变量 字符数组 一个字节 字符串中字节数+1 (0结束标志),引用形式: 存放内容: 赋值对象: 占用空间:,例如: a “a” 不同 1个字节 2个字节,一、字符数组的初始化,注意: 产生的数组没有结束符0。因为是以单个字符形式为数组各元素赋初值,所以数组rat中存放的不是字符串。,char rat5=T,h,e, ;,1、用字符型数据对字符数组初始化,若使数组rat中存放的是字符串。应加入结束符0,即: char rat5=T,h,e, ,0;,2、用字符串常量对字符数组初始化 char panic6=“HELLO“;,注意: 数组中的字符除了H,E,L,L,O之外,系统自动加入结束标志0。 为了用一个字符数组来存储长度为N的字符串,要求字符数组的大小至少为N+1.,初始化时也可省略花括号。 char panic =“HELLO“;,系统自动加入,下面的初始化是错误的: char neg5=“double arrow“;,对于一个二维数组,C编译程序将其视为一个一维数组,这个一维数组中每个元素又是一个一维数组。这一概念对字符型数组仍适用。,3、二维字符数组的初始化,char ch34=“aa”,”bbb”,”c” ;,第一维的长度代表要存储的字符串的个数,可以省略。 第二维的长度不能省略,且应按最长的字符串长度设定,二、字符数组的输入输出,1、按C格式符一个字符一个字符地单独输入输出,例: main() int i, str10; for(i=1;i10;i+) scanf(“%c”, ,1.输入多个数据时,格式控制串中没有非格式字符,则输入时数据间的分隔符可用空格、TAB键、回车键。,2. 输入字符数据时,若格式控制符中无非格式符,则认为所有输入的字符均为有效字符。 char a,b,c; scanf(“%c%c%c“, 输入:A,B,C 输出:a=A,b=,c=B,注:Scanf函数的 %c格式,2、按S格式符将字符串作为一个整体输入输出, 用scanf函数加%s实现字符串输入,注意: (1) 输入的字符串中不能有空格、回车或跳格符(Tab),因为系统遇到这些分隔符时,会认为输入结束。 上例中若输入:hello world 则实际存入str的只有“hello “,例如: char str10; scanf(“%s“,str);, 用printf函数加%s实现字符串输出 printf(“%s“,str);,(2) 要保证字符数组的长度足够大。Scanf() 不检查用户输入字符串长度是否超过了字符数组的容纳能力 (3) 数组名前不用加&符号,因为数组名本身代表该数组的首地址。,数组名,3、用字符串处理函数 gets 或 puts 输入输出一个字符串,gets( )函数专门用于输入字符串 一般形式是: gets(字符数组名);,其中:函数参数只能使用数组名而不能是字符串常量,与scanf函数的不同是: gets()函数将用户键入的换行符之前的所有字符 (包括t和 )存入字符数组,然后加上0,但换行符被丢掉 与scanf函数相同的是: gets()函数也不检查用户输入字符串长度是否超过了字符数组的容纳能力,因此编程者要确保数组足够大。 scanf()不能读入带空格的字符串,gets()可以,gets( )函数,#include #define LATH 80 main() char nameLATH; printf(“你好,请输入姓名:n“); gets(name); printf(“真是个好名字:%sn“,name); ,例 :,其中:函数参数可以是字符串常量,也可以 是字符串变量。,puts()函数专门用于输出字符串,一般形式是: puts(字符串);,与printf()的不同: puts()函数打印字符串的全部内容,直至遇到0为止,然后自动多打印一个n,起到换行的作用。而printf函数无此功能。,#include #define PREDEF “这是预定义字符串“ main() char str=“这是初始化字符串“; puts(“这是直接使用字符串常量“); puts(PREDEF); puts(str); ,例 :,建议: 当多种类型的混合输入输出 时,选用 scanf 和 printf; 当大量文字信息输入输出时,使 用 gets 和 puts。,这些函数的原型存放在string.h文件中。,strlen()函数 测试字符串的长度(length) strcat()函数字符串连结(catenate,使连续) strcmp()函数字符串比较(compare) strcpy()函数字符串的拷贝(copy),三、字符串处理函数,1、strlen()函数 功能:测试字符串的长度。 一般形式是: length=strlen(字符串) 其中: 函数参数可以是字符串常量,或者字符变量。 整型变量length用于保存函数的返回值。 字符串的长度是包围在双引号内的有效字符数,不包括双引号和0。 如: “ABC“ 长度为3。 “abcn“ 长度为4 “ 长度为0,#include #include main() char msg=“Rock and Roll“; int Inth; Inth=strlen(msg); printf(“字符串:%s的长度是:%dn“,msg,Inth); printf(“空字符串的长度是:%dn“,strlen(“); ,2、strcat()函数 功能:用于连结两个字符串。 一般形式: strcat(字符串1,字符串2); 将字符串2连结到字符串1的后面,注意: (1) strcat函数不检查字符串1的空白位置是否装得下字符串2。连结前应用strlen函数进行检验,确保不发生溢出。 (2) 长度加,为新字符串的结束符0留一个位置。,其中:参数1必须是字符串变量,而参数2可以是字符串常量或变量。,例 : #include #include #define SIZE 30 main() char bookSIZE; char msg=“的确是本好书!“; puts(“你喜欢什么书?“); gets(book); if(strlen(book)+strlen(msg)+1=SIZE) /*长度加1,为新串的0留一个位置*/ strcat(book,msg);puts(book); else puts(“字符数组空间不够,无法进行连结!“); ,3、strcmp()函数 功能:比较两个字符串的大小。 一般形式: i=strcmp(字符串1,字符串2); 比较方法:从左至右逐个比较其ASCII码值大小 其中: (1)字符串1、字符串2均可为字符串常量或变量. (2) i 是用于存放比较结果的整型变量。 比较结果的规定: 字符串1字符串2,函数返回一个正值。,#include #include main() int i; i=strcmp(“A“,“A“); printf(“%dn“,i); i=strcmp(“A“,“B“); printf( “%dn“,i); printf( “%dn“,strcmp(“B“,“A“); printf( “%dn“,strcmp(“C“,“A“); printf( “%dn“,strcmp(“disk“,“disksk“); ,例,正确的做法是用strcmp函数进行比较。 if(strcmp(“ABC “ ,“DEF“),字符串的比较是比较字符串中各个字符的ASCII码。因此无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符0为止。,如:if(“ABC”“DEF”
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理终极考试题及答案
- 呼吸科考试题及答案
- 全国大学生英语竞赛试题及答案
- 英语中考模拟试题及答案
- 安卓的面试题及答案
- 自考教育原理试题及答案
- 焊工培训考试题及答案
- 新闻学概论试题及答案
- 安全证试题及答案
- 邯郸导演考试题及答案
- 70岁以上的换领驾驶证三力测试题答案
- 药品售后服务承诺书
- 露天矿防火安全知识讲座
- 2024年山东烟台财金集团招聘笔试参考题库含答案解析
- GB/T 43234-2023成型模斜导柱
- 马工程版《中国经济史》各章思考题答题要点及详解
- 中建公路工程10T龙门吊安拆方案
- 2023年石狮市国企招聘考试基础题库
- OBE理念下的一流专业和课程建设
- 游戏俱乐部群公告范本
- 国家玩具安全技术规范
评论
0/150
提交评论