清华谭浩强C语言课件第7章数组.ppt_第1页
清华谭浩强C语言课件第7章数组.ppt_第2页
清华谭浩强C语言课件第7章数组.ppt_第3页
清华谭浩强C语言课件第7章数组.ppt_第4页
清华谭浩强C语言课件第7章数组.ppt_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

高级语言程序设计 张远 TelE-mail: 程序=算法+数据结构+结构化程序 设计方法+语言工具和环境 第7章 数组 v前面各章所使用的数据都属于基本数据 类型(整型、实型、字符型),C语言除 了提供基本数据类型外,还提供了构造 类型的数据,它们是数组类型、结构体 类型、共同体类型等。构造数据类型是 由基本数据类型的数据按照一定的规则 组成,所以也称为“导出类型”。 v下面简单介绍一下数组概念: 1、数组:一组具有相同数据类型的数据的 有序的集合。 2、数组元素:构成数组的数据。数组中的 每一个数组元素具有相同的名称,不同 的下标,可以作为单个变量使用,所以 也称为下标变量。 3、数组的下标:是数组元素的位置的一个 索引或指示。 4、数组的维数:数组元素下标的个数。根 据数组的维数可以将数组分为一维、二 维、三维、多维数组。 v7.1 一维数组 v数组组是一组组有序数据的集合,数组组中每一个元 素的类类型相同。用数组组名和下标标来唯一确定数 组组中的元素。 7.1.1 一维数组的定义(先定义后使用) 定义方式: 类型说明符 数组名整型常量表达式 例: int a10 第7章 数组 int a10 表示如下信息: v定义一个数组,数组名a,有10个元素,每个元素 的类型均为int。 v这10个元素分别是:a0、a1、a2、a3、 a4、a8、a9。 v各个数组元素是排成一行的一组下标变量,用一个 统一的数组名来标识,用一个下标来指示其在数组 中的位置。一维数组通常和一重循环相配合,对数 组元素进行处理。 v注意: v1)下标从0开始。如:数组a的第1个元素是 a0,数组的第8个元素是a7 第7章 数组 v注意: 2)C语言不允许对数组的大小做动态定义 ,如: vint n; vscanf(“%d“, vint an; v因为为在编译时编译时 ,C编译编译 器根据已知数组组 大小分配内存。 v说明: 1)数组名:按标识符规则。本例a就是数 组名。 2)整型常量表达式:表示数组元素个数( 数组的长度)。可以是整型常量或符号 常量,不允许用变量。整型常量表达式 在说明数组元素个数的同时也确定了数 组元素下标的范围,下标从0开始整型 常量表达式-1(注意不是1整型常量表 达式)。 vC语言不检查数组下标越界,但是使用时, 一般不能越界使用,否则结果难以预料(覆 盖程序区-程序飞出,覆盖数据区-数据覆盖 破坏,操作系统被破坏,系统崩溃)。本例 数组元素个数是10个,下标从0-9。 3)C编译程序为数组分配了一片连续的 空间。 4)类型说明:指的是数据元素的类型,可以是 基本数据类型,也可以是构造数据类型。类型 说明确定了每个数据占用的内存字节数。 一维数组: float mark100; mark0 mark1 mark2 mark3 . . . mark99 86.5 92.0 77.5 52.0 . . . 94.0 低地址 高地址 每个数据元素占用的 字节数,就是基类型 的字节数 一个元素占4个字节 第7章 数组 7.1.2 一维数组的初始化 v初始化:在定义时指定初始值,编译器把初值 赋给数组变量。赋值:使用赋值语句,在程序 运行时把值赋给数组变量,如a0 = 2。 v初始化格式: v数据类型 数组名常量表达式初值表 1、一般初始化,例: vstatic int a10= 0,1,2,3,4,5,6,7,8,9 vint array10 = 1,2,3,4,5,6,7,8,9,10; 2、部分元素初始化,其余元素均为零。 例:static int a10 = 0,1,2,3,4; 仅前5个元素赋初值,后5个元素自动赋为0。 3、全部元素均初始化为0,不允许简写。 static int a10 = 0,0,0,0,0,0,0,0,0,0; 不能写成:int a10=0*10; 第7章 数组 v不能简写为: vstatic int a10 = 0*10; v注意:当程序不给数组指定初始值时, 编译器作如下处理: v(1)编译器自动把静态数组的各元素初 始化为0。 v(2)编译器不为动态数组自动指定初始 值。 v4、如果全部元素均指定初值,定义中可以省 略元素的个数,例: vstatic int a5 = 1,2,3,4,5; v可以写为: vstatic int a = 1,2,3,4,5; 7.1.3 数组组元素的引用 vC语言规定,不能引用整个数组,只能逐 个引用元素,元素引用方式: v 数组名下标表达式 例:a0 = a5 + a7 - a2*3 “下标表达式”可以是任何非负整型数据 ,取值范围是0 (元素个数-1)。 v特别强调:在运行C语言程序过程中,系统并 不自动检验数组元素的下标是否越界。因此在 编写程序时,保证数组下标不越界是十分重要 的。 v1个数组元素,实质上就是1个变量,它具有和 相同类型单个变量一样的属性,可以对它进行 赋值和参与各种运算。 v在C语言中,数组作为1个整体,不能参加数据 运算,只能对单个的元素进行处理。 例6.1 使数组元素a0a9的值为09 ,然后逆序输出。 vmain() v v int i,a10; v for (i=0;i=0; i-) v printf(“%d “,ai); v v 运行输出: 9 8 7 6 5 4 3 2 1 0 7.1.4 一维数组的应用 例7.3 输入10个数,用“冒泡法”对10个数排序(由小到大 )。 v冒泡法的基本思想:通过相邻两个数之间的比较和交换, 使排序码(数值)较小的数逐渐从底部移向顶部,排序码 较大的数逐渐从顶部移向底部。就像水底的气泡一样逐渐 向上冒,故而得名。 v“冒泡法”算法:以六个数9、8、5、4、2、0为 例。 v第1趟比较(下图1) 第2趟比较(下图2) v第1趟比较后,剩5个数未排好序;两两比 较5次 v第2趟比较后,剩4个数未排好序;两两比 较4次 v第3趟比较后,剩3个数未排好序;两两比 较3次 v第4趟比较后,剩2个数未排好序;两两比 较2次 v第5趟比较后,全部排好序;两两比较1次 v算法结论:对于n个数的排序,需进行n- 1趟比较,第j趟比较需进行n-j次两两比 较。 v程序流程图:(用两层嵌套循环实现) v程序:设需排序的数有10个,定义数组大小为 11,使用a1a10存放10个数,a0不用 。 vmain() v v int a11; /* 用a1a10, a0不用*/ v int i,j,t; /* i,j作循环变量,t作临变*/ v printf(“input 10 numbers:n“); v for(i=1;i ai+1) /* 交换大小 */ v t = ai; v ai = ai+1; v ai+1 = t; v v printf(“the sorted numbers:n“); v for(i=1;imax,把aij作为新的临时最大 值,并记录下其下标i和j。当全部元素比 较完后,max是整个矩阵全部元素的最 大值。 流程: v程序: vmain() v vint i,j,row=0,colum=0,max; v static int a34=1,2,3,4,9,8,7,6,-10,10,- 5,2; v max = a00; v for(i=0; i max ) v max = aij; v row = i; v colum = j; v v printf(“max=%d, row=%d, colum=%dn“,max,row,colum); v 注意:本例中得到的行列值从0始。 725 多维数组 v当数组元素的下标在2个或2个以上时,该数组 称为多维数组。其中以2维数组最常用。 v定义多维数组:类型说明 数组名整型常数1 整型常数2 整型常数k; 例如:int a233; v定义了一个三维数组a,其中每个数组元素为 整型。总共有2x3x3=18个元素。 v说明: 1) 对于三维数组,整型常数1,整型常数2,整型 常数3可以分别看作“深”维(或:“页”维) 、“行”维、“列”维。可以将三维数组看作一 个元素为二维数组的一维数组。三维数组在内存 中先按页、再按行、最后按列存放。 2) 多维数组在三维空间中不能用形象的图形表示 。多维数组在内存中排列顺序的规律是:第一维 的下标变化最慢,最右边的下标变化最快。 3) 多维数组的数组元素的引用:数组名下标1 下标2 下标k。多维数组的数组元素可以在 任何相同类型变量可以使用的位置引用。只是同 样要注意不要越界。 三维数组的元素排列顺序 a000a001a002a003 a010a011a012a013 a020a021a022a023 a100a101a102a103 a110a111a112a113 a120a121a122a123 7.3 字符数组 v字符数组:存放字符数据的数组,每一个元 素存放一个字符。 一、程序中定义字符数组 v例、char c10; /* 定义c为字符数组,包含10个元素 */ vc0=I; c1= ; c2=a; c3=m; c4= ;c5=h; c6=a; c7=p; c8=p; c9=y; v注意: v字符型与整型可以通用,但有区别: char c10; /* 在内存中占10字节 */ int c10; /* 在内存中占20字节 */ 二、字符数组的初始化 1、逐个元素初始化 vstatic char c10 = I, ,a,m, ,h,a,p,p,y; 2、初始化数据少于数组长度,多余元素自动为“ 空”(0,二进制0)。 vstatic char c10 = c,p,r,o,g,r,a,m;/* 9 */ 3、指定初值时,若未指定数组长度,则长度等 于初值个数(不加0)。 vstatic char c = I, ,a,m, ,h,a,p,p,y; ; /* 10 */ 三、字符数组的引用 v引用一个元素,得到一个字符。 例7.2.1 输出一个字符串。 vmain() vstatic char c10=I, ,a,m, ,a, ,b,o,y; v int i; v for(i=0;i 1、puts()函数:输出字符串(以0结尾) 。 v例、static char c6=“China”; printf、puts均以0结尾. printf(“%sn“,c); printf需要格式控制符%s puts(c); 看书上例题(p146) puts不需要格式控制符,且自动换行 2、gets()函数:输入字符串到数组。 v例: static char str12; gets(str); v注意:gets()、puts()一次只能输入输出 一个字符串。而scanf()、printf()可以输 入输出几个字符串。 3、strcat():连接字符串。 vstrcat(字符串1,字符串2); v功能:把“字符串2”连接到“字符串1”的 后面。从str1原来的0(字符串结束 标志)处开始连接。 注意: v字符串1一般为字符数组,要有足够的空 间,以确保连接字符串后不越界; v字符串2可以是字符数组名,字符串常量 或指向字符串的字符指针(地址)。 v(p147)例题 4、strcpy():字符串拷贝。 v strcpy(字符串1,字符串2); v 功能:将“字符串2”为首地址的字符串复制到“字 符串1”为首地址的字符数组中。即把“字符串2”的 值拷贝到“字符串1”中。 v例如: v static char str110,str2 =“china”; v strcpy(str1,str2); v执行后str1的状态为: C h i n a 0 0 0 0 0 注意: vstr1-一般为字符数组,要有足够的空间,以确保 复制字符串后不越界; vstr2-可以是字符数组名,字符串常量或指向字符 串的字符指针(地址)。 v字符串(字符数组)之间不能赋值,但是通过此 函数,可以间接达到赋值的效果。 5、strcmp():字符串比较。 v int strcmp(字符串1,字符串2); v 比较“字符串1”、“字符串2”, v例: strcmp(str1,str2); strcmp(“China“, “Korea“); strcmp(str1, “Beijing“); v比较规则:逐个字符比较ASCII码,直到 遇到不同字符或0,比较结果是该函数 的返回值。 v字符串1 字符串2, strcmp()返回值0 v长度不同的字符串也可以进行比较,比较 结果当然是“不同”。 v长度不同的字符串也可以进行比较,比 较结果当然是“不同”。 v注意:字符串只能用strcmp函数比较,不 能用关系运算符“=”比较。 v例:if (strcmp(str1,str2)= 0) printf(“yes“); if (str1 = str2) printf(“yes“); 6、求字符串的长度函数strlen(str) v功能:统计str为起始地址的字符串的长 度(不包括“字符串结束标志”),并 将其作为函数值返回。 v注意:在调用字符串处理函数时,在程 序前面应设置一个相关的文件包含预处 理命令,即#include 7.3.4 字符数组应组应 用举举例 例7.8 输入一行字符,统计其中有多少个单 词(单词间以空格分隔)。 v比如,输入“ I am a boy.“,有4个单词。 v算法:单词的数目由空格出现的次数决定(连 续出现的空格记为出现一次;一行开头的空格 不算。)。应逐个检测每一个字符是否为空格 。 用num表示单词数(初值为0)。word=0 表示前一字符为空格,word=1表示前一字符 不是空格,word初值为0。如果前一字符是空 格,当前字符不是空格,说明出现新单词, num加1。 v框图如下: v程序: #include “stdio.h“ /* gets()函数在该头文件定义 */ vmain() v vchar string81 ; v int i, num = 0, word = 0; v char c; v gets(string); v for(i=0; (c=stringi) != 0;i+) v if (c= ) word = 0; v else if (word = 0) v v 第7章 数组 v word = 1; v num+; v v printf(“There are %d words in the

温馨提示

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

评论

0/150

提交评论