C++程序设计第4章数组.ppt

上传人:牧羊曲112 文档编号:6153990 上传时间:2023-09-30 格式:PPT 页数:61 大小:222KB
返回 下载 相关 举报
C++程序设计第4章数组.ppt_第1页
第1页 / 共61页
C++程序设计第4章数组.ppt_第2页
第2页 / 共61页
C++程序设计第4章数组.ppt_第3页
第3页 / 共61页
C++程序设计第4章数组.ppt_第4页
第4页 / 共61页
C++程序设计第4章数组.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《C++程序设计第4章数组.ppt》由会员分享,可在线阅读,更多相关《C++程序设计第4章数组.ppt(61页珍藏版)》请在三一办公上搜索。

1、第4章 数组,目的与要求4.1 数组的定义与使用4.2 字符数组的定义和使用4.3 数组应用举例(习题课)本章小结,目的与要求,通过本章学习,应掌握一维数组和二维数组的定义、初始化赋值和使用方法,掌握字符数组的定义、初始化赋值和使用方法,掌握字符串处理函数的使用方法。掌握利用数组编写程序的基本方法。,4.1 数组的定义与使用,一维数组的定义和使用1.一维数组的定义与初始化赋值(1)一维数组的定义 定义格式为:存储类型;例:int a10;表示定义一个名为a的整型数组,有10个元素,分别为a0、a1、a2、a3、a4、a5、a6、a7、a8、a9。,(2)一维数组的初始化赋值,初始化格式:数据类

2、型 数组名常量表达式初值表 方法:给数组的所有元素赋初值 例如:int a10=1,2,3,4,5,6,7,8,9,10;例如:int b=1,2,3,4,5;给数组的部分元素赋初值 例如:int a10=1,2,3,4,5;当把数组定义为全局变量或静态变量时,所有数组元素的初值均为0;当把数组定义为其他存储类型的局部变量时,数组元素没有确定的值,即其值是随机的。,2.一维数组在内存中的存储方式,一维数组的存储方式,定义数组后,系统为数组分配一串连续的存储单元,依次存放各个数组元素。例如,定义 int a10=1,2,3,4,5,6,7,8,9,10;系统将为a数组分配10个元素的存储空间,每

3、个元素占有4个字节,其存储空间的分配情况如图所示。,3.一维数组元素的访问,一维数组元素的访问形式为:说明:下标表达式的值就是被访问的数组元素的下标,其数据类型必须为整型。【例4.1】通过键盘将10个整数依次输入到一个数组中,然后按倒序输出。例程,4.一维数组应用举例,【例4.2】某小组有10个学生,进行了数学考试,求他们数学成绩的平均分、最高分和最低分。例程【例4.3】将一个数组的内容按颠倒的次序重新存放。例如数组中数组元素原来的值依次为:8、3、5、1、9、7、2,要求改为:2、7、9、1、5、3、8。例程【例4.4】某班有10个学生,进行了数学考试,现要求将数学成绩按由低到高的顺序排序。

4、(1)冒泡法(2)选择法,4.1.2 二维数组的定义使用,1.二维数组的定义与初始化赋(1)二维数组的定义 定义格式为:存储类型;说明:常量表达式1指明二维数组的行数;常量表达式2则指明二维数组的列数。例如:int a34;表示定义了一个二维数组a,其元素的数据类型为整型,它有3行4列共12个元素。a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23,(2)二维数组的初始化赋值,给数组的所有元素赋初值方法一:每行一个花括号,花括号间用逗号分隔,全部初值再用一个花括号。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;方法二:所有初

5、值放在一个花括号中,按数组排列的顺序给各元素赋初值。例如: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;或:int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,二维数组的初始化赋值,给数组的部分元素赋初值 给数组的部分元素赋初值的方法与给数组的所有元素赋初值的方法类似。例如:int a34=1,2,5,9,10,11;表示二维数组a的元素a00、a01、a10、a20、a21、a22赋了初值,其余元素的初值

6、为0。,2.二维数组在内存中的存储方式,二维数组的存储方式,C+中,按行顺序存放二维数组各数组元素,即先存放第一行上的元素,再存放第二行上的元素,依次把各行上的元素存入一串连续的存储单元中。例如上节中所定义的a数组存储在内存中时各数组元素的排列顺序如图所示。,3.二维数组元素的访问,格式:下标表达式1和下标表达式2的值就是被访问的数组元素的两个下标,其数据类型必须为整型或符号常量。下标表达式1和下标表达式2的值,都应在已定义数组大小的范围内。假设有数组a34,则可用的行下标范围为02,列下标范围为03。【例4.5】通过键盘给一个3行4列的二维数组输入整型数值,并按表格形式输出此数组的所有元素。

