650 likes | 754 Views
C++ 语言程序设计 数组. 学习目标. . 掌握定义一维数组和二维数组方法以及在定义时设定初值的方法; 掌握数组操作的基本技巧并能用来解决实际问题; 掌握数组的一个典型应用 —— 字符串处理,熟悉常用的字符串处理函数。. 第一讲主要内容. 数组的概念 一维数组的定义和初始化 一维数组的下标访问 一维数组应用举例 多维数组的概念 二维数组的定义和初始化 二维数组的下标访问 二维数组应用举例 字符数组与字符串 字符串的主要操作 字符串应用举例. . 数组的概念. 数组是可以通过下标访问的同类型数据元素的集合。
E N D
学习目标 • 掌握定义一维数组和二维数组方法以及在定义时设定初值的方法; • 掌握数组操作的基本技巧并能用来解决实际问题; • 掌握数组的一个典型应用——字符串处理,熟悉常用的字符串处理函数。
第一讲主要内容 数组的概念 一维数组的定义和初始化 一维数组的下标访问 一维数组应用举例 多维数组的概念 二维数组的定义和初始化 二维数组的下标访问 二维数组应用举例 字符数组与字符串 字符串的主要操作 字符串应用举例
数组的概念 数组是可以通过下标访问的同类型数据元素的集合。 数组的每个元素是一个存储单元,元素的值就存放于其中,而且可以改变。 数组的数据类型也就是它的元素 (单元)的数据类型
一维数组的定义 定义格式: 类型修饰符 数组名 [元素个数] eg:int a[6] 类型修饰符 数组名 ([元素个数])={初值表} 例子: eg:int a[ ]={7,0,9,6,3,5} eg:int a[6]={7,0,9} 可省略
一维数组的定义和初始化.. char s1[80]; int d[]={1,2,3,4,5,6};
一维数组的定义和初始化.. double num[5]={1.0,3.0,5.0}; long ldata[10]={0L};
一维数组的定义和初始化 #define FIRST 100 int D3[]= {FIRST,FIRST+1,FIRST+2};
一维数组的下标访问 格式:数组名[下标] 例如:k=num[4]; num[2]=6.7; cout<<name[3*k]; 注意防止下标越界
一维数组应用举例.. —— 例4.1:输入8个整数,然后按输入的相反顺序显示这些数据。
一维数组的输入/输出 一维数组的输入 int a[size]; cin>>a[0]>>a[1]>>a[2]>>…>>a[size-1]; int a[size]; for(int i=0;i<size;i++)cin>>a[i]; 一维数组的输出 int a[size]; for(int i=0;i< size;i++)cout<<a[i]<<‘‘;
反序显示 Data[0] Data[1] Data[2] Data[3] Data[3] Data[2] Data[1] Data[0]
一维数组应用举例.. 1:#include <iostream.h> 2: 3:void main() 4:{ 5: int data[8]; 6: cout<<endl<<”请输入8个整数:”; 7: int i; 8: for(i=0;i<8;i++) cin>>data[i]; 9: cout<<endl; 10: for(i=7;i>=0;i--) cout<<data[i]<<' '; 11:}
一维数组应用举例.. 1: //例4.1程序的改进 2: #include <iostream.h> 3: 4: #define SIZE 8 5: 6: void main() 7: { 8: int data[SIZE]; 9: cout<<endl<<”请输入”<<SIZE <<”个整数:”; 10: int i; 11: for(i=0;i<SIZE;i++) cin>>data[i]; 12: cout<<endl; 13: for(i=SIZE-1;i>=0;i--) cout<<data[i]<<' '; 14: }
一维数组应用举例.. —— 例4.2:输入10个整数到一个数组中,调整这10个数在数组中的排列位置,使得其中最小的一个数成为数组的首元素。
一维数组应用举例.. 1:#include <iostream.h> 2: 3:#define SIZE 10 4: 5:void main() 6:{ 7:int data[SIZE]; 8: cout<<endl<<”请输入”<<SIZE <<”个整数:”; 9: int m; 10: for(m=0;m<SIZE;m++) cin>>data[m]; 11: int j=0; 12: for(int i=1;i<SIZE;i++) 13: if(data[i]<data[j]) j=i; 5: void main() //演示 6:{ 7: int data[SIZE]; 8: cout<<endl<<”请输入”<<SIZE<<”个整数:”; 9: int m; 10: for(m=0;m<SIZE;m++) cin>>data[m]; 11: int j=0; 12: for(int i=1;i<SIZE;i++) 13: if(data[i]<data[j]) j=i; 14: if(j>0){ 15: int k=data[0]; 16: data[0]=data[j]; 17: data[j]=k; 18: } 19: cout<<endl; 20: for(m=0;m<SIZE;m++)cout<<data[m]<<' '; 21:}
一维数组应用举例.. —— 例4.3:重新安排整数序列 12 23 9 34 45 7 78 –33 59 3 的顺序,使其按升序排列。显示排序前后的这两个整数序列。
一维数组应用举例.. 1: #include <iostream.h> 2: 3: void main() 4: { 5: int data[] ={12,23,9,34,45,7,78,–33,59,3}; 6: #define SIZE (sizeof(data)/sizeof(data[0])) 7: 8: int m; 9: //显示排序前的序列 10: cout<<endl<<"排序前:"; 11: for(m=0;m<SIZE;m++) cout<<data[m]<<' '; 12:
一维数组应用举例.. 13://实现挑选排序的双重循环 14: for(m=0;m<SIZE-1;m++){ //演示 15: int j=m; 16: for(int i=m+1;i<SIZE;i++) 17: if(data[i]<data[j]) j=i; 18: if(j>m){ 19: int k=data[m]; 20: data[m]=data[j]; 21: data[j]=k; 22: } 23: } 24: 25://显示排序后的序列 26: cout<<endl<<"排序后:"; 27: for(m=0;m<SIZE;m++) cout<<data[m]<<' '; 28:}
12 23 45 7 78 33 - 59 3 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 9 j i 34 • 14: for(m=0;m<SIZE-1;m++){ • 15: int j=m; • 16: for(int i=m+1;i<SIZE;i++) • 17: if(data[i]<data[j]) j=i; • 18: if(j>m){ • 19: int k=data[m]; • 20: data[m]=data[j]; • 21: data[j]=k; • 22: } • 23: }
一维数组应用举例.. —— 例4.4:显示输出 100 以内的所有质数。 • 质数(素数)指除1和它本身以外 不能被别的数整除的整数; • 最小的质数是2,其余的质数都是 奇数; • 质数序列为:2 3 5 7 11 13 17……
一维数组应用举例.. 1:#include<iostream.h> 2: 3:#define SIZE 100 4: 5:void main() 6:{ 7: bool p[SIZE]; 8: cout<<SIZE<<"以内的质数有:2"; 9: int i; 10: for(i=3;i<SIZE;i+=2)p[i]=true; 11: for(i=3;i<SIZE;i+=2) 12: if(p[i]){ 13: cout<<' '<<i; 5:void main() 6:{ 7: bool p[SIZE]; 8: cout<<SIZE<<"以内的质数有:2"; 9: int i; 10: for(i=3;i<SIZE;i+=2)p[i]=true; 11: for(i=3;i<SIZE;i+=2) 12: if(p[i]){ 13: cout<<' '<<i; 15: for(int j=i+i+i;j<SIZE; j+=i+i) p[j]=false; 16: } 17:}
多维数组的概念 依据元素的不同排列方式,数组可分为一维数组、二维数组、三维数组等等。 二维数组可以看成是这样的一维数组:它的所有元素都是规格相同的一维数组;三维数组可以看成是这样的一维数组:它的所有元素都是规格相同的二维数组;……
二维数组的定义和初始化.. • 格式: • 类型修饰符 数组名[行数][列数] • 类型修饰符 数组名[ ][列数]={初值表};
二维数组的定义和初始化.. float d[4][5];
二维数组的定义和初始化.. int num[][3] ={{1,3,5},{0},{2,4,6}};
二维数组的定义和初始化.. int a[5][3]={{1,3},{5,0},{2,4,6}};
二维数组的定义和初始化.. int b[5][3]={1,3,5,0,2,4,6}; int b[5][3]={{1,3,5},{0,2,4},{6}};
二维数组的下标访问 格式:数组名[行下标][列下标] 例如:k=num[4][2]; num[2][4]=6.7;
二维数组的下标访问 • 例:输入足够的整数放入一个 3 行 5 列的二维数组中。 • int d[3][5]; • for(int i=0;i<3;i++) • for(int j=0;j<5;j++) • cin >> d[i][j];
二维数组的输出 • int data[行数][列数],i,j; • for (i=0;i<行数;i++){ • cout<<endl; • for( j=0;j<列数;j++) • cout<<data[i][j]<<’’;}
二维数组应用举例.. —— 例4.5:输入一个5╳5的整数矩阵,然后将之转置并显示这个转置后的矩阵。
二维数组应用举例.. 方法:以主对角线为对称轴,交换所有对称点元素。
二维数组应用举例.. 1: #include<iomanip.h> 2: 3: #define SIZE 5 4: 5: void main() 6: { 7: int data[SIZE][SIZE],i,j; 8: 9: //输入矩阵 10: for(i=0;i<SIZE;i++) 11: for(j=0;j<SIZE;j++) cin>>data[i][j]; 12: 13: //转置矩阵 14: for(i=0;i<SIZE-1;i++) 13: //转置矩阵 14: for(i=0;i<SIZE-1;i++) 15: for(j=i+1;j<SIZE;j++){ 16: int d=data[i][j]; 17: data[i][j]=data[j][i]; 18: data[j][i]=d; 19: } 20: 21: //输出转置后的矩阵 22: for(i=0;i<SIZE;i++){ 23: cout<<endl; 24: for(j=0;j<SIZE;j++) cout<<setw(8)<<data[i][j]; 25: } 26: }
二维数组应用举例.. for(i=0;i<SIZE-1;i++) for(j=i+1;j<SIZE;j++){ int d=data[i][j]; data[i][j]=data[j][i]; data[j][i]=d;}
二维数组应用举例.. 例4.7:计算如下所示两个矩阵的乘积:
二维数组应用举例.. 关于矩阵乘法的常识: 1.第一个矩阵的列数必须等于第二个矩阵的行数;一个 m 行 n 列矩阵乘以一个 n 行 p 列矩阵,其结果是一个m 行 p 列的矩阵。 2.若矩阵 A 乘以矩阵 B,则结果矩阵 C 中的每个元素须按下面的公式计算:
二维数组应用举例.. c2,4=12*0+(-1)*10+27*9+8*(-37)=0–10+243-296=-63
15://按先行后列的顺序扫描C的所有元素 16: for(i=0;i<3;i++) 17: for(j=0;j<5;j++) 18://计算ci,j的值(A的第i行和B的第j列的内积) 19: for(int k=0;k<4;k++) C[i][j]+=A[i][k]*B[k][j]; 20: 21://下面的二重循环输出的结果——矩阵C的内容 22: for(int i=0;i<3;i++){ 23: cout<<endl; 24: for(int j=0;j<5;j++) cout<<setw(5)<<C[i][j]; 25: } 26:} 二维数组应用举例.. 1:#include <iomanip.h> 2: 3:void main() 4:{ 5: int A[3][4]={{2, 3,-5, 0}, 6 {12,-1,27, 8}, 7: {91,22,-32,1}}; 8: int B[4][5]={{25,13,65,0,5 }, 9: {-2, 0,18,10,45}, 10: {53,33, 3, 9, 0}, 11: { 7,61,26,-37,-1}}; 12: int C[3][5]={{0}}; 13: int i,j; 14:
二维数组应用举例.. 15://按先行后列的顺序扫描C的所有元素 16: for(i=0;i<3;i++) 17: for(j=0;j<5;j++) 18://计算ci,j的值(A的第i行和B的第j列的内积) 19: for(int k=0;k<4;k++) C[i][j]+=A[i][k]*B[k][j];
字符数组与字符串.. 字符串常量以双引号括起来的字符序列表示,结束符字符串是以'\0'结尾的字符序列,'\0'称为字符串的结束符。 结束符并不显式地表示出来,如"C++程序设计""First line\nSecond line"
字符数组与字符串.. 字符串中字符的个数称为字符串的长度(西文字符,不包括结束符);如 "ABCD" 的长度为4"C++程序设计" 的长度为11"First line\nSecond line" 的长度为22 字符串实际占用的空间字节数比它的长度值多1。
字符数组与字符串.. 可以用字符数组存储字符串,例如要将字符串 "A string" 存储在字符数组 S 中:char s[]={'A',' ','s','t', 'r','i','n','g'};//错误char s[]={'A',' ','s','t', 'r','i','n','g','\0'}; //正确
字符数组与字符串.. 对于存储字符串的数组的初始化,C++提供了一种更简便的不易出错方法:char s[]="A string"; • 如果这样的字符数组在程序中有可能改而存放别的字符串,应充分估计所需的最大空间,例如:char s[80]="A string";
字符数组与字符串.. 要为字符数组赋值,使它改而存放另一个字符串,可以用赋值语句:S="XYZ"; //错误S[]="XYZ"; //错误S[0]='X'; //以下正确,S[1]='Y'; S[2]='Z'; S[3]='\0'; 更好的赋值方法是使用strcpy函数
字符数组与字符串.. 用于存放字符串的一维字符数组可以看成是字符串变量,从而可将存放于其中的字符串作为一个整体来处理;此种情况下数组名可以像简单变量那样单独使用(即不使用下标)。例如:char name[]="Smith"; cout<<"I am "<<name <<'.';将显示输出:I am Smith.
字符数组与字符串.. 同理,二维字符数组就可视作存放字符串的一维字符串数组。例如:char WD[][4]={"Sun","Mon","Tue","Wed", "Thu","Fri","Sat"};cout<<endl<<WD[4]; 将显示输出:Thu
字符串的主要操作.. 求字符串长度调用格式:strlen(字符串)功能:计算并返回 字符串的长度例如:char h[50]="How long?";cout<<strlen(h)<<' ' <<strlen("How long?");将输出:9 9
字符串的主要操作.. 字符串复制调用格式:strcpy(字符串变量, 字符串)功能:将 字符串 复制到 字符串变量 中,该变量中原有内容被覆盖。函数以 字符串变量 作为它的返回值。
字符串的主要操作.. 例如:char s[]=”12345”;cout<<s<<’ ’;cout<<strcpy(s,”ABCD”)<<’ ’;cout<<s;的输出是:12345 ABCD ABCD