




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第5章 数组,数组,一维数组,二维数组,字符串与字符数组,1,2,3,一维数组,【例5.1】输入10个学生C语言课的成绩,输出高于平均分的成绩。 #include #include void main() float s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, sum, aver; cin s1 s2 s3 s4 s5 s6 s7 s8 s9 s10; sum=s1+s2+s3+s4+s5+s6+s7+s8+s9+s10; aver=sum/10; if (s1aver) cout aver) cout aver) cout aver) cout aver) cout aver) cout aver) cout aver) cout aver) cout aver) cout setw(6) s10; cout endl; ,一维数组,为了避免大量相同类型变量要分别命名,相同操作要重复书写的麻烦,C+中引入了数组的概念,数组就是一组具有相同属性数据的有序集合,用统一的数组名来标识数组,集合中的一个数据称为数组的一个元素,由其所在的位置(数组的下标)来区分。利用数组名和下标,就可以用统一的方式来处理数组中的所有元素,大大提高程序设计的效率。,一维数组定义,和简单变量一样,数组在使用之前必须先定义。数组定义包括数组的类型、名称、维数及数组中元素的个数。一维数组的一般定义形式为: 类型标识符 数组名常量表达式; 例如: int a10; /定义了整型数组a,它有10个元素 float m5, n10; /定义了实型数组m和n,m有5个元素,n有10个元素 const int N= 8; char chN; /定义了字符型数组ch,它有8个元素,一维数组定义,类型标识符表明了数组元素的数据类型,可以是基本数据类型也可以是构造类型。 数组名遵循变量的命名规则,它代表数组的首地址。 方括号是必需的,不能是圆括号或花括号。方括号中的常量表达式表示数组元素的个数,即数组长度。如int a5; 定义数组a有5个元素。数组元素的下标从0开始,因此,数组a的5个元素分别为a0,a1,a2,a3,a4。 常量表达式可以是常量和符号常量,不能包含变量。,一维数组定义,数组元素在内存中占据一组地址连续的存储单元。对于一维数组来说,各元素按照下标从小到大的顺序连续存放,逻辑上相邻的元素其物理地址也是相邻的。例如:int a5; 系统将为数组a开辟5个连续的存储单元。 数组a在内存中所占的字节数等于每个元素所占的字节数与元素个数的乘积,sizeof(a)的值是20,sizeof(a0)的值是4,sizeof(a)/ sizeof(a0)的值是5,即元素个数。,一维数组元素的引用,一维数组元素的引用形式为: 数组名下标 下标用来标识元素在数组中的位置,可以是整型常量或整型表达式。 例如:ai=ai-1*a2*3; 对于数值型数组,只能通过下标逐个引用数组元素,不能一次引用整个数组。 对单个变量能进行的操作(如输入、赋值、输出等),就能对数组元素实施,唯一的区别是使用数组元素时必须带下标。 由于数组元素下标排列的规律性,在程序中,通常通过循环变量控制一维数组的下标值,实现对数组的整体操作。,一维数组元素的引用,【例5.2】输入10个学生C语言课的成绩,输出高于平均分的成绩。 #include #include void main() float s10, sum, aver; int i; cout si; / 依次输入成绩 sum+= si; / 对输入的成绩进行累加 aver=sum/10; / 计算平均分 for (i=0; iaver) cout setw(6) si; cout endl; ,一维数组元素的引用,【例5.3】输入10个学生C语言考试成绩,求出最高分与最低分。 #include void main() int i, max, min, s10; cout si; max=s0; / 为max赋初值 min=s0; / 为min赋初值 for (i=1; imax) / 将找到的较大的数存入max max=si; if (simin) / 将找到的较小的数存入min min=si; cout “最高分是:“ max endl; cout “最低分是:“ min endl; ,一维数组的初始化,(1)对全部数组元素赋初值。 如:int a5=1, 2, 3, 4, 5; 初始化后各元素值为:a0=1,a1=2,a2=3,a3=4,a4=5。 (2)对部分元素进行初始化。 int a10=0, 1, 2, 3, 4, 5; 定义了有10个元素的一维数组,但是内只提供了6个初值。此时只给前面6个元素a0 a5依次赋值。a6 a9均为0。,一维数组的初始化,说明: 对全部元素赋初值时,可以不指定数组长度。编译系统会根据中所赋初值的个数自动计算数组的大小。例如: int a = 1, 2, 3, 4, 5; 系统自动定义数组a的长度为5。 初值个数多于定义的数组元素个数时,会产生编译错误。 未初始化的数组元素,其值是不确定的。 如:int a10; 不能认为a0 a9都是0。,一维数组的初始化,【例5.4】输入一个整数,在一个已知的数组中进行查找。若该数存在,指出其第次出现的位置;若该数不存在,给出提示信息。 #include void main() int key, i , a=10, 20, -10, -20, 7, 35, -7, 25, 36, 48; int n = sizeof a / sizeof a0; / 计算数组元素个数 cout key; for (i=0; in; i+) if (key=ai) break; / 找到时不继续查找,用break强行退出 if (in) cout key “在第“ i+1 “个位置。“ endl; else cout key “不存在。“ endl; ,一维数组的初始化,【例5.5】输出杨辉三角。 #include #include #define N 8 void main() int i,j,aN; for (i=0; i0; j-) aj+=aj-1; for (j=0; j=i; j+) cout setw(4) aj; cout endl; ,案例:排序算法,1. 冒泡排序 (1)从a0到aN-1,相邻的两个数依次进行比较,即a0与a1比,a1与a2比,aN-2与aN-1 比。 (2)在每次比较过程当中,若前一个数比后一个数大,则对调两个数;也就是说把较大的那个数调到后面,较小的调到前面,否则不进行对调。 上述过程称作第一趟排序,最大的数必然落到最后位置上,即存于aN-1中。然后进行第二趟排序,对a0到aN-2进行同样操作,其结果是使次大的数存放在aN-2位置上。依此类推,最后把a0与a1中大的那个数放到a1中。这样N个数经过N-1趟重复,就完成了从小到大的排序。这种排序方法被形象地比喻成“冒泡”,在排序过程中,小的数就如气泡一般逐层上冒,而大的数逐个下沉。,案例:排序算法,#include #include #define N 7 void main() float aN, temp; int i, j; cout ai; for (i=0; iaj+1) / 相邻两数进行比较,案例:排序算法, temp=aj; / 相邻两数进行交换 aj=aj+1; aj+1=temp; cout “第 “ i+1 “趟排序的结果:“; / 该循环是为了演示每趟排序的结果 for (j=0; jN; j+) cout setw(6) aj; cout endl; cout “从快到慢的成绩为:“; for (i=0; iN; i+) /输出最终的排序结果 cout setw(6) ai; ,案例:排序算法,2. 选择排序 (1)先假设a0中的数最小,记下此最小数的位置k=0。 (2)依次把ak和ai(i从1变化到N-1)进行比较,每次比较时,若ai中的数比ak中的数小,则把i的值赋给k,使k总是指向当前扫视过的数据中最小数的位置;因此ak总是代表当前所扫视的最小数,在依次比较完后,k就指向N个中最小数所在位置,ak就是N个数中最小的数。 (3)把ak与a0中的数对调。最小数就在a0中了。 上述过程称作第一趟选择排序。重复此算法,第二趟从a1到aN-1中去找次小数的位置,然后把ak与a1对调,次小的数存放在a1中。此过程重复N-1次后,使N个数按从小到大的顺序排好。,案例:排序算法,#include #include #define N 7 void main() float aN, t; int i, j, k; cout ai; for (i=0; iN-1; i+) /共比较N-1趟 k=i; /记录每一趟的起始位置 for (j=i+1; jN; j+),案例:排序算法,if (akaj) k=j; /找到一个较小的元素记录其位置 if (k!=i) /本趟中最小元素的位置不是该趟的起始位置 t=ai; ai=ak; ak=t; cout endl “从快到慢的成绩为:“ endl ; for (i=0; iN; i+) cout setw(6) ai; ,二维数组,一维数组用来描述一行或一列数据,如5个学生的单科成绩。而要描述5个学生4门课成绩这样多行多列的数据,就要使用二维数组了。二维数组在逻辑上可以想象成是由若干行、若干列组成的表格或矩阵。,二维数组定义,二维数组定义的一般形式: 类型标识符 数组名常量表达式1常量表达式2; 例如:int a23; /定义2行3列有12个元素的整型数组a #define M 5 #define N 4 float sMN; /定义5行4列有20个元素的实型数组s 由于行、列下标从0开始,因此上述定义后,数组a各元素的排列顺序为: a00 a01 a02 a10 a11 a12,二维数组定义,二维数组在内存中是按行存放的,即先放第一行,再放第二行,每行中的元素是按列下标由小到大的次序存储的,这样的存储方式也称为行优先存储。,二维数组元素的引用,二维数组元素的一般表示形式为: 数组名下标1下标2 其中: 下标1为行下标,下标2为列下标,其值都是从0开始的,使用时下标不要越界。 通常使用两个循环控制变量分别控制行、列下标,实现对二维数组的整体处理。,二维数组元素的引用,【例5.6】输入4个学生的考试成绩,每个学生有6门课程。要求输出每个学生平均分,以及有几科不及格。 #include #include void main() float s46, sum; int i, j, n; for (i=0; i sij; ,二维数组元素的引用,for (i=0; i4; i+) / 控制第几个学生 sum=0;n=0; / 处理下一行数据前sum、n必须清零 for (j=0; j6; j+) / 控制第几门课程 sum+=sij;/ 对读取的数据进行累加 if (sij60) / 统计不及格的科目数 n+; cout “第“ i+1 “个学生的平均成绩为:“ setprecision(3) sum/6; cout “ 不及格科目数为:“ n endl; ,二维数组的初始化,(1)按行连续赋值。将数组所有元素初始值按相应顺序写在一对花括号内,各初值之间以逗号分隔。如: int a32=2, 4, 6, 8, 10, 12 ; 初始化后形成的矩阵 (2)按行分段赋值。每行初始值一逗号分隔,顺序写在一对花括号内,每个花括号内的数据对应一行元素。各行元素以逗号分隔,写在一个总的花括号内。如: int a32=2, 4, 6, 8,10, 12 ; 这种赋初值的方式更直观,符合二维数组的特点,初始值与元素关系(行、列)清楚,不易出错。,2 4 6 8 10 12,二维数组的初始化,说明: 对全部元素赋初值时,可以不指定第一维大小,但是第二维大小必须指定。如: int a 2=2, 4, 6, 8, 10, 12; 编译系统可自动根据初值数目与第二维大小确定第一维大小。 可只对部分元素初始化,没有初值对应的元素将赋0或空字符(字符数组)。如: int a33=1,2,3; 初始化后形成的矩阵 int a32=2, 4,6; 初始化后形成的矩阵,1 0 0 2 0 0 3 0 0,2 4 0 0 6 0,二维数组的初始化,【例5.7】输入3行4列的矩阵,输出其转置矩阵。 #include #include #define M 3 #define N 4 void main() int i, j; int aMN=1, 2, 3, 4,5, 6, 7, 8,9, 10, 11, 12, bNM; cout “矩阵A:“ endl; for (i=0; iM; i+) for (j=0; jN; j+),二维数组的初始化, cout setw(5) aij; / 输出原矩阵 bji=aij; / 对元素进行转置 cout endl; cout “矩阵B:“ endl; for (i=0; iN; i+) / 输出转置后的矩阵 for (j=0; jM; j+) cout setw(5) bij; cout endl; ,二维数组的初始化,【例5.8】求二维数组中每行元素的最大值,以及最大值所在的行号和列号。 #include void main() int i, j, max, row, col; int a44=11, 33, 55, 44,31, 21, 31, 41,40, 20, 30, 10,12, 42, 32, 22; for (i=0; imax) max=aij; / max存储当前最大的数 col=j; / col记录当前最大数的列号 coutrow“行“col“列“ 最大元素为:“maxendl; ,案例:简单学生成绩管理,#include #include #include void main() int i, j, select; int score45, sum=0; int x; do cout select;,案例:简单学生成绩管理,switch (select) / 根据选择项,实现相应功能 case 0: cout scoreij; break; case 2: cout x; sum=0; for (i=0; i5; i+),案例:简单学生成绩管理,sum+=scorex-1i; cout x; for (i=0; i5; i+) cout “第“ i+1 “科成绩是:“ scorex-1i endl; break; case 4: for (i=0; i4; i+) cout “第“ i+1 “名成绩:“; for (j=0; j5; j+) cout setw(6) scoreij; break; while (1); ,字符串与字符数组,字符数组是数组元素类型为字符型的数组。前面介绍的数值型数组的定义、存储形式和使用等都适合于字符数组。 字符数组用于存放字符常量或字符串,每一个数组元素存放一个字符常量,它在内存中占用一个字节。 一般字符数组有两种形式: (1)一维字符数组 (2)二维字符数组。 一维字符数组用来存放一个字符串,而二维字符数组用来存放多个字符串。,字符数组的定义,字符数组的定义形式 char 数组名常量表达式; char 数组名常量表达式1常量表达式2; 如: char str20; /* 定义一个包含20个元素的一维字符数组str */ char ch410; /* 定义可存放4个字符串的二维字符数组ch,每个串中最多存放10个字符 */,字符串和字符串结束标志,字符串常量是用一对双引号括起来的字符序列,C+规定以字符0作为字符串的结束标志。这样,系统在存储字符串常量时,会在字符序列末尾自动添上0用来标志字符串的结束,但它并不输出。 说明: 字符串的长度为字符串中的有效字符个数,并不包括存储0标志所占用的存储空间。 在程序中可以依靠检测0来判定字符串是否结束。后面与字符串有关的程序中会多次出现。,字符数组的初始化,1. 使用字符常量初始化。 char ch7=s , t , u, d, e, n, t ; 说明: (1)若初值个数与数组元素个数相等,定义时元素个数可缺省。上述定义可以为: char ch =s , t , u, d, e, n, t ; (2)若初值个数少于数组元素个数,其余的元素值默认为空字符0。例: char ch10=s , t , u, d, e, n, t ; 其中:ch7= 0,ch8= 0,ch9= 0。,字符数组的初始化,2. 使用字符串初始化。 定义的字符数组个数必须大于等于所初始化的字符串长度,因为其中一个元素存储字符串的结束标志0。例如: char ch8=“student“; 也可定义为: char ch =“student“; ch数组的长度为8,而不是7。,字符数组的初始化,请比较下面三种定义: char ch1 =“student“; /* 字符数组ch1长度为8,存储的是字符串 */ char ch2 =s , t , u, d, e, n, t ; /* 字符数组ch2长度为7,存储的是字符序列,而不是字符串 */ char ch3 =s , t , u, d, e, n, t, 0; /* 与第一种定义相同 */ sizeof(ch1)的值是8,sizeof(ch2)的值是7,sizeof(ch3)的值是8。,字符数组的引用,【例5.9】统计字符数组中字符的个数。 / 5-9.cpp #include #include void main() char str20 = “c program“; / 字符数组元素个数应大于字符串长度 int i=0, count=0; while (stri!= 0)/ 将0作为判断字符串结束的标志 count+; i+; cout “字符个数为:“ count endl; ,字符数组的引用,【例5.10】用二维数组存储字符串并输出。 / 5-10.cpp #include void main() char str45= “北京“, “上海“, “天津“, “重庆“; int i, j; for (i=0; i4; i+) for (j=0; j4; j+) cout strij; cout endl; ,字符数组的输入、输出,【例5.11】一维字符数组的输出。 / 5-11.cpp #include void main() char str20= “C+ Programming“; cout str; ,字符数组的输入、输出,【例5.12】二维字符数组的输出。 / 5-12.cpp # include void main() int i; char str320= “Monica“,“Rebecca“, “Rachel“; for (i=0; i3; i+) cout stri endl; ,字符数组的输入、输出,【例5.13】以下程序输入一个字符串,统计出小写字母a出现的次数。 #include void main() char str80; int i=0, n=0; cout str; while (stri!=0) if (stri=a) n+; i+; cout “输出该字符串:“ str endl; cout “字母a的个数为:“ n endl; ,字符数组的输入、输出,可以看出: 整体输入、输出字符数组时,只写字符数组名。 输入给字符数组的字符串应短于定义的字符数组个数,否则下标越界。 使用cin输入字符串时,如果遇到了空格、制表符或回车,将会结束输入。 上面程序的第二次输出结果可能与读者的预测有所不同,原因是cin只能接收空格之前的部分,所以str接收到的只是this,而不是整个字符串。像这样包含空格的字符数组输入时,常常使用C+的cin.getline()函数实现。,字符数组的输入、输出,【例5.14】以下程序输入一个字符串,统计出小写字母a出现的次数。 / 5-14.cpp #include void main() char str80; int i=0, n=0; cout “请输入一个字符串:“; cin.getline (str,sizeof str); while (stri!=0) if (stri=a) n+; i+; cout “字母a的个数为:“ n endl; ,字符数组的输入、输出,【例5.15】从键盘输入一行字符,统计其中每个英文字母的个数,并输出字母及相应的个数。 #include void main() int i=0, c52=0, m=0; char str80, p; cout = A i+)/ 该循环用来输出个数不为0的大写字母及个数,字符数组的输入、输出,if (ci) if (m%8=0) / 每行输出8个大写字母及其个数 cout endl; m+; p= i+A; cout p “有“ ci “个 “ ; m=0; for (i=0; i26; i+) / 该循环用来输出个数不为0的大写字母及个数 if (ci+26) if (m%8=0) / 每行输出8个小写字母及其个数 cout endl; m+; p= i+a; cout p “有“ ci+26“个 “; cout endl; ,字符串处理函数,C+函数库中提供了字符串处理函数,方便用户对字符串的处理。下面介绍几个常用的字符串处理函数。它们定义在cstring和string.h头文件中,可以使用编译预处理命令: #include 将其包含到程序中, 如果读者使用的是Visual C+ 2008集成开发环境,最好写为: #include using namespace std;,求字符串长度函数strlen ( ),语法格式: strlen (字符数组) 功能:测试字符串的实际长度(不包括结束标志)。 char ch8= “student“; cout strlen (ch); 结果为7而不是8。,字符串复制函数strcpy ( ),语法格式: strcpy (字符数组1, 字符数组2) 功能:将字符数组2中的字符串复制到字符数组1中。 说明: (1)第一个参数必须为字符数组,第二个参数也可为字符串。 (2)字符数组1的长度应大于等于字符数组2的长度。 (3)串结束标志也一同复制。 (4)不能用赋值语句给字符数组赋值。 char ch1 = “student“, ch210; ch2=ch1; 是错误的。只能用strcpy (ch2, ch1); 实现。 例如:交换两个字符数组str1和str2中的字符串。使用语句: strcpy (temp, s1); /temp为中间变量 strcpy (s1, s2); strcpy (s2, temp);,字符串比较函数strcmp ( ),语法格式: strcmp (字符串1, 字符串2) 功能:将字符串1和字符串2从左向右逐个字符比较ASCII码大小,直到出现不同字符或遇到0。函数值为整数。 (1)若字符串1=字符串2,则strcmp (字符串1,字符串2)=0 (2)若字符串1字符串2,则strcmp (字符串1,字符串2)0 (3)若字符串
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025内蒙古第七批高层次人才需求目录(2025年4月29日发布)模拟试卷带答案详解
- 大班保育员工作总结15篇
- 安全个人工作总结
- 数字版权签约作者合同6篇
- 2025年物联网设备安全漏洞应对策略与防护技术深度报告
- 2025年家庭教育指导服务行业供需矛盾与市场潜力分析报告
- 2025年纺织服装制造业智能化生产智能化生产设备市场前景分析报告
- 2025年电商平台售后服务质量提升策略研究报告:售后服务与品牌口碑管理研究
- 购房资金不足借款协议6篇
- 2025年康复医疗服务体系人才培养与职业发展报告
- 新人教版《海水的性质》课件
- NB-T+33008.1-2018电动汽车充电设备检验试验规范 第1部分:非车载充电机
- 【新课标】高中生物新课程标准考试题三套
- 2025小学道德与法治开学第一课(思想政治理论教育课)
- 公关经理培训课程
- 异博定治疗方案
- 申请法院司法赔偿申请书
- 锻造操作机安全检查表模版
- 400字作文稿纸可修改模板
- 防排烟系统施工安装全程验收记录
- 家庭经济困难学生认定申请表
评论
0/150
提交评论