C++程序设计教程第4章-数组与结构体.ppt
《C++程序设计教程第4章-数组与结构体.ppt》由会员分享,可在线阅读,更多相关《C++程序设计教程第4章-数组与结构体.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4章 数组和结构体 数组是有序数据的集合。数组中的每一个元素都属于同一数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型,用一个统一的数组名和下标来唯一地确定数组中个数据类型,用一个统一的数组名和下标来唯一地确定数组中的元素。的元素。4.1.1 4.1.1 数组的定义数组的定义 格式:类型说明符格式:类型说明符 数组名数组名 常量表达式常量表达式 例如:例如:int a10 int a10;int z34 int z34;float b20 float b20;数组元素为:数组元素为:a0a0、a1a1、a2a2、a9a9 b0 b0、b1b1、b2b2、b19b19 ai ai与
2、某个简单变量是一样的。与某个简单变量是一样的。C+C+中没有动态数组。中没有动态数组。例如:例如:int n=10;int n=10;int an;/int an;/是错误的是错误的4.1 4.1 数组数组 4.1.2 4.1.2 数组元素的引用数组元素的引用 数组在内存中是连续存放的。对于数组也必须先定义后使用。数组在内存中是连续存放的。对于数组也必须先定义后使用。并且并且C+C+规定只能逐个引用数组元素而不能一次引用整个数组。规定只能逐个引用数组元素而不能一次引用整个数组。一维数组中数组元素的引用方式为:一维数组中数组元素的引用方式为:数组名数组名 下标下标 下标可以是整型常量或整型表达式
3、。例如:下标可以是整型常量或整型表达式。例如:a0a0、a2*3a2*3、ai+5ai+5。二维数组的元素的引用方式为二维数组的元素的引用方式为:数组名数组名 下标下标下标下标 下标可以是整型表达式。如下标可以是整型表达式。如a23a23、a3-12*2-1a3-12*2-1。但不要写。但不要写成成a2a2,33。注意事项:注意事项:1 1、同一数组中的元素必须具有、同一数组中的元素必须具有相同相同的数据类型,而且这组数据在的数据类型,而且这组数据在内存中将占据一段连续的存储单元内存中将占据一段连续的存储单元2 2、数组名命名规则和变量名相同,遵循标识符命名规则。、数组名命名规则和变量名相同,
4、遵循标识符命名规则。3 3、常量表达式表示元素的个数,即数组长度常量表达式表示元素的个数,即数组长度。4 4、常量表达式中可以包括常量和符号常量,不能包含变量。、常量表达式中可以包括常量和符号常量,不能包含变量。(int an;-int an;-不对)不对)5 5、数组、数组第一个元素的下标为第一个元素的下标为0 0。例例4-1 4-1 从键盘输入从键盘输入1010个整数,将它们逆序输出。个整数,将它们逆序输出。#include int main()int i,a10;for(i=0;iai;for(i=9;i=0;i-)coutai;coutendl;return 0;例例4-2 4-2 用
5、数组构造用数组构造FibnacciFibnacci序列的前序列的前2020个数。个数。#include int main()int i,fib20;fib0=1;fib1=1;for(i=2;i=19;i+)fibi=fibi-1+fibi-2;for(i=0;i=19;i+)coutfibi“;coutendl;return 0;关键关键4.1.3 4.1.3 数组的初始化数组的初始化 在定义数组时可以对其进行初始化。在定义数组时可以对其进行初始化。1 1一维数组的初始化一维数组的初始化(1 1)全部赋初值)全部赋初值 int a10=0 int a10=0,1 1,2 2,3 3,4 4,
6、5 5,6 6,7 7,8 8,99;(2 2)部分赋初值)部分赋初值 int a10=0 int a10=0,1 1,2 2,3 3,44;/后后5 5个元素值为个元素值为0 0(3 3)赋初值时省略数组大小)赋初值时省略数组大小 int a5=0 int a5=0,1 1,2 2,3 3,44;int a=0 int a=0,1 1,2 2,3 3,44;/两个语句等价两个语句等价 初始化给出的元素个数不能超过数组的长度。初始化给出的元素个数不能超过数组的长度。例如:例如:int a5=0 int a5=0,1 1,2 2,3 3,4 4,55;就是错误的。就是错误的。2 2二维数组的初始
7、化二维数组的初始化(1 1)全部赋初值)全部赋初值 int a34=1 int a34=1,2 2,3 3,44,55,6 6,7 7,88,99,1010,1111,1212;int a34=1 int a34=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,1212;(2 2)部分赋初值)部分赋初值 int a34=1 int a34=1,22,33;int a34=1 int a34=1,00,22,00,0 0,33;(3 3)赋初值省略第一维的大小)赋初值省略第一维的大小 int a 4=1 int a 4=1,2 2,3 3,4 4,5 5,
8、6 6,7 7,8 8,9 9,1010,1111,1212;等价于:等价于:int a34=1 int a34=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,1212;在定义时也可以只对部分元素赋初值而省略第一维的大小,在定义时也可以只对部分元素赋初值而省略第一维的大小,但应分行赋初值。如但应分行赋初值。如 int a 4=0 int a 4=0,11,11,0 0,11;这样的写法,能通知编译系统,数组共有这样的写法,能通知编译系统,数组共有3 3行。行。数组各元素为:数组各元素为:例例4-3 4-3 将一个将一个3*43*4矩阵转置后输出。例如矩
9、阵转置后输出。例如矩阵矩阵 转置后成为矩阵转置后成为矩阵#include#include int main()int main()int i,j,b43;int i,j,b43;int a34=1,2,3,4,1,2,3,4,1,2,3,4;int a34=1,2,3,4,1,2,3,4,1,2,3,4;coutBefore convertingendl;coutBefore convertingendl;for(i=0;i3;i+)for(j=0;j4;j+)cout.width(3);coutaij;coutendl;for(i=0;i3;i+)for(j=0;j4;j+)bji=aij;
10、coutAfter convertingendl;for(i=0;i4;i+)for(j=0;j3;j+)cout.width(3);coutbij;coutendl;return 0;cout.width(3);/cout.width(3);/设置宽度设置宽度为为3 3,不足用空格填充,不足用空格填充,是左是左边补空格。边补空格。4.1.4 4.1.4 数组的应用数组的应用1.1.数组的简单应用数组的简单应用例例4-4 4-4 编写程序找出编写程序找出10001000以内所有的完数。以内所有的完数。所谓完数就是该数等于它的所有因子之和。如所谓完数就是该数等于它的所有因子之和。如6=1+2+3
11、6=1+2+3。#include#include int main()int main()int n,m,i,j,a20;int n,m,i,j,a20;for(n=2;n=1000;n+)for(n=2;n=1000;n+)m=n;j=0;m=n;j=0;for(i=1;in;i+)for(i=1;in;i+)if(n%i=0)if(n%i=0)aj=i;j=j+1;aj=i;j=j+1;m=m-i;m=m-i;if(m=0)if(m=0)coutn coutn是一个完数,它的因子是是一个完数,它的因子是;for(i=0;ij;i+)for(i=0;ij;i+)coutai,;coutai,
12、;coutendl;coutendl;return 0;return 0;/aj/aj中存的是因数中存的是因数例例4-5 4-5 有有3*43*4的整数数组,编写程序,求出最大的那个元素的整数数组,编写程序,求出最大的那个元素的值以及其所在的行列号。的值以及其所在的行列号。#include int main()int a34=1,2,3,4,5,6,7,8,9,0,10,11;int i,j,row,col,max;max=a00;row=0;col=0;for(i=0;i3;i+)for(j=0;jmax)max=aij;row=i;col=j;coutMax=max ;coutRow=ro
13、w ;coutCol=colendl;return 0;修改版:修改版:#include#include int main()int main()/int a34=1,2,3,4,5,6,7,8,9,0,10,11;/int a34=1,2,3,4,5,6,7,8,9,0,10,11;int a34;int a34;int i,j,row,col,max;int i,j,row,col,max;for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j4;j+)for(j=0;jaij;cinaij;max=a00;row=0;col=0;max=a00;row=0;col=0
14、;for(i=0;i3;i+)for(i=0;i3;i+)for(j=0;j4;j+)for(j=0;jmax)if (aijmax)max=aij;row=i;col=j;max=aij;row=i;col=j;coutMax=max ;coutMax=max ;coutRow=row ;coutRow=row ;coutCol=colendl;coutCol=colendl;return 0;return 0;输入:输入:1 2 3 4 5 6 7 8 9 0 10 111 2 3 4 5 6 7 8 9 0 10 11输出:输出:Max=11 Row=2 Col=3Max=11 Row=
15、2 Col=3 例例4-6 Josephus 4-6 Josephus 问题问题 分析:分析:Josephus Josephus 问题是说,一群小孩围成一圈,任意假定一问题是说,一群小孩围成一圈,任意假定一个数个数m m,从第,从第1 1个小孩起,顺时针方向数,每数到第个小孩起,顺时针方向数,每数到第m m个小孩时,该个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。小孩便是胜利者。编写程序,顺序打印离开的小孩及最后的胜利者。编写程序,顺序打印离开的小孩及最后的胜利者。#include#define NU
16、M 10 /定义小孩个数定义小孩个数int main()int m;/每次数每次数m个小孩,便让小孩离开个小孩,便让小孩离开 int aNUM;/小孩数组小孩数组 int i,j,k,s;/数组下标变量数组下标变量i,数数记数变量数数记数变量j,/离开小孩记数变量离开小孩记数变量k,游戏标志变量游戏标志变量s for(i=0;iNUM;i+)ai=i+1;/给小孩编号给小孩编号 for(i=0;iNUM;i+)coutai,;/顺序输出开始时的小孩编号顺序输出开始时的小孩编号 coutendl;coutm;/输入数小孩的间隔数到输入数小孩的间隔数到m k=1;/游戏开始游戏开始 i=-1;s=
17、1;/设数组下标初值(下一个值设数组下标初值(下一个值0即第一个开数小孩即第一个开数小孩 的下标的下标)和标志和标志s初初值值 while(s)/剩下的小孩多于一个剩下的小孩多于一个 j=0;/设置开始记数初值设置开始记数初值 while(jm)/数数m个小孩个小孩 i=(i+1)%NUM;/对下标加对下标加1求模求模 if(ai!=0)j+;/如果该元素的小孩在圈中,则数数有效如果该元素的小孩在圈中,则数数有效 if(k=NUM)/表示圈中只有一个小孩了,因为表示圈中只有一个小孩了,因为k初值是初值是1 s=0;else coutai ,;/输出本次离开的小孩的编号输出本次离开的小孩的编号
18、ai=0;/标识小孩已离开标识小孩已离开 k+;/准备处理圈中下一个小孩准备处理圈中下一个小孩 coutendl;cout第第 ai 号小孩获胜!号小孩获胜!;return 0;理解理解2 2 利用数组进行排序利用数组进行排序例例4-7 4-7 用直接选择排序方法将输入的用直接选择排序方法将输入的n n个整数按从小到大的顺序个整数按从小到大的顺序排列输出。排列输出。思路:直接选择排序是一种比较简单的排序方法,它的排序过程思路:直接选择排序是一种比较简单的排序方法,它的排序过程为:先从待排序的所有记录中选出关键字最小的记录,把它与原为:先从待排序的所有记录中选出关键字最小的记录,把它与原始序列中
19、的第一个记录交换位置;然后再从去掉了关键字最小的始序列中的第一个记录交换位置;然后再从去掉了关键字最小的记录的剩余记录中选出关键字最小的记录,把它与原始序列中第记录的剩余记录中选出关键字最小的记录,把它与原始序列中第二个记录交换位置;依次类推,直至所有的记录成为有序序列。二个记录交换位置;依次类推,直至所有的记录成为有序序列。#include int main()int a10,i,j,k,temp,n=10;for(i=0;iai;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(ajak)k=j;if(k!=i)temp=ai;ai=ak;ak=temp;cou
20、tAfter sortingendl;for(i=0;in;i+)cout ai ;cout endl;return 0;找剩余的数中找剩余的数中最小的那个数最小的那个数,并把其下标存并把其下标存入入k k中中例例4-8 4-8 用冒泡排序方法将输入的用冒泡排序方法将输入的n n个整数按从小到大的顺序排列个整数按从小到大的顺序排列输出。输出。思路:冒泡排序的排序过程为:先将第思路:冒泡排序的排序过程为:先将第1 1个记录和第个记录和第2 2个记录进行个记录进行比较,若为逆序,则交换之;接着比较第比较,若为逆序,则交换之;接着比较第2 2个记录和第个记录和第3 3个记录;个记录;依次类推,直至第
21、依次类推,直至第n-1n-1个记录和第个记录和第n n个记录进行比较、交换为止,个记录进行比较、交换为止,我们称这样的过程为一趟冒泡排序。如此经过一趟排序,关键字我们称这样的过程为一趟冒泡排序。如此经过一趟排序,关键字最大的记录被安置到最后一个记录的位置上。然后,对前最大的记录被安置到最后一个记录的位置上。然后,对前n-1n-1个个记录进行同样的操作,使具有次大关键字的记录被安置到第记录进行同样的操作,使具有次大关键字的记录被安置到第n-1n-1个记录的位置上。重复以上过程,直到没有记录需要交换为止。个记录的位置上。重复以上过程,直到没有记录需要交换为止。/用用i i表示比较的趟次,则表示比较
22、的趟次,则i i:1 1 9 9/用用j j表示比较的两个对象的前一个的下标,表示比较的两个对象的前一个的下标,/即即ajaj与与aj+1aj+1比较比较j j:0 0 9-i 9-i#include#include int main()int main()int a10,i,j,temp,n=10;int a10,i,j,temp,n=10;for(i=0;in;i+)for(i=0;iai;cinai;for(i=1;i=n-1;i+)for(i=1;i=n-1;i+)for(j=0;jfor(j=0;jaj+1)if(ajaj+1)temp=aj;temp=aj;aj=aj+1;aj=a
23、j+1;aj+1=temp;aj+1=temp;coutAfter sorting“endl;for(i=0;in;i+)cout ai ;cout string1 字符串字符串string2string2,函数值为一个正整数。,函数值为一个正整数。如果字符串如果字符串string1 string1 字符串字符串string2string2,函数值为一个负整数。,函数值为一个负整数。ASCIIASCII的比较:的比较:0 09 9A AZ Za az z:记住几个常见字母的:记住几个常见字母的ASCIIASCII码大小:码大小:“A”“A”为为6565;“a”“a”为为9797;“0”“0”为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 教程 数组 结构
限制150内