收藏 分享(赏)

C语言 数组.ppt

上传人:HR专家 文档编号:11669857 上传时间:2020-11-04 格式:PPT 页数:55 大小:123.51KB
下载 相关 举报
C语言 数组.ppt_第1页
第1页 / 共55页
C语言 数组.ppt_第2页
第2页 / 共55页
C语言 数组.ppt_第3页
第3页 / 共55页
C语言 数组.ppt_第4页
第4页 / 共55页
C语言 数组.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、第七章 数 组 数组是内存中的一种数据集合,用于存贮较大量的相同类型的数据元素,在程序中数组有一个名字,并通过下标访问数组的某个元素。 7.1 一维数组 一、一维数组的定义 语法格式:元素类型名 数组名; 如:int a5,b8;double y15,c20; #define N 10 long posN;int cN+1;/*/ 例如:int n=10,an;/*错误*/,只能是整型常量表达式,二、一维数组元素的引用 语法格式:数组名下标表达式 如:若有定义 int a4; 则元素a0,a1,a2,a3是数组的有效元素。a4并非有效元素,属于下标超范围。下标超范围会引起死机或程序错误,但C语

2、言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围。,必须是整型表达式,数组下标固定从0开始编号,7.1 一维数组,一维数组的元素在内存中是连续存放的。 例如:若有int a10;,则a数组中包含的10个元素在内存中的存储情况如下:,三、一维数组存贮空间分析:,如: double a5; 该数组共5个元素,存贮5个double型实数,共占用40字节存贮空间。,7.1 一维数组,四、一维数组的初始化,在定义数组时,允许对静态(数组定义前加有static保留字)数组、外部数组(定义于所有函数以及复合语句之外)及main()定义的auto型数组进行初始化。,7.1 一维数组,初

3、始化格式:,static 类型说明符 数组名=常量列表;,例: static int a4=1,2,3,4;,(1)static与外部数组不初始化,初值自动为0 (2)初始化时,可以不指定元素个数 static int a=1,2,3,4; 则数组a自动为4个元素, 与上面的定义形式完全等价。 (3)可以只对前部分元素进行初始化,余下的元 素初值自动为0。(main()中的auto型也是这样) 如: static int a5=1,2,3;则 a3与a4自动为0。,说明:,四、一维数组的初始化,例7.1 将数值5,3,4,5,3,6,6,4,3,2,9赋予数组a并求其和。 程序:,#inclu

4、de int a=5,3,4,5,3,6,6,4,3,2,9; main() int sum,i; sum=0; for (i=0;i=10;i+) sum+=ai; printf(sum=%dn,sum); ,7.1.3 一维数组应用举例,例7.2 编写一程序,求全班40个学生计算机的平均成绩。 其算法可用如图7.1所示的流程图表示。 程序:(要求学生自己写出),7.1.3 一维数组应用举例,基本思想:每一趟在n-i+1(i=1,2,.,n-1)个记录中(第i趟)选取关键字最小的记录作为有序序列中第i个记录。 方法:n个数,比较n-1趟 第i趟(i=1,2,.,n-1) 比较n-i次,选择一

5、个最小的记录交换一次。,选择排序总共要进行(n-1)+(n-2)+1=n(n-1)/2比较,最多n-1次交换。,例7.3 使用选择法对输入的10个整型数据进行从小到大排序。,选择排序法,for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(ajak) k=j; if(k!=i) t=ai;ai=ak;ak=t; ,要求学生写出完整程序,语言描述:,/*k指示当前比较的最小值下标*/,练习:写出该程序,选择排序法,一、二维数组的定义 语法格式: 元素类型名 数组名下标1维数下标2维数; 如:int a58; /*5行8列整型数组*/ 又如:#define N 6 l

6、ong mNN; /*N行N列长整型数组*/,行数,列数,7.2 二维数组,二、二维数组元素的引用 语法格式: 数组名行下标列下标 其中,下标表达式必须是整型表达式;下标固定从0开始编号。 如: 若有定义int a34; 则左上角元素下标为a00, 右下角元素下标为a23。 C语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围。,例如,若有int a23;,则a数组中包含的二行三列共6个元素在内存中的存储情况如下:,三、二维数组存贮空间分析:,也只能对static或外部数组、main()中的auto型数组进行初始化。 初始化方法: 标准形式 static int a23

7、=1,2,3,4,5,6; 注意:用内层表示行,每行可视作一个一维 数组,并按行初始化。 2.对所有元素初始化可以缺省行数和内层 如:上述初始化可写为 static int a3=1,2,3,4,5,6或 static int a3=1,2,3,4,5,6; 或 static int a23=1,2,3,4,5,6;,7.2.2、二维数组的初始化,(3)static与外部数组不初始化,初值自动为0 (4)每行可以只对前几列元素进行初始化,余下的元素初值自动为0。 如: static int a3=1,2,3;则 矩阵元素初值如下:,(5)指定行数时,可以只初始化前面几行,余下各行元素初值自动为

