1 / 69

第5章 数组

第5章 数组. 教学内容 数组的定义及应用 字符串处理函数 几个常用算法:排序算法(选择排序、冒泡排序). 第5章 数组. 重点、难点 数组的定义及应用 常用算法的设计(选择排序、冒泡排序). 第5章 数组. 教学目标 熟练掌握数组的定义及应用 掌握字符数组的定义及应用 掌握常用的字符串处理函数 熟练掌握几个常用算法:排序算法(选择排序、冒泡排序). 第5章 数组. 5.1 –5.3数组的定义及应用 5. 4 字符数组与字符串 5.5 数组应用实例. 5.1 问题的提出. 1. 已知,全班计算机课程的成绩,求平均成绩。

Télécharger la présentation

第5章 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5章 数组 教学内容 • 数组的定义及应用 • 字符串处理函数 • 几个常用算法:排序算法(选择排序、冒泡排序)

  2. 第5章 数组 重点、难点 • 数组的定义及应用 • 常用算法的设计(选择排序、冒泡排序)

  3. 第5章 数组 教学目标 • 熟练掌握数组的定义及应用 • 掌握字符数组的定义及应用 • 掌握常用的字符串处理函数 • 熟练掌握几个常用算法:排序算法(选择排序、冒泡排序)

  4. 第5章 数组 5.1 –5.3数组的定义及应用 5.4字符数组与字符串 5.5数组应用实例

  5. 5.1 问题的提出 1. 已知,全班计算机课程的成绩,求平均成绩。 a1,a2,a3,…,an 2.已知,全班6门课程的成绩,求每门课程的平均成绩。 a11, a12, a13, a14, a15, a16 a21, a22, a23, a24, a25, a26 …… an1, an2, an3, an4, an5, an6

  6. 5.2一维数组的定义及应用 1.一维数组的定义 【格式】 <类型> <数组名>[<常量表达式>] 例如:int a[10]; 【说明】 (1)<类型>可以是基本数据类型,也可以是已经声明过的某种数据类型; (2)<数组名>是用户自定义的标识符,用来表示数组的名称; (3) <常量表达式>必须是整型数据,用于表示数组的长度,即数组所包含元素的个数。

  7. 一维数组的定义 例如: int a[10]; float b[20]; double c[5]; a数组包含10个数组元素,分别是a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。 【说明】C++语言规定数组的下标是从0开始,依次为1、2、3、…、n-1。

  8. 数组元素 数组在内存中的地址 一维数组的定义 数组a在内存中存储形式的示意图(连续存储空间)。

  9. 一维数组的定义 说明: (1)数组名a表示内存首地址,是地址常量。 (2)数组a中每个数组元素占的内存空间为4字节,因此,整个数组所占内存空间为6*4=24字节。

  10. 2. 一维数组的初始化 【格式】<类型> <数组名>[<常量表达式>]={<初值表>} 例如,下面都是合法的初始化数组元素的格式。 (1)int a[6]={1,2,3,4,5,6}; //整型数组元素被全部初始化 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; a[5]=6; (2)int b[8]={2,5,9,6,1,3}; //初始化了部分数组元素 等价于:b[0]=2; b[1]=5; b[2]=9; b[3]=6; b[4]=1; b[5]=3; b[6]=0; b[7]=0; (3)int c[]={3,5,9,2,1}; //编译系统根据初值个数确定数组的长度为5 等价于:c[0]=3; c[1]=5; c[2]=9; c[3]=2; c[4]=1; (4)static int d[5]; 等价于:d[0]=0; d[1]=0; d[2]=0; d[3]=0; d[4]=0;

  11. 一维数组的初始化 【说明】 (1)初始化时,可以对全部元素赋初值,也可以对部分元素赋初值。 (2)如果只对部分元素赋初值,没有赋初值的元素默认为0。 (3)若对所有元素赋初值,可以不显式指定数组的长度。系统会根据初值表中数据的个数自动定义数组的长度。

  12. 3.一维数组的应用 数组元素是通过数组名及下标运算符[ ]来使用的。每个元素由惟一下标来标识数组元素,数组元素也称为下标变量 。

  13. 一维数组的应用示例 int a[5],b[2],i,j; a[0]=b[0]=2; //下标为常量 i=1;j=3; a[i]=j; //下标为变量 a[j+1]=8; //下标为表达式 a[j]=3*a[1]; a[b[0]]=a[i]+a[0]; //下标是数组元素的值 b[1]=a[2]; int h[5],i; for(i=0;i<5;i++) h[i]=i+1; //利用循环为数组元素赋值

  14. 一维数组的应用示例 【例5-2-0】已知,全班计算机课程的成绩,求平均成绩。 【例5-2-1】求Fibonacci数列的前40项。 【例5-2-2-0 】在给出的10个数中找出最大值并输出。 【例5-2-2 】排序问题。将下列10个数按由小到大的顺序排列输出。(选择排序)

  15. a(i)与a(imin)交换 2 6 9 3 8 7 第一次 imin=2 i=1imin=1 imin=4 imin=5

  16. a(i)与a(imin)交换 2 3 9 6 8 7 第二次 imin=2 i=2imin=2 imin=4

  17. a(i)与a(imin)交换 2 3 6 9 8 7 第三次 imin=3 imin=4 i=3imin=3 imin=4

  18. a(i)与a(imin)交换 2 3 6 7 8 9 第四次 imin=4 imin=5 imin=6 i=4imin=4

  19. 2 3 6 7 8 9 第五次 imin=5 i=5imin=5

  20. i 5 4 5 3 2 2 3 6 7 8 9 1 1 2 3 4 5 结果

  21. 选择排序程序 #include <iostream.h> void main() {int a[10]={15,8,0,-6,2,39,-53,12,10,6 }; int i,j,temp; for(i=0;i<9;i++) //比较排序的总轮次 for(j=i+1;j<10;j++) //每轮比较的次数 if(a[i]>a[j]) {temp=a[i]; a[i]=a[j]; a[j]=temp; } for(i=0;i<10;i++) cout<<a[i]<<' '; cout<<endl;}

  22. 冒泡排序 算法 (1)每轮的比较是从最后一个数开始的 (2)在每轮排序时将相邻的数进行比较,当次序不对时就交换位置,出了内循环最小数已冒出 (3) 除第一个数外,其余n-1个数再按步骤 (2)执行,让次小数冒出 (4)重复步骤(2)n-1遍,最后形成递增序列

  23. 如果后面的比前面的小就交换 i=1

  24. 如果后面的比前面的小就交换 i=2

  25. 如果后面的比前面的小就交换 i=3

  26. 如果后面的比前面的小就交换 i=4

  27. 如果后面的比前面的小就交换 i=5

  28. 5 次 5 4 3 2 i 2 3 4 5 1 1

  29. 冒泡排序 #include <iostream.h> void main() {int a[10]={15,8,0,-6,2,39,-53,12,10,6 }; int i,j,temp; for(i=9;i>=1;i--) //比较排序的总轮次 for(j=9;j>9-i;j--) //每轮比较的次数 if(a[j]<a[j-1]) {temp=a[j]; a[j]=a[j-1];a[j-1]=temp; } for(i=0;i<10;i++) cout<<a[i]<<' '; cout<<endl;}

  30. 一维数组应用示例 【例5-2-3】查找。在有序数列(-56,-23,0,8,10,12,26,38,65,98)中查找数据38是否存在。

  31. 一维数组应用示例 二分查找的思想:二分查找也称为折半查找。 -56,-23,0,8,10,12,26,38,65,98 10<38 12,26,38,65,98 38=38

  32. 二分查找程序 #include <iostream.h> void main() {int s[10]={-56,-23,0,8,10,12,26,38,65,98 }; int low,high,binary,x; cout<<"input x="; cin>>x; //输入待查找数据 low=0;high=9; //标识查找区间 binary=(low+high)/2; //确定折半位置 while(x!=s[binary] && low<=high ) { if(x<s[binary]) high=binary-1; //在前半区间查找 else low=binary+1; //在后半区间查找 binary=(low+high)/2; } if(low<=high) cout<<"find success!"<<endl; else cout<<"find fail!"<<endl; }

  33. 5.2 二维数组 1.多维数组的定义 <类型> <数组名>[<常量表达式1>][<常量表达式2>]…[<常量表达式n>] int a[3][5],b[2][3][4]; float score[30][6];

  34. 二维数组 a[3][5]是一个二维数组,包含15(3*5)个数组元素。 a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[2] a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] 存放的顺序:先行后列

  35. 二维数组 a[3][4]的存储形式:

  36. 2.二维数组的初始化 (1)int a[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}}; (2)int a[3][4]={1,2,3,4,3,4,5,6,5,6,7,8}; (3)int b[][3]={{1,3,5},{5,7,9}}; //初始化了全部数组元素,隐含了行数 (4)int c[3][3]={{1},{0,1},{0,0,1}}; a数组: 1 2 3 4 3 4 5 6 5 6 7 8 b数组: 1 3 5 5 7 9 c数组: 1 0 0 0 1 0 0 0 1

  37. 3.二维数组的应用 【例5-3-1】已知一个3*4的矩阵a,将其转置后输出。 分析:所谓转置就是将矩阵的行列互换,即将a矩阵的a[i][j]元素变成b矩阵的b[j][i]。

  38. 二维数组的应用 #include <iostream.h> // 【例5-3-1】 void main() {int a[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}}; int b[4][3],i,j; for(i=0;i<3;i++) {for(j=0;j<4;j++) cout<<a[i][j]<<" "; cout<<endl; } for(i=0;i<4;i++) for(j=0;j<3;j++) b[i][j]=a[j][i]; for(i=0;i<4;i++) {for(j=0;j<3;j++) cout<<b[i][j]<<" "; cout<<endl; }}

  39. 二维数组的应用 【例5-3-2】编程实现两个矩阵的乘法运算。 算法:c[i][j]=c[i][j]+a[i][k]*b[k][j];

  40. 二维数组的应用 #include <iostream.h> // 【例5-3-2】 void main() {int a[3][4]={{1,2,3,4},{2,2,3,1},{5,4,2,3}}; int b[4][3]={{6,3,2},{2,8,1},{6,9,5},{2,4,6}}; int i,j,k,c[3][3]={{0},{0},{0}}; for(i=0;i<3;i++) for(j=0;j<3;j++) for(k=0;k<4;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j]; for(i=0;i<3;i++) {for(j=0;j<3;j++) cout<<c[i][j]<<" "; cout<<endl; }}

  41. 二维数组的应用 【例5-3-3-0】有一个3*4的矩阵,求其最大值。 1  2  12  4 30  4  15   61 50 16  7   8 【例5-3-3-1】有一个3*4的矩阵,求其最大值及其位置。

  42. 二维数组的应用 【例5-3-4】按下列格式打印杨辉三角形。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1

  43. 二维数组的应用 #include <iostream.h> // 【例5-3-4】 #include <iomanip.h> void main() {const int m=10; int a[m][m]; int i,j; for(i=0;i<m;i++) {a[i][0]=1; a[i][i]=1; for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; } for(i=0;i<m;i++) {for(j=0;j<=i;j++) cout<<setiosflags(ios::left)<<setw(5)<<a[i][j]; cout<<endl; }}

  44. 二维数组的应用 【例5-3-5】打印下列魔方阵。 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9

  45. 二维数组的应用 #include <iostream.h> //【例5-3-5】 #include <iomanip.h> void main() {const int m=6; int a[m][m]; int i,j; i=1;j=m/2; for(int k=1;k<=(m-1)*(m-1);k++) {a[i][j]=k; if(k % (m-1)==0) i++; else { i--;j++; if(i<1) i=m-1; if(j>m-1) j=1; } } for(i=1;i<=(m-1);i++) {for(j=1;j<=(m-1);j++) cout<<setiosflags(ios::left)<<setw(5)<<a[i][j]; cout<<endl; }}

  46. 5.4字符数组与字符串 5.4.1字符数组的定义 【格式】 <char> <数组名>[<常量表达式>] char s1[10],s2[20]; char s3[5][10]; s3是一个二维数组,可以存放5个字符串,每个字符串最多可以存放10个字符。

  47. 5.4.2字符数组的初始化 1.用字符常量进行初始化 char s1[8]={'C','o','m','p','u','t','e','r'}; char s2[10]={'m','o','u','s','e'}; char s3[2][5]={{'b','o','o','k'},{'b','o','o','k','2'}}; 2.用字符串常量进行初始化 char s11[9]={"Computer"}, s22[10]="mouse"; char s33[2][5]={"box","boxs"};

  48. 字符数组的初始化 【说明】 (1)如果字符个数大于数组长度,系统会提示用户语法错误。 (2)用字符串初始化字符数组时,系统会在字符数组的末尾自动加上一个字符'\0'。因此,要考虑数组的长度比实际字符的个数大1。 (3)用字符串初始化一维字符数组时,可以省略花括号{}。

  49. 5.4.3字符数组的使用 【例5-4-1 】阅读下列程序,给出运行结果。 #include <iostream.h> void main() {char s[30]="computer,mouse,key"; int i=0,k=0; cout<<s<<endl; while(s[i]!='\0') {if(s[i]=='m') k++; i++; } cout<<"i="<<i<<endl; cout<<"k="<<k<<endl;} 结果: computer,mouse,key i=18 k=2

  50. 5.4.4字符数组的输入输出 1.逐个元素的输入输出 程序段2 char s1[10]; int i; for(i=0;i<10;i++) cin.get(s1[i]); //输入ab cdefgh m n for(i=0;i<10;i++) cout.put(s1[i]); 程序段1: char s1[10]; int i; for(i=0;i<10;i++) cin>>s1[i]; //输入ab cdefgh m n for(i=0;i<10;i++) cout<<s1[i];

More Related