260 likes | 427 Views
C++ 面对对象程序设计. 授课老师 :. 第 4 章 数组. 本章要点 4.1 一维数组 4.2 二维数组 4.3 字符数组. 本章要点 一维数组的定义和初始化及应用 二维数组的定义和初始化及应用 字符数组的定义和初始化及应用. 4.1 一维数组. 4.1.1 一维数组的定义 一维数组的声明格式为: 数据类型 数组名[常量表达式]; 4.1.2 一维数组的初始化 ( 1 )给数组的所有元素赋初值。 ( 2 )给数组的部分元素赋初值。 ( 3 )当把数组定义为全局变量或静态变量时,所有数组元素的初值均为 0 ;.
E N D
C++ 面对对象程序设计 授课老师:
第4章 数组 • 本章要点 • 4.1 一维数组 • 4.2 二维数组 • 4.3 字符数组
本章要点 • 一维数组的定义和初始化及应用 • 二维数组的定义和初始化及应用 • 字符数组的定义和初始化及应用
4.1 一维数组 • 4.1.1 一维数组的定义 • 一维数组的声明格式为: • 数据类型 数组名[常量表达式]; • 4.1.2一维数组的初始化 • (1)给数组的所有元素赋初值。 • (2)给数组的部分元素赋初值。 • (3)当把数组定义为全局变量或静态变量时,所有数组元素的初值均为0;
4.1.3一维数组元素的访问 • 通过变量定义语句定义了一个数组后,用户便可以随时使用其中的任何元素。数组元素的使用是通过下标运算符[]指明和访问的,其中运算符左边为数组名,中间为下标。使用数组时,只能分别对数组的各个元素进行操作。数组要先定义后使用,数组元素的访问格式: • 数组元素的访问格式: • 数组名[下标] • 例如: • int a[10];//声明数组a • a[0]=6;//将整数6存入数组a的第1个元素中 • a[5]=7;//将整数7存入数组a的第6个元素中 • couta[5];//输出数组a的第6个元素 • int x; • x=a[5];//将数组a的第6个元素存入变量x中
4.1.4一维数组应用示例 • 将数据1~10赋给10个数组元素,然后按倒序输出来。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" void main() { int i ,a[10]; for (i=0; i<10; i++) a[i]=i+1; for (i=0; i<10; i++) cout<<a[9-i]<<" "; cout<<endl; getchar(); } • 运行结果如下: • 10 9 8 7 6 5 4 3 2 1
找出数组中的最大数。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" void main() { int a[8]={25, 64, 38, 40, 75, 66, 38, 54}; int max=a[0]; for (int i=1; i<8; i++) if (a[i]>max) max=a[i]; cout<<"max:"<<max<<endl; getchar(); }
设计一个数组,使得它从第三个元素开始每个元素值均等于它前两个元素值之和(设数组前两个元素值为1和2)设计一个数组,使得它从第三个元素开始每个元素值均等于它前两个元素值之和(设数组前两个元素值为1和2) #include "stdafx.h" #include "stdio.h" #include "iostream.h" const int M=10; void main() { int a[M+1]; a[0]=1; a[1]=2; int i; for (i=2; i<=M; i++) a[i]=a[i-1]+a[i-2]; for (i=0; i<M; i++) cout<<a[i]<<" "; cout<<a[M]<<endl; getchar(); }
4.2二维数组 • 4.2.1二维数组定义 • 二维数组的声明格式: • 数据类型 数组名[常量表达式1][常量表达式2]; • 4.2.2二维数组初始化 • 1.给数组的所有元素赋初值 • 给数组的所有元素赋初值的方法有2种: • (1)按行的顺序,将每一行元素的初值放在一个用花括号括起来的、各初值间用逗号分开的序列中,用花括号括起来的序列间用逗号分隔,全部初值再用一个花括号括起来。 • (2)将所有初值放在一个花括号括起来的序列中,按数组排列的顺序给各元素赋初值。 • 2.给数组的部分元素赋初值 • 给数组的部分元素赋初值的方法与给数组的所有元素赋初值的方法类似
4.2.3二维数组元素的访问 • 访问二维数组元素的形式为: • 数组名[下标1][下标2] • 例如: • int a[2][3];//声明二维数组 • int x; • a[1][2]=3;//将3存入数组a的第2行第3列 • x=a[1][2];//将数组a的第2行第3列元素的值赋给变量x • couta[0][1];//输出数组的第1行第2列的元素
4.2.4二维数组应用示例 #include "stdafx.h" #include "stdio.h" #include "iostream.h" #include "iomanip.h" const int M=3, N=4; void main() { int a[M][N]={{7, 5, 14, 3},{6, 20, 7, 8},{14, 6, 9, 18}}; int i, j; for (i=0; i<M; i++) { for (j=0; j<N; j++) cout<<setw(5)<<a[i][j]; cout<<endl; } cout<<endl; getchar(); }
说明 • 该程序首先定义了一个元素类型为int的二维数组a[M][N],并对它进行了初始化;接着通过双重for循环输出每一个元素的值,其中外循环变量i控制行下标从小到大依次变化,内循环变量j控制列下标从小到大依次变化,每输出一个元素值占用显示窗口的5个字符宽度,当同一行元素(即行下标值相同的元素)输出完毕后,将输出一个换行符,以便下一行元素在显示窗口另起一行显示出来。该程序的运行结果为: • 7 5 14 3 • 6 20 7 8 • 14 6 9 18
输入四个学生、五门课程的成绩,分别存放在4×6矩阵的前5列上,计算每个学生的平均成绩后,存放在该数组最后一列的对应行上。输入四个学生、五门课程的成绩,分别存放在4×6矩阵的前5列上,计算每个学生的平均成绩后,存放在该数组最后一列的对应行上。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" #include "iomanip.h" void main() { const int M=4; const int N=6; float a[M][N], sum; int i, j; cout<<endl<<"请输入四个学生五门课程的成绩:\n"; for (i=0; i<M; i++) for (j=0; j<N-1; j++) cin>>a[i][j];
for (i=0; i<M; i++) { sum=0; for (j=0; j<N-1; j++) sum=sum+a[i][j]; a[i][N-1]=sum/(N-1); } cout<<"\n输出四个学生五门课程的成绩和均分:\n"; for (i=0; i<M; i++) { for (j=0; j<N; j++) cout<<setw(6)/*<<setiosflags(ios:fixed)<<setprecision(1)*/<<a[i][j]; cout<<endl; } cout<<endl; getchar(); }
运行情况是: • 请输入四个学生五门课程的成绩: • 78 86 68 82 99<Enter> • 97 82 88 94 75<Enter> • 89 79 99 84 56<Enter> • 85 78 68 57 90<Enter> • 输出四个学生五门课程的成绩和均分: • 78 86 68 82 99 82.6 • 97 82 88 94 75 87.2 • 89 79 99 84 56 81.4 • 85 78 68 57 90 75.6
有一个3×4的矩阵,要求找到并输出其中最小值的元素以及其所在的行号和列号。有一个3×4的矩阵,要求找到并输出其中最小值的元素以及其所在的行号和列号。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" void main() { int a[3][4]={{8, 2, 10, -5},{13, 6, 4, 7},{20, 5, -2, 1}}; int i, j, min, row=0, col=0; min=a[0][0]; for (i=0; i<3; i++) for (j=0; j<4; j++) if (a[i][j]<min) { min=a[i][j]; row=i; col=j; } cout<<"min="<<min<<", rwo="<<row<<", col="<<col<<endl; getchar(); } • 运行结果为: • min=-5,row=0,col=3
4.3字符数组 • 4.3.1字符数组的定义和初始化 • 初始化字符数组可用下列形式:
4.3.2字符串和字符串结束标志 • 在C++中,为了判断字符串是否结束,系统自动在字符串的末尾加上一个字符‘\0’作为字符串的结束标志。 • 4.3.3字符数组的输入和输出 • 4.3.4字符串处理函数 • 1.求字符串长度 • 函数原型:int strlen(const char s[]); • 2.字符串拷贝 • 函数原型:char*strcpy(char*dest,const char*src); • 3.字符串连接 • 函数原型:char*strcat(char*dest,const char*src); • 4.字符串比较 • 函数原型:int strcmp(const char*s1,const char*s2); • 5.从字符串中查找字符 • 函数原型:char*strchr(const char*s,int c); • 6.从字符串中逆序查找字符 • 函数原型:char*strrchr(const char*s,int c); • 7.从字符串中查找子串 • 函数原型:char* strstr(const char*s1,const char*s2);
4.3.5字符数组应用示例 输入长度不超过100的字符串,计算并输出该字符串的长度。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" void main() { char str[100]=" "; int l=0; cout<<"请输入一个字符串:"<<endl; cin>>str; int i=0; while (str[i]!='\0') { l++; i++; } cout<<"字符串的长度:"<<l<<endl; getchar(); } 程序执行结果如下: 请输入一个字符串: • I love China<Enter> • 字符串的长度:10
编写程序将字符数组str2中的字符全部复制到字符数组str1中,要求不用strcpy函数。编写程序将字符数组str2中的字符全部复制到字符数组str1中,要求不用strcpy函数。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" void main() { int i; char str1[20], str2[20]; cout<<"请输入字符串:\n"; cin>>str2; for (i=0; str2[i] != '\0'; i++) str1[i]=str2[i]; str1[i]='\0'; cout<<"输出拷贝后的字符串:\n"<<str1<<endl; getchar(); }
运行结果为: • 请输入字符串: • How are you<Enter> • 输出拷贝后的字符串: • How are you
编一程序,首先输入10个字符串到一个二维字符数组中,接着输入一个待查的字符串,然后从二维字符数组中查找统计出含有待查字符串的个数。编一程序,首先输入10个字符串到一个二维字符数组中,接着输入一个待查的字符串,然后从二维字符数组中查找统计出含有待查字符串的个数。 #include "stdafx.h" #include "stdio.h" #include "iostream.h" #include "string.h" void main() { char a[10][30]={" "}; //用于10个字符串,假设每个串的长度小于30 char s[30]; //存储待查的字符串 int i, k=0; cout<<"输入10个字符串"<<endl;
for (i=0; i<10; i++) cin>>a[i]; cout<<"输入一个待查的字符串:"<<endl; cin>>s; for (i=0; i<10; i++) if (strcmp(a[i], s) == 0) k++; cout<<"字符串个数:"<<k<<endl; getchar(); } • 程序执行结果: • abc def def abc abc ghj kuyk juy abc gfd <Enter> • 输入一个待查的字符串: • abc<Enter> • 字符串个数:4
从键盘上输入4个字符串,输出其中最大者 #include "stdafx.h" #include "stdio.h" #include "iostream.h" #include "string.h" void main() { int i; char max[15], str[4][15]; cout<<"输入第0行字符串:"<<endl; cin.getline(str[0],15); strcpy(max, str[0]); cout<<"输入第1~3行字符串:"<<endl; for (i=0; i<3; i++) { cin.getline(str[i], 15); if (strcmp(max, str[i])<0) strcpy(max,str[i]); } cout<<"最大的串是:"<<max<<endl; getchar(); }
运行结果 • 运行结果如下: • 输入第0行字符串: • From<Enter> • 输入第1~3行字符串: • goto<Enter> • girl<Enter> • first<Enter> • 最大的串是: • goto
本章小结 • 1.数组是一种组合数据类型,它由同一种数据类型、固定数目的元素所组成。数组中的每个元素按下标标记访问的。 • 2.数组在内存中占用一块连续的存储空间,占用内存空间的大小等于每个元素的类型长度与数组中元素个数的乘积。 • 3.一维数组是数组的基本形式,二维数组是一维数组的推广,即一维数组中的每个元素仍为一维数组时就构成了二维数组。同理,三维数组是二维数组的推广,依次类推。 • 4.在C++中,字符串不作为单独的数据类型而存在,而是作为一种特殊的字符数组,每个字符串都隐含以空字符作为结束符。 • 5.对字符串进行赋值、比较、连接等操作都是通过相应字符串函数的功能实现的,对字符串的输入、输出操作与同简单类型的数据一样可直接进行。 • 6.数组作为一种组合数据类型有着广泛的应用,如可以利用数组进行数值计算、数据统计、数据排序、数据查找等。