四章数组与指针ppt课件.ppt
《四章数组与指针ppt课件.ppt》由会员分享,可在线阅读,更多相关《四章数组与指针ppt课件.ppt(76页珍藏版)》请在三一办公上搜索。
1、uangXi University,1,C/C+程序设计,胡立坤,uangXi University,2,第4章数组与指针及其应用,4.1 一维数组4.2 二维数组4.3 字符串4.4 指针和数组4.5动态数组4.6 程序举例,数组用于保存大量同类型的相关数据,如矩阵运算,表格数据等。,uangXi University,3,4.1一维数组,4.1.1 引例例4.1求N个学生的平均成绩,并统计高于平均分的人数。,用以前所学知识实现:int k=0;float s,ave,sum=0;for(int i=0;is;sum=sum+s;ave=sum/100;for(i=0;is;if(save)
2、k+;,用数组来实现:int k=0;float s100,ave,sum=0;for(i=0;isi;sum=sum+si;ave=sum/100;for(i=0;iave)k+;,数组:一组数据类型相同的元素按一定顺序存放,构成的数据集合。,采用随机数函数si=rand()%101,uangXi University,4,4.1一维数组,4.1.2一维数组的定义、存储和初始化(1)数组的形式 数据类型 数组名整型常量表达式;如:int s5;s0 s1 s2 s3 s4 下标从0开始数组名是常量,表示数组在内存中的首地址。数组长度应该为整型常量表达式,不能是变量。如:,正确:const i
3、nt s=10;int as;float f5;,错误:int s=10;int as;float b3.4,uangXi University,5,4.1一维数组,(2)数组的初始化 a.给所有元素赋初值。如:int a5=0,2,4,6,8;或 int a=0,2,4,6,8;b.给部分元素赋初值。如:int a10=1,3,5,7,9;花括号内列出的值赋给前面的若干个元素,其余元素自动赋0。以下的语句均是错误:int a10;a=1,3,5,7,9;/数组名是个地址常量,不能被赋值。int a10;a10=1,3,5,7,9;/a10不是数组中的元素,并且不能用花括号为一个元素赋多个值。
4、int c3=1,2,3,4;/常量个数超过数组定义的长度。,花括号,uangXi University,6,4.1一维数组,说明:数组大小最好用宏来定义,以适应未来可能的变化#define SIZE 10int aSIZE;对数组每个元素的使用与普通变量无异,可以快速地随机访问可以用任意表达式作为下标,动态决定访问哪个元素for(i=0;iSIZE;i+)ai=2*i;下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果sizeof可以用来获得数组大小一旦定义,不能改变大小,uangXi University,7,4.1一维数组,4.1.3数组元
5、素的引用和基本操作(1)数组元素的引用 形式:数组名下标-相当于一个普通变量,如有:int a10=1,2,3,4,5,6,7,8,9,10,b10,i(2);则:a3=a0+ai;/a3=1+3=4 couta2+i;/输出a4元素的值 coutaa3;/aa3=a4=5 couta10;/数组下标越界 couta;/对数组一般不能作为一个整体进行操作 b=a;,uangXi University,8,4.1一维数组,(2)基本操作 假设有定义:int aN;N是已定义过的符号常量。数组元素的输入和输出-for(j=0;jaj;-for(j=0;jN;j+)coutaj;-for(i=0;i
6、10;i+)scanf(%d,uangXi University,9,4.1一维数组,求数组中的最大元素-max=a0;/假设第一个元素值最大 for(j=1;jmax)max=aj;求最大元素下标-imax=0;/imax代表最大元素下标 for(j=1;jaimax)imax=j;将最大元素放于某一特定位置(如放在最前头)-imax=0;for(j=1;jaimax)imax=j;if(imax!=0)t=a0;a0=aimax;aimax=t;,uangXi University,10,4.1一维数组,4.1.4 数组排序 排序是将一组数按递增或递减的次序排列,如按学生的成绩、球赛积分等
7、排序。常用的算法有:,选择法()冒泡法()插入法 快速排序法.,uangXi University,11,4.1一维数组,(1)选择法排序-基本思想:(a)从n个数的序列中选出最小的数(递增),与第1个数交换位置;(b)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(c)重复(1)n-1遍,最后构成递增序列。例4.3对存放在数组中的6个数,用选择法按递增排序。,下标 0 15 1 25 2 35 3 45 4 5,for(i=0;i5;i+)min=i;for(j=i+1;j6;j+)if(ajamin)min=j;if(i!=min)temp=ai;ai=am
8、in;amin=temp;,uangXi University,12,4.1一维数组,(2)冒泡法排序-基本思想:(a)从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,最大的数存放在aN-1中;(b)然后对a0到aN-2的N-1个数进行同(a)的操作,次最大数放入aN-2元素内,完成第二趟排序;依次类推,进行N-1趟排序后,所有数均有序。例4.4用冒泡排序法实现例4.3,for(i=0;iaj)temp=aj-1;aj-1=aj;aj=temp;,思考:当数据未交换,说明数组已有序,如何结束排序?,uangXi University,1
9、3,4.2二维数组,4.2.1 二维数组的定义和初始化(1)数组的定义 形式:数据类型 数组名常量表达式1常量表达式2;如:float a23;,以“先行后列”的规则连续存放:,序号=当前行号*每行列数+当前列号,序号:0 1 2 3 4 5,uangXi University,14,4.2二维数组,(2)数组的初始化,(a)按在内存排列顺序对所有元素赋初值。(b)按行给所有元素赋初值,每一行的数据放于一个花括号内。(c)按行给部分元素赋初值,省略的元素初值此时自动为0。对应的数组b为:(d)按行赋初值也可省略第一维的长度。对应的数组c为:,int a23=1,2,3,4,5,6;或 int
10、a3=1,2,3,4,5,6;,int a23=1,2,3,4,5,6;,int b34=1,2,0,3,4,0,0,5;,int c 3=1,0,2;,uangXi University,15,4.2二维数组,4.2.2 二维数组的基本操作(1)数组的输入、输出例4.5输入两个矩阵A、B的值,求C=A+B。,分析:(1)A、B矩阵相加,其实质是将两矩阵的对应元素相加。相加的条件是有相同的行、列数。(2)输入可以通过空格、Tab符和回车符控制;输出内循环不换行,出了内循环输出endl换行。,uangXi University,16,4.2二维数组,#include iostream.h#inc
11、lude iomanip.h void main()int a23,b23,c23,i,j;for(i=0;iaij;for(i=0;ibij;for(i=0;i2;i+)/A+B矩阵,每个对应元素相加 for(j=0;j3;j+)cij=aij+bij;for(i=0;i2;i+)for(j=0;j3;j+)coutsetw(4)cij;coutendl;,uangXi University,17,4.2二维数组,(2)求二维数组中最大(或最小)元素及下标 例4.6对33方阵,求最大元素及下标。与一维数组求最大值的方式相同,max=a00;imax=0;jmax=0;for(i=0;imax
12、)max=aij;imax=i;jmax=j;,uangXi University,18,4.2二维数组,(3)矩阵转置:将矩阵以主对角线为轴线,将元素的行和列位置调换。如对33方阵转置,for(i=0;i3;i+)for(j=0;ji;j+)t=aij;aij=aji;aji=t;,uangXi University,19,4.2二维数组,4.矩阵相乘例4.7求两个矩阵aMN和bNP的乘积 c。,设矩阵A、B为:,则矩阵C为:,即矩阵C的第i行第j列元素可通过右边公式求得:,c00元素的实现:s=0;for(k=0;k3;k+)s+=a0k*bk0;c00=s;,uangXi Univers
13、ity,20,4.2二维数组,#include iostream.h#define M 2#define N 3#define P 4void main()int aMN=3,5,7,4,6,8,bNP=1,4,7,10,2,5,8,11,3,6,9,12;int cMP,i,j,k,s;for(i=0;iM;i+)for(j=0;jP;j+)s=0;/求一个元素的值 for(k=0;kN;k+)s+=aik*bkj;cij=s;for(i=0;iM;i+)for(j=0;jP;j+)coutcij;coutendl;,uangXi University,21,4.3字符串,字符串常量:ab1
14、23,系统自动添加 0(结束标志符),处理字符串的方法有:字符数组、CString(string)类和字符指针。本节只介绍前两种方法,后一种方法我们将在下一节介绍。,uangXi University,22,4.3字符串,4.3.1 字符数组(1)字符数组 char s6;-既可以存放若干个字符,也可以存放一个字符串。char s28;-可以存放一组相关的字符串,按要处理字符串中最大长度来定义列数。,s0,s1,si0,si7,uangXi University,23,4.3字符串,(2)字符数组的初始化(a)逐个字符赋初值(b)用字符串为字符数组初始化(c)字符串数组初始化 对二维数组以字符
15、串形式初始化。对于二维字符数组,用两个下标表示数组中的一个字符。,char s10=I,a,m,f,i,n,e;/s不是字符串,char s10=I am fine;char s10=I am fine;s是字符串,0 系统自动添加,char a48=COBOL,FORTRAN,PASCAL,C/C+;,uangXi University,24,4.3字符串,注意不要出现下面的错误:,char s10=“This is a book”;/长度超过了 char s10;s=“I am fine”;/不能将字符串常量赋给地址常量 char s10;s=I,a,m,f,i,n,e;/同样不能将一系列
16、字符赋给地址常量 char s34;s7=c;/不能将二维数组当成一维数组访问,uangXi University,25,4.3字符串,(3)字符数组的输入/输出 逐个数组元素的输入/输出,char s110;for(i=0;is1i;/s1中是字符,不是字符串/C:scanf(“%c”,i+)couts1i/通过循环逐个输出/C:printf(“%c”,&s1i),注意:a.输入时各输入项之间不需加空格分隔 b.输入多出的字符不会被处理 c.逐个字符输出,uangXi University,26,4.3字符串,字符串整体的输入/输出,char s110,s225;输入:输出:cins1;co
17、ut s1;gets(s1);/C:scanf(%s,s1);puts(s1);/C:printf(%s,s1);for(int i=0;i2;i+)for(i=0;i2;i+)gets(s2i);puts(s2i);/C:scanf(%s,s2i);/C:printf(%s,s2i);s1、s2中是字符串,0自动添加,注意:使用cins1;语句,字符串中不能有空格。这与scanf一样。gets()和puts()是对字符串整体输入/输出,应加#include“stdio.h”命令。并且允许字符串中的空格,gets()以回车符r结束。gets(字符数组名或字符指针变量名);puts(字符数组名或
18、字符指针变量名)。,uangXi University,27,4.3字符串,字符串输入函数gets()没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机。对输入字符串长度有限制的函数调用 fgets(buf,sizeof(buf),stdin);对于scanf,当用户的输入多于定义时,str数组将越界。所以scanf被公认为最易遭到黑客攻击的函数之一。getline(cin,str,定界符);从输入流读入一串字符,直到出现下列情况:(1)到达文件尾,这样,输入流的edfbit被设置,调用方法file()或eof()都将返回true;(2)遇到分界字符,默认为n,这种情况
19、下,将把分界字符从输入流中删除,而且不存储她;(3)读取的字符到达最大的允许值,它将设置输入流的failbit,这意味着fail()方法返回true;/Attention!实际上,cin类中也有getline、get成员函数,详细地说明将在I/O流那一章给出。,uangXi University,28,4.3字符串,(4)字符串处理函数 在标准C+中使用下面函数时,应加#include string.h命令。a.strlen(str)功能:求str所指向的字符串长度。不包括字符串结束标志0。说明:str可为字符串常量、字符数组名或字符指针。b.strlwr(str)功能:将字符串中的大写字母转
20、换成小写字母。说明:str为字符字符串常量、数组名或字符指针。c.strupr(str)功能:将字符串中的小写字母转换成大写字母。说明:str为字符字符串常量、数组名或字符指针。,uangXi University,29,4.3字符串,d.strcpy(str1,str2)功能:将str2所指的字符串复制到str1中。说明:str1和str2为字符数组名或字符指针,str2还可以是字符串常量。str1要有足够大的空 间。e.strcat(str1,str2)功能:将str2字符串内容连接到str1字符串内容的后面 说明:str1要有足够大的空间。例如:char s120=abcd;coutst
21、rcat(s1,kkk)endl;/s1中的内容变为abcdk,设:char str210=aaa,str110;,strcpy(str1,str2);str1=bb;str1=str2;,uangXi University,30,4.3字符串,f.strcmp(str1,str2)功能:比较字符串str1和str2的大小。说明:从左至右逐个字符进行比较ASCII码值,直到出现不相同字符或遇到0为止。str1 小于str2 返回-1 str1等于str2 返回 0 str1大于str2 返回 1例4.8字符串处理函数示例,strcmp(ABCD,BD;/结果为:-1,#include stdi
22、o.h#include string.hvoid main()char s80;while(1)gets(s);if(strcmp(s,pass),puts(Invalid password.n);else break;puts(passn);,uangXi University,31,4.3字符串,4.3.2 CString 类(补充)对字符串的存取及有关操作,在VC开发平台下还可通过MFC中的CString 类。(1)定义CString 类对象 CString 类的定义在“afx.h”头文件中形式:CString 对象名;CString 对象名=字符串常量;CString 对象名(字符串常
23、量);CString 对象名(字符,int n);/重复产生n个相同的字符如:CString s1=C/C+程序设计;CString s(d,5);couts;/s获得字符串ddddd,/CString类中有多个构造函数(多态),uangXi University,32,4.3字符串,(2)输入/输出例4.补1 示例#include iostream.h#include afx.hvoid main()char c80;CString st1;coutc;st1=c;cout输出结果:;coutst1endl;,由于VC+并不能直接使用cin对CString对象进行操作,应利用字符数组间接输入
24、,CString对象可直接通过cout输出,uangXi University,33,4.3字符串,(3)基本运算假设定义:CString st1(ASDFG),st2,st3(DD);,uangXi University,34,4.3字符串,(4)成员函数形式:函数值类型 CString对象.成员函数名(参数列表)a.取子串形式:CString Mid(int nFirst,int nCount)/取字符串中nFirst位置开始的nCount个字符 CString Left(int nCount)/取字符串的左边nCount个字符 CString Right(int nCount)/取字符串
25、的右边nCount个字符,有定义:CString s(12345);则:s.Mid(2,2)的值为34 s.Left(3)的值为123,uangXi University,35,4.3字符串,例4.补2 利用Left函数,输出如图所示的结果。,分析:确定每行显示字符的起始位,通过setw(n)显示一个空格的位数来实现,也可通过产生一个有若干个空格的字符串后left(n)显示n个空格来实现。显示可变的,利用left(n)。,如果不利用left函数,你如何输出如图所示的结果?,CString st1(,30);/产生30个空 CString st2(ABCDEFGHIJKLMNOPQRS);for
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 指针 ppt 课件
链接地址:https://www.31ppt.com/p-5379652.html