Upload
amelia-davenport
View
100
Download
9
Embed Size (px)
DESCRIPTION
C++ 语言程序设计 数组. 学习目标. . 掌握定义一维数组和二维数组方法以及在定义时设定初值的方法; 掌握数组操作的基本技巧并能用来解决实际问题; 掌握数组的一个典型应用 —— 字符串处理,熟悉常用的字符串处理函数。. 第一讲主要内容. 数组的概念 一维数组的定义和初始化 一维数组的下标访问 一维数组应用举例 多维数组的概念 二维数组的定义和初始化 二维数组的下标访问 二维数组应用举例 字符数组与字符串 字符串的主要操作 字符串应用举例. . 数组的概念. 数组是可以通过下标访问的同类型数据元素的集合。 - PowerPoint PPT Presentation
Citation preview
C++ 语言程序设计 数组
学习目标1. 掌握定义一维数组和二维数组方法以及在定义时设定初值的方法;2. 掌握数组操作的基本技巧并能用来解决实际问题; 3. 掌握数组的一个典型应用——字符串处理,熟悉常用的字符串处理函数。
第一讲主要内容 数组的概念
一维数组的定义和初始化 一维数组的下标访问 一维数组应用举例 多维数组的概念 二维数组的定义和初始化 二维数组的下标访问 二维数组应用举例 字符数组与字符串 字符串的主要操作 字符串应用举例
数组的概念• 数组是可以通过下标访问的同类型数据元素的集合。• 数组的每个元素是一个存储单元,元素的值就存放于其中,而且可以改变。• 数组的数据类型也就是它的元素 ( 单元 ) 的数据类型
一维数组的定义定义格式:类型修饰符 数组名 [ 元素个数 ] eg:
int a[6]类型修饰符 数组名 ( [ 元素个数 ] ) =
{ 初值表 } 例子:eg:int a[ ]={7,0,9,6,3,5}eg:int a[6]={7,0,9}
可省略
一维数组的定义和初始化 ..
0 1 2 3 … … 78 79
int d[]={1,2,3,4,5,6};int d[]={1,2,3,4,5,6};0 1 2 3 4 51 2 3 4 5 6
char s1[80];
一维数组的定义和初始化 ..
0 1 2 3 4
1.0 3.0 5.0 0.0 0.0
long ldata[10]={0L};long ldata[10]={0L};
0 1 2 3 4 5 6 7 8 9
0L 0L 0L 0L 0L 0L 0L 0L 0L 0L
• double num[5]={1.0,3.0,5.0};
一维数组的定义和初始化• #define FIRST 100 int D3[]= {FIRST,FIRST+1,FIRST+2};
0 1 2
100 101 102
一维数组的下标访问• 格式: 数组名 [ 下标 ]• 例如:
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() 5: void main() //// 演示演示 6:{6:{ 7: int data[SIZE];7: int data[SIZE]; 8: cout<<endl<<”8: cout<<endl<<” 请输入”请输入” <<SIZE<<”<<SIZE<<” 个整数:”个整数:”
;; 9: int m;9: int m;10: for(m=0;m<SIZE;m++) cin>>data[m]; 10: for(m=0;m<SIZE;m++) cin>>data[m]; 11: int j=0; 11: int j=0; 12: for(int i=1;i<SIZE;i++) 12: for(int i=1;i<SIZE;i++) 13: if(data[i]<data[j]) j=i; 13: if(data[i]<data[j]) j=i; 14: if(j>0){ 14: if(j>0){ 15: int k=data[0]; 15: int k=data[0]; 16: data[0]=data[j];16: data[0]=data[j];17: data[j]=k;17: data[j]=k;18: }18: }19: cout<<endl; 19: cout<<endl; 20: for(m=0;m<SIZE;m++)cout<<data[m]<<' ';20: for(m=0;m<SIZE;m++)cout<<data[m]<<' ';21:}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:}
457
7833-593
12
23934
j i
[0][1][2][3][4][5][6][7][8][9]
•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 以内的所有质数。• 质数(素数)指除质数(素数)指除 11 和它本身以和它本身以外外 不能被别的数整除的整数; 不能被别的数整除的整数;• 最小的质数是最小的质数是 22 ,其余的质数都,其余的质数都是是 奇数; 奇数;• 质数序列为:质数序列为: 2 3 5 7 11 13 17……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()5:void main() 6:{6:{ 7: bool p[SIZE];7: bool p[SIZE]; 8: cout<<SIZE<<"8: cout<<SIZE<<" 以内的质数有:以内的质数有: 2"; 2"; 9: int i;9: int i;10: for(i=3;i<SIZE;i+=2)p[i]=true;10: for(i=3;i<SIZE;i+=2)p[i]=true;11: for(i=3;i<SIZE;i+=2) 11: for(i=3;i<SIZE;i+=2) 12: if(p[i]){ 12: if(p[i]){ 13: cout<<' '<<i; 13: cout<<' '<<i; 15: for(int j=i+i+i;j<SIZE; 15: for(int j=i+i+i;j<SIZE; j+=i+i) p[j]=false; j+=i+i) p[j]=false;
16: }16: }17:}17:}
多维数组的概念 依据元素的不同排列方式,数组可分为一维数组、二维数组、三维数组等等。 二维数组可以看成是这样的一维数组:它的所有元素都是规格相同的一维数组;三维数组可以看成是这样的一维数组:它的所有元素都是规格相同的二维数组;……
二维数组的定义和初始化 ..
格式:类型修饰符 数组名 [ 行数 ][ 列数 ]类型修饰符 数组名 [ ][ 列数 ]={ 初值表 } ;
二维数组的定义和初始化 ..• float d[4][5];
0 1 2 3 40
1
2
3
二维数组的定义和初始化 ..• int num[][3] ={{1,3,5},{0},{2,4,6}};
0 1 20 1 3 5
1 0 0 0
2 2 4 6
二维数组的定义和初始化 ..• int a[5][3]={{1,3},{5,0},{2,4,6}};
0 1 20 1 3 01 5 0 02 2 4 63 0 0 04 0 0 0
二维数组的定义和初始化 ..• int b[5][3]={1,3,5,0,2,4,6};
0 1 20 1 3 51 0 2 42 6 0 03 0 0 04 0 0 0
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的整数
矩阵,然后将之转置并显示这个转置后的矩阵。
二维数组应用举例 ..
方法:以主对角线为对称轴,交换所有对称点元素。
25242322212019181716151413121110987654321
25201510524191494231813832217127221161161
二维数组应用举例 ..• 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: //13: // 转置矩阵转置矩阵14: for(i=0;i<SIZE-1;i++) 14: for(i=0;i<SIZE-1;i++) 15: for(j=i+1;j<SIZE;j++){15: for(j=i+1;j<SIZE;j++){16: int d=data[i][j]; 16: int d=data[i][j]; 17: data[i][j]=data[j][i];17: data[i][j]=data[j][i];18: data[j][i]=d;18: data[j][i]=d;19: }19: }20: 20: 21: //21: // 输出转置后的矩阵输出转置后的矩阵22: for(i=0;i<SIZE;i++){22: for(i=0;i<SIZE;i++){23: cout<<endl;23: cout<<endl;24: for(j=0;j<SIZE;j++) 24: for(j=0;j<SIZE;j++) cout<<setw(8)<<data[i][j] cout<<setw(8)<<data[i][j];;25: }25: }26: }26: }
二维数组应用举例 ..
for(i=0;i<SIZE-1;i++)for(i=0;i<SIZE-1;i++)for(j=i+1;j<SIZE;j++){for(j=i+1;j<SIZE;j++){ int d=data[i][j];int d=data[i][j];data[i][j]=data[j][i];data[i][j]=data[j][i]; data[j][i]=d;}data[j][i]=d;}
25242322212019181716151413121110987654321
25201510524191494231813832217127221161161
二维数组应用举例 ..• 例 4.7 :计算如下所示两个矩阵的乘积:
1372661709333534510180250651325
13222918271120532
二维数组应用举例 ..• 关于矩阵乘法的常识:1.1. 第一个矩阵的列数必须等于第二个矩第一个矩阵的列数必须等于第二个矩阵的行数;一个 阵的行数;一个 m m 行 行 n n 列矩阵乘列矩阵乘以一个 以一个 n n 行 行 p p 列矩阵,其结果是列矩阵,其结果是一个一个 m m 行 行 p p 列的矩阵。列的矩阵。2.2. 若矩阵 若矩阵 A A 乘以矩阵 乘以矩阵 BB ,则结果,则结果矩阵 矩阵 C C 中的每个元素须按下面的中的每个元素须按下面的公式计算:公式计算:
n
kjkkiji bac
1,,,
二维数组应用举例 ..
• c2,4=12*0+(-1)*10+27*9+8*(-37)
=0–10+243-296=-63
1372661709333534510180250651325
13222918271120532
二维数组应用举例 .. 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://15:// 按先行后列的顺序扫描按先行后列的顺序扫描 CC 的所有元素的所有元素16: for(i=0;i<3;i++) 16: for(i=0;i<3;i++) 17: for(j=0;j<5;j++)17: for(j=0;j<5;j++)18://18:// 计算计算 cci,ji,j 的值的值 (A(A 的第的第 ii 行和行和 BB 的第的第 jj 列的列的内积内积 ))19: for(int k=0;k<4;k++) 19: for(int k=0;k<4;k++)
C[i][j]+=A[i][k]*B[k][j]; C[i][j]+=A[i][k]*B[k][j];20: 20: 21://21:// 下面的二重循环输出的结果——矩阵下面的二重循环输出的结果——矩阵 CC 的内的内容容22: for(int i=0;i<3;i++){22: for(int i=0;i<3;i++){23: cout<<endl;23: cout<<endl;24: for(int j=0;j<5;j++) 24: for(int j=0;j<5;j++)
cout<<setw(5)<<C[i][j]; cout<<setw(5)<<C[i][j];25: }25: }26:}26:}
二维数组应用举例 ..
15://15://按先行后列的顺序扫描按先行后列的顺序扫描 CC的所有元素的所有元素16: for(i=0;i<3;i++) 16: for(i=0;i<3;i++) 17: for(j=0;j<5;j++)17: for(j=0;j<5;j++)18://18://计算计算 cci,ji,j的值的值 (A(A的第的第 ii行和行和 BB的第的第 jj列的内积列的内积 ))19: for(int k=0;k<4;k++) 19: for(int k=0;k<4;k++) C[i][j]+=A[i][k]*B[k][j]; C[i][j]+=A[i][k]*B[k][j];
1372661709333534510180250651325
13222918271120532
字符数组与字符串 ..1. 字符串常量以双引号括起来的字符序列表
示,结束符字符串是以 '\0' 结尾的字符序列, '\0' 称为字符串的结束符。
2. 结束符并不显式地表示出来,如"C++ 程序设计 ""First line\nSecond line"
字符数组与字符串 ..3. 字符串中字符的个数称为字符串的长度(西文字符,不包括结束符);如 "ABCD" 的长度为 4"C++ 程序设计 " 的长度为 11"First line\nSecond line" 的长度为 22
字符串实际占用的空间字节数比它的长字符串实际占用的空间字节数比它的长度值多度值多 11 。。
字符数组与字符串 ..4. 可以用字符数组存储字符串,例如要将字符串 "A string" 存储在字符数组 S 中:char s[]={'A',' ','s','t', '
r','i','n','g'};// 错误char s[]={'A',' ','s','t', '
r','i','n','g','\0'}; // 正确
字符数组与字符串 ..5. 对于存储字符串的数组的初始化, C++提供了一种更简便的不易出错方法:char s[]="A string";
6.6.如果这样的字符数组在程序中有可能如果这样的字符数组在程序中有可能改而存放别的字符串,应充分估计所改而存放别的字符串,应充分估计所需的最大空间,例如:需的最大空间,例如: char s[80]="A string"; char s[80]="A string";
字符数组与字符串 ..7. 要为字符数组赋值,使它改而存放另一个字符串,可以用赋值语句: S="XYZ"; // 错误 S[]="XYZ"; // 错误 S[0]='X'; // 以下正确, S[1]='Y'; S[2]='Z'; S[3]='\0';
更好的赋值方法是使用更好的赋值方法是使用 strcpystrcpy 函数函数
字符数组与字符串 ..8. 用于存放字符串的一维字符数组可以看成是字符串变量,从而可将存放于其中的字符串作为一个整体来处理;此种情况下数组名可以像简单变量那样单独使用(即不使用下标)。例如: char name[]="Smith"; cout<<"I am "<<name <<'.';将显示输出: I am Smith.
字符数组与字符串 ..9. 同理,二维字符数组就可视作存放字符串的一维字符串数组。例如:char WD[][4]={"Sun","Mon","Tue","Wed", "Thu","Fri","Sat"};cout<<endl<<WD[4]; 将显示输出: Thu
字符串的主要操作 ..1.求字符串长度调用格式: strlen( 字符串 )功能:计算并返回 字符串 的长度例如:char h[50]="How long?";cout<<strlen(h)<<' ' <<strlen("How long?");将输出: 9 9
字符串的主要操作 ..2. 字符串复制
调用格式: strcpy( 字符串变量 , 字符串 )功能:将 字符串 复制到 字符串变量 中,该变量中原有内容被覆盖。函数以 字符串变量 作为它的返回值。
字符串的主要操作 ..• 例如:char s[]=”12345”;
cout<<s<<’ ’;
cout<<strcpy(s,”ABCD”)<<’ ’;
cout<<s;
的输出是:12345 ABCD ABCD
字符串的主要操作 ..3. 字符串连接
调用格式: strcat( 字符串变量 , 字符串 )
功能:将 字符串 复制到字符串变量 中原有字符串的后面,形成连接效果。函数以字符串变量 作为它的返回值。
字符串的主要操作 ..• 例如:char s[]=”xyz”;
cout<<s<<’ ’;
cout<<strcat(s,”ABC”)<<’ ’;
cout<<s;
的输出是:xyz xyzABC xyzABC
字符串的主要操作 ..4. 字符串比较调用格式: strcmp( 字符串 1, 字符串 2)功能:把 字符串 1 和 字符串 2 这两字符串进行比较,通过一整数返回比较结果:
==0 :表明两字符串相等;>0 :表明 字符串 1 大于 字符串 2<0 :表明 字符串 1 小于 字符串 2
字符串的主要操作 ..• 例如:
if(!strcmp(“ABCD”,”abcd”)) cout<<” 相等” ; else cout<<” 不相等” ;的输出是:不相等
字符串的主要操作 ..5. 求子串位置
调用格式: strstr( 字符串 , 子串 );
功能:在 字符串 中寻找与 子串 相同的子串,如找到,返回该 字符串 的从子串起始处开始的后半部分,否则返回一空字符串。
字符串的主要操作 ..• 例如:
char s[]="abcdefghi"; cout<<s[3]<<' '
<<strstr(s,"def");
的输出是:d defghi
字符串的主要操作 ..
6.字符串输出调用格式: cout<< 字符串功能:显示输出 字符串
7.字符串输入调用格式 1 : cin>> 字符串变量功能:输入一个无空白字符的字符串
字符串的主要操作 ..• 例如: char s1[50],s2[50]; cin>>s1>>s2;此时若键入 ABCD 123XYZ WTR则:——输入到 s1 中的字符串是 "ABCD" ;——输入到 s2 中的字符串是 "123XYZ"
字符串的主要操作 ..• (字符串输入)• 调用格式 2 :cin.getline( 字符串变量 , 变量大小 )
功能:从键盘输入一个以 Enter键标志结束的字符串。
字符串的主要操作 ..• 例如: char s[81]; cin.getline(s,81);此时若键入 ABCD 123XYZ WTR则输入到 s 中的字符串是:" ABCD 123XYZ WTR"
字符串应用举例 ..• 例 4.8 :输入一字符串,将其中所
有的小写字母换为大写字母,大写字母换为小写字母,然后显示输出转换后的字符串。
字符串应用举例 ..• 1:#include<iostream.h>• 2:#include<ctype.h>• 3:void main()• 4:{ • 5: char s[81];• 6: cin.getline(s,81);• 7: for(int i=0;s[i];i++)• 8: s[i]=( islower(s[i])? toupper(s[i]) : tolower(s[i]) );
• 9: cout<<s;• 10:}
字符串应用举例 ..• 例 4.9 :按行输入字符串,从中摘出词并建立词表。当词表中的词满 20 个或发现名为 QUIT 的词时,显示输出词表,程序结束。词表中不得有重复的词,每个词的长度不超过 10 。“词”的含义:字符串中任意的不含空白字符的字符序列。
字符串的主要操作 ..• 1:#include<iostream.h>• 2:#include<string.h>• 3:void main()• 4:{• 5: char s[11],dict[20][11];• 6: int i=0,j; • 7: while(i<20){ • 8: cin>>s; • 9: if(!strcmp(s,"QUIT")) break;
• 10: for(j=0;j<i;j++) • 11: if(!strcmp(s,dict[j])) break;
7: while(i<20){ 7: while(i<20){ 8: cin>>s; 8: cin>>s; 9: if(!strcmp(s,"QUIT")) break;9: if(!strcmp(s,"QUIT")) break;10: for(j=0;j<i;j++) 10: for(j=0;j<i;j++) 11: if(!strcmp(s,dict[j])) break;11: if(!strcmp(s,dict[j])) break;12: if(j==i){ 12: if(j==i){ 13: strcpy(dict[i],s); 13: strcpy(dict[i],s); 14: i=i+1; 14: i=i+1; 15: }15: }16: }16: }17: for(j=0;j<i;j++) 17: for(j=0;j<i;j++)
cout<<dict[j]<<endl; cout<<dict[j]<<endl; 18:}18:}
C++ 语言程序设计数组讲完再见