7、例程,4.二维数组应用举例,【例4.6】某小组有5个学生,考了3门课程,他们的学号及成绩如书中表4.1所示,试编程求每个学生的平均成绩,并按表格形式输出每个学生的学号、3门课程成绩和平均成绩。【例4.7】将一个二维数组的行和列元素互换,形成另一个二维数组,即数组的转置运算。,例程,例程,4.2 字符数组的定义和使用,字符数组和字符串1.字符串常量及其结束标志(1)字符串常量(简称字符串)用一对双引号将字符序列括起来。(2)为了判断字符串是否结束,系统自动在字符串的末尾加上一个字符0 作为字符串的结束标志。(3)字符串常量和字符常量的区别,2.字符数组与字符串,(1)字符数组的定义 格式:存储类

8、型 char;(2)字符数组的初始化赋值 给字符数组的各个元素逐个赋初值 例如:char str12=C,+,+,p,r,o,g,r,a,m,0;注意:用这种方法对字符数组进行初始化时,可以不指定字符数组的长度。给字符数组指定一个字符串初值,系统将自动在最后一个字符后面加一个字符0。例如:char str=C+program;注意:字符数组的长度为12,而不是11。,3.字符数组的输入与输出,(1)把字符数组中的元素逐个输入/输出。这种输入/输出方法通常采用循环语句来实现。【例4.8】将从键盘输入的10个字符依次送给数组str中的各个元素,并将数组str中的元素按倒序输出。例程(2)把字符数组

9、作为字符串进行整体的输入/输出。采用这种方法输入时,在cin中仅给出字符数组名;输出时,在cout中也仅给出字符数组名。【例4.9】将两个字符串分别输入到两个字符数组中,并把这两个数组中的字符串输出。例程,4.2.2 字符串处理函数,1.求字符串长度函数strlen()格式:strlen()功能:求字符串的长度。例如:char str=C+program;coutstrlen(str)endl;则屏幕输出字符串长度为11。说明:(1)字符串可以是字符数组名,也可以是字符串常量。(2)函数值为字符串的实际长度,不包括最后的0在内。,2.字符串复制函数strcpy(),格式:strcpy(,)功能