8、0. 如: static int a43=1,2,3,4,5,6; 则矩阵初值如下:,1 0 0 2 3 0,1 0 0 2 3 4 5 6 0 0 0 0,7.2.2、二维数组的初始化,例7.4 将下表存入数组a,按行求元素之和并显示。 25 13 32 10 54 53,7.2.3 应用举例,程序: #include main() int a24,i; a00=25;a01=13;a02=32; a10=10;a11=54;a12=53; for (i=0;i=1;i+) ai3=ai0+ai1+ai2; for (i=0;i=1;i+) printf(%d %d %d %d n,ai0,

9、ai1,ai2,ai3); ,例7.5:输入一个三行四列的矩阵A,计算其转 置矩阵B,输出矩阵B。,bji=aij,7.2.3 应用举例,7.2.3 应用举例,#include 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);

10、 ,程序:,例7.6 编写一程序,求全班40个学生每个学生三门功课的平均成绩。,1.定义数据结构 40个学生3门功课的存放:int a4030; 每个学生三门功课的平均成绩存放:int v40; 2.输入学生成绩 3.求每个学生平均成绩: vi= (ai0+ai1+ai2)/3, 4.输出结果.,分析:,7.2.3 应用举例,程序: #include main() int a403,s,i,j,v40; for(i=0;i40;i+) for(j=0;j3;j+) scanf(%d, ,例7.7 在N行M列的二维数组x中,找出数组的最大值以及此最大值所在的行、列下标。,分析:1.定义二维数组:

11、int xNM; 定义变量 max:存放最大值 line:存放最大值行号 col:存放最大值列号 2.找最大值:max初始值= x00, line及col的初始值为0, 再将二维数组x中的元素逐个与max进行比较,确定新的max和line及col的值,直到二维数组x中的元素全部处理完。 3.输出数据,7.2.3 应用举例,程序运行结果如下: input array numbers: 12 31 40 20 67 80 max=80 line=1 col=2,程序: #define N 2 #define M 3 #include stdio.h main() int i,j,xNM,max,l

12、ine,col; printf(input array numbers:n); for(i=0;iN;i+) for(j=0;jM;j+) scanf(%d, ,7.3.1 字符数组的定义、引用与初始化 1字符数组的定义 一维字符数组的定义形式如下: char 数组名常量表达式; 例如: char a10; 二维字符数组的定义形式如下: char 数组名常量表达式1常量表达式2; 例如: char a34;,7.3 字符数组,7.3 字符数组,2字符数组元素的引用 一维字符数组元素的引用形式如下: 数组名下标 例如: a2 a1+1 二维字符数组的元素的引用形式如下: 数组名行下标列下标 例如

13、: a10 a03-2,7.3 字符数组,3字符数组的初始化 一维字符数组的初始化形式如下: static 类型说明符 数组名=字符常量列表; 例如: char a10=H,e,l,l,o,! 二维字符数组的初始化形式如下: static 类型说明符 数组名=字符常量列表,; 例如:char a23=A,B,C,D,7.3 字符数组,说明: (1)如果花括号中提供的字符个数大于数组长度,则作语法错误处理。 (2)如果花括号中提供的字符个数小于数组长度,则只将这些字符赋给数组中的前面那些元素,其余元素自动定为空字符(即0)。 (3)如果花括号中提供的字符个数与预定的数组长度相同,在定义时可以省略

14、数组长度,系统会自动根据初值个数确定数组长度。,7.3.2 字符串与字符数组,1字符串和字符串结束标志 C语言约定用0作为字符串的结束标志,它占内存空间,但不计入串的长度。0的代码值为0。 字符型一维数组来存储一个字符串,用字符型二维数组来存储多个字符串。,7.3.2 字符串与字符数组,2用字符串常量给数组赋初值(初始化)。 例如,如果有:char c6=“china”; 或char c6= “china”; 或char c = “china”; 则数组c在内存中的存储情况如下:,3字符数组与字符串的输入输出 (1)用格式符“%c”逐个字符输入输出:,7.3.2 字符串与字符数组,#inclu

15、de main() char a10; int i; for(i=0;i字符串2,函数值为正整数。 (3)字符串1=a ,7.3.3 字符串函数,例7.9 将字符串s1从第m个字符开始剩余的所有字符送入字符数组s2中。 分析: 该程序用一个单循环控制,将字符数组s1中的元素从第m个字符开始剩余的所有字符依次逐个送入字符数组s2中。 程序中用两个整型变量i、j分别标识元素在原字符数组s1中的下标和在目标数组s2中的下标,每循环一次,即传送一个字符后,i、j的值增1。 循环控制条件是当前所处理的原字符数组s1中的元素不是字符串结束标志0,即原字符数组s1中从第m个字符开始剩余的所有字符还没有处理完

16、毕。,程序: #include main() int i,j,m; char s180,s280; printf(input a string:n); gets(s1); printf(input start point:n); scanf(%d, ,7.4 本章考点,一维数组的定义、引用及初始化。 二维数组的定义、引用及初始化。 字符串和字符数组。 字符串处理函数。,7.5 典型试题详解,1以下能正确定义一维数组的选项是_。 A)int num; B)#define N 100; int numN; C)int num0100 D)int N=100; int numN; 正确答案:B(知识

17、点:一维数组的定义),7.5 典型试题详解,2假设int类型变量占用两个字节,其有定义:int x10=0,2,4;,则数组x在内存中所占的字节数是_。 A)3 B)6 C)10 D)20 正确答案:D(知识点:一维数组的定义),7.5 典型试题详解,3以下程序运行后的输出结果是_。 main() int i,n=0,0,0,0,0; for(i=1;i=4;i+) ni=ni-1*2+1; printf(%d ,ni); 正确答案:1 3 7 15(知识点:一维数组的定义与引用),7.5 典型试题详解,4以下数组定义中不正确的是_。 A)int a23; B)int b3=0,1,2,3;

