C语言第8章 常用数据表示_数组_第1页
C语言第8章 常用数据表示_数组_第2页
C语言第8章 常用数据表示_数组_第3页
C语言第8章 常用数据表示_数组_第4页
C语言第8章 常用数据表示_数组_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第 8 8 章章(1)(1) 数数 组组2 我们已学习到的数据类型都属于基本类型我们已学习到的数据类型都属于基本类型: int , char , float. C语言还提供了一类语言还提供了一类“构造类型构造类型”的数据的数据: 数组数组, 结构体结构体, 共用体。共用体。8.1 数组:数组:新内容3 数组的概念数组的概念: 数组是数组是同一种同一种数据类型的数据类型的有序集合有序集合。 数组中的每个元素可用数组中的每个元素可用数组名和下标数组名和下标, 唯一唯一地来标记它地来标记它们。们。 数组元素数组元素又称为又称为下标变量下标变量. 如如: 数组元素数组元素array15 表示名为表

2、示名为array1的数组中的数组中下标下标为为5的那个元素的那个元素.4使用数组的好处:使用数组的好处: 让一批类型相同的数据用同一个数组名,书写方让一批类型相同的数据用同一个数组名,书写方 便,便,可读性高;便于使用循环语句处理可读性高;便于使用循环语句处理。 数组中的一个一个的数据称为数组中的一个一个的数据称为数组元素数组元素,它们在它们在内存中内存中是连续存放的是连续存放的. 数组元素数组元素其实可视为其实可视为一变量一变量. 非常重要58.1.1 一维数组的定义和引用:一维数组的定义和引用: 1定义:定义: 类型说明符类型说明符 数组名数组名 数组长度数组长度 ; 说明说明: (1).

3、 C语言的数组下标是语言的数组下标是从从开始计数。开始计数。 定义时定义时,数组长度必定是数组长度必定是一一常量常量,指明数组元素个数,指明数组元素个数从从 0开始开始例例: int a110; /*定义一个含有定义一个含有10个个整型整型元素的数组元素的数组a1*/ char c320; /*定义一个含有定义一个含有20个个字符字符元素的数组元素的数组c3*/ float f45; /*定义一个含有定义一个含有5个个单精度浮点型单精度浮点型元素的数组元素的数组f4*/6 如定义了数组如定义了数组: int a110 ; 它它有有10个元素个元素,分别是:分别是: a10, a11, a12,

4、 a18, a19 . 这里这里不存在不存在a110 这个元素。这个元素。数组数组a110 :a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 这里的这里的a110是定是定义数组的表达形式义数组的表达形式. 这里的这里的a1i是数组是数组a110 中的第中的第i号元素号元素.注:注: 注意注意定义时定义时数组名的表数组名的表示形式,与它的示形式,与它的各元素各元素的表的表示形式的区别。示形式的区别。72. 数组元素的引用数组元素的引用: a. 数组必须先定义,然后才能使用数组必须先定义,然后才能使用. b. 只能逐个引用数组各个元素,不能引用整个数组。只能逐个引用

5、数组各个元素,不能引用整个数组。 数组元素的数组元素的引用引用要指定下标要指定下标, 表示形式表示形式: 数组名数组名下标下标 例例: : int k, a10; 在可以使用整型变量的任何地方在可以使用整型变量的任何地方, ,都可以使用数组元素都可以使用数组元素. .如如: : k=3; a0=23; ak-2=a0+1; scanf(“%d”,&a9); 8例例8.1 数组及数组元素的表示方法数组及数组元素的表示方法:#include int main() int i,a10=1,2,3,4,5,6; for(i=0;i6;i+)printf(a%d=%-4d, i, ai); printf

6、(n); return 0;ch8_8_1.c在定义数组时可对数在定义数组时可对数组元素赋初值组元素赋初值.输出结果输出结果9说明说明: (1). 语言中对语言中对下标不作合法性检查下标不作合法性检查,所以允许在,所以允许在使使 用中下标越界。这种情况须程序员自我检查和控制。用中下标越界。这种情况须程序员自我检查和控制。 合法的下标范围是合法的下标范围是: 0, 数组长度数组长度-1(2). 定义定义数组数组时时,数组数组长度可以包含常量和符号常量,长度可以包含常量和符号常量,不不 可使用变量可使用变量 。 也就是说也就是说, 数组长度在定义时必须指定数组长度在定义时必须指定, 运行时是不运行