10、:将字符串2复制到字符数组1中。例如:char str112,str2=C+program;strcpy(str1,str2);则字符数组str1的内容为C+program。说明:(1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是字符串常量;(2)字符数组1必须足够大,以便容纳被复制的字符串;(3)字符串2后的0也一起复制到字符数组1中;(4)在赋值运算符“=”没有重载之前,不能用赋值语句将一个字符串常量或字符数组赋给另一个字符数组,只能用字符串复制函数来处理。例如下面操作是非法的:str2=C+program;str1=str2;,3.字符串连接函数strcat(),格式:

11、strcat(,)功能:将字符串2连接到字符数组1中的字符串后,其结果存放在字符数组1中。例如:char str130=I am a;char str2=student.;strcat(str1,str2);则字符数组1的内容为I am a student.。说明:(1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是字符串常量;(2)字符数组1必须足够大,以便容纳连接后的新字符串;(3)连接时字符串1之后的0取消,只在新字符串最后保留一个0。,4.字符串比较函数strcmp(),格式:strcmp(,)功能:将两个字符串从左到右逐个字符进行比较(按ASCII码的大小比较),直到

12、出现不同的字符或遇到0为止。如果所有字符相同,则认为两个字符串相等;若出现不相同的字符,则以第一个不相同的字符的比较结果作为两个字符串的比较结果。比较结果由函数值带回。(1)如果字符串1=字符串2,则函数值为0;(2)如果字符串1字符串2,则函数值为一个正整数;(3)如果字符串1字符串2,则函数值为一个负整数。,字符串比较函数strcmp(),说明:(1)字符串1和字符串2都可以是字符数组名,也可以是字符串常量;(2)在比较运算符(如“=”)没有重载之前,两个字符串间不能用关系运算符进行比较,而只能用字符串比较函数来处理。例如下面的操作是非法的:if(str1=str2)coutTrue;el

13、se coutFalse;,5.字符串中大写字母变换成小写字母函数strlwr(),格式:strlwr()功能:将字符数组中的所有大写字母均换成小写字母。例如:char str=CHINA;strlwr(str);则str中的内容变换成:china;,6.字符串中小写字母变换成大写字母函数strupr(),格式:strupr()功能:将字符数组中的所有小写字母均换成大写字母。例如:char str=china;strupr(str);则str中的内容变换成:CHINA“。,4.2.3 字符数组应用举例,【例4.10】从键盘输入两个字符串,将它们连接成一个字符串。方法一:使用字符串连接函数str

14、cat连接两个字符串。方法二:不使用字符串连接函数strcat连接两个字符串。方法三:在方法二中,使用字符串结束标志0来判断字符串的结束位置。事实上也可以用求字符串长度函数strlen确定字符串结束位置。,例程,例程,例程,4.3 数组应用举例(习题课),一维数组应用举例 1.一维数组内容小结(1)定义格式:存储类型长度=初值;(2)元素引用:下标表达式(3)输入/输出:一维数组元素只允许单个元素的输入输出;2一维数组应用举例(1)求数组的最大值与最小值(2)求数组的和与平均值(3)对数组排序 对一维数组排序共有三种方法,即冒泡法、选择法与擂台法。【例4.11】已有一按从小到大次序排序好的数组

15、,现输入一数,要求按原来排序的规律将它插入到数组中。,例程,4.3.2 二维数组应用举例,(1)格式:存储类型行长列长=初值(2)元素引用:行下标表达式 列下标表达式(3)输入/输出:二维数组元素只允许单个元素的输入输出,而不允许用数组名a进行输入或输出。【例4.12】某小组有5个学生,考了3门课程,他们的学号及成绩如书中表4.2所示,试编程求每个学生的总成绩及每门课的平均成绩,并按表格形式输出每个学生的学号、3门课程成绩、总成绩及各门课程的平均成绩。要求用一个6行5列的数组完成上述操作。对学生成绩表按总成绩排序后输出。【例4.13】)设计一个程序,打印杨辉三角形。,例程,例程,4.3.3 字

16、符数组应用举例,(1)格式:存储类型 char 长度=“字符串”;(2)数组引用:下标(3)输入输出:可以整体赋初值、整体输入和输出。(4)字符串处理函数 C+提供的字符串处理函数包含在头文件string.h中。常用的字符串处理函数有:求字符串长度函数:strlen(str);/返回字符串str长度 字符串复制函数:strcpy(s1,s2);/s1s2 字符串连接函数:strcat(s1,s2);/s1s1+s2 字符串比较函数:strcmp(s1,s2);/当s1s2时函数值0/当s1=s2时函数值=0,当s1s2时函数值0【例4.14】从键盘输入三个字符串,找出其中的最大者。,例程,本章

17、小结,1.一维数组(1)定义格式:存储类型;(2)访问形式:2.二维数组(1)定义格式:存储类型;(2)访问形式:注意:不论一维数组和二维数组,都必须先定义后使用;数组元素的下标从0开始,且不能超出范围。,3.字符数组和字符串,(1)字符串:用一对双引号括起来的字符序列,在字符串的末尾有一个结束标志0。(2)字符数组定义格式:存储类型 char;(3)字符串处理函数,(1)冒泡法,冒泡法(续),外循环用变量i控制轮次,i的值从0到3(3=N-2),共进行N-1轮。用循环语句表示为:for(i=0;iaj+1)temp=aj;aj=aj+1;aj+1=temp;因此排序程序的主体结构为:for(

18、i=0;iaj+1)temp=aj;aj=aj+1;aj+1=temp;,例程,(2)选择法,选择法(续),外循环用变量i控制轮次,i的值从0到3(3=N-2),共进行N-1轮。用循环语句表示为:for(i=0;iaj)temp=ai;ai=aj;aj=temp;因此排序程序的主体结构为:for(i=0;iaj)temp=ai;ai=aj;aj=temp;,例程,例4.1,#include void main(void)int a10,i;coutai;for(i=9;i=0;i-)coutait;coutendl;程序执行后提示:Input ten integers:0 1 2 3 4 5

19、6 7 8 9 9 8 7 6 5 4 3 2 1 0 返回,例4.2,#include#define N 10void main(void)float aN,sum,ave,max,min;int i;coutai;sum=0;max=a0;min=a0;for(i=0;imax)max=ai;if(aimin)min=ai;ave=sum/N;coutave=ave,max=max,min=min;coutendl;程序运行后,提示:Input integers:90 87 68 92 56 78 85 90 98 64输出:ave=80.8,max=98,min=56,返回,例4.3,#

20、include#include#define N 7void main(void)int aN,i,temp;coutai;for(i=0;iN;i+)coutsetw(4)ai;coutendl;for(i=0;iN/2;i+)temp=ai;ai=aN-i-1;aN-i-1=temp;for(i=0;iN;i+)coutsetw(4)ai;coutendl;程序执行后提示:Input 7 integers:8 3 5 1 9 7 2 2 7 9 1 5 3 8,分析:设a数组有n个元素,将a数组中的内容按颠倒的次序重新存放,只需将元素a0的内容与元素an-1的内容交换,将元素a1的内容与元

21、素an-2的内容交换,将元素ai的内容与元素an-i-1的内容交换即可;i的取值范围为0到(取整)(n/2)-1。返回,例4.4 冒泡法,#include#include#define N 10void main(void)float aN,temp;int i,j;coutai;for(i=0;iaj+1)temp=aj;aj=aj+1;aj+1=temp;for(i=0;iN;i+)coutsetw(7)ai;coutendl;,升序排序冒泡法归结口诀:相邻两数两两相比,上大下小则交换,共进行N-1轮,每轮进行N-1-i次。返回,例4.4 选择法,#include#include#defi

22、ne N 10void main(void)float aN,temp;int i,j;coutai;for(i=0;iaj)temp=ai;ai=aj;aj=temp;for(i=0;iN;i+)coutsetw(5)ai;coutendl;,升序排序选择法归结口诀:首数与后数两两相比,首大后小则交换,共进行N-1轮,每轮进行从i+1开始N-1为止。返回,例4.5,#include#include void main(void)int a34,i,j;coutaij;,for(i=0;i3;i+)for(j=0;j4;j+)coutsetw(4)aij;coutendl;程序执行后提示:In

23、put twelve integers:1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12,返回,例4.6(1),#include#include#define N 5#define M 5void main(void)int sNM,numN;float sum;int i,j;coutsij;,例4.6(2),for(i=0;iN;i+)/处理数据 sum=0.0;for(j=1;jM-1;j+)/计算每个学生的总成绩 sum=sum+sij;sij=sum/(M-2);/计算每个学生的平均成绩 coutsetw(5)Num.Math

24、.Chin.Engl.Ave.endl;/输出数据 cout-n;for(i=0;iN;i+)for(j=0;jM;j+)/输出每个学生的学号与成绩 coutsetw(6)sij;coutendl;cout-n;,例4.6(3),程序运行后,提示:Input data:100190 80 85 100270 75 80 100365 70 75 100485 50 60 100580 90 70输出:Num.Math.Chin.Engl.Ave.-1001 90 80 85 85 1002 70 75 80 75 1003 65 70 75 70 1004 85 50 60 65 1005 8

25、0 90 70 80-,返回,例4.7(1),#include#include void main(void)int a34=1,2,3,4,5,6,7,8,9,10,11,12;int b43;int i,j;coutArray a:n;for(i=0;i3;i+)/输出a数组 for(j=0;j4;j+)coutsetw(5)aij;coutendl;,例4.7(2),for(i=0;i3;i+)/将a数组转置成b数组 for(j=0;j4;j+)bji=aij;coutArray b:n;for(i=0;i4;i+)/输出b数组 for(j=0;j3;j+)coutsetw(5)bij;

26、coutendl;,例4.7(3),程序运行后,输出:Array a:1 2 3 4 5 6 7 8 9 10 11 12 Array b:1 5 9 2 6 10 3 7 11 4 8 12,返回,例 4.8,#include void main(void)int i;char str10;coutstri;for(i=9;i=0;i-)coutstri;coutendl;程序执行后提示:Input ten character:ABCDEFGHIJ JIHGFEDCBA,返回,例4.9,#include void main(void)char s140,s240;couts1s2;couts

27、1=s1ts2=s2endl;输出为:s1=verys2=good,输入字符串时,遇到空格字符或换行字符(Enter健),认为一个字符串结束,接着的非空格字符作为一个新的字符串开始;并且系统自动会在每一个字符串后加一个0。当要把输入的一行(包括空格字符)作为一个字符串送到字符数组中时,则要使用函数cin.getline(str,n),该函数的第一个参数str为字符数组名,第二个参数n为允许输入的最大字符个数。例如:char s12;cin.getline(s,12);一个字符数组作为一个字符串输出时,必须保证在数组中包含字符串结束符0;当遇到0时,输出自动结束,0不输出。,返回,例4.10(方

28、法一),#include#include void main(void)char str140,str220;/定义字符数组str1、str2 coutInput two strings:n;cin.getline(str1,20);/输入字符串1到str1中 cin.getline(str2,20);/输入字符串2到str2中 strcat(str1,str2);/将str1、str2连接后存入str1 coutstr1endl;/输出str1 返回,例4.10(方法二),void main(void)#include char str140,str220;/定义字符数组str1、str2

29、int i,j;coutInput two string:n;/输入字符串1到str1中 cin.getline(str2,20);/输入字符串2到str2中 i=0;/使i指向str1的第一个元素 while(str1i!=0)/判断str1是否结束 i+;/str1没有结束,使i指向下一个元素 j=0;/使j指向str2的第一个元素 while(str2j!=0)/判断str2是否结束 str1i=str2j;/str2没有结束,将str2j赋给;str1i i+;/使i指向str1的下一个元素 j+;/使j指向str2 的下一个元素 str1i=0;/在str1末尾添加结束标志0 cou

30、tstr1endl;/输出str1,返回,例4.10(方法三),#include#include void main(void)char str140,str220;/定义字符数组str1、str2 int i,j;coutInput two string:n;cin.getline(str1,20);/输入字符串1到str1中 cin.getline(str2,20);/输入字符串2到str2中 i=strlen(str1);/使i指向str1的结束位置0 for(j=0;j=strlen(str2);i+,j+)/j从0到str2的结束位置0依次循环 str1i=str2j;/将str2j

31、赋给str1i coutstr1endl;/输出str1,返回,例4.11(1),#include#include#define N 10void main(void)float aN;int i,b,j;coutai;coutb;,例4.11(2),i=0;while(aii;j-)aj=aj-1;ai=b;for(i=0;iN;i+)coutsetw(6)aiendl;输入:1 2 3 4 5 6 7 8 10 插入:9输出:1 2 3 4 5 6 7 8 9 10,返回,例4.12(1),#include#include#define M 6#define N 5 void main(v

32、oid)float sMN,sum,ave,temp;int i,j,k;coutsij;,例4.12(2),for(i=0;iM;i+)/处理数据 sum=0.0;for(j=1;jN-1;j+)/计算每个学生的总成绩 sum=sum+sij;siN-1=sum;/存放每个学生的总分 for(j=1;jN;j+)/处理数据 sum=0.0;for(i=0;iM-1;i+)/计算每门课的总成绩 sum=sum+sij;sM-1j=sum/(M-1);/计算每门课程的平均分,例4.12(3),for(i=0;iM-2;i+)/按总成绩排序 k=i;for(j=i+1;jM-1;j+)if(skN

33、-1sjN-1)k=j;if(k!=i)for(j=0;jN;j+)temp=sij;sij=skj;skj=temp;,例4.12(4),coutsetw(5)Num.Math.Chin.Engl.Sum.endl;/输出数据 cout-n;for(i=0;iM;i+)for(j=0;jN;j+)/输出学号、3门课程的成绩与总分 if(i=M-1,返回,例4.13,杨辉三角形:1 1 1121133114641151010511615201561,例4.13(方法一),#include#include#define N 11void main(void)int cNN,m,n,k,m1,n1

34、,n_m;for(n=0;nN;n+)for(m=0;m=n;m+)for(m1=1,k=1;k=m;k+)m1*=k;for(n1=1,k=1;k=n;k+)n1*=k;for(n_m=1,k=1;k=n-m;k+)n_m*=k;cnm=n1/(m1*n_m);for(n=0;nN;n+)for(m=0;m=n;m+)coutsetw(6)cnm;coutendl;,例4.13(方法二),#include#include#define N 11void main(void)int cNN,m,n,k,m1,n1,nm1;for(n=1;nN;n+)cnn=1;cn1=1;for(n=3;nN

35、;n+)for(m=2;m=n-1;m+)cnm=cn-1m-1+cn-1m;for(n=1;nN;n+)for(m=1;m=n;m+)coutsetw(6)cnm;coutendl;,返回,例4.14(1),#include#include void main(void)char str320,string20;/定义字符数组str320和string20 int i;coutInput three strings:n;for(i=0;i3;i+)cin.getline(stri,80);/输入三个字符串存放在str320中,例4.14(2),if(strcmp(str0,str1)0)/找出str0和str1中的大者,存入string strcpy(string,str0);else strcpy(string,str1);if(strcmp(str2,string)0)/若str2比string大,则str2存入string strcpy(string,str2);coutstringendl;/输出string程序运行后,提示:Input three strings:we you they输出:you,返回,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号