《《世界头号毒王》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《世界头号毒王》PPT课件.ppt(42页珍藏版)》请在三一办公上搜索。
1、第四章第一部分 数组,一维数组二维数组数组作为函数参数字符数组 字符串程序举例,数组是一种数据类型,数组是一种数据类型,数据类型都是用来描述数据的,那么数组是用来描述那一种数据类型?1:数组 适合描述一组按序排列的同类型数据【基本数据类型和构造数据类型】的集合2:按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别的数组,从键盘接收10个数,求平均数,并输出小于平均数的数,while(idata;s=s+data;avg=s/10.0;,输入的数据 都被覆盖了!,5:字符串的存储 和 字符串的系统函数的使用方法,1:一维数组、二维数组的定义,2:数组元素的初始化和
2、引用,4:字符数组的定义、初始化和引用,变量的定义,变量的初始化和引用,3:基本类型数组的存储,变量的存储,1 一维数组,一维数组的定义 数据类型 数组名整型常量;例如:int a5;float a5;char a5A 一维整型数组;B 数组名为a;C 5个数组元素 a0、a1、a2、a3、a4,定义可存储数组的数据类型,数组名和变量名定义规则相同,表示数组存储的数据元素个数。也可以看作数组的长度,#define N 5main()int n=5;int a N,b 5,c n,d5.0;int a=1,2,3,4,5;.,数组的大小在定义时就要确定,而且不可变动,C语言不允许定义动态数组,即
3、数组的长度不能依赖于程序运行过程中变化着的量,下面这种数组定义方式是不允许的。,一维数组的引用【使用】,数组必须先定义,然后使用。1:数组元素要一个一个的引用 数组名下标2:不能引用超出数组长度的部分,大家可以试试用小数作为下标和引用大于数组长度的部分,main()int a10;int i;for(i=0;i10;i+)ai=i+2;couta2endla5endl;,一维数组的初始化,变量的初始化:1 赋值方式int i;i=0;2 输入语句cinI;3 定义时赋初值int i=0;,一维数组的初始化:1 赋值方式int i5;i0=0;i1=10;i4=40;2 输入语句cini0,/*
4、inital array 1*/for(i=0;i5;i+)ai=i+9;couti aiendl;,/*inital array 2*/for(i=0;iai;coutiaiendl;,都是对于数组元素的操作,Example,可以用赋值语句或输入语句使数组中的元素得到值,但占运行时间,同时也可以使数组在程序运行之前初始化,即在编译期间使之得到初值。,1:在定义数组时对数组元素赋以初值,如:int s5=78,87,77,91,60;int s5=1,2,3,4,5,6;2:给一部分元素赋值。例如:int s5=78,87,77;其结果是:s0=78,s1=87,s2=77,s3=0,s4=0
5、,即花括号内的值只赋给了数组的前几个元素,后几个元素的值为0。3:对全部数组元素赋初值时,可不指定数组长度。例如:int s5=1,2,3,4,5;int s=1,2,3,4,5;,编译时,可以根据元素个数确定数组长度,从键盘输入15个整数,并检查整数10是否包含在 这些数据中,若是的话,它是第几个被输入的。,Void main()int i,flag,data15;flag=0;coutdatai;for(i=0;i15;i+)if(datai=10)cout10 is inputed in the position“i+1endl;flag=1;break;/*标记10在输入数据中*/if
6、(flag=0)cout10 is not in numbers“endl;,Example,Void main()int i;int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0)coutendl;coutsetw(6)fi;,构造Fibonacci数列前20项,生成20个Fibonacci元素,每5个元素换行打印,for(i=1;i=20;i+)coutsetw(6)fi-1;if(i%5=0)coutendl;,将10个整数从大到小排序,Void main()int a10=7,15,4,12,9,3,11,0,2
7、4,6;int i,j,temp,n;for(i=0;i=9;i+)for(j=i+1;j=9;j+)if(aiaj)temp=ai;ai=aj;aj=temp;for(i=0;i10;i+)coutsetw(3)ai;coutendl;,Example,取一个数和它后面的所有数比较,7,15,4,12,9,3,11,0,24,615,7,4,12,9,3,11,0,24,624,7,4,12,9,3,11,0,15,6 7,4,12,9,3,11,0,15,6 12,4,7,9,3,11,0,15,6 15,4,7,9,3,11,0,12,6,2 二维数组(处理表格数据),二维数组的定义数据
8、类型 数组名整型常量1整型常量2;,例如:int a23 2行3列;共有6个元素,a0 a00 a01 a02 a1 a10 a11 a12,说明:可以把二维数组看作是一种特殊的一维数组。,二维数组在内存中按行存放,二维数组元素的引用数组元素要一个一个的引用,不能引用超出数组长度的部分,数组名下标下标,二维数组的应用之一是矩阵和行列式。其中,左起第一个下标表示行数,第二个下标表示列数。,s23,aij 不能写成s2,1+3,ai,j,Void main()int i,j,a23;for(i=0;i2;i+)for(j=0;j3;j+)aij=i*3+j*2;cout2 row 1 column
9、 data:“a10;,二维数组的初始化,1:对二维数组元素赋初值,可以用分行赋值的方法,例如:int a32=1,2,3,4,5,6;其中内 代表一行元素的初值。经过如此的初始化后,每个数组元素分别被赋以如下各值:a00=1,a01=2,a10=3,a11=4,a20=5,a21=6,1 23 45 6,考虑:int a23的初始化?,1,2,3,4,5,6,1 2 34 5 6,int a23=1,2,3,4,5,6;?,2:为数组的部分元素赋值 int a32=1,2,3,4;a00=1,a10=2,a11=3,a20=4其余元素为0。3:将所有数据写在一个花括号内,按顺序对各元素赋初值
10、。int a32=1,2,3,4;a00=1,a01=2,a10=3,a11=4 其余元素为0。4:若对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但对第二维的长度不能省。int a 2=1,2,3,4,5,6;,会读即可,数组名下标1下标2,现实当中有很多数据可以二维数组的类型描述:1:当用这个数组来描述一个二维表格时 下标1 表示行数 下标2 表示列数2:当用这个数组来描述矩阵时,下标1 表示行数 下标2 表示列数,1 2 3 43 4 5 6,a32,a24,定义一个二维数组:aNMN 可以表示这个二维数组有 N个一维数组构成;M 可以表示构成这个二维数组的N个一维数组包含M
11、个元素;所以:aNM 又可以被看作 由N个 长度为M的一维数组构成,多维数组定义方式与二维数组类似 int x342;float y423;,int a2,a22,a222,从键盘为一个NN的整型数组输入数据,并将每一行的最小值显示出来,aNN minN,请大家看一下,N*N和每一行的最小值分别适合用那种数据类型来描述,请大家看一下,转制过程需要用那种基本程序结构描述?,循环结构中的【嵌套循环】循环条件是处理完所有行和列循环体是生成随机数,放入对应的数组元素中,获取最小值,生成随机数据,Void main()int aNN,mN,i,j,r;printf(nBegin Generate Ran
12、d:n);randomize();初始化随机数发生器 for(i=0;iN;i+)for(j=0;jN;j+)r=random(99);aij=r;coutsetw(7)r;coutendl;,随机生成一个在100以内的数存入NN的数组中,并打印出来,后续,for(i=0;iN;i+)for(j=0;jN;j+)r=random(99);aij=r;coutsetw(7)r;,mi=ai0;for(j=1;jaij)mi=aij;,Cout Row:“i“Min:”miendl;,生成第i行的一维数组,找出第i行的最小元素,46 30 82 90 56 17 Row0:Min:17 95 15
13、 48 26 4 58 Row1:Min:4 71 79 92 60 12 21 Row2:Min:12 63 47 19 41 90 85 Row3:Min:19 14 9 52 71 79 16 Row4:Min:9 81 51 95 93 34 10 Row5:Min:10,Example,有一个34的矩阵,要求编程以求出其中值最大的那个元素,以及它所在的行号和列号。,Void main()int i,j,row,col,max;int a34=3,5,1,8,6,4,11,7,9,3,10,2;max=a00;for(i=0;imax)max=aij;row=i;col=j;cout“
14、max=”max“row=“row“col=”colendl;,取第一个数和所有数比较当发现比它大的数就记录下数据和所在的位置,有M个人参加了N门课程的考试,编程求每个人的平均分以及每门课程的平均成绩。5个人 考了3门考试,x53,程序要完成的几件事初始化x53 嵌套循环计算每个学生的平均成绩 累加过程计算每门课程的平均成绩 累加过程输出学生成绩,平均成绩和课程的平均成绩 嵌套循环,#define M 5#define N 3void main()int i,j,xMN;float sum,aveM,meanN;coutxij;sum=sum+xij;avei=sum/N;,待续,for(j=
15、0;jN;j+)sum=0;for(i=0;iM;i+)sum=sum+xij;meanj=sum/M;,for(i=0;iM;i+)coutNO.“/ti+1;for(j=0;jN;j+)coutsetw(3)xij;cout“NO.”i+1“s average score is”aveiendl;,for(j=0;jN;j+)cout“Lesson”j+1“:”meanjendl;,Example,数组作为函数参数,数组名和数组元素都可以作为函数的参数,从而实现数据的传递和共享。1数据名*(形参和实参都是数组名)书中109页,程序修改。2数组元素作为函数参数。书中110页程序。问题:上面两
16、者的参数传递是单向的,还是双向的?,字符数组其实就是类型为字符型的数组,每一个元素存放一个字符,主要用于存储和处理字符型数据。复习:字符串是有一对双引号括起的字符序列。如:“hello world!”,每个字符串都有一个字符结束标志0(空字符),1 字符数组的定义、初始化和引用字符数组的定义和一般的数组一样,例如:char s10;char string310;初始化的方法如下:char s10=H,e,l,l,o,C,+,+,!;/完全初始化 char s=H,e,l,l,o,C,+,+,!;/省略长度的完全初始化 char s10=H,e,l,l,o,!;/不完全初始化(后面自动填充0)c
17、har s11=“Hello C+!”;/可以用字符串常量来初始化字符数组。如:char s11=“Hello C+!”;/省略花括号的字符串形式的初始化 课堂提问:字符数组和字符串数组的区别?,4 字符数组与字符串,C字符串的输入和输出,当字符串保存在字符数组中时,字符串的输入和输出有两种方法:(1)将逐个字符输入和输出for(i=0;istri;for(i=0;i5;i+)coutstri;,C字符串的输入和输出,(2)将整个字符串整体输入和输出:char str5;cinstr;coutstr;注意:1.输入的字符数组中一定要有结束符(OK!(后面为空格或回车或tab)2.字符串结束标志
18、0不输出。3.输出整个字符串时,输出项为字符数组名。4.如果字符数组中包含一个以上0时,第一个中止。,#include#include using namespace std;int main()char s100;cout=0)coutsi;coutendl;return 0;,【例题】输入一串字符,将其按逆序输出。,getline函数有两个参数:第一个参数用于接收输入的C+字符串变量;第二个参数用于规定getline最多能接收的字符个数。例如:char a80;cin.getline(a,80);当遇到行结束的时候,输入才会停止。,为了处理字符串方便,C+提供了很多字符串处理函数,使用这些
19、函数需要包含cstring,如下形式:#include 下面具体介绍其中常用的函数。int strlen(const char*s)字符串长度函数求字符指针s所指字符串中第一个结束符0前的字符个数。const 表示不允许修改s所指字符串。s可以是字符数组的名称。例如:char s100=Hello World!;char t100=12345067890;coutstrlen(s)endl;/输出12coutstrlen(t)endl;/输出5,2 字符串函数,2 字符串函数,2char*strcpy(char*s1,const char*s2);字符串复制函数函数将字符串s2复制到字符串s1
20、,并返回s1。很显然,s1必须有足够的空间来存储复制过来的s2。例如:char s120;char s2=Good luck;strcpy(s1,s2);couts1endl;/输出Good luckstrcpy函数可以将结束符一起复制过去,以上复制操作也可以直接写成:strcpy(s1,Good luck);,3char*strcat(char*s1,const char*s2)字符串连接函数函数将字符串s2连接到字符串s1后面,并返回s1。很显然,s1也必须有足够的空间来存储由原来的s1和s2构成的新s1字符串。例如:char s120=Good luck;char s2=to you!;
21、strcpy(s1,s2);couts1endl;/输出Good luck to you!连接后的s1的有效字符长度为17包括结束符在内,s1至少需要18个字符长度,否则连接是错误的。,2 字符串函数,5char*strlwr(char*s)字符串大写变小写将字符串s的所有大写字母转换成小写字母。6char*strupr(char*s)字符串小写变大写将字符串s的所有小写字母转换成大写字母。,4int strcmp(const char*s1,const char*s2)字符串比较函数函数比较s1和s2字符串的大小,并返回比较的结果。若s1大于s2,则返回一个正整数若s1等于s2,则返回0若s
22、1小于s2,则返回一个负整数字符串比较规则:自左向右按ASCII码值大小进行比较,直至出现一对不同字符或者遇到结束符为止,#include#include using namespace std;int main()char s550=Hello World!,Good luck to you!,How are you?,Moon River,I love this book.;int max=0;for(int i=1;i 0)max=i;/记录最大串的位置即可cout最大的字符串是:smaxendl;return 0;,【例题】输出几个字符串中的最大的串。,【例题】将10个数排序输出。(冒
23、泡法排序)分析:对一系列数进行排序,有很多种方法,冒泡法是其中比较容易理解的一种算法。所谓冒泡法,就是指找到的大数或者小数像气泡一样浮出水面被发现。为了理解算法,我们看下面的例子:,5 程序示例,假如有5个数7、2、9、1、8,冒泡排序算法如下:,冒泡法采用的基本操作是比较交换,上面算法的目标是得到从小到大的顺序,其中每一步都是找到一定范围内的最大数并放在该范围的最后一个数,当从5个数中找到4个较大的数后,排序完成。具体操作如下:第1次查找 范围:7 2 9 1 8 第1步 72 将7和2交换位置,得到2 7 9 1 8 第2步 71 将9和1交换位置,得到2 7 1 9 8 第4步 98 将
24、9和8交换位置,得到2 7 1 8 9第1次查找,将9作为最大数放在最后,结果为:2 7 1 8 9外面打上方框表示后面的查找范围将不包括9了。第2次查找 范围:2 7 1 8 第1步 21 将7和1交换位置,得到2 1 7 8 9 第3步 78 不交换第2次查找结果为:2 1 7 8 9,【例题】将10个数排序输出,#include#include using namespace std;int main()const n=10;int an=7,2,8,9,1,6,0,4,5,3;int i,j;int t;for(i=0;i aj+1)/前面的数大于后面的数就交换/利用中间变量t实现aj
25、和aj+1相邻两个数的交换t=aj;aj=aj+1;aj+1=t;for(i=0;in;i+)coutai;coutendl;return 0;,#include#include using namespace std;int main()char s1100=12345;char s250=6789;int i=0;while(s1i!=0)i+;int j=0;while(s2j!=0)s1i=s2j;i+;j+;s1i=0;cout连接后的字符串是:s1endl;return 0;,【例题】编写程序将两个字符串连接成一个新的字符串。,#include#include using name
26、space std;int main()char s100=I love this program.“,c;cout请输入要删除的字符:;c=cin.get();/cin.get()是保留回车在输入流队列中的.而cin是丢弃回车的 int i,j;for(i=j=0;si!=0;i+)if(si!=c)sj=si;j+;sj=0;cout删除后的字符串为:sendl;return 0;,【例题】编写程序删除字符串中指定字符。,i=0;j=0;(i)j=1;i=1;()j=2;i=2;(l)j=2;i=3(o)j2=i3;j=3;i=4,#include#include using namespace std;int main()int t,a33=9,8,7,6,5,4,3,2,1;for(int i=0;i3;i+)for(int j=0;j3;j+)t=aij;aij=aji;aji=t;for(i=0;i3;i+)for(int j=0;j3;j+)coutaijt;coutendl;return 0;,【例题】已知一个3*3的二维数组,编程将行列元素互换,生成它的转置矩阵。,