《四章节数组和字符串》由会员分享,可在线阅读,更多相关《四章节数组和字符串(36页珍藏版)》请在金锄头文库上搜索。
1、1第四章第四章 数组和字符串数组和字符串2教学目标l(1) 掌握数组的定义、初始化和引用方法掌握数组的定义、初始化和引用方法;l(2) 了了解解数数组组在在数数值值计计算算、数数据据统统计计、排排序序和和数数据据检索方面的应用检索方面的应用;l(3) 了了解解字字符符串串与与字字符符数数组组的的概概念念,会会对对于于字字符符串串进行整体输入输出进行整体输入输出。3基本内容 l4.1 数组数组l4.1.1 一维数组l4.1.2 二维数组l4.2 字符数组字符数组l4.2.1 字符数组的定义、初始化和输入与输出l4.2.2 字符串处理函数4构造数据类型构造数据类型l问题的引出:问题的引出:l实际应
2、用的程序设计中,只用几个变量的情况是极少的;实际应用的程序设计中,只用几个变量的情况是极少的;更多的情况是处理大批量的相同类型或不同类型的数据。更多的情况是处理大批量的相同类型或不同类型的数据。相同类型数据举例:统计全校相同类型数据举例:统计全校15,000学生英语学生英语4级统考成绩;级统考成绩;不同类型数据举例:管理全校不同类型数据举例:管理全校15,000学生学籍信息记录,每学生学籍信息记录,每条记录信息包括:姓名、学号、出生日期、班级、各科成绩等。条记录信息包括:姓名、学号、出生日期、班级、各科成绩等。l用什么样的数据结构来描述这类应用更简洁?用什么样的数据结构来描述这类应用更简洁?5
3、4.1 数组l数组:数组: 具有相同类型的数据的集合。具有相同类型的数据的集合。l数组用数组名来标识。数组用数组名来标识。l其中的每个变量其中的每个变量(数组元素数组元素)通过该变量在数组中的相对位置通过该变量在数组中的相对位置(下标下标)来引用。来引用。l特点:特点:l常用于处理大批量数据;常用于处理大批量数据;l数据特点:存在内在联系;数据特点:存在内在联系;l数组数组具有相同数据类型的变量集合;具有相同数据类型的变量集合;l这些变量都有相同名字,但下标不同;这些变量都有相同名字,但下标不同;l称这些变量为数组元素;称这些变量为数组元素;l只有一个下标只有一个下标一维数组;一维数组;l有两
4、个下标有两个下标二维数组。二维数组。6数组说明l与变量相同。与变量相同。数据类型数据类型 数组名数组名整型常数表达式整型常数表达式,.l例:例:lint array10; / 说明了一个有说明了一个有10个元素的整型数组个元素的整型数组ldouble matrix2020; / 说明了一个说明了一个20行行20列的浮点型矩阵列的浮点型矩阵l特点:特点:l数组名定名规则和变量名相同,遵循标识符定名规则。数组名定名规则和变量名相同,遵循标识符定名规则。l数组名后是用方括号起来的常量表达式,不能用圆括号数组名后是用方括号起来的常量表达式,不能用圆括号l错误用法:错误用法:int a(10);l方括号
5、中的下标表示元素在数组中的位置。下标从方括号中的下标表示元素在数组中的位置。下标从0开始,开始,必须必须是整型常量。是整型常量。7(1)一维数组存储结构l逻辑结构:逻辑结构:l由一串数据构成的向量表,每个元素的下标值确定了各元素在此由一串数据构成的向量表,每个元素的下标值确定了各元素在此数据表中的位置。数据表中的位置。lA5排序次序为:排序次序为: A0,A1,A2,A3,A4l存贮结构:存贮结构:l数组元素存放为一片连续的存储单元,其元素在内存中的存放顺数组元素存放为一片连续的存储单元,其元素在内存中的存放顺序与逻辑结构是一致的;即所谓序与逻辑结构是一致的;即所谓“逻辑上相邻,物理上也相邻逻
6、辑上相邻,物理上也相邻”。lA5的存储结构为:的存储结构为:A0A1A2A3 A48一维数组的初始化一维数组的初始化l 在定义数组时对数组元素赋以初值。在定义数组时对数组元素赋以初值。l例如例如:int a10=0,1,2,3,4,5,6,7,8,9;l如果想使一个数组中全部元素值为如果想使一个数组中全部元素值为0,可以写成,可以写成int a10=0,0,0,0,0,0,0,0,0,0;l不能写成不能写成 int a10=0*10;即不能给数组整体赋初值(即不能给数组整体赋初值(C+不允许对一个数组进行聚集操作不允许对一个数组进行聚集操作 )。)。l 在对全部数组元素赋初值时,可以不指定数组
7、长度。在对全部数组元素赋初值时,可以不指定数组长度。l例如例如:int a5=1,2,3,4,5;l可以写成可以写成 int a=1,2,3,4,5;l在第二种写法中,花括号中有在第二种写法中,花括号中有5个数,系统会据此自动定义个数,系统会据此自动定义a数组的数组的长度为长度为5。9例:找出一维数组中的最大数。l算法分析:算法分析:1.假设数组中第假设数组中第1个元素最大,令个元素最大,令big =array02.将将array i(0= i n)与与big进行比较,进行比较,若若array i big ,i=i+1,再执行再执行2否则,令否则,令big =array i,i=i+1,再执行
8、再执行23.循环结束,求出最大元素并输出循环结束,求出最大元素并输出big。10/ 找出一维数组中的最大数找出一维数组中的最大数#include using namespace std; int main() int array7;coutPlease input an array with seven elements: endl;for(int i=0; iarrayi;int big = array0;for(int j=0; jbig)big = arrayj;coutmax=bigmaxaijmax14#include using namespace std; int main()i
9、nt i, j, row=0, colum=0, max; int a34=1,2,3,4, 9,8,7,6, -10,10,-5,2;max=a00;for (i=0;i=2;i+)for (j=0;jmax) max=aij; row=i; colum=j;coutmax=max, row=row, colum=columname;l字符串的输出字符串的输出coutname; 194.2.2 字符串处理库函数lC/C+提供了许多字符串处理函数。使用这些函数,可提供了许多字符串处理函数。使用这些函数,可以提高字符处理的效率。以提高字符处理的效率。l字符串处理函数的说明都包含在字符串处理函数的
10、说明都包含在“cstring”头文件中头文件中,所以使用时需要添加所以使用时需要添加#include lstpcpy(): 字符串拷贝字符串拷贝;lstrcat(): 字符串连接字符串连接;lstrchr(): 在字符串中查找字符在字符串中查找字符;lstrcmp(): 字符串比较字符串比较;lstrlen(): 求字符串长度求字符串长度;lstrlwr(): 将字符串中的大写字母转换为小写字母将字符串中的大写字母转换为小写字母;lstrrev(): 反转字符串反转字符串;lstrstr(): 在字符串中查找另一个字符串在字符串中查找另一个字符串;lstrupr(): 将字符串中的小写字母转换
11、为大写字母将字符串中的小写字母转换为大写字母;l 20字符串处理函数l(1) 求字符串的长度求字符串的长度:int strlen(char s );例如例如:len = strlen(This is a sample.);执行后,变量执行后,变量len会被赋值会被赋值17。l(2) 字符串连接函数字符串连接函数 strcat(char destin , char source );l(3) 复制字符串复制字符串strcpy(char destin , char source );例如例如:char weekday11;strcpy(weekday, MONDAY);l(4) 字符串字符串比较比
12、较int strcmp(char string1 , char string2 );21例4-2:字符串复制函数和连接函数的用法#include #include using namespace std;int main()char s80;strcpy( s, Hello world from );strcat( s, strcpy );strcat( s, and );strcat( s, strcat! );coutsendl;return 0;22例4-3:简单的口令验证系统#include #include using namespace std;int main()char pwd
13、50;while(1)coutpwd;if(strcmp(pwd, welcome)cout口令不正确,请重新输入!口令不正确,请重新输入!endl;elsebreak;cout口令正确,欢迎使用,再见。口令正确,欢迎使用,再见。endl;return 0;23扩展阅读l4.3 字符串类字符串类l字符串类隶属于标准字符串类隶属于标准C+语言类库,若要在程序中使语言类库,若要在程序中使用字符串类,必须在源程序最前面包含标准用字符串类,必须在源程序最前面包含标准C+语言语言类库的头文件类库的头文件。l使用与基本数据类型使用与基本数据类型int、char等类似,定义格式为:等类似,定义格式为:str
14、ing 对象对象1, 对象对象2, ;l例如:例如: string s1, s2;/定义对象定义对象s1和和s2 string s3(Monday);/定义定义s3同时初始化同时初始化24/ 例例 4-4 字符串类的运算符操作字符串类的运算符操作#include #include using namespace std;int main()string str1(Zhang3);string str2(Li4);string str3=Wang5;string str4;/ 字符串赋值字符串赋值str4 = str1; cout str1 endl str4 endl;/ 字符串连接字符串连接
15、str4 = str2 + str3; cout str4 endl;str4 = str2 + and + str3;cout str4 = str1) cout = str1 endl;elsecout str3 str1 endl;/ 输入字符串输入字符串cout str5;cout str5 endl;return 0;运行结果:Zhang3Zhang3Li4Wang5Li4 and Wang5str3 str1请输入一个字符串: MondayMonday25上机指导l4.4 基本调试方法基本调试方法l标准数据检验标准数据检验:用若干组已知结果的标准数据对程序进行检验用若干组已知结果的
16、标准数据对程序进行检验l标准数据:要有代表性标准数据:要有代表性, 接近实际数据接近实际数据;比较简洁比较简洁, 容易对其结果的正确性进行容易对其结果的正确性进行分析;对重要的临界数据也必须进行检验。分析;对重要的临界数据也必须进行检验。 l程序跟踪程序跟踪:让程序逐句执行让程序逐句执行, 通过观察和分析执行过程中数据和流程变化来查找错误通过观察和分析执行过程中数据和流程变化来查找错误l采用跟踪调试工具采用跟踪调试工具l传统的方法:传统的方法: 在程序中直接设置断点、打印重要变量内容等来掌握程序的运在程序中直接设置断点、打印重要变量内容等来掌握程序的运行情况。行情况。l边界检查边界检查:重点检
17、查边界和特殊情况重点检查边界和特殊情况l如果程序中有由如果程序中有由if-else语句、语句、switch语句等组成的分支结构语句等组成的分支结构, 应该设计相应的数应该设计相应的数据,使得分支中的每一条路径都要通过检验据,使得分支中的每一条路径都要通过检验例如例如, while(count1000) 就应该检验就应该检验count等于等于999、1000、0 或负数等情况。或负数等情况。l简化简化:在调试时在调试时, 有时可以通过对程序进行某种简化来加快调试速度。有时可以通过对程序进行某种简化来加快调试速度。l例如减少循环次数、缩小数组规模、屏蔽次要程序段等。例如减少循环次数、缩小数组规模、
18、屏蔽次要程序段等。l 要注意简化不能太过分要注意简化不能太过分, 以致于无法代表原程序的真实情况。以致于无法代表原程序的真实情况。26应用举例l例例 4-5:使用数组方法计算斐波那挈数列问题:使用数组方法计算斐波那挈数列问题#include using namespace std;int main()int i, f24;f0=1;f1=1;/ 构造斐波那契数列构造斐波那契数列for(i=2; i24; i+)fi=fi-1+fi-2;/ 输出斐波那契数列输出斐波那契数列for(i=0; i24; i+)coutfit;coutendl;return 0;27例4-6:使用冒泡排序法编写程序,
19、可以对任意输入的10个整数进行从小到大的排序 l算法分析:算法分析:1.两两比较相邻元素两两比较相邻元素Ai和和Ai-1 (i=N-1, N-2, 2, 1, 0), 如果如果AiAi-1, 则交换它们的位置则交换它们的位置 AiAi-1; 经过经过N-1次比较次比较,将最将最小值交换到小值交换到A0的位置的位置; 2.对剩下的对剩下的N-1个元素个元素,再两两进行比再两两进行比较较,按同样规则交换它们的位置按同样规则交换它们的位置,经经过过N-2次比较次比较,将次最小值交换到将次最小值交换到A1的位置的位置;3.如法炮制如法炮制,经过经过N-1趟的趟的“冒泡处理冒泡处理”,每趟进行每趟进行N
20、-i次的比较次的比较,全部数列全部数列有序。有序。28#include using namespace std;int main()int i, j, tmp;int list10;cout 请输入待排序的整数数列:请输入待排序的整数数列:;for(i=0; ilisti;for(i=0; ii; j-)/ 每次都从最后一个元素开始比较每次都从最后一个元素开始比较if(listj-1listj)/ 如果前后顺序不符,则交如果前后顺序不符,则交换位置换位置tmp = listj-1;listj-1 = listj;listj = tmp;/ 输出排序后的数组输出排序后的数组cout 排序后的整数
21、数列为:排序后的整数数列为:;for(i=0; i10; i+)cout listi ;coutendl;return 0;29应用举例l例例 4-7:编写程序,计算两个矩阵差。:编写程序,计算两个矩阵差。30#include using namespace std;int main()const int M=3;const int N=4;double aMN=1, 2, 3, 4,5, 6, 7, 8,9, 10, 11,12;double bMN=1, 4, 7,10,2, 5, 8, 11,3, 6, 9,12;double cMN;/ 结果矩阵结果矩阵cout 矩阵矩阵a和矩阵和矩阵
22、b的差的矩阵的差的矩阵c为为: endl;/ 两个矩阵的加减是对应矩阵元素的加减两个矩阵的加减是对应矩阵元素的加减for(int i=0; iM; i=i+1)for(int j=0; jN; j=j+1)cij=aij-bij;cout cij t;cout endl;/ 每输出完成一行中所有元素后换行每输出完成一行中所有元素后换行return 0; 31应用举例l例例4-8字符串连接。字符串连接。/ 方法方法0,直接调用字符串连接函数直接调用字符串连接函数#include #include using namespace std;int main()char destination81 =
23、 abcdefghijklmnopqrstuvwxyz;char source = ABCDEFGHIJKLMNOPQRSTUVWXYZ;strcat(destination, source); / 直接调用字符串连接函数直接调用字符串连接函数cout连接后的字符串为:连接后的字符串为:destinationendl;return 0;32应用举例l例例4-8字符串连接。字符串连接。/ 方法方法1,利用字符数组的结构特点利用字符数组的结构特点#include #include using namespace std;int main()char destination81 = abcdefgh
24、ijklmnopqrstuvwxyz;char source = ABCDEFGHIJKLMNOPQRSTUVWXYZ;int i = strlen(destination);/ 求出目标字符串长度,以确定复制位置求出目标字符串长度,以确定复制位置int j = 0;while(sourcej!=0)/ 在未达到源字符串尾部前逐个字符复制在未达到源字符串尾部前逐个字符复制destinationi+ = sourcej+;destinationi = 0;/ 在目标字符串的结尾处添加结束标志在目标字符串的结尾处添加结束标志cout连接后的字符串为:连接后的字符串为:destinationendl
25、;return 0;33应用举例l例例4-9 恺撒(替换)加密法恺撒(替换)加密法l加密规则:加密规则:l将每个字母用字母表中排在其后面的第将每个字母用字母表中排在其后面的第3个字母个字母的大写形式来替换(如字母的大写形式来替换(如字母d或或D就用就用G来替换),来替换),对于字母表中最后的三个字母,可将字母表看成对于字母表中最后的三个字母,可将字母表看成是首尾衔接的(如字母是首尾衔接的(如字母y或或Y用用B来替换);字符来替换);字符串中其他非字母符号不做改变。串中其他非字母符号不做改变。l使用该方法编写一个字符串加密程序。使用该方法编写一个字符串加密程序。34/ 例例4-9:恺撒(替换)加
26、密:恺撒(替换)加密#include #include using namespace std;int main()char str50 = I love you;cout加密前的字符串是:加密前的字符串是:str= a & stri = A & stri = Z)stri = (stri+3-A)%26+A;/ 按凯撒加密法替换字母按凯撒加密法替换字母i+;cout加密后的字符串是:加密后的字符串是:strendl;return 0;35学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 你的编程能力与你在计算机上投入的时间成你的编程能力与你在计算机上投入的时间成 结结 束束 语语36