版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 数 组,本章要点: 1.建立数组的概念; 2.掌握一维数组和多维数组的定义; 3.掌握数组的初始化和引用; 4.掌握字符串与字符数组. 5. 掌握用数组进行编程的技术。,数组的概念,1. 问题的提出 假设我们将26个数分别存放在26个变量中,要计算26个变量的和,如何做? 将26个变量逐个加起来? 能否使用循环语句? for(sum=0,i=0;i26;i+) sum=sum+ai; 正确吗?,2. 使用数组解决问题 定义一个变量,包含26个数据,称为数组变量。 main( ) int i, sum = 0, a26; for( i =0; i 26; i+) scanf(“%d”,
2、,数组的基本概念:,1、数组:一组具有相同数据类型的数据的有序的集合。 2、数组元素:数组中的元素。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用。在定义一个数组后,在内存中使用一片连续的空间依次存放数组的各个元素。,3、数组的下标:是数组元素的位置的一个索引或指示。 4、数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维数组。 数组是同类型变量的集合,共用一个名字,用下标区分; 每个变量称作数组元素; 按下标递增顺序在内存中存放; 使用几个下标区分变量,就称是几维数组。 一维数组与数学中的数列对应,二维数组与矩阵对应。很少使用三维及三维
3、以上的数组。,7.1 一位数组的定义和引用 7.1.1一维数组的定义 定义方式: 类型说明符 数组名 常量表达式 例:int a10 它表示数组名为a,此数组有10个元素。说明: 说明: (1)数组名定义规则和变量名相同; (2)数组名的常量表达式用方括弧而不是圆括弧括起来 (3)常量表达式表示元素的个数,即数组长度。例如: a10表示a数组共有10个元素,下标从0开始分别 为:a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 注意:没有a10,(4)常量表达式中可以包括常量和符号常量,不能包含 变量,即数组的大小不能依赖于程序过程中变量的值。 例如:int n; scanf(“%d
4、”, 是不合法的。 7.1.2 一维数组元素的引用 C语言规定,只能逐个引用数组元素而不能一次引用整个数组。 数组元素的表示形式为: 数组名下标 其中下标可以是整型常量或整型表达式。例如: a0=a5+a7-a2*3,例7.1 数组元素的引用 main ( ) int i, a10; for ( i = 0; i = 0; i-) printf(“%d”, ai); 本例使a0到a9的值为09,然后按逆序输出。,7.1.3 一维数组的初始化,1、在定义数组时对数组元素赋以初值 方法:将初值依次写在花括号 内。 例如: int a4=2,4,6,8,其中:a0=2, a1=4, a2=6, a3
5、=8,(1)可以只给一部分元素赋值。 例如:int a10=0,1,2,3,4; 其中:a0=0, a1=1, a2=2, a3=3, a4=4, a5=0, a6=0, a7=0, a8=0, a9=0 (2)如果想使一个数组中全部元素值为0,可以写成: int a10=0, 0, 0, 0, 0, 0, 0, 0, 0, 0 不能写成: int a10=0*10,注意:定义成static数组,不赋初值,系统会自动将全部元素赋以0值。(此处后面有介绍),(3)在对全部数组元素赋初值时,可以不指定数组长度。 例如: int a5=0,1,2,3,4 可以写成: int a =0,1,2,3,4
6、 但是如果被定义的数组长度与提供初值的个数不相同时,则数组长度不能省略。 例如: int a10=0,1,2,3,4; 只初始化了前5个元素,后5个元素为0。,7.1.4 一维数组程序举例,例7.2 用数组来处理求Fibonacci数列问题。 main( ) int i; int f20 = 1, 1; for( i = 2; i 20; i+) fi = fi-2 + fi-1; for ( i = 0; i 20; i+) if ( i % 5 = 0) printf(“n”); printf(“%12d”, fi); ,例7.3 用冒泡法对10个数排序(由小到大)。 冒泡法:对将进行排序
7、的数,相邻两个数进行比较,如果满足次序要求,保持两者位置不变,否则交换位置;,第一次 比较,第二次 比较,第三次 比较,第四次 比较,第五次 比较,第一次冒泡排序的结果,n个数经过一次冒泡排序后,最大数(最小数) 将被交换到最后位置,但前面n-1数仍然无 序。下一次排序最后一位不必参加排序。,第一次冒泡排序,算法结论: 如果有n个数参加冒泡排序,则要进行n-1趟比较。 在第j趟比较中有n-j+1个数参加排序,要进行n-j次两两比 较。本例中第2趟有5个数参加排序,进行了4次比较。,第一次比较,第二次比较,第三次比较,第四次比较,第二次冒泡排序的结果,第二次冒泡排序,main( ) int a1
8、0; int i, j, t; printf(“input 10 numbers:n”); for ( i = 0; i ai+1 ) t = ai; ai = ai+1; ai+1 = t; printf(“the sorted numbers:n”); for( i = 0; i 10; i+) printf(“%d”,ai); ,7.2 二维数组的定义和引用,7.2.1 二维数组的定义 二维数组定义的一般形式: 类型说明符 数组名 常量表达式 常量表达式 例: float a34, b510; 此句定义了一个名为a的3行4列的实数数组和一个名为b的5行10列的实数的数组。 注意:不能写成
9、:float a3,4, b5,10; 在C语言中,可以把二维数组看成特殊的一维数组,即把把一行看成一个元素,这些特殊的元素组成以一个特殊的一维数组。比如:我们可以把二维数组a34看成一个由 a0, a1, a2元素组成的数组,每个元素又由四个元素组成,例如a0由a00,a01, a02, a03组成。,二维数组的存放顺序: 在C语言中,二维数组中的元素是按行存放的。 例如: a23的存放形式为,二维数组是多维数组的基础。其它多维数组的定义和元素存放形式类似二维数组。,低,高,7.2.2 二维数组的引用,二维数组的元素的表示形式为: 数组名 下标 下标 例如:a23表示的是a二维数组的第3行第
10、4列的元素。 此处我们要特别注意下标不要超界。 注意: 1)下标可以是整型表达式,如a2-12*2-1; 2)不能写成a2,3的形式;,7.2.3 二维数组的初始化,(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; (3)可以对部分元素赋初值。例如: int a34=1,5,9; 它的作用是只对每行第一列赋初值,其他元素自动为0, 结果为:,也可以对各行中的某一元素赋初值,其他元素自
11、动为0 : int a34=1,0,6,0,0,11; 结果为:,(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以写成: int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,例7.4 将二维数组 行和列元素互换,存到另一个二 维数组中。,7.2.4 二维数组程序举例,main( ) int a23=1,2,3,4,5,6; int b32, i, j; printf(“array a:n”); for ( i = 0; i = 1; i+) for(
12、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”); ,例7.5 有一个3X4的矩阵,要求编程求出其中最大的那个元素的值,以及其所在的行号和列号;,main ( ) int i, j, row = 0, colum = 0, max; int a34 = 1, 2, 3, 4, 9, 8, 7, 6, -10, 10, -5, 2
13、; max = a00; for( i = 0; i max ) max = aij; row = i; colum = j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum); ,7.3 字符数组,7.3.1 字符数组的定义 字符数组的定义类似前面的数组定义。例如: char c4; c0=S; c1=U; c2=S; c3=E; 上句的作用为:定义C为字符数组,包含4个元素。赋值后的状态为: 在C语言中,字符型和整型是互相通用的,因此上述定义句可以写为: int c4,也可以定义和初始化一个二维字符数组,方法类似前述。 例如: char dia
14、mond55= , , *, , *, , *, *, , , , * , , *, , *, , , *; 7.3.3 字符数组的引用 可以引用字符数组中的一个元素,得到一个字符。 例7.6;输出一个字符串 main ( ) char c10I, , a, m, ,a, , b,o,y; int i; for( i = 0; i 10; i+) printf(“%c”, ci); printf(“n”); ,例7.7;输出一个 main ( ) char diamond55= , , *, , *, , *, *, , , , * , , *, , *, , , *; int i, j; f
15、or( i = 0; i 5; i+) for ( j =0; j 5; j+) printf(“%c”, diamondij); printf(“n”); 运行结果为: * * * * * * * *,7.3.4 字符串和字符结束标志 在C语言中,将字符串作为字符数组来处理。 为了测定字符串的实际长度C语言规定了一个“字符结束标志”,以字符0代表,由它前面的字符组成字符串。 系统字符串常量也自动加一个0作为结束符。 例如“C Program”共有9个字符,但在内存中占10个字节,最后一个字节0是由系统自动加上的。 结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志,另一种方法用字
16、符串常量来使字符数组初始化。 例如 char c =“I am happy”; 也可以省略花括弧,直接写成 char c =“I am happy”; (注意字符串的两端是用双引号而不是单引号括起来的)。 注意:上述字符串占用的空间长度是11而不是10。因为字符串常量的最后由系统加上一个0。 上述的初始化与下面的初始化等价。 char c =I, , a, m , , h , a , p , p , y , 0; 而不与下面的等价: char c =I, , a, m , , h , a , p , p , y ; 前者的长度为11,后者的长度为10。,需要说明的是:字符数组并不要求它的最后一
17、个字符为0,甚至可以不包含0 . 像以下这样写完全是合法的. char c5= C, h, i , n , a ; 是否需要加上0,完全根据需要决定。 系统对字符串常量自动加上一个0,因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组也常常人为加上一个0,如: char c6= C, h, i , n , a, 0 ;,7.3.5 字符数组的输入输出,字符数组的输入输出可以有两种方法: (1)逐个字符输入输出。用格式符“%c”输入或输出一个字符。如: main ( ) char c10I, , a, m, ,a, , b,o,y; int i; for (
18、 i = 0; i 10; i+) printf(“%c”, ci); printf(“n”); (2)将整个字符串一次输入或输出。用“%s”格式符。如: char c = “china”; printf(“%s”,c);,注意: 1.输出字符不包括结束符0 ; 2.用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是字符元素名。比如不能写成: printf(“%s”,c0); 正确写法为: printf(“%s”,c); 3.如果数组长度大于字符串实际长度,也只输出到遇0 结束。 4.如果一个字符数组中含一个以上的0 ,则遇到第一个0 输出就结束。,7.3.6 字符串
19、处理函数,在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C都提供这些函数。下面是几种常用的函数。 1.puts(字符数组) 作用:将一个字符串(以0结束的字符序列)输出到终端。 puts函数用的不多。puts函数输出字符串中可以包含转义字符。 2.gets(字符数组), 作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的起始地址。 如执行下面的函数: gets(str) 从键盘输入:Computer 将输入的字符串” Computer”送给字符数组str(请注意送给数组的共有9个字符,而不是8个字符),函数值为字符数组str的起始地址。注意:
20、用puts和gets函数只能输入或输出一个字符串,,3.strcat(字符数组1,字符数组2) 作用是:连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。 例如: char str130=“Peoples Repubnic of ”; char str2 =“China”; printf(%s,strcat(str1,str2); 输出: Peoples Republic of China 连接前后的状况见下图所示。,说明: (1)字符数组1必须足够大,以便容纳连接后的新字符串。 (2)连接前两个字符串的后面都有一个0 ,
21、连接时将字符串1后面的0取消,只在新串最后保留一个0 。,4.strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去, 例如:char str110,str2 =“China”); strcpy(strl,str2); 执行后,str1的状态如图所示。 说明: (1)字符数组1必须定义得足够大长度不应小于字符串2的长度; (2)“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如: strcpy(str1, “China”); (3)复制时连同字符串后面的0一起复制到字符数组1中。 (4)不能用赋值语句将一个字符串常量或字
22、符数组直接给一个字符数组。下面两行都是不合法的: str1=“China”; str1=str2; 而只能用strcpy函数处理。用赋值语句只能将一个字符赋给一个字符型变量或字符 数组元素。,5. strcmp(字符串1,字符串2) 作用:比较字符串1和字符串2。 例如: strcmp(str1,str2); strcmp(”China”,”Korea”); strcmp(str1, “Beijing”); 字符串比较规则: 对两个字符串自左至右逐个字符相比。按ASCII码值大小比较,直到出现不同的字符或遇到“0“为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比
23、较结果为准。例如: “A”字符串2,函数值为一正整数。 (3)如果字符串1字符串2,函数值为一负整数。,注意:对两个字符串比较,不能用以下形式 if(str1=str2) printf(“yes”); 而只能用 if(strcmp(str1,str2)=0) printf(“yes”); 6.strlen(字符数组) 作用:测试字符串长度的函数函数的值为字符串中的实际长度,不包括0在内。如: char str10=“china”; printf(“%d”,strlen(str); 输出结果不是10也不是6,而是5。也可以直接测字符串常过的长度,如 strlen(“china”); 7.strl
24、wr(字符串) 作用是将字符串中的大写字母换成小写字母。 8. strupr(字符串) 作用是将字符串中的小写字母换成大写字母。,强调:库函数并非C语言本身的组成部分,而是人们为使用方便而编写、提供大家使用的公共函数时系统捉供的函数 数量和函数名、函数功能都不尽相同,使用时要小心,心要时查一下库函数手册。当然,有一些基本的函数。(包括函数名和函数功能)不同的系统所提供的是相同的,这就为程序的通用性提供了基础。,7.3.7字符数组应用举例,例7.8输入一行字符,统计其中有多少个单词,单词之间用空格分隔开 解题的思路: 单词间的数目义由空格出现的次数决定(连续的空格做为出现一次空格;开头的空格不统计在内) 如果测出某一个字符为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育教师线上教学总结(17篇)
- 2026年高考生物考前20天冲刺讲义(一)(解析版)
- 保利房地产培训资料-备份属于 销售部工作流程规范
- 传热学知识点概念总结
- 2026届山东省滨州市北城英才校十校联考最后英语试题含答案
- 保温现场组织设计方案和施工规范
- 六年级英语上册导学案
- 2026年全国防灾减灾日主题宣传手册(全民版)
- 江苏省南通市启东市滨海实验校2026届中考语文最后一模试卷含解析
- 创业计划书商业模式 (一)
- 2026年天津市高三高考二模英语模拟试卷试题(含答案详解)
- 2026中国卵巢上皮性癌维持治疗专家共识解读
- 2026年炊事专业考核真题(培优B卷)附答案详解
- 北京市西城区2026年高三一模英语试卷(含答案)
- 安宁疗护科临终关怀安全质量目标及管理细则2026年
- 2026年中考苏教版生物复习知识点考点背诵提纲
- (正式版)DB50∕T 1915-2025 《电动重型货车大功率充电站建设技术规范》
- GA/T 2332-2025法庭科学纤维检验拉曼光谱法
- 高中教室学生桌椅更换方案
- 肝移植术后感染防控指南(2025版)
- 血管外科科普教育
评论
0/150
提交评论