18、C)int c100100=0; D)int3= 1,2,1,2,3,1,2,3,4; 正确答案:D(知识点:二维数组的初始化) 试题分析:二维数组初始化时,对数组第一维的长度可以不指定,但第二维的长度不能省略。,7.5 典型试题详解,5有以下程序: main () int aa44= 1,2,3,4,5,6,7,8,3,9,10,2,4,2,9,6; int i,s=0; for(i=0;i4;i+) s+=aail printf(%dn,s) 执行后的输出结果是_。 A)11 B)19 C)13 D)20 正确答案:B(知识点:二维数组的定义、引用及初始化) 试题分析:该程序是求aa0l、

19、aa1l、aa2l、aa3l之和并输出。,7.5 典型试题详解,6以下不能正确进行字符串赋初值的语句是_。 A)char str5=good!; B)char str =good!; C)char str6=good!; D)char str5=g, o,o,d; 正确答案:A(知识点:字符数组的初始化) 试题分析:每个字符串末尾都有一个结束0,因此,字符串 good!在内存中占6个字符型存储单元,在初始化时,可以不指定数组的大小,或指定一个大于或等于6的值。选项D中给出的初值个数小于数组的大小5,则将初值赋给数组前面的元素,其后的元素值为0。,7.5 典型试题详解,7以下程序的输出结果是_。

20、 main() char ch35= AAAA, BBB, CC; printf(%sn,ch1); A)AAAA B)BBB C)BBBCC D)CC 正确答案:B(知识点:字符数组的初始化) 试题分析:程序中定义ch是一个字符型的二维数组,由于二维数组可以看做是由一维数组构成的一维数组,ch35是由ch0、ch1、ch2构成的,而ch0、ch1、ch2又都是由5个字符型元素构成的一维数组,因此ch1即是二维数组ch35的第二行的字符串BBB所在一维数组的名字,因为其元素是字符类型,可以用数组的名字(即数组的首地址)来表示所存储的字符串BBB,输出时去掉字符串定界符“”。,7.5 典型试题详

21、解,8有下列程序: main() char s = n123 printf(%d,%dn,strlen(s),sizeof(s); 程序运行后的输出结果是_。 A)赋初值的字符串有错 B)6,7 C)5,6 D)6,6 正确答案:C(知识点:字符串处理函数、转义字符) 试题分析:程序的输出结果是strlen(s)和sizeof(s)两个函数的值。函数strlen(s)是求字符串s(用字符数组存储)的长度,即字符串s中有效字符的个数,不包括字符串结束标志0,根据对s的初始化处理,字符串s中包含两个转义字符n和,因此字符串s的长度为5。函数sizeof(s)是求字符数组s在内存中所占的字节数,根据

22、程序中对s的初始化处理,字符数组s的长度省略,即由其后的初始值来确定,是字符串s中有效字符的个数加1(即加上字符串结束标志0),为6,由于每个数组元素是字符类型,在内存中占一个字节,所以字符数组s在内存中所占的字节数为6。注意,如果字符串s的长度在定义时给出了确定的值,则计算其在内存中所占字节数时,按给定的长度计算。,7.5 典型试题详解,9当执行下面的程序时,如果输入ABC,则输出是_。 #include #include main() char ss10=12345; gets(ss); strcat(ss, 6789); printf(%s,ss); A)ABC6789 B)ABC67

23、C)12345ABC6 D)ABC456789 正确答案:A(知识点:字符串处理函数),7.5 典型试题详解,试题分析:程序开始虽然对字符数组ss进行了初始化,但其后又用函数gets(ss)从键盘上重新输入为字符串ABC,再通过函数strcat(ss, 6789)将字符串6789连接到ss的尾部,字符串ss即为ABC6789。,7.5 典型试题详解,10下列程序执行后的输出结果是_。 main() char arr24; strcpy(arr0, you); strcpy(arr1, me); arr03= A)you&me B)you C)me D)err 正确答案:A(知识点:字符串处理函数) 试题分析:程序中定义了二维字符数组arr24,即包括两个字符型一维数组arr0和arr1,通过两个字符串复制函数strcpy(arr0, you)和strcpy(arr1, me)将字符串you和字符串me分别复制到arr0和arr1,这时,再赋arr03的值为字符&,即覆盖了字符串you后的字符串结束标志0,由于二维数组在内存中是按行连续存放的,当输出字符串arr0时,将从arr0的第一个字符开始输出,直到遇到第一个字符串结束标志0(即arr1中字符串me后的结束标志)为止。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 其他相关文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报