• 1.06 MB
  • 2022-04-29 14:25:17 发布

最新四章数组与指针ppt课件PPT课件

  • 77页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'四章数组与指针ppt课件 第4章数组与指针及其应用4.1一维数组4.2二维数组4.3字符串4.4指针和数组4.5动态数组4.6程序举例数组用于保存大量同类型的相关数据,如矩阵运算,表格数据等。2GuangXiUniversity 4.1一维数组求数组中的最大元素----max=a[0];//假设第一个元素值最大for(j=1;jmax)max=a[j];求最大元素下标----imax=0;//imax代表最大元素下标for(j=1;ja[imax])imax=j;将最大元素放于某一特定位置(如放在最前头)----imax=0;for(j=1;ja[imax])imax=j;if(imax!=0){t=a[0];a[0]=a[imax];a[imax]=t;}9GuangXiUniversity 4.1一维数组4.1.4数组排序排序是将一组数按递增或递减的次序排列,如按学生的成绩、球赛积分等排序。常用的算法有:选择法(√)冒泡法(√)插入法快速排序法…...10GuangXiUniversity 4.1一维数组(1)选择法排序----基本思想:(a)从n个数的序列中选出最小的数(递增),与第1个数交换位置;(b)除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(c)重复(1)n-1遍,最后构成递增序列。例4.3对存放在数组中的6个数,用选择法按递增排序。下标01~512~523~534~545for(i=0;i<5;i++){min=i;for(j=i+1;j<6;j++)if(a[j]a[j]){temp=a[j-1];a[j-1]=a[j];a[j]=temp;}思考:当数据未交换,说明数组已有序,如何结束排序?12GuangXiUniversity 4.2二维数组4.2.1二维数组的定义和初始化(1)数组的定义形式:数据类型数组名[常量表达式1][常量表达式2]; 如:floata[2][3];a[0][0] a[0][1] a[0][2]a[1][0] a[1][1] a[1][2]以“先行后列”的规则连续存放:序号=当前行号*每行列数+当前列号序号:01234513GuangXiUniversity 4.2二维数组(2)数组的初始化(a)按在内存排列顺序对所有元素赋初值。(b)按行给所有元素赋初值,每一行的数据放于一个花括号内。(c)按行给部分元素赋初值,省略的元素初值此时自动为0。对应的数组b为:(d)按行赋初值也可省略第一维的长度。对应的数组c为:inta[2][3]={1,2,3,4,5,6};或inta[][3]={1,2,3,4,5,6};inta[2][3]={{1,2,3},{4,5,6}};intb[3][4]={{1,2},{0,3,4},{0,0,5}};intc[][3]={{1},{0},{2}};14GuangXiUniversity 4.2二维数组4.2.2二维数组的基本操作(1)数组的输入、输出例4.5输入两个矩阵A、B的值,求C=A+B。分析:(1)A、B矩阵相加,其实质是将两矩阵的对应元素相加。相加的条件是有相同的行、列数。(2)输入可以通过空格、Tab符和回车符控制;输出内循环不换行,出了内循环输出endl换行。15GuangXiUniversity 4.2二维数组#include"iostream.h"#include"iomanip.h"voidmain(){inta[2][3],b[2][3],c[2][3],i,j;for(i=0;i<2;i++)for(j=0;j<3;j++)cin>>a[i][j];for(i=0;i<2;i++)for(j=0;j<3;j++)cin>>b[i][j];for(i=0;i<2;i++)//A+B矩阵,每个对应元素相加for(j=0;j<3;j++)c[i][j]=a[i][j]+b[i][j];for(i=0;i<2;i++){for(j=0;j<3;j++)cout<max){max=a[i][j];imax=i;jmax=j;}17GuangXiUniversity 4.2二维数组(3)矩阵转置:将矩阵以主对角线为轴线,将元素的行和列位置调换。如对3×3方阵转置123147a=456b=258789369for(i=0;i<3;i++)for(j=0;j>s1[i];//s1中是字符,不是字符串//C:scanf(“%c”,&s1[i])//for(i=0;i<10;i++)cout<>s1;•cout<>s1;语句,字符串中不能有空格。这与scanf一样。gets()和puts()是对字符串整体输入/输出,应加#include“stdio.h”命令。并且允许字符串中的空格,gets()以回车符‘r’结束。gets(字符数组名或字符指针变量名);puts(字符数组名或字符指针变量名)。26GuangXiUniversity 4.3字符串字符串输入函数gets()没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机。对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);对于scanf,当用户的输入多于定义时,str数组将越界。所以scanf被公认为最易遭到黑客攻击的函数之一。getline(cin,str,[定界符]);从输入流读入一串字符,直到出现下列情况:(1)到达文件尾,这样,输入流的edfbit被设置,调用方法file()或eof()都将返回true; (2)遇到分界字符,默认为‘n’,这种情况下,将把分界字符从输入流中删除,而且不存储她;(3)读取的字符到达最大的允许值,它将设置输入流的failbit,这意味着fail()方法返回true;//Attention!!!实际上,cin类中也有getline、get成员函数,详细地说明将在I/O流那一章给出。27GuangXiUniversity 4.3字符串(4)字符串处理函数在标准C++中使用下面函数时,应加#include"string.h"命令。a.strlen(str)功能:求str所指向的字符串长度。不包括字符串结束标志""。说明:str可为字符串常量、字符数组名或字符指针。b.strlwr(str)功能:将字符串中的大写字母转换成小写字母。说明:str为字符字符串常量、数组名或字符指针。c.strupr(str)功能:将字符串中的小写字母转换成大写字母。说明:str为字符字符串常量、数组名或字符指针。28GuangXiUniversity 4.3字符串d.strcpy(str1,str2)功能:将str2所指的字符串复制到str1中。说明:str1和str2为字符数组名或字符指针,str2还可以是字符串常量。str1要有足够大的空间。e.strcat(str1,str2)功能:将str2字符串内容连接到str1字符串内容的后面说明:str1要有足够大的空间。例如:chars1[20]="abcd";cout<>c;st1=c;cout<<"输出结果:";cout<、<、==>=、<=、!=关系运算st1=="ASDF"st1maxlen){maxlen=len;//找最长的单词长度maxst=st1;//找最长的单词}}cout<a<=>&a[0](2)p+i<=>&a[i](3)*(p+i)<=>*(a+i)<=>a[i]指针可以作数组名用即:p[i]<=>a[i]45GuangXiUniversity 4.4指针与数组例4.9(1)四种方式输入数据设有:inta[10];p=a;for(i=0;i<10;i++)cin>>a[i];则等价于:p=a;for(i=0;i<10;i++)cin>>*p++;p=a;for(i=0;i<10;i++,p++)cin>>*p;p=a;for(i=0;i<10;i++)cin>>*(p+i);//cin>>p[i]思考:第三种方法与其它二种区别何在?P指针变量的值不变46GuangXiUniversity 4.4指针与数组例4.9(2)分别用三种方式访问并显示数组中的所有元素。#include“iostream.h”voidmain(){inta[6]={10,20,30,40,50,60},*p=a,i;cout<<“n下标方式:”;for(i=0;i<6;i++)cout<voidmain(){inta[10],i,*p;p=a;for(i=0;i<10;i++)cin>>*p++;;for(i=0;i<10;i++,p++)cout<<*p;}否48GuangXiUniversity 4.4指针与数组说明:(1)三种引用方式比较引用方式数组元素地址数组元素值特点下标&a[i]a[i]引用速度慢,要先计算地址a+i的值,指向该元素后存取,比较直观。地址a+i*(a+i)指针p+i*(p++i)指针变量所指地址不变速度快,不直观。p++*p指针变量所指地址改变(2)p与a的区别:p是地址变量,而a是地址常量。p++、p--、p=p+2a++、a=a+249GuangXiUniversity 4.4指针与数组(3)*p++与(*p)++区别:*p++的++运算符作用于指针变量;(*p)++的++运算符作用于指针变量所指对象。cout<<*p++;//输出?cout<<*p;//输出?cout<<(*p)++;//输出?cout<<*p;//输出?Thefisrt:TheSecond:30403031设有定义:inta[6]={10,20,30,40,50,60},*p=a+2;分别执行下面两段代码,思考每行代码的输出:50GuangXiUniversity 4.4指针与数组4.4.2指针和二维数组(若干个一维数组组成)定义二维数组:inta[n][m];则a代表二维数组的首地址,第0行的地址a+i代表第i行的地址*(a+i)即a[i]代表第i行第0列的地址*(a+i)+j即a[i]+j代表第i行第j列的地址*(*(a+i)+j)即a[i][j]代表第i行第j列的元素元素a[i][j]的地址的几种等价的引用方式&a[i][j]a[i]+j*(a+i)+j&(*(a+i))[j]元素a[i][j]的几种等价的引用方式a[i][j]*(a[i]+j)*(*(a+i)+j)(*(a+i))[j]51GuangXiUniversity 4.4指针与数组如设有定义:inta[2][3];数组名a可以解释为指向int类型的二级指针常量;a可以看成是由两个元素a[0]、a[1]构成的一维数组。a[0]可以看成是由a[0][0]、a[0][1]、a[0][2]3个整型变量组成的一维数组,可将a[0]解释为指向int类型的一级指针常量;a[1]具有a[0]相同的性质。指针方式引用二维数组元素的两种方式:指针变量引用数组元素、指针数组元素引用数组元素。52GuangXiUniversity 4.4指针与数组(1)指针变量引用数组元素a.采用列指针(一级指针)设有定义:inta[2][3],*p=a[0];//或用p=*a初始化通过p指针显示二维数组的各元素:for(i=0;i<6;p++,i++){cout<<*p<<"";if(i%3==0)cout<>s;gets(s);p="china";//指向字符串常量的首地址p=newchar[6];或p=s;//应使字符指针有确定指向后才能从键盘进行输入操作cin>>p;或gets(p);运算字符数组名s不能进行自增或自减运算p是指针变量,可以进行自增或自减运算57GuangXiUniversity 4.4指针与数组例4.11输入一串字符存储在字符数组中,用指针方式逐一显示字符,并求其长度。#include"iostream.h"#include"stdio.h"voidmain(){chars[80],*p;gets(s);p=s;//p指向数组的第一个元素cout<<"输出每个字符:";while(*p!="")cout<<*p++<<"";//指针下移,直到p指向字符串结束符cout<<"n字符串长度:"<0)k=j;if(i!=k){p=book[i];book[i]=book[k];book[k]=p;}}for(i=0;i<4;i++)cout<   main(){   int a,b;  int *point_1,*point_2,*temp_point;  scanf("%d,%d",&a,&b);point_1=&a;point_2=&b; if (a中均定义了下面的函数void*malloc(unsignedintsize);向系统申请大小为size的内存块,把首地址返回。如果申请不成功,返回NULLvoid*calloc(unsignedintnum,unsignedintsize);向系统申请num个size大小的内存块,把首地址返回。如果申请不成功,返回NULLvoidfree(void*p);释放由malloc()和calloc()申请的内存块。p是指向此块的指针64GuangXiUniversity 4.5动态数组一维动态数组#includemain(){int*p=NULL,n,i,sum;printf("Pleaseenterarraysize:");scanf("%d",&n);p=(int*)malloc(n*sizeof(int));if(p==NULL){printf("Noenoughmemory!n");exit(0);}printf("Pleaseenterthescore:");for(i=0;imain(){int*pScore=NULL,i,j,m,n,maxScore,row,col;printf("Pleaseenterarraysizem,n:");scanf("%d,%d",&m,&n);pScore=(int*)calloc(m*n,sizeof(int));if(p==NULL){printf("Noenoughmemory!n");exit(0);}printf("Pleaseenterthescore:");for(i=0;i=k;i--)a[i+1]=a[i];//从最后元素开始往后移,腾出位置a[k]=x;67GuangXiUniversity 4.5应用举例删除操作首先也是要找到欲删除的元素的位置k;然后从k+1到n个位置开始向前移动;最后将数组元素减1。例4.14从数组中删除某数。for(i=0;i<10;i++)if(key==a[i])break;for(j=i;j<10;j++)a[j]=a[j+1];2.删除数据68GuangXiUniversity 4.5应用举例3.二分法查找分析:二分法查找只适合于在已排好序的数组中进行。设a[low]和a[high]是有序数组中最小和最大元素,待查找的数为x。算法描述如下:①开始假设待查区间的下界low为0,上界high为N-1。②求待查区间中间元素的下标mid=(low+high)/2,x和a[mid]比较。③若x==a[mid],则查找完毕,结束程序;若x>a[mid],则继续查找的范围应为a[mid]后面的元素,修改查找区间的下界low=mid+1;若xhigh无查找区域,找不到。69GuangXiUniversity 4.5应用举例70GuangXiUniversity 4.5应用举例其中,第3步可用如下程序段实现:if(x==a[mid])break;elseif(x>a[mid])low=mid+1;elsehigh=mid-1;请编出完整的程序。71GuangXiUniversity 4.5应用举例4.分类统计例4.15统计一串字符中各字母出现的次数(大小写字母不区分),并对出现的字母显示其出现的个数和总字母数。分析:①声明一个具有26个元素的数组,每个元素的下标表示对应的字母,元素的值表示对应字母出现的次数。②从输入的字符串中逐一取出字符,转换成大写字符(使得大小写不区分),进行判断。72GuangXiUniversity 4.5应用举例#include"iostream.h“#include"stdio.h“#include"afx.h"voidmain(){CStringst1;chars[256],c;inta[26]={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";a[j]++;}}for(j=0;j<=25;j++)//"输出字母及其出现的次数if(a[j]){sumc=sumc+a[j];st1.Format("%c=%d",j+65,a[j]);cout<>m>>r;}while(m<0||r<2||r>16);while(m!=0){mr0=m%r;//取余数if(mr0>9)c=mr0-10+"A";elsec=mr0+"0";s=c+s;m=m/r;}cout<<"结果为"<