7、时是不 可改变的可改变的.(3). 使用时,只能使用时,只能逐个使用逐个使用数组元素数组元素, 而不能一次使用而不能一次使用 整个数组。整个数组。 即:只能对数组元素进行操作即:只能对数组元素进行操作.10 物理意义:物理意义:数组一旦定义数组一旦定义: 在编译时在内存中开辟出一块在编译时在内存中开辟出一块连续的空间连续的空间,空间的空间的首地址首地址对应对应于第一个元素,依次排列。于第一个元素,依次排列。越越界界?地址地址下标下标首地址0首地址+117254首地址+2287首地址+3390首地址+4487首地址+5578首地址+6首地址+7首地址+8首地址+9678986905085.内容内

8、容 如果如果越越界将出现什么问题界将出现什么问题?数组首地址数组首地址11例例: 使用一个使用一个a10数组数组,依次送入依次送入0-9,然后逆序输出然后逆序输出. main( ) int i, a10; for(i=0; i=0; i-) printf(“%d ”, ai ); 输出:输出: 9 8 72 1 0 0 1 2 3 4 5 6 7 8 9a0数组数组a10a1a2a8a9. 这里的这里的a10是定是定义数组的表达形式义数组的表达形式. 这里的这里的ai是数组是数组a10 中的第中的第i号元素号元素.12例例 8.2 数组元素赋值数组元素赋值,及输出及输出#includeint

9、main() int s10=1,2,3,4,5,6,7,8,9,10; int i=2, a3; a0=si; a1=s2+i; a2=s2*i+3; printf(a0=%d a1=%d a2=%dn,a0,a1,a2); return 0; 这里的定义了二个数这里的定义了二个数组组: s10, a3.133. 一维数组的初始化:一维数组的初始化: 在定义数组时可对数组元素赋初值在定义数组时可对数组元素赋初值,如:如: int a10= 1,2,3,4,5,6,7,8,9,10 ;说明说明:(1). 虽然虽然C语言规定语言规定,只有静态只有静态(static)存储的数组才能初存储的数组才能

10、初 始化始化,但一般的但一般的C编译系统都允许对动态编译系统都允许对动态(auto)型数组型数组 赋初值赋初值. 以下内容中以下内容中,允许对静态数组允许对静态数组, 动态型数组初始化动态型数组初始化.可以将所有数据写在可以将所有数据写在一对花括号内。一对花括号内。14例如例如: static int b5=1,2,3,4,5; 静态静态(static)存储的数组如果没有初始化存储的数组如果没有初始化,系统自动给所有系统自动给所有的数组元素赋的数组元素赋0.(2). 可以只给部分元素赋初值可以只给部分元素赋初值: static int b5=1,2,3; 给前面给前面3个元素赋初值,后面个元素

11、赋初值,后面2个元素个元素自动为自动为0. 又如又如: int fib20=0,1; 给前面给前面2个元素赋初值,后面其它元素的值个元素赋初值,后面其它元素的值不确定不确定.无无 static!,为为动态动态(auto)型数组型数组.15 如果提供的初始值个数如果提供的初始值个数与希望与希望的数组长度不一致,如的数组长度不一致,如 提供提供5个初始值个初始值, 而希望数组长度为而希望数组长度为10,这时数组长度,这时数组长度 不能省。不能省。(3). 对对全部数组元素赋初值时全部数组元素赋初值时,可不指定数组元素长度,可不指定数组元素长度.如如: int a5=1,2,3,4,5;可写成:可写

12、成: int a =1,2,3,4,5;这时系统自动定义数组这时系统自动定义数组 a 的长度为的长度为5。16例例8.3 从键盘输入从键盘输入,给给数组元素赋初值数组元素赋初值:#includeint main() int i,a10; printf(请输入请输入10个整型数,以空格隔开个整型数,以空格隔开n); for(i=0;i10;i+) scanf(%d,&ai); printf(输入的数组为:输入的数组为:); for(i=0;i10;i+) printf(“a%d=%-4d”, i, ai); printf(n); return 0;ch8_8_3.c178.1.2 字符数组字符数

