




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 数组,6.1 问题的提出 6.2 一维数组 6.3 二维数组 6.4 字符串与字符串函数,6.1 问题的提出,第一个问题是:输入100个学生的“C 程序设计”课程的成绩,将这100个分数从 小到大输出。 第二个问题是输入100个学生的“C程 序设计”课程的期中和期末成绩,算出总评 成绩,总评成绩为“30%期中成绩 +70%期末成绩”,计算总评成绩的分数 段情况。,6.2 一维数组,6.2.1 一维数组的定义 从概念上来说,数组是一组变量,这组变量应该满足下列条件: (1) 具有有相同的名字 (2) 具有相同的数据类型 (3) 在存储器中连续存放,每个变量称为数组的一个“数组单 元”,保
2、存在其中的数据值称为“数组元 素”,不论是数组单元,还是数组元素, 在不引起混淆的情况下,可以简称为元 素。数组对象的整体有一个名称,这个 名称表示整个数组。,每个数组在使用之前都需要定义。 定义数组的语法是: 数据类型说明符 数组名数组长度; 数据类型说明符是C语言提供的任何一种基本数据类型或构造数据类型。 数组名是用户定义的标识符。 方括号中的数组长度是一个常量表达 式,它表示了数组单元的个数。注意:数 组长度只能是常量。,例如: int data5; 说明整型数组a,有5个元素。 float b10,c20; 说明单精度浮点型数组b,有10个元素;单 精度浮点型数组c,有20个元素。 c
3、har string20; 说明字符型数组string,有20个元素。,注意 (1) 数组的数据类型定义的是每个数组 元素的取值类型。对于一个数组来说,所 有数组元素的数据类型应该都是相同的。 (2) 数组名要符合用户定义字的书写规 则,也就是与普通变量一样。 (3) 在C语言的一个函数中,数组名不能 与本函数的其它变量名同名。 (4)数组长度不能是变量,也不能是或包含变 量的表达式,可以是常量或常量表达式。并且 常量表达式应是整型数,不能是小数 。,程序段一: #define Size 5 main() int aSize,bSize+10; /*正确 */ 程序段二: main() int
4、 n=5; int datan; /*错误 */ ,6.2.2 一维数组的引用 引用数组单元的一般形式为: 数组名下标 数组下标可以是整型变量或整型表达式, 但不能是浮点型的变量或浮点型表达式;并且 下标不能大于数组长度-1,因为超过部分没 有被定义过,是不能正确使用的。 图。 例如:data4、datai+j、datai+都是 合法的引用方式。,例6.1用数组方式读入5个整数,并求和。 /* sum of 5 interger */ #include stdio.h void main() int i,data5,sum=0; printf(nPlease enter 5 integer:)
5、; for (i=0;i5;i+) scanf(%d, ,在语言中只能逐个地使用每个数组单元 进行操作,而不能一次引用整个数组。 例如,不能用printf(“%d”,data);来代替下 面的语句: for(i=0; i=4; i+) printf(%d,datai); 因为,C语言规定数组名本身代表数组的首 地址。printf(“%u”,data);语句输出的是数组的 首地址,而不是数组单元的内容。,6.2.3 一维数组的初始化 初始化是指在数组定义时给数组元素赋予 初值。需要注意的是,数组初始化是在编译阶 段进行的,而不是在程序开始运行以后,由可 执行语句完成的,因此不能将初始化的“=”与
6、 赋值号混淆。 一维数组初始化的一般形式是: 数据类型说明符 数组名数组长度=数值,数 值,. 数值;,int data5=1,2,3,4,5; 注意 (1) 允许初始化一部分元素,而不是全部。 int data5=1,2; (2) 初始化数组时,允许省略数组的长度。 int data=1,2,3,4,5; 与int data5=1,2,3,4,5;是完全等价的。 (3) 初始化数组时,不能对整个数组初始化。 例如,int data5=1;,6.2.4 程序举例 例6.2用数组方式解决Fibonacci数列问题,求出 Fibonacci数列的前20项存储在数组中,并将数 组内容输出。,#inc
7、lude stdio.h void main() int i,fib20=1,1; /*初始化 */ printf(n); for (i=2;i20;i+) fibi=fibi-1+fibi-2; for (i=1;i=20;i+) printf(%10d,fibi-1); if (i%5=0) printf(n); /*换行,每行输出5个 */ ,例6.3 输入100个整数,求出最小的数以及第一个最小的数在数组中的下标。 例6.4 输入100个整数,从小到大排列并输出 。 选择排序 例6.5 输入100个学生的“C程序设计”课程的期 中和期末成绩,算出总评成绩,总评成绩为 “30%期中成绩+
8、70%期末成绩”,计算总评 成绩的分数段情况。 本题要使用三个平行的数组才能解决问题。 这三个数组的第i个元素记录了一个学生的期中 成绩、期末成绩和总评成绩。,6.3 二维数组,如果一维数组的数组单元不是一个变量,而是另一个一维数组,就构成了二维数组。 图。 e_score是一个一维数组,它的每个数 组单元是一个变量,分别是e_score0、 e_score1、e_score2、e_score3、 e_score4。而stu_score的每个数组单元不 是一个变量,而是一个有三个变量的一维数 组,这就构成了二维数组。,stu_score有5个数组单元,每个数 组单元又有3个元素,我们称stu_
9、score是 一个53的二维数组,该二维数组行的 个数是5,列的个数是3。 6.3.1 二维数组的定义 定义二维数组的语法是: 数据类型说明符 数组名行数列数,例如: int data53; 说明整型数组a,有5行3列共15个整型变量。 float b1020; 说明单精度浮点型数组b,有10行20 列共200个单精度浮点型变量。 char string2050; 说明字符型数组string,有20行50列共 1000个字符型变量。,地址二维数组在概念上是二维的,可以说 是数组的数组,二维数组的下标在行和列两个方 向变化。但是,计算机的内存是连续编址的,也 就是说存储器单元是按一维线性排列的。
10、那么, 如何按照地址的顺序存放二维数组呢?一般有两 种方式来存储二维数组,第一种称为按行排列, 方法是先存储完第一行中的每个元素,再存放下 一行的每个元素;第二种称为按列排列,方法是 先存储完第一列中的每个元素,再存放下一列的 每个元素。C语言的编译系统采用按行排列。,6.3.2 二维数组的引用 引用二维数组的一般形式为: 数组名行下标列下标 行下标不能大于行数-1,列下标不 能大于列数-1。 如果有int stu_score53; stu_score00、stu_score12、 stu_score31都是正确的引用方式,但 是stu_score33是不正确的。,例6.7判断下面程序的运行结
11、果: #include stdio.h void main() int i,j,a32; /* 定义 */ for (i=0;i3;i+) /* 赋值 */ for (j=0;j2;j+) aij=i+j; for (i=0;i3;i+) for (j=0;j2;j+) printf( %10d,aij); printf(n); /*每输出一行换行 */ ,6.3.3 二维数组的初始化 二维数组初始化的一般形式是: 数据类型说明符 数组名行数列数=数 值,数值,. 数值,数值,数值,. 数 值; 或者 数据类型说明符 数组名行数列数=数 值,数值,. 数值;,第一种方法是按行分段初始化,即在
12、外面的花括号里面再嵌套花括号,里面的 每个花括号分别为每行元素初始化, 第二种方法则是按行连续初始化,不用加内嵌的花括号。 这两种方法有时没有区别,有时区别却很大。,例如:对数组a32: int a32= 5,6,7,8,9,10; /*按行分段初始化*/ int a32= 5,6,7,8,9,10; /*按行连续初始化*/ 上面两种初始化的结果是完全相同的。,int a32= 5,7,9; /*按行分段初始化*/ int a32= 5,7,9; /*按行连续初始化*/ 则结果却完全不一样。,对于二维数组的全部元素进行初始 化,则行数可以省略,编译系统会自动计 算出行数。但是绝对不能省略列数。
13、 例如:int a32=4,5,6,7,8,9; 可以写为:int a2=4,5,6,7,8,9;但是不 能写为:int a3=4,5,6,7,8,9;,6.3.4 程序举例 例6.8 将用二维数组a表示的矩阵转置存入b中,输出a和b。 例6.9 输入100个学生的“C程序设计”课程 的期中和期末成绩,算出总评成绩,总评 成绩为“30%期中成绩+70%期末成绩”,计 算总评成绩的分数段情况,要求用一个二维数 组存储期中成绩、期末成绩和总评成绩,。 本题将使用二维数组的的第i个元素记 录一个学生的期中成绩、期末成绩和总评 成绩。,6.4 字符串与字符串函数,6.4.1 字符数组 字符数组就是定义
14、一个数据类型是字符型的数组。 字符数组的初始化: char str10= H, e, l, l, o; 例6.10 以$符号为终止符号接收一组字符, 并逆序输出这组字符。,#include stdio.h void main() char c80; int i; puts(Please input a string:); for (i=0;(ci=getchar()!=$;i+); /*读入一组字符 */ for (i-; i=0;i-) /*从最后一个字符开始逆向输出 */ putchar(ci); ,6.4.2 字符串变量 C语言的字符串变量不是真正的字符串类型。 C语言的字符串变量从形式
15、上还是定义一个字符数组,但是,在概念上,字符串是带有字符串结束符0的一组字符,不论它是常量还是变量。 有了0标志以后,在处理字符数据时,就不必再用数组的长度来控制对字符数组的操作,而是用0来判断字符串的结束位置。 这是字符串变量与其它类型的数组(包括一般的字符数组)在操作上的根本区别。,字符串变量需要用字符串常量对其进行初始 化。 例如: char str=Hello; 或 char str=Hello; 用上面两种方式初始化str以后,str字符串 变量所占的内存空间是6字节,最后一个字节是 字符串结束标志0。,6.4.3 字符串变量的输入与输出 1、使用printf函数输出字符串变量的方式
16、是:使用转换字符序列“%s”。 例6.11使用printf函数输出字符串变量。 #include stdio.h void main() char str=Hello; printf(%s,str); 运行结果: Hello,例6.12请判断下面程序的运行结果: #include stdio.h void main() char str10= H, e, l, l, o, !,0, !; printf(%s,str); 运行结果: ?,2、使用scanf函数输入字符串给字符串变量也使用转换字符序列“%s”。 例6.13 使用scanf函数输入字符串给字符串变量。 #include stdio.
17、h void main() char str10; scanf(%s,str); printf(%s,str); ,2、使用scanf函数输入字符串给字符串变量也使用转换字符序列“%s”。 例6.13 使用scanf函数输入字符串给字符串变量。 #include stdio.h void main() char str10; scanf(%s,str); printf(%s,str); 运行结果: Welcome you ?,3、puts()是字符串输出函数,其调用格式为: puts (字符串变量); 它的功能是把字符串变量的内容(一定要 有0结束符)显示在屏幕上。 例6.14 使用puts(
18、)字符串输出函数。 #include stdio.h void main() char str=Hello; puts(str); 运行结果: Hello,#include stdio.h void main() char str=Hello; printf(%s,str); printf(%s,str); 运行结果 ?,#include stdio.h void main() char str=Hello; puts(str); puts(str); 运行结果: ?,4、gets()是字符串输入函数,其调用格式为:gets (字符串变量); 它的功能是:从标准输入设备键盘上输入一个字符串。
19、例6.15 使用gets()字符串输入函数。 #include stdio.h void main() char str20; gets(str); puts(str); 若输入为 Welcome you 输出?,6.4.4 字符串函数 1. 字符串连接函数strcat 其调用格式为: strcat (字符串变量1,字符串2) 它的功能是:将字符串2的字符串连接 到字符串变量2中的字符串的后面,并删去字符 串变量1中的字符串结束符0。strcat的返回值 是字符串变量1的首地址。 字符串变量1应定义足够的长度,以便能装入连接以后的字符串。,例6.16 字符串连接函数的使用。 #include
20、stdio.h #includestring.h void main() char str130=I am ; char str210= a student; strcat(str1,str2); puts(str1); 运行结果: I am a student,2. 字符串拷贝函数strcpy 其调用格式为: strcpy (字符串变量1,字符串2) 它的功能是:将字符串2的字符串复制到 到字符变量1中。字符串结束符0 也一起复制。 字符串2既可以是字符串常量也可以是字符串变量。 strcpy函数要求字符串变量1有足够的长 度,以便能装入要复制的字符串。,例6.17使用函数strcpy将一个
21、字符串的内容拷贝到另一个字符串中。 #include stdio.h #includestring.h void main() char str130=I am ; char str210= a student; strcpy(str1,str2); puts(str1); 运行结果: a student,3. 字符串比较函数strcmp 其调用格式为: strcmp(字符串1,字符串2) 它的功能是:按照ASCII码顺序比较两个 数组中的字符串,并由函数返回值返回比较结 果。 若字符串1字符串2,返回值为0; 若字符串1 字符串2,返回值为一正整数; 若字符串1 字符串2,返回值为一负整数。 字符串1和字符串2既可以是字符串常量也可以是字
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届衡水中学高一物理第二学期期末综合测试模拟试题含解析
- 2025届河北省张家口市涿鹿中学高一物理第二学期期末联考试题含解析
- 2025届天津市杨村第一中学物理高二第二学期期末教学质量检测试题含解析
- 2025届新疆阿克苏地区乌什县二中物理高一下期末检测试题含解析
- 2025届试题山西省怀仁市重点中学物理高二第二学期期末调研试题含解析
- 二零二五年度冷链车队专业运输合作协议
- 二零二五年度农家乐经营权转让合同范本
- 2025版新能源汽车电池回收利用销售合作协议
- 二零二五年教育辅导帮工服务合同
- 2025版安置房房票买卖贷款提前还款合同
- 2025年政工职称考试题库(带答案)
- 性关系协议书范本
- 民族理论与民族政策课程
- SA8000标准全套控制程序文件及实施指南
- 高中政治学科教学设计
- 2025年渠道维护工(技师)技能理论考试题(附答案)
- 花生生长全过程图谱
- 2025年烟台汽车工程职业学院单招职业技能测试题库一套
- 边缘智能计算应用课件:NLE-AI800开发板介绍及案例体验
- 华住收益管理
- 气瓶使用、运输和储存安全管理制度模版(2篇)
评论
0/150
提交评论