《最新四章数组与指针ppt课件PPT课件》由会员分享,可在线阅读,更多相关《最新四章数组与指针ppt课件PPT课件(77页珍藏版)》请在金锄头文库上搜索。
1、四章数组与指针四章数组与指针ppt课件课件 C/C+ C/C+程序设计第第4章数组与指针及其应用章数组与指针及其应用4.1 一维数组4.2 二维数组4.3 字符串4.4 指针和数组4.5动态数组4.6 程序举例数组用于保存大量同类型的相关数组用于保存大量同类型的相关数组用于保存大量同类型的相关数组用于保存大量同类型的相关数据,数据,数据,数据,如矩阵运算,表格数据等。如矩阵运算,表格数据等。如矩阵运算,表格数据等。如矩阵运算,表格数据等。2uangXi University C/C+ C/C+程序设计 C/C+ C/C+程序设计 C/C+ C/C+程序设计 C/C+ C/C+程序设计 C/C+
2、 C/C+程序设计 C/C+ C/C+程序设计 C/C+ C/C+程序设计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;9uangXi University
3、C/C+ C/C+程序设计4.1一维数组一维数组4.1.4 数组排序排序是将一组数按递增或递减的次序排列,如按学排序是将一组数按递增或递减的次序排列,如按学生的成绩、球赛积分等排序。常用的算法有生的成绩、球赛积分等排序。常用的算法有: 选择法选择法 () 冒泡法冒泡法 () 插入法插入法 快速排序法快速排序法 . 10uangXi University C/C+ C/C+程序设计4.1一维数组一维数组(1)选择法排序选择法排序-基本基本思想思想:(a)从从n个数的序列中选出最小的数个数的序列中选出最小的数(递增递增),与第,与第1个数交换位置;个数交换位置;(b)除第除第1个数外,其余个数外,
4、其余n-1个数再按个数再按(1)的方法选出次小的数,与第的方法选出次小的数,与第2个数交换位置个数交换位置;(c)重复重复(1)n-1遍,最后构成递增序列。遍,最后构成递增序列。例例4.3对存放在数组中的对存放在数组中的6个数,用选择法按递增排序。个数,用选择法按递增排序。下标下标 0 15 1 25 2 35 3 45 4 5for( i= 0;i5;i+) min= i; for(j=i+1;j6;j+) if(ajamin)min= j; if(i!=min) temp=ai; ai= amin; amin=temp; 11uangXi University C/C+ C/C+程序设计4
5、.1一维数组一维数组(2)冒泡法排序冒泡法排序-基本思想:基本思想:(a)从第一个元素开始,对数组中两两相邻的元素比较,将值较小从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较完毕,最的元素放在前面,值较大的元素放在后面,一轮比较完毕,最大的数存放在大的数存放在aN-1中;中;(b)然后对然后对a0到到aN-2的的N-1个数进行同个数进行同(a)的操作,次最大数放的操作,次最大数放入入aN-2元素内,完成第二趟排序;依次类推,进行元素内,完成第二趟排序;依次类推,进行N-1趟排序趟排序后,所有数均有序。后,所有数均有序。例例4.4用冒泡排序法
6、实现例用冒泡排序法实现例4.38 3497K=5348 79K=4 34789K=33 47 8 9K=2for(i=0;i5;i+) for(j=1;jaj ) temp=aj-1; aj-1=aj; aj=temp; 思考:思考:当数据未交换,当数据未交换,说明数组说明数组已有序已有序 ,如何,如何结束排序?结束排序? 12uangXi University C/C+ C/C+程序设计4.2二维数组二维数组4.2.1二维数组的定义和初始化二维数组的定义和初始化(1)数组的定义数组的定义 形式:数据形式:数据类型型 数数组名名 常量表达式常量表达式11常量表达式常量表达式22; 如如:flo
7、at a23;:float a23;a00 a01 a02 a10 a11 a12 以以“先行后列先行后列”的规则连续存放的规则连续存放: : 序号序号= =当前行号当前行号* *每行列数每行列数+ +当前列号当前列号 序号:序号: 0 1 2 3 4 513uangXi University C/C+ C/C+程序设计4.2二维数组二维数组(2)数组的初始化数组的初始化(a)按)按在内存排列在内存排列顺序对所有元素赋初值。顺序对所有元素赋初值。(b)按行给所有元素赋初值,每一行的数据放于一个花括号内。)按行给所有元素赋初值,每一行的数据放于一个花括号内。(c)按行给部分元素赋初值,省略的元素
8、初值此时自动为)按行给部分元素赋初值,省略的元素初值此时自动为0。对应的数组对应的数组b为为:(d)按行赋初值也可省略第一维的长度。)按行赋初值也可省略第一维的长度。 对应的数组对应的数组c为为:int a23=1,2,3,4,5,6; 或或 int 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;14uangXi University C/C+ C/C+程序设计4.2二维数组二维数组4.2.2二维数组的基本操作二维数组的基本操作(1)数组的输入、输出数组的输入、输出例例4.5输入两个矩阵输入两个
9、矩阵A、B的值,求的值,求C=A+B。分析分析:(1)A、B矩阵相加,其实质是将两矩阵的对应元素相加。矩阵相加,其实质是将两矩阵的对应元素相加。相加的条件是有相同的行、列数。相加的条件是有相同的行、列数。(2)输入可以通过空格、输入可以通过空格、Tab符和回车符控制;输出内循符和回车符控制;输出内循环不换行,出了内循环输出环不换行,出了内循环输出endl换行。换行。15uangXi University C/C+ C/C+程序设计4.2二维数组二维数组#include iostream.h #include iomanip.h void main() int a23,b23,c23,i,j;
10、for ( i = 0; i2;i+) for( j=0; jaij; for ( i = 0; i2; i+) for( j = 0; jbij; 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; 16uangXi University C/C+ C/C+程序设计4.2二维数组二维数组(2)求二维数组中最大(或最小)元素及下标求二维数组中最大(或最小)元素及下标
11、例例4.6对对33方阵,求最大元素及下标。方阵,求最大元素及下标。与一维数组求最大值的方式相同与一维数组求最大值的方式相同max=a00; imax=0; jmax=0;for ( i = 0; i3; i+) for( j=0; jmax) max=aij; imax=i; jmax=j;17uangXi University C/C+ C/C+程序设计4.2二维数组二维数组(3)矩阵转置矩阵转置:将矩阵以主对角线为轴线,将元素的行和列将矩阵以主对角线为轴线,将元素的行和列位置调换。位置调换。如对如对33方阵转置方阵转置 1 2 3 1 4 7a = 4 5 6 b = 2 5 8 7 8
12、9 3 6 9for ( i = 0; i3; i+) for( j=0; ji; j+) t=aij; aij=aji; aji=t; 18uangXi University C/C+ C/C+程序设计4.2二维数组二维数组4.矩阵相乘矩阵相乘例例4.7求两个矩阵求两个矩阵aMN和和bNP的乘积的乘积c。设矩阵设矩阵A A、B B为:为: 则则矩阵矩阵C C为:为:即即矩矩阵C C的第的第i i行第行第j j列元素可通列元素可通过右边右边公式求得公式求得:c00元素的实现:元素的实现:s=0;for(k=0;k3;k+)s+=a0k*bk0;c00=s;19uangXi University
13、 C/C+ C/C+程序设计4.2二维数组二维数组#includeiostream.h#defineM2#defineN3#defineP4voidmain()intaMN=3,5,7,4,6,8,bNP=1,4,7,10,2,5,8,11,3,6,9,12;intcMP,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;20uangXi University C/C+ C/C+程序设
14、计4.3字符串字符串字符串常量:字符串常量: ab123ab1230系统自动添加系统自动添加 0(结束标志符)(结束标志符)处理字符串的方法理字符串的方法有:有: 字符数字符数组、CStringCString(stringstring)类和字符指和字符指针。 本节只介绍前两种方法,后一种方法我们将在下一节介绍。本节只介绍前两种方法,后一种方法我们将在下一节介绍。21uangXi University C/C+ C/C+程序设计4.3字符串字符串4.3.1字符数组字符数组 (1)字符数组字符数组chars6;-既可以存放若干个字符,也可以存放一个既可以存放若干个字符,也可以存放一个字符串。字符串
15、。chars28;-可以存放一组相关的字符串可以存放一组相关的字符串,按要处理按要处理字符串中最大长度来定义列数。字符串中最大长度来定义列数。字符数组字符数组若干个字符若干个字符字符串字符串abcdabcd0C O B O L 0F O R T R AN 0s0s1si0si722uangXi University C/C+ C/C+程序设计4.3字符串字符串(2)字符数组的初始化字符数组的初始化(a)逐个字符赋初值逐个字符赋初值(b)用字符串为字符数组初始化用字符串为字符数组初始化(c)字符串数组初始化字符串数组初始化对二维数组以字符串形式初始化。对于二维字符数对二维数组以字符串形式初始化。
16、对于二维字符数组,用两个下标表示数组中的一个字符。组,用两个下标表示数组中的一个字符。char s10 = I, , a, m, , f, i, n, e; /s不是字符串不是字符串char s10 = I am fine;char s10 = I am fine;s是字符串,是字符串, 0 系统自动添加系统自动添加char a48=char a48=COBOL,FORTRAN,PASCAL,C/C+;23uangXi University C/C+ C/C+程序设计4.3字符串字符串注意不要出现下面的错误注意不要出现下面的错误: char s10=“This is a book”;/长度超过
17、了长度超过了 char s10; s = “I am fine”;/不能将字符串常量赋给地址不能将字符串常量赋给地址常量常量 char s10; s = I, , a, m, , f, i, n, e;/同样同样不能将一系列字符赋给地址常量不能将一系列字符赋给地址常量 char s34; s7=c;/不能将二维数组当成一维数组访问不能将二维数组当成一维数组访问24uangXi University C/C+ C/C+程序设计4.3字符串字符串(3)字符数组的输入字符数组的输入/输出输出逐个数组元素的输入逐个数组元素的输入/输出输出char s110;for (i = 0; is1i; /s1中
18、是字符,不是字符串中是字符,不是字符串 /C:scanf(“%c”,&s1i) /for (i=0;i10;i+) couts1; cout s1; gets(s1);/C:scanf(%s,s1);scanf(%s,s1); puts(s1);/C:printf(%s,s1);printf(%s,s1); for( int i=0; i2;i+) for( i=0; is1;s1;语句,字符串中不能有空格。这与语句,字符串中不能有空格。这与scanfscanf一样。一样。gets()gets()和和puts()puts()是是对字符串整体输入对字符串整体输入/ /输出输出 ,应加,应加#in
19、clude #include “stdio.hstdio.h”命令。并且允许字符串中的空格,命令。并且允许字符串中的空格,gets()gets()以回车符以回车符rr结结束。束。gets(gets(字符数组名或字符指针变量名字符数组名或字符指针变量名););puts(puts(字符数组名或字符指针变量名字符数组名或字符指针变量名) )。26uangXi University C/C+ C/C+程序设计4.3字符串字符串字符串输入函数字符串输入函数gets()gets() 没有提供限制输入字符串长度的方法,容易引起缓没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机。冲区
20、溢出,给黑客攻击以可乘之机。 对输入字符串长度有限制的函数调用对输入字符串长度有限制的函数调用 fgets(buffgets(buf, , sizeofsizeof ( (bufbuf), ), stdinstdin););对于对于scanfscanf,当用户的输入多于定义时,当用户的输入多于定义时,strstr数组将越界。所以数组将越界。所以scanfscanf被公认被公认为最易遭到黑客攻击的函数之一。为最易遭到黑客攻击的函数之一。getline(cin,strgetline(cin,str, , 定界符定界符););从输入流读入一串字符,直到出现下列情况:从输入流读入一串字符,直到出现下列
21、情况:(1)(1)到达文件尾,这样,输入流的到达文件尾,这样,输入流的edfbitedfbit被设置,调用方法被设置,调用方法file()file()或或eofeof()()都将返回都将返回true;true;(2)(2)遇到分界字符,默认为遇到分界字符,默认为n,n,这种情况下,将把分界字符从输入流中这种情况下,将把分界字符从输入流中删除,而且不存储她;删除,而且不存储她;(3)(3)读取的字符到达最大的允许值,它将设置输入流的读取的字符到达最大的允许值,它将设置输入流的failbitfailbit, ,这意味着这意味着failfail()()方法返回方法返回true; /Attention
22、 !true; /Attention !实际上,实际上,cincin类中也有类中也有getlinegetline、getget成员函数,详细地说明将在成员函数,详细地说明将在I/OI/O流那一流那一章给出。章给出。27uangXi University C/C+ C/C+程序设计4.3字符串字符串(4)字符串处理函数字符串处理函数 在标准在标准C+中使用下面函数时,应加中使用下面函数时,应加#includestring.h命令。命令。a.strlen(str)功能:求功能:求str所指向的字符串长度。不包括字符串结束标志所指向的字符串长度。不包括字符串结束标志0。说明:说明:str可为字符串常
23、量、字符数组名或字符指针。可为字符串常量、字符数组名或字符指针。b.strlwr(str)功能:将字符串中的大写字母转换成小写字母。功能:将字符串中的大写字母转换成小写字母。说明:说明:str为字符字符串常量、数组名或字符指针。为字符字符串常量、数组名或字符指针。c.strupr(str)功能:将字符串中的小写字母转换成大写字母。功能:将字符串中的小写字母转换成大写字母。说明:说明:str为字符字符串常量、数组名或字符指针。为字符字符串常量、数组名或字符指针。28uangXi University C/C+ C/C+程序设计4.3字符串字符串d.strcpy(str1,str2)功能:将功能:
24、将str2所指的字符串复制到所指的字符串复制到str1中。中。说明:说明:str1和和str2为字符数组名或字符指针为字符数组名或字符指针,str2还可以是字符还可以是字符串常量。串常量。str1要有足够大的空要有足够大的空间。间。e.strcat(str1,str2)功能:将功能:将str2字符串内容连接到字符串内容连接到str1字符串内容的后面字符串内容的后面说明:说明:str1要有足够大的空间。要有足够大的空间。例如:例如:chars120=abcd;coutstrcat(s1,kkk)endl;/s1中的内容变为中的内容变为abcdk设:设:char str210= aaa,str11
25、0; strcpy(str1,str2); str1=bb; str1=str2; 29uangXi University C/C+ C/C+程序设计4.3字符串字符串f.strcmp(str1,str2)功能:比较字符串功能:比较字符串str1和和str2的大小。的大小。说明:从左至右逐个字符进行比较说明:从左至右逐个字符进行比较ASCII码值,直到出现不相码值,直到出现不相同字符或遇到同字符或遇到0为止。为止。str1小于小于str2 返回返回-1str1等于等于str2返回返回0str1大于大于str2返回返回1例例4.8字符串处理函数示例字符串处理函数示例strcmp(strcmp(A
26、BCDABCD, ,BDBD; ; / 结果为:结果为:-1 #include stdio.h#include string.hvoid main( ) char s80; while(1) gets(s); if(strcmp(s,pass) puts(Invalid password.n); else break; puts(passn);30uangXi University C/C+ C/C+程序设计4.3字符串字符串4.3.2CString类类( (补充补充) )对字符串的存取及有关操作,在对字符串的存取及有关操作,在VC开发平台下还可通过开发平台下还可通过MFC中的中的CStrin
27、g类。类。(1)定义定义CString类对象类对象CString类的定义在类的定义在“afx.h”头文件中头文件中形式:形式:CString对象名;对象名;CString对象名对象名=字符串常量字符串常量 ;CString对象名对象名(字符串常量字符串常量);CString对象名对象名(字符字符,intn);/重复产生重复产生n个相同的字符个相同的字符如:如:CStrings1=C/C+程序设计程序设计;CStrings(d,5);couts;/s获得字符串获得字符串ddddd/CString类中有多个构造函数类中有多个构造函数(多态多态)31uangXi University C/C+ C/
28、C+程序设计4.3字符串字符串(2)输入输入/输出输出例例4.补补1示例示例#includeiostream.h#includeafx.hvoidmain()charc80;CStringst1;coutc;st1=c;cout输出结果输出结果:;coutst1 、 =、=、!=!=关系运算关系运算st1=ASDFst1st3falsetrue 取取指指定定位位置置的的字字符符 , ,将将 CString CString 对象看成数组对象看成数组st10st10st13st13A/第一个字符位置为第一个字符位置为0F33uangXi University C/C+ C/C+程序设计4.3字符串
29、字符串(4)成员函数成员函数形式:函数值类型形式:函数值类型CString对象对象.成员函数名成员函数名(参数列表参数列表)a.取子串取子串形式:形式:CStringMid(intnFirst,intnCount)/取字符串中取字符串中nFirst位置开始的位置开始的nCount个字符个字符CStringLeft(intnCount)/取字符串的左边取字符串的左边nCount个字符个字符CStringRight(intnCount)/取字符串的右边取字符串的右边nCount个字符个字符有定义:有定义:CString s(12345 );则:则:s.Mid(2,2)的值为的值为34 s.Left
30、(3)的值为的值为12334uangXi University C/C+ C/C+程序设计4.3字符串字符串例例4.补补2 利用利用Left函数,输出如图所示的结果。函数,输出如图所示的结果。分分析析: 确确定定每每行行显显示示字字符符的的起起始始位位,通通过过setw(n)setw(n)显显示示一一个个空空格格的的位位数数来来实实现现,也也可可通通过过产产生生一一个个有有若若干干个个空空格格的的字字符符串串后后left(n) left(n) 显显示示n n个个空空格来实现。格来实现。显示可变的,利用显示可变的,利用left(n)left(n)。如果不利用如果不利用left函数,你如函数,你如
31、何输出如图所示的结果?何输出如图所示的结果? CStringst1(,30);/产生产生30个空个空CStringst2(ABCDEFGHIJKLMNOPQRS);for(inti=1;i=10;i+)coutst1.Left(10-i)st2.Left(2*i-1)endl;35uangXi University C/C+ C/C+程序设计4.3字符串字符串b.查看字符串信息查看字符串信息intFind(TCHARch);/返回指定字符在串中的位置返回指定字符在串中的位置intFind(LPCTSTRlpszSub);/返回指定子字符串在串中的位置返回指定子字符串在串中的位置intGetLe
32、ngth();/返回字符串的字符数返回字符串的字符数有定义:有定义:CString s (ABCDEF); 则:则:s.Find(C)的值为的值为2 s.Find(BCD)的值为的值为1 s.GetLength()的值为的值为636uangXi University C/C+ C/C+程序设计4.3字符串字符串例例4.补补3程序输入程序输入5个单词,显示最长的单词及长度。个单词,显示最长的单词及长度。#include stdio.h“ #include iostream.h“ #include afx.hvoid main() CString st1,maxst; char s80; int
33、maxlen(0),len,i; cout输入入单词 :endl; for(i=1;imaxlen) maxlen=len; /找找最长的单词最长的单词长度长度 maxst=st1; /找找最长的单词最长的单词 coutmaxstmaxlenendl;37uangXi University C/C+ C/C+程序设计4.3字符串字符串c.字符串修改字符串修改voidSetAt(intnIndex,TCHARch)/用字符替换指定位置的字符用字符替换指定位置的字符intInsert(intnIndex,TCHARch)/将字符插入到指定位置前将字符插入到指定位置前intDelete(intnIn
34、dex,intnCount=1)/从指定位置开始删除一个或多个字符从指定位置开始删除一个或多个字符intReplace(TCHARchOld,TCHARchNew)/将新字符替换字符串中的老字符将新字符替换字符串中的老字符intReplace(LPCTSTRlpszOld,LPCTSTRlpszNew)/同上,区别替换的是子字符串同上,区别替换的是子字符串有定义:有定义:CString s (ABCDEF); 则:则:s.SetAt(1, b); couts; /输出输出AbCDEF s.Insert(1, b); couts; / 输出输出AbBCDEF s.Replace(g,k);cou
35、ts; /输出输出ABCDEF s.Replace(BCD,bc); couts; /输出输出AbcEF思考:思考: 如何删如何删除字符串除字符串中任意子中任意子字符串?字符串? 38uangXi University C/C+ C/C+程序设计4.3字符串字符串例例4.补补4对已知输入的字符串,用对已知输入的字符串,用定冠词定冠词替换替换The。#includeiostream.h#includeafx.hvoidmain()CStringst1(TheThereThenTheThara);cout替换前替换前st1=st1endl;st1.Replace(The,定冠词定冠词);cout替
36、换后替换后st1=st1endl;39uangXi University C/C+ C/C+程序设计4.3字符串字符串d.转换字符串转换字符串voidMakeUpper()/将字符串中的所有字符转换成大写将字符串中的所有字符转换成大写voidMakeLower()/将字符串中的所有字符转换成小写将字符串中的所有字符转换成小写voidMakeReverse()/将字符串中各字符的顺序倒转将字符串中各字符的顺序倒转voidEmpty()/将字符串中的所有字符删除将字符串中的所有字符删除有定义:有定义:CString s (ABCabc); 则:则:s. MakeUpper()MakeUpper()
37、; couts; 输出输出:ABCABC s. MakeReverse()MakeReverse(); couts; 输出输出:cbaCBA s. Empty()Empty();couts; 输出输出: (空)(空)40uangXi University C/C+ C/C+程序设计4.3字符串字符串e.格式化输出格式化输出形式:形式:viodFormat(格式字符串,输出参数列表格式字符串,输出参数列表);功能:构造一个输出的字符串功能:构造一个输出的字符串,类似于类似于C中的中的printf。其中:其中:“格式字符串格式字符串”由输出的文字和数据格式说明符组成,文字由输出的文字和数据格式说明
38、符组成,文字可以是直接键入的各种字符,还可以是转义符;数据格式可以是直接键入的各种字符,还可以是转义符;数据格式说明符形式:说明符形式:%输出宽度输出宽度格式字符格式字符-常用格式常用格式d/c/s/f/lf“输出参数列表输出参数列表”表示要输出的数据,其个数与类型必须与表示要输出的数据,其个数与类型必须与格式说明符依次对应。格式说明符依次对应。有定义:有定义:CString s; 则:则:s.Format(a1=%d,a2=%5.2f,a3=%s,123,12.3,abc); couts;输出:输出:a1=123,a2=12.30,a3=abc41uangXi University C/C+
39、 C/C+程序设计4.3字符串字符串例例4.补补5利用利用Format函数显示函数显示10o180o之间每隔之间每隔10o对应对应的弧度、的弧度、sin、cos、平方根和、平方根和e指数的函数值。要求:指数的函数值。要求:除第一项是角度占除第一项是角度占3位整数外,其余各项宽度为位整数外,其余各项宽度为10、小、小数占数占5位。位。#includeiostream.h“#includemath.h#includeafx.hvoidmain()CStrings,sl(-,55);inti;floatx;cout数学函数表数学函数表endl;coutslendl;/显示显示55个个-字符字符cou
40、tixsin(x)cos(x)sqr(i)exp(x)endl;for(i=10;i=180;i=i+10)x=i*3.14259/180;s.Format(%3d%10.5lf%10.5lf%10.5lf%10.5lf%10.5lfn,i,x,sin(x),cos(x),sqrt(x),exp(x);couts;42uangXi University C/C+ C/C+程序设计4.3字符串字符串例例4.补补6使用使用CString类对象数组存放若干个字符串,采用选类对象数组存放若干个字符串,采用选择法排序,实现对字符串数组的排序。择法排序,实现对字符串数组的排序。#includeiostre
41、am.h#includeafx.hvoidmain()CStrings4=Fortran,C/c+,Pascal,VisualBasic,t;inti,j,m;for(i=0;i3;i+)/选择法排序选择法排序m=i;for(j=i+1;j4;j+)if(sjsm)m=j;t=si;si=sm;sm=t;for(i=0;i4;i+)coutisiendl;C/c+FortranPascalVisualBasic43uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组4.4.1指针和一维数组指针和一维数组4.4.2指针和二维数组指针和二维数组4.4.3指针和字
42、符串指针和字符串4.4.4指针的补充说明指针的补充说明指针可以指向基本数据类型变量指针可以指向基本数据类型变量(第二章第二章),也可以指向数组或数组元素。实际上数组名就也可以指向数组或数组元素。实际上数组名就是起始地址。是起始地址。44uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组4.4.1指针和一维数组指针和一维数组设有定义:设有定义:inta6=10,20,30,40,50,60,*p=a;下面是引用数组元素的三种方式。下面是引用数组元素的三种方式。1.下标方式下标方式形式:形式:数组名数组名下标下标2.地址方式地址方式 形式:形式:*(地址常量)
43、(地址常量)3.指针方式指针方式形式:形式:*指针变量名指针变量名假设有定义假设有定义float a10, *p = a;则如下在值上的关系成立:则如下在值上的关系成立:(1) p a &a0(2) p+i &ai(3) *(p+i) *(a+i) ai(4) 指针可以作数组名用指针可以作数组名用 即:即:piai45uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组例例4.9 (1)四种方式输入数据四种方式输入数据设有:设有:int a10; p = a; for(i = 0; iai;则等价于:则等价于:p = a;for (i = 0; i*p+;p
44、 = a;for (i = 0; i*p;p = a;for (i = 0; i*(p+i);/cinpi思考:思考:第三种方法与其它二种区别第三种方法与其它二种区别何在?何在?P指针变量的值不变指针变量的值不变46uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组例例4.9(2)分别用三种方式访问并显示数组中的所有元素。分别用三种方式访问并显示数组中的所有元素。#include“iostream.h”voidmain()inta6=10,20,30,40,50,60,*p=a,i;cout“n下标方式下标方式:”;for(i=0;i6;i+)coutai
45、“”;/coutflush;cout“n地址方式地址方式:”;for(i=0;i6;i+)cout*(a+i)“”;cout“n指针方式指针方式:”;for(i=0;i6;i+)cout*(p+i)“”;coutendl;思考:按思考:按(1)的思路,还可的思路,还可以写成什么形式?以写成什么形式?47uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组分析下列程序分析下列程序,思考思考:数组元素能否正确输出?:数组元素能否正确输出?#include void main( ) int a10, i, *p; p = a; for (i = 0; i*p+;
46、for (i = 0; i10; i+,p+) cout*p;否否48uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组说明说明:(1)三种引用方式比较三种引用方式比较引用方式引用方式数组元素地址数组元素地址数组元素值数组元素值特点特点下标下标&aiai引用速度慢,要先计算地址引用速度慢,要先计算地址a+i的值,指的值,指向该元素后存取,比较直观。向该元素后存取,比较直观。地址地址a+i*(a+i)指针指针p+i*(p+i)指针变量所指地址不变指针变量所指地址不变速度快,不直速度快,不直观。观。p+*p指针变量所指地址改变指针变量所指地址改变(2)p与与a
47、的区别的区别:p是地址变量,而是地址变量,而a是地址常量。是地址常量。 p+ 、p- 、p=p+2 a+、a=a+249uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组(3)*p+与与(*p)+区别区别:*p+的的+运算符作用于指针变量运算符作用于指针变量;(*p)+的的+运算符作用于指针变量所指对象。运算符作用于指针变量所指对象。cout*p+;/输出?输出?cout*p;/输出?输出?cout(*p)+;/输出?输出?cout*p;/输出?输出?Thefisrt:TheSecond:30403031设有定义:设有定义:inta6=10,20,30,4
48、0,50,60,*p=a+2;分别执行下面两段代码分别执行下面两段代码,思考每行代码的输出:思考每行代码的输出:50uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组4.4.2指针和二维数组指针和二维数组(若干个一维数组组成若干个一维数组组成)定义二维数组:定义二维数组:intanm;则则a 代表二维数组的首地址,第代表二维数组的首地址,第0行的地址行的地址a+i 代表第代表第i行的地址行的地址*(a+i) 即即 ai 代表第代表第i行第行第0列的地址列的地址*(a+i)+j 即即 ai+j 代表第代表第i行第行第j列的地址列的地址*(*(a+i)+j )
49、 即即 aij 代表第代表第i行第行第j列的元素列的元素元素元素元素元素aijaij的地址的几种等价的引用方式的地址的几种等价的引用方式的地址的几种等价的引用方式的地址的几种等价的引用方式&a&aijijai+jai+j *(a+i)+j*(a+i)+j &(*(a+i)j&(*(a+i)j元素元素元素元素aijaij的几种等价的引用方式的几种等价的引用方式的几种等价的引用方式的几种等价的引用方式aijaij*(ai+j)*(ai+j) *(*(a+i)+j)*(*(a+i)+j) (*(a+i)j(*(a+i)j51uangXi University C/C+ C/C+程序设计4.4指针与数
50、组指针与数组如设有定义如设有定义: int a23; int a23; 数组名数组名a可以解释为指向可以解释为指向int类型的类型的二级指针常量二级指针常量;a可以看可以看成是由两个元素成是由两个元素a0、a1构成的一维数组。构成的一维数组。a0可以看成是由可以看成是由a00、a01、a023个整型变量组个整型变量组成的一维数组,可将成的一维数组,可将a0解释为指向解释为指向int类型的类型的一级指针常量一级指针常量;a1具有具有a0相同的性质。相同的性质。指针方式引用二维数组元素的两种方式:指针方式引用二维数组元素的两种方式:指针变量引用数组指针变量引用数组元素、指针数组元素引用数组元素元素
51、、指针数组元素引用数组元素。52uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组(1)(1)指针变量引用数组元素指针变量引用数组元素 a.采用列指针采用列指针(一级指针一级指针)设有定义:设有定义:int a23,*p=a0;int a23,*p=a0; /或用或用p=*a初始化初始化通过通过p p指指针显示二示二维数数组的各元素:的各元素:for(i=0;i6;p+,i+)for(i=0;i6;p+,i+) cout*p ; cout*p ; if(i%3=0)coutendl; if(i%3=0)coutendl; 注意:注意:在在C+C+中二级指针
52、地址中二级指针地址不能赋值给一级指针变量不能赋值给一级指针变量:如:如:int a23,int a23,*p=a*p=a; ;在标准在标准C C中是允许的,但在中是允许的,但在C+C+中就不允许中就不允许。p+153uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组b.采用行指针采用行指针(二级指针二级指针)-数组指针数组指针设有定义:设有定义:inta23,(*p)3=a;/或或p=a初始化初始化;通过通过p指针显示二维数组的各元素:指针显示二维数组的各元素:p+1for(inti=0;i2;i+)for(inti=0;i2;i+)for(intj=0;
53、j3;j+)for(intj=0;j3;j+)cout(*p)j;cout(*p)j;p+;p+;coutendl;coutendl; p等效于二维数组名等效于二维数组名a,但没有指出其边界,即第一维的,但没有指出其边界,即第一维的元素数量,但是它的较低维数的元素数量必须要指定。元素数量,但是它的较低维数的元素数量必须要指定。for(inti=0;i2;i+)for(intj=0;j3;j+)cout*(*p)+j);p+;coutendl;54uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组(2)(2)指针数组引用数组元素指针数组引用数组元素 指针数组
54、的形式:指针数组的形式:数据类型数据类型 *标识符标识符整型常量表达式整型常量表达式;即:即:数组中每个元素是指针数组中每个元素是指针。 设有定义:设有定义: int a23,*p2 =a0,a1; 要引用要引用aijaij元素,可用指针数组表示如下:元素,可用指针数组表示如下: *(pi+j) *(pi+j) 或或 *(*(p+i)+j)*(*(p+i)+j)注意:注意:指指针数数组名名p p与与二维二维数数组名名a a都是二级指针的概念,都是二级指针的概念,区区别在于:在于: aiai是地址常量,是地址常量,pipi是地址是地址变量。量。55uangXi University C/C+ C
55、/C+程序设计4.4指针与数组指针与数组例例4.10数组指针与指针数组示例数组指针与指针数组示例#include iostream.hvoid main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j;/列指针示例int *p=a0;for(i=0;i12;p+,i+) cout*p ; if(i+1)%4=0) coutendl; coutendl;/数组指针(二级指针-行指针)示例int (*p0)4=a; /的优先级高于*, p0是一个指针变量/第一种方式输出for(i=0;i12;i+) cout(*p0)i ; if(i+1)%4=0) cou
56、tendl; coutendl;/第二种方式输出for(i=0;i3;i+)for (j=0;j4;j+) cout*(*p0)+j) ; p0+; coutendl;coutendl; /第三种方式输出p0=a;/重新指向afor(i=0;i3;i+)for (j=0;j4;j+) cout(*p0)j ; p0+; coutendl; coutendl; /第四种方式输出p0=a; /重新指向afor(i=0;i3;i+)for (j=0;j4;j+) coutp0ij ; coutendl; coutendl;/指针数组示例 /对一维数组int c4=1,2,3,4;int *p14=&
57、c0,&c1,&c2,&c3; /p1是四个指针,这四个指针组成一个数组for(int k=0;k4;k+) cout*p1kendl; coutendl; /对二维数组int b23=1,2,3,4,5,6,*p22=b0,b1,kk,jj;for(kk=0;kk2;kk+)for(jj=0;jj3;jj+)cout*(p2kk+jj) ;coutendl;couts; gets(s); p=china; /指向字符串常量的首地址 p=new char6; 或 p=s; /应使字符指针有确定指向后才能从键盘进行输入操作 cinp; 或 gets(p);运算字符数组名s不能进行自增或自减运算
58、p是指针变量,可以进行自增或自减运算 57uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组例例4.114.11输输入入一一串串字字符符存存储储在在字字符符数数组组中中,用用指指针针方方式式逐逐一一显显示示字字符符,并求其长度。并求其长度。#include iostream.h#include stdio.hvoid main() char s80,*p; gets(s); p=s; /p指向数指向数组的第一个元素的第一个元素 cout输出每个字符:出每个字符:; while(*p!=0) cout*p+ ; /指指针下移,直到下移,直到p指向字符串指向字
59、符串结束符束符 coutn 字符串字符串长度度 : p-sendl; 58uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组(2)(2)字符指针数组字符指针数组, ,常用于处理若干字符串。常用于处理若干字符串。设有定义:设有定义:char *bookchar *book=Fortran, C/c+, Pascal, Visual Basic; 按字符串的实际长度存储,以按字符串的实际长度存储,以00表示每个字符串的结束。表示每个字符串的结束。 采用采用交换指针值交换指针值的方法改变指针的指向。的方法改变指针的指向。即:即:数组数组bookbook中每个元素
60、是指向字符串的指针中每个元素是指向字符串的指针。 59uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组例例4.12 4.12 对对4 4个字符串,按字典顺序将它们排序输出。个字符串,按字典顺序将它们排序输出。#include iostream.h#include string.hvoid main() char *book=Fortran,C/c+,Pascal,Basic,*p; int i,j,k; for(i=0;i3;i+) k=i; for(j=i+1;j0) k=j; if(i!=k) p=booki;booki=bookk; bookk=p
61、; for(i=0;i4;i+)coutbookiendl;注意元素的比注意元素的比较较60uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组4.4.4指针的补充说明指针的补充说明指针学习不好关键是概念不清造成的,说的指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的。学习饶口令不多看多学多练是不行的。学习原则学习原则一定要学会其实通常的应用很简单,与使用变量几乎无异仔细琢磨使用原则使用原则永远要清楚每个指针指向了哪里永远要清楚指针指向的位置是什么我们还
62、是给几个例子来说明。我们还是给几个例子来说明。61uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组例:用变量例:用变量a给出下面的定义给出下面的定义一个整型数一个整型数一个指向整型数的指针一个指向整型数的指针一个指向指针的指针,它指向的指针是指向一个一个指向指针的指针,它指向的指针是指向一个整型数整型数一个有一个有10个整型数的数组个整型数的数组一个有一个有10个指针的数组,该指针是指向一个整型个指针的数组,该指针是指向一个整型数的数的一个指向有一个指向有10个整型数数组的指针个整型数数组的指针a)inta;b)int*a;c)int*a;d)inta1
63、0;e)int*a10;f)int(*a)10;62uangXi University C/C+ C/C+程序设计4.4指针与数组指针与数组例:分析下面程序的功能例:分析下面程序的功能#includemain()inta,b;int*point_1,*point_2,*temp_point;scanf(%d,%d,&a,&b);point_1=&a;point_2=&b;if(ab)temp_point=point_1;point_1=point_2;point_2=temp_point;printf(%d,%d,*point_1,*point_2);此题并没有改变变量此题并没有改变变量a,b
64、的值,利用指针的值,利用指针变量分别存储变量分别存储a和和b的的地址地址,然后若然后若ab,把,把那两个指针变量的值那两个指针变量的值对换一下,再利用对换一下,再利用*point_1和和*point_2的方式把调换后的值的方式把调换后的值显示出来。利用指针显示出来。利用指针进行地址交换达到大进行地址交换达到大小排序的目的小排序的目的.63uangXi University C/C+ C/C+程序设计4.5动态数组动态数组在在和和中均定义了下面中均定义了下面的函数的函数void* malloc(unsigned int size);向系统申请大小为size的内存块,把首地址返回。如果申请不成功,
65、返回NULLvoid *calloc(unsigned int num, unsigned int size);向系统申请num个size大小的内存块,把首地址返回。如果申请不成功,返回NULLvoid free(void* p);释放由malloc()和calloc()申请的内存块。p是指向此块的指针64uangXi University C/C+ C/C+程序设计4.5动态数组动态数组一维动态数组一维动态数组#include main()int *p = NULL, n, i, sum;printf(Please enter array size:);scanf(%d, &n); p =
66、(int *) malloc(n * sizeof (int); if (p = NULL) printf(No enough memory!n); exit(0); printf(Please enter the score:);for (i=0; in; i+) scanf(%d, p + i); sum = 0; for (i=0; in; i+) sum = sum + *(p + i); printf(aver = %dn, sum/n); free(p); 65uangXi University C/C+ C/C+程序设计4.5动态数组动态数组二维动态数组二维动态数组#includ
67、e main()int *pScore = NULL, i, j, m, n, maxScore, row, col; printf(Please enter array size m,n:);scanf(%d,%d, &m, &n); pScore = (int *) calloc(m*n, sizeof (int); if (p = NULL) printf(No enough memory!n); exit(0); printf(Please enter the score:);for (i=0; im; i+)for (j = 0; jn; j+) scanf(%d, &pScore
68、i*n+j); maxScore = FindMax(pScore, 3, 4, &row, &col); printf(maxScore = %d, class = %d, number = %dn, maxScore, row+1, col+1); free(pScore); 66uangXi University C/C+ C/C+程序设计 1 4 7 10 13 16 19 22 25 14 k x 4.6应用举例应用举例1.1.插入数据插入数据基本思想:基本思想: 1 1)首先要查找待插入数据在数组中的位置)首先要查找待插入数据在数组中的位置k k;2 2)然然后后从从最最后后一一个
69、个元元素素开开始始往往前前直直到到下下标标为为k k的的元元素素依依次次往往后后移移动动一个位置;一个位置;3) 3) 第第k k个元素的位置空出,将欲插入的数据插入。个元素的位置空出,将欲插入的数据插入。例例4.13 在有序数组在有序数组a中插入数值中插入数值x for(k=0;k9;k+) if (x=k;i-) ai + 1 = ai; /从最后元素开始往后移,从最后元素开始往后移,腾出位置出位置 ak = x;67uangXi University C/C+ C/C+程序设计4.5应用举例应用举例 删除操作首先也是要找到欲删除的元素的位置删除操作首先也是要找到欲删除的元素的位置k k;
70、然后从;然后从k+1k+1到到n n个位置开始向前移动;最后将数组元素减个位置开始向前移动;最后将数组元素减1 1。 例例4.14 4.14 从数组中删除某数。从数组中删除某数。for(i=0;i10;i+) if(key=ai)break;for(j=i;jamidxamid,则继续查找的范找的范围应为amidamid后面的元素,修改后面的元素,修改查找区找区间的下界的下界low = mid+1low = mid+1;若;若xamidxhighlowhigh无无查找区域,找不到。找区域,找不到。69uangXi University C/C+ C/C+程序设计4.5应用举例应用举例70uan
71、gXi University C/C+ C/C+程序设计4.5应用举例应用举例其中,第其中,第3 3步可用如下程序段步可用如下程序段实现:if (x=amid)if (x=amid) break; break;else if (xamid)else if (xamid) low=mid+1; low=mid+1;elseelse high=mid-1; high=mid-1;请编出完整的程序。请编出完整的程序。71uangXi University C/C+ C/C+程序设计4.5应用举例应用举例4. 分类统计分类统计 例例4.15 统计一串字符中各字母出现的次数统计一串字符中各字母出现的次数
72、(大小写字母不区分大小写字母不区分),并,并对出现的字母显示其出现的个数和总字母数。对出现的字母显示其出现的个数和总字母数。 分析分析: 声声明明一一个个具具有有2626个个元元素素的的数数组组,每每个个元元素素的的下下标标表表示示对对应应的的字字母,元素的值表示对应字母出现的次数。母,元素的值表示对应字母出现的次数。 从从输输入入的的字字符符串串中中逐逐一一取取出出字字符符,转转换换成成大大写写字字符符( (使使得得大大小小写写不区分不区分) ),进行判断。,进行判断。72uangXi University C/C+ C/C+程序设计4.5应用举例应用举例#includeiostream.h
73、“#includestdio.h“#includeafx.hvoidmain()CStringst1;chars256,c;inta26=0,i,j,le,sumc(0);gets(s);st1=s;le=st1.GetLength();/求字符串的长度求字符串的长度st1.MakeUpper();/转换成大写转换成大写for(i=0;i=A&c=Z)j=c-A;aj+;for(j=0;j=25;j+)/输出字母及其出现的次数输出字母及其出现的次数if(aj)sumc=sumc+aj;st1.Format(%c=%d,j+65,aj);coutst1;cout共有共有sumc个字母个字母mr;while(m0|r16);while(m!=0)mr0=m%r;/取余数取余数if(mr09)c=mr0-10+A;elsec=mr0+0;s=c+s;m=m/r;cout结果为结果为sendl;75uangXi University C/C+ C/C+程序设计小结小结回忆一下,本章你学习了些什么?回忆一下,本章你学习了些什么?回忆一下,本章你学习了些什么?回忆一下,本章你学习了些什么?回忆一下,本章你学习了些什么?回忆一下,本章你学习了些什么?76uangXi University