13、组 存放字符数据的数组是存放字符数据的数组是字符数组字符数组。数组中一个元素存。数组中一个元素存放一个字符。放一个字符。 c c语言中没有字符串变量语言中没有字符串变量, ,它用一维字符数组来表示它用一维字符数组来表示. .即将字符串作为字符数组来处理即将字符串作为字符数组来处理. . 181. 一维字符数组的定义一维字符数组的定义 如如:char str80;2字符数组的初始化字符数组的初始化: 最容易理解的方式就是最容易理解的方式就是, 逐个字符赋给数组中各元素逐个字符赋给数组中各元素. 如如: char c10= I, , a, m, , h, a, p, p,y;还是挺麻烦的还是挺麻烦

14、的19 如果初始值个数如果初始值个数少于少于数组长度数组长度,则只将这些字符赋予数则只将这些字符赋予数组中前面的元素组中前面的元素, 其余的元素自动定为空字符其余的元素自动定为空字符(0). char c10= c, , p, r, o, g, r, a,m; C0 C1 C2 C3 C4 C5C6C7C8 C9 C p r o g r a m 0在内存中的状态在内存中的状态:共九个字符共九个字符.203. 字符数组的引用字符数组的引用: 可以引用字符数组一个元素可以引用字符数组一个元素,得到一个字符得到一个字符. main( ) char c210= I, ,a,m, ,a, ,b,o,y;

15、 int i; for(i=0;i10;i+) printf(“%c”,c2i); 运行输出运行输出: I am a boy214. 字符串和字符串结束标志:字符串和字符串结束标志: 为了测定字符串的为了测定字符串的实际长度实际长度,C语言规定了一个字符串语言规定了一个字符串结束标志结束标志0. 如果有一个字符串如果有一个字符串, 其第其第10字符为字符为0,则此字符串的则此字符串的有效字符有效字符为为9个个. 也就是说也就是说,在遇到在遇到0时时,表示字符串结束表示字符串结束,由它前面的由它前面的字符组成字符串字符组成字符串.22 系统对系统对字符串常量字符串常量也也自动加一个自动加一个0,

16、 例如例如“C program”共有共有9个字符个字符, 但在内存中占用但在内存中占用10字节字节, 最后一个最后一个0是由系统自动加上去的是由系统自动加上去的. 字符串字符串作为作为一维字符数组一维字符数组存放在内存中存放在内存中. 一定记住23 5. 字符串的存储字符串的存储: 我们对字符串数组初始化也可用如下方法我们对字符串数组初始化也可用如下方法: char c2 = “I am happy” ; 也可也可直接直接写成如下形式写成如下形式: char c2 = “I am happy” ; 字符数组字符数组c2 的的长度长度不是不是10, 而是而是11, 这点务请注意这点务请注意.这里

17、共十这里共十个字符个字符.24 这是因为字符串常量的最后由系统自动加上一个这是因为字符串常量的最后由系统自动加上一个0. 因此因此,上面的初始化与下面的初始化等价上面的初始化与下面的初始化等价: char c210=I, ,a,m ,h,a,p,p,y,0;256字符串的操作字符串的操作: 定义数组:定义数组: char s1 =“China”; 输出输出:使用:使用 “%s”格式输出格式输出: printf(“%s”,s1); 遇到遇到0就停止输出就停止输出。 输入输入: char s26; scanf(“%s”,s2); 输入输入: china ( 回车回车)数组名代表数组名代表什么什么

18、?不能加不能加& 注意注意:在输入时,:在输入时,s2前不能加前不能加&,在,在C中,中,数组名代表数组名代表 数组初始地址。数组初始地址。26例例 8.4 利用字符数组利用字符数组,输出字符串输出字符串”I Love Linux!” #include int main() char string =I Love Linux!; printf(%sn,string); return 0; Ch8_8_4.c27例例 : 利用数组利用数组,计算计算Fibonacii(斐波纳契斐波纳契)数列前数列前20项的值项的值,即即 1,1,2,3,5,8,, 并按每行打印并按每行打印5个的格式输出个的格式输

19、出. 用数组计算并存放数列的前用数组计算并存放数列的前2020个数个数, ,并有下列关系式并有下列关系式成立成立: : fib0=fib1=1 ; / n=0,1 fibn=fibn-1 + fibn-2 ; / 2n1928 main( ) int i; int fib20=1,1; for(i=2;i20;i+) fibi=fibi-1+fibi-2; for(i=0;i20;i+) printf(%6d,fibi); if(i+1)%5=0) printf(n); 初始化数组,生初始化数组,生成前二个数成前二个数: 1,1计算该数列其计算该数列其余的余的18个数个数. 每输出每输出5 个

20、个数就换行数就换行.输出:输出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610987 1597 2584 4181 6765 298.1.3 二维数组的定义与引用:二维数组的定义与引用:1二维数组的定义:二维数组的定义: 一般形式:一般形式: 类型名类型名 数组名数组名行长度行长度列长度列长度例例: float a134 , b1510 ; 这里定义这里定义: a1数组为数组为3行行,4列。列。 b1数组为数组为5行行,10列。列。 第一维第一维(行行)第二维第二维(列列)30 二维数组实际上对应了一个二维表格二维数组实际上对应了一个二维表格, ,其中其

21、中第一维第一维表表示二维表的行数示二维表的行数, ,第二维第二维表示二维表的列数表示二维表的列数. . 二维数组二维数组按行按行列列矩阵方式在内存中连续存放矩阵方式在内存中连续存放, ,第一下标第一下标( (维维) )指示行指示行, ,第二下标第二下标( (维维) )指示列指示列, ,下标都从下标都从0 0开始计数开始计数. .如数组如数组a34的排列的排列: a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a00a01a02a11a03a10a12a13a20 .数组的数组的起始地址起始地址312. 二维数组元素的引用:二维数组元素的引用:二维

22、数组二维数组元素元素的表示形式:的表示形式: 数组名数组名行下标行下标列下标列下标 如数组元素如数组元素 a13: 数组元素可以出现在表达式中,也可以赋值:数组元素可以出现在表达式中,也可以赋值: b12 = a232 ; a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 代表第二行代表第二行,第四列上第四列上的那个元素的那个元素.32注意注意: a. 要区分要区分定义定义数组时用的形式:数组时用的形式:int a34 ; 和和使用使用数组元素时的形式:数组元素时的形式:a23 两种形式的含义是不同的两种形式的含义是不同的。b. 引用数组元素时,要

23、保证下标值在定义的范围之内引用数组元素时,要保证下标值在定义的范围之内. 如定义数组:如定义数组: int a34; 它的行下标值范围它的行下标值范围: 0, 它的列下标值范围它的列下标值范围: 03 . 333二维数组的初始化二维数组的初始化 可使用下列几种方法可使用下列几种方法:a. 可以将可以将所有数据所有数据写在一对花括号内。如写在一对花括号内。如: int a34= 1, 2 11,12 ; 数组按顺序给各元素赋初值数组按顺序给各元素赋初值.b. 可可分行分行给二维数组赋初值给二维数组赋初值: int a34= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12 第

24、一个花括号内赋给第一行第一个花括号内赋给第一行,第二个花括号内的值赋给第第二个花括号内的值赋给第二行二行, , 外加一个花括号外加一个花括号.34c. 可以对可以对部分部分元素赋初值。元素赋初值。 如如: static int a34= 1, 5, 9 ;存放情况存放情况: 1 0 0 0 5 0 0 0 9 0 0 0 d. 如果如果提供全部提供全部初始数据初始数据,进行赋初值进行赋初值,则定义数组时则定义数组时, 第一维长度可省去第一维长度可省去,第二维不可省第二维不可省. 如:如: int a 4=1,2, 11,12; 系统根据每行系统根据每行4列列,从而可确定共从而可确定共3行。行。

25、 即对各行第一列即对各行第一列的元素赋初值,其的元素赋初值,其它元素为它元素为0. 也可对各行中某一元素赋初值也可对各行中某一元素赋初值: int a34=1,0,6,0,0,11;35#includeint main() int i,j,a44; printf(请输入请输入16个整型数,以空格隔开个整型数,以空格隔开n); for(i=0;i4;i+) for(j=0;j4;j+) scanf(%d,&aij); .例例 8.5二维数组的输入输出二维数组的输入输出.Ch8_8_5.c36 printf(输入的数组为:输入的数组为:n); for(i=0;i4;i+) for(j=0;j4;j

26、+) printf(a%d%d=%-4d, i, j, aij ); printf(n); return 0; 37例例: 写一程序,求一矩阵的主对角线写一程序,求一矩阵的主对角线(左上到右下角左上到右下角)上的上的 元素之和元素之和.main() int a33=1,3,5,7,9,11,13,15,17; int sum=0, i, j; for(i=0;i3;i+) /*行行 for(j=0;j3;j+) /*列列 if(j=i) sum=sum+aij; printf(”sum=%d”,sum); i=1 1 3 5 7 9 1113 15 17i=0j=0i=2j=1j=2 a 数组

27、数组Ch8_8_5_1.c38例例:输入一串字符输入一串字符 , 用反序输出:用反序输出: #include ”stdio.h” main( ) int i, j=0; char c1 , s100; while( (sj+=getchar( ) ) != n) ; for( i=0, j -=2 ; ij ; i+, j-) c1=sj ; sj=si ; si=c1; for( i=0 ; si != n; i+) printf(“%c”, si); a b c d e f n J=0J=1J=5 J=6J=7Ch8_8_5_2.c39 第第8章章 (1) “数组数组” 结束结束40 第第

28、8章章 课后作业课后作业:41P50:#includevoid main() int blank,digit,i,other; char ch; blank=digit=other=0; printf(Enter 10 characters:); . 42 for(i=1;i=10;i+) ch=getchar( ); switch(ch) case : /_ case n: blank+;break; case 0: case1: case 2: case3: case 4: case5: case 6: case7: case 8: case9:digit+;break; /_ defau

29、lt: /_ other+;break; printf(blank=%d,digit=%d,other=%dn,blank,digit,other);43课本课本P101_7_1.c#includeint main() int x; printf(请输入百分制成绩请输入百分制成绩:n); scanf(%d,&x); . 44 switch(x/10) case 10: case 9: printf(五分制五分制:5分分 nn); break; case 8: printf(五分制五分制:4分分 nn);break; case 7: printf(五分制五分制:3分分 nn);break; ca

30、se 6: printf(五分制五分制:2分分 nn);break; default: printf(五分制五分制:1分分 nn);break; return 0;45课本课本P101_7_2.c#include #includeint main() double x,s; int y;printf(请输入函数值请输入函数值:n);scanf(%lf,&x);printf(您希望进行哪种运算您希望进行哪种运算?n);printf(1.计算计算sin(x)n);printf(2.计算计算cos(x)n);printf(3.计算计算tan(x)n); printf(Please input:n);

31、scanf(%d,&y); 46switch(y) case 1: s=sin(x); printf(sin(%.2f)=%fn,x,s); break; case 2: s=cos(x); printf(cos(%f)=%fn,x,s);break; case 3: s=tan(x); printf(tan(%f)=%fn,x,s);break;default: printf(输入有误,请输入输入有误,请输入0 - 3之间的数字!之间的数字!n); return 0;47/课本课本P123_8_2.c (判断回文判断回文) #include void main( ) int i, j=0;

32、char s100; printf(请输入一串字符,以回车结束。请输入一串字符,以回车结束。n); while( (sj+=getchar( ) ) != n) ; for( i=0, j-=2 ; i=j) printf(该字符串是回文!该字符串是回文!n); else printf(该字符串不是回文!该字符串不是回文!n); a b d d b a n J=0J=1J=5 J=6J=748补充题补充题 1: 从键盘输入从键盘输入5个字符组成的单词个字符组成的单词, 判断此单词是判断此单词是不是不是hello,并显示结果并显示结果 .49#include main() static char

33、 str =h,e,l,l,o; char str16; int i, flag; for(i=0;i=5;i+) str1i=getchar( ); flag=0; for(i=0;i5;i+) if(str1i != stri) flag=1; break; if(flag) printf(This word is not hello); else printf(This word is hello); 50例例2: 输入一行字符输入一行字符,统计其中有多少单词统计其中有多少单词,单词用空格隔开单词用空格隔开.#include main( ) char string81; int i, n

34、um=0, word=0; char c; gets(string); num 统计单词个数统计单词个数, word用用来判断是否单来判断是否单词的标志词的标志.You are students.51 for(i=0; (c=stringi) != 0; i+) if(c= ) word =0; else if(word=0) word=1; num+; printf(These are %d words in the line.n,num);(1). 当前字符为空格当前字符为空格: 未出现新单词未出现新单词 ,word=0, num 不不累加。累加。(2). 当前字符为非空格当前字符为非空格(分两种情况分两种情况):a. 前一字符为空格前一字符为空格(word=0),新词出新词出 现现, word=1, num 加加1 .b. 前一字符为非空格前一字符为非空格(word=1),未出未出 现新单词现新单词, num 不不加加1 .You are students.52 从本质上来看从本质上来看,二维数组也可看作一种二

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论