收藏 分享(赏)

Ch6-C++数组与字符串.ppt

上传人:wjmd390 文档编号:6859760 上传时间:2019-04-25 格式:PPT 页数:84 大小:2.07MB
下载 相关 举报
Ch6-C++数组与字符串.ppt_第1页
第1页 / 共84页
Ch6-C++数组与字符串.ppt_第2页
第2页 / 共84页
Ch6-C++数组与字符串.ppt_第3页
第3页 / 共84页
Ch6-C++数组与字符串.ppt_第4页
第4页 / 共84页
Ch6-C++数组与字符串.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、数组与字符串,曹迎春 ,学习目标,掌握数组的定义与使用方法,学会利用数组编写程序。 掌握数组元素的初始化方法。 掌握字符数组处理字符串的技巧。 熟悉字符串处理函数的功能及使用方法。 掌握数组作为函数参数的使用方法。,2019/4/25,2,知识点,数组:数组的定义; 一维数组: 一维数组的存储;一维数组的初始化; 二维数组: 二维数组的存储;二维数组的初始化; 字符数组; 字符串处理函数; 数组作函数参数,2019/4/25,3,数组,数组是一种集合数据类型,它由许多元素组成,每一个元素都有相同的数据类型,在内存中占用相同大小的存储单元,且在内存中连续存放。 每一个数组有一个名字,数组中的每一

2、个元素有一个序号(或称下标)表示元素在数组中的位置,可以通过下标来识别数组中的每一个元素。 数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变。,2019/4/25,4,数组举例,用数组来表示班级的分数,并把这个数组取名为MARKS。 MARKS 0 = 85; MARKS 1 = 92; MARKS 2 = 95; MARKS 3 = 88; 在给数组元素赋值之前,一定要先定义该数组: INT MARKS4;,2019/4/25,5,数组举例,定义一个家庭成员的年龄数组: INT AGE4; /定义有4个元素的数组AGE AGE0 = 35; /给每个数组元素赋值 AGE1 =

3、38; AGE2 = 6; AGE3 = 8; 某机构的雇员姓名的数组: CHAR NAMES36 = “MARY“, “JOHN“, “ALICE“;,2019/4/25,6,数组的特点,每个数组元素的数据类型相同,且可以是任何合法的数据类型; 数组可以是一维的、二维的,甚至更高维的; 数组同其它变量一样,在使用前必须定义; 数组各个元素按顺序排列,其位置由下标确定; 数组元素可以同其它变量一样使用。,2019/4/25,7,一维数组,2019/4/25,8,一维数组的定义,类型说明符 数组名常量表达式; 数组元素的个数在编译时就必须固定,且最好定义为一个常量。 例:const int NE

4、 = 100; float annual_tempNE; 各数组元素在内存中是连续存放的。 int a10;,2019/4/25,9,程序举例,#include void main(void) int a5,sum; /定义数组a和变量sum a0 = 3; a1 = 1; a2 = 7; a3 = 4; a4 = 8; sum = a0 + a1 + a2 + a3 + a4; cout“sum = “sumendl; ,2019/4/25,10,sum = 23,数组的使用,数组元素的一般引用形式为: 数组名下标表达式 数组元素的下标总是从0开始,如果一个数组有n个元素,则第一个元素的下标

5、是0,最后一个元素的下标是n-1。 数组定义和数组元素的引用形式类似,但它们含义不同。 int a5; /定义有5个元素的数组a a4 /表示数组中下标为4的元素。,2019/4/25,11,数组的使用,能使用标识符的地方,就能引用数组元素。 C+不检查引用一个数组元素时的下标值是否在数组要求的下标值范围内。但是,程序运行的结果是难以预料的。 引用数组元素时,下标超出了允许的范围,称之为下标溢出。,2019/4/25,12,程序举例,求一组学生的平均成绩。 #define num 5 /预定义num的值为5 #include void main(void) int gradenum,i,tot

6、al; float average; total = 0; printf(“Please input %d scoren“,num); for(i = 0;i num;i +) printf(“grade%d = “,i); scanf(“%d“, ,2019/4/25,13,please input 5 scores grade0 = 90 grade1 = 65 grade2 = 97 grade3 = 57 grade4 = 78 average = 77.40,程序举例,求菲波那契数列 #include void main(void) const int NUM = 20; const

7、 int COL = 5; int fNUM + 1,i; f1 = 0; f2 = 1; for(i = 3; i= NUM;i +) fi = fi - 2 + fi - 1; for(i = 1;i = NUM;i +) printf(“%10d“,fi); if(i % COL = 0) printf(“n“); ,2019/4/25,14,0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181,数组在内存中如何存储,int marks4;float marks4;,2019/4/25,15,数组在内存中如何存储,

8、char marks5 = “Mary“;,2019/4/25,16,数组在内存中如何存储,char names36 = “Mary“, “John“, “Alice“;,2019/4/25,17,一维数组应用举例,筛法求素数(只能被1和自身整除的正整数是素数)。 基本思想:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。,2019/4/25,18,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 2

9、7 28 29 30,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30,3 5 7 9 11 13 15 17 19 21 23 25 27 29,2 3 5 7 11 13 17 19 23 29,#define RANGE 200 #include void main(void) int sieveRANGE + 1; int i,j,count; for(i = 0;i = RANGE;i +) sievei = 1;/初始化 sieve0 = sieve1 = 0;/0和1不是素

10、数 count = 0; for(i = 2;i = RANGE;i +) if(sievei = 1)/i是素数 printf(“%5d“,i);/输出素数 count +; if(count % 8 = 0)/每行输出8个值 printf(“n“); for(j = i;j = RANGE; j += i) sievej = 0;/筛去i的倍数 printf(“n“); ,2019/4/25,19,2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 13

11、1 137 139 149 151 157 163 167 173 179 181 191 193 197 199,一维数组应用举例,求杨辉三角形。 所谓杨辉三角形就是二次项的系数: 1 1 2 1 2 1 1 3 3 1 1 4 6 4 1,2019/4/25,20,一维数组应用举例,杨辉三角形的性质: 每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 第n行的数字个数为n个。 第n行数字和为2n1。 每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。 将第2n+1行第1个数,跟第2n+2行第3个数、第2n+2行第5个数连成一线,这些数的和是第2n个斐波那契数。将第

12、2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数这些数之和是第2n-1个斐波那契数。 第n行的第1个数为1,第二个数为1(n-1),第三个数为1(n-1)(n-2)/2,第四个数为1(n-1)(n-2)/2(n-3)/3依此类推。,2019/4/25,21,#define LASTROW 10 #include void main(void) int yanghuiLASTROW + 1,row,col; yanghui0 = 1; printf(“%4dn“,yanghui0);/输出第一行 /由前一行生成新的一行 for(row = 1;row 0;col -) yanghui

13、col = yanghuicol + yanghuicol - 1; for(col = 0;col = row;col +) printf(“%4d“,yanghuicol);/输出一行 printf(“n“); ,22,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 1 10 45 120 210 252 210 120 45 10 1,一维数组的初始化,数组可以在定义时就给出

14、数组元素的初值,称之为初始化。初值放在一对花括号中,各初值之间用逗号隔开。初始化时可只对部分元素赋值。 int primes = 1, 2, 3, 5, 7, 11, 13; int primes10 = 1, 2, 3, 5, 7;,2019/4/25,23,程序举例,#include void main(void) int marks4 = 82,92,95,88; cout“Second element is:“marks1endl; ,2019/4/25,24,Second element is 92,二维数组,2019/4/25,25,二维数组的定义,二维数组定义的一般形式为: 类型

15、说明符 数组名常量表达式1常量表达式2;float seasonTemp34;,2019/4/25,26,二维数组的定义,C+语言把二维数组看成是一个一维数组,该一维数组的各个元素又是一个一维数组。二维数组在内存中的排列顺序:,2019/4/25,27,二维数组的初始化,二维数组的初始化可以分行进行。 float seasonTemp34 = 11.3, 28.2, 16.5, -7.1, 12.4, 27.1, 17.6, -5.7, 23.2, 33.5, 25.8, -1.3 ; 二维数组在内存中是一维的,且由各行元素顺序存放得到,初始化也可以写成: int seasonTemp34 =

16、 11.3, 28.2, 16.5, -7.1, 12.4, 27.1, 17.6, -5.7, 23.2, 33.5, 25.8, -1.3 ;,2019/4/25,28,二维数组的初始化,按行初始化能够初始化某一行中的部分元素。 int seasonTemp34 = 26, 24, 28; 定义并初始化一个二维数组时,可以省略“常量表达式1”。 int seasonTemp 4 = 26, 34, 22, 17, 24, 32, 19, 13, 28, 38, 25, 20 ; 注意:“常量表达式2“一定不能省略,否则程序编译时会出错。,2019/4/25,29,二维数组的使用,访问二维数

17、组元素可通过两个运算符,第一个运算符指定元素的行下标,第二个运算符指定元素的列下标。 程序举例: 在数组seasonTemp中查找最高温度。,2019/4/25,30,程序举例,const int rows = 3; const int columns = 4; int seasonTemprowscolumns = 26, 34, 22, 17, 24, 32, 19, 13, 28, 38, 25, 20 ; int HighestTemp (int temprowscolumns) int highest = 0; for (register i = 0; i highest) high

18、est = tempij; return highest; ,2019/4/25,31,程序举例,矩阵的转置。 矩阵的转置就是把矩阵的行和列互换。,2019/4/25,32,#include #define ROW 3 #define COL 4 void main(void) int aROWCOL,bCOLROW; int i,j; coutaij; for(i = 0;i ROW;i +) /转置 for(j = 0;j COL;j +) bji = aij; cout“Matrix b:“endl; for(i = 0;i COL;i +) /输出矩阵b for(j = 0;j ROW

19、;j +) coutbij“ “; coutendl; ,2019/4/25,33,运行结果:Please input elements of the matrix a(34) 1 2 3 4 5 6 7 8 9 10 11 12 Matrix b: 1 5 9 2 6 10 3 7 11 4 8 12,2019/4/25,34,程序举例,对于nn矩阵,可以只用一个数组,在数组中进行行列元素的互换。,2019/4/25,35,#define ROW 4 #include void main(void) int smROWROW,i,j,temp; printf(“Input elements

20、of a matrix (%d%d):n“,ROW,ROW); for(i = 0;i ROW;i +) for(j = 0;j ROW;j +) scanf(“%d“, ,2019/4/25,36,运行结果:Input elements of a matrix (44): 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 The matrix has been transposed: 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16,2019/4/25,37,程序举例,求解幻方问题。 把1放在最上一行正中间的方格中, 把下一个整数放置到

21、前一个整数的右上方, 如果到达最上一行,下一个整数放在最后一行同一列的位置; 如果到达最右端,则下一整数放在第一列的同一行的位置; 当到达的方格中已填上数值时,下一个整数就放在刚填上数值的方格的正下方。,2019/4/25,38,2019/4/25,39,#define MAX 15 #include void main(void) int m,mm,i,j,k,ni,nj; int magicMAXMAX; printf(“Enter the number you wantedn“); scanf(“%d“,2019/4/25,40,for(k = 1;k = mm;k +) magicij

22、 = k; /求右上方方格的坐标 if(i = 0) ni = m - 1;/最上一行,则下一个位置在最下一行 else ni = i - 1; if(j = m - 1) nj = 0;/最右端,则下一个位置在最左端 else nj = j + 1; /判断右上方方格是否已有数 if(magicninj = 0) /右上方无值 i = ni; j = nj; else i +;/右上方方格已填上数 for(i = 0;i m;i +) for(j = 0;j m;j +) printf(“%4d“,magicij); printf(“n“); else /m=0或m_是偶数 printf(“

23、Error in input data.n“); ,2019/4/25,41,运行结果:Enter the number you wanted 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,2019/4/25,42,字符数组,2019/4/25,43,字符数组,当数组中的元素都是由一个个字符组成时,便称之为字符数组。 C+中,用一个一维的字符数组表示字符串。数组的每一个元素保存字符串的一个字符,并附加一个空字符,表示为0,添加在字符串的末尾,以识别字符的结束。,2019/4/25,44,字符数组的输出,字

24、符串可以用printf或cout函数输出。 cout “The string s1 is “ s1 endl; printf(“The string s1 is %sn“, s1) ;,2019/4/25,45,The string s1 is example,char s110;char s1 = “example“; char s220 = “another example“,2019/4/25,46,注意:字符串的长度并不包括结尾符。,char str16 = T, h, i, s, , i, s, , a, , s, t, r, i, n, g;char c10 = C, ,P,r,o

25、,g,r,a,m;char str = T,h, i, s, , i, s, , a, , s, t, r, i, n, g;,2019/4/25,47,char str = “This is a string“;,char str = “This is a string“;,字符数组的输入,scanf cin,2019/4/25,48,用scanf函数输入字符串,scanf可以一次输入一个或多个字符串,如果一次输入多个字符串,字符串之间用逗号隔开。 char s110, s210;scanf(“%s”, s1); /输入字符串“Learn C+“scanf(“%s%s“, s1, s2);

26、/输入字符串“Learn C+“,2019/4/25,49,注意用scanf函数输入字符与输入字符串的不同。 char str1,str2; char s110,s210; scanf (“%c%c“,2019/4/25,50,用cin输入字符串,char s110;cin s1; /输入字符串“Learn C+“,2019/4/25,51,char firstname 12, surname12; cout firstname; cin surname; cout “The name entered was “ firstname “ “ surname;,char firstname 12

27、, surname12; cout firstname surname; cout “The name entered was “ firstname “ “ surname;,2019/4/25,52,字符数组应用举例,求字符串的长度 从键盘上读一个输入行并输出 把两个字符串连接起来 把一个数字字符串转换为相应的整数,2019/4/25,53,求字符串的长度,#define MAXLEN 80 #include void main(void) char strMAXLEN+1; int len; printf(“Input a string:”); scanf(“%s”,str); len

28、= 0; while(strlen != 0) len+; printf(“The length of this string is %dn“,len); ,2019/4/25,54,Input a string:world The length of this string is 5,从键盘上读一个输入行并输出,#define MAXLEN 80 #include void main(void) char lineMAXLEN + 1,c; int i; i = 0; while(c = getchar() != n) linei + = c; linei = 0; printf(“%sn“

29、,line); ,2019/4/25,55,How are you How are you,连接两个字符串,#define LENGTH 40 #include void main(void) char str1LENGTH + 1,str2LENGTH + 1; char result2 * LENGTH + 1; int len1,len2; coutstr1; coutstr2;,2019/4/25,56,len1 = 0; while(str1len1 != 0) resultlen1 = str1len1; len1 +; len2 = 0; while(str2len2 != 0)

30、 resultlen1 = str2len2; len1 +; len2 +; resultlen1 = 0; coutresultendl; ,2019/4/25,57,运行该程序并输入: Input the first string: Good Input the second string: bye 运行结果为: Goodbye,转换数字字符串为相应的整数,#include #include void main(void) char s10; int i,n,sign; couts; i = 0; sign = 1; if(si = + | si = -)/符号 sign = (si +

31、 = +)?1:-1; for(n = 0;si = 0 ,58,运行该程序并输入: Input a numberic string 123 运行结果为: 123,字符串处理函数,头文件string.h包含所有字符串处理函数的说明。 常用的字符串处理函数: strcpy(char destination, const char source); strncpy(char destination, const char source, int numchars); strcat(char target, const char source); strncat(char target, const

32、 char source, int numchars); int strcmp(const char firststring, const char secondstring); strlen( const char string );,2019/4/25,59,strcpy,函数原型:strcpy(char destination, const char source); 函数功能:将字符串source拷贝到字符串destination中。,2019/4/25,60,#include #include void main(void) char str110 = “Nanjing “; cha

33、r str210 = “Computer“; coutstrcpy(str1,str2)endl; ,2019/4/25,61,注意:在定义数组时,destination的字符串长度必须大于或等于source的字符串长度。不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。,Computer,strncpy,函数原型:strncpy(char destination, const char source, int numchars); 函数功能:将字符串source中前numchars个字符拷贝到字符串destination中。,2019/4/25,62,#include #incl

34、ude void main(void) char str110 = “Nanjing“; char str210 = “Computer“; coutstrncpy(str1,str2,3)endl; ,2019/4/25,63,Comjing,函数原型:strcat(char target, const char source); 函数功能:将字符串source接到字符串target的后面。,2019/4/25,64,Error!,#include #include void main(void) char str1 = “Nanjing “; char str2 = “Computer“;

35、 coutstrcat(str1,str2)endl; ,2019/4/25,65,Nanjing Computer,strncat,函数原型:strncat(char target, const char source, int numchars); 函数功能:将字符串source的前numchars个字符接到字符串target的后面。,2019/4/25,66,Error!,#include #include void main(void) char str1 = “Tsinghua “; char str2 = “Computer“; coutstrcpy(str1,str2)endl;

36、 运行结果: Tsinghua Com,2019/4/25,67,strcmp,函数原型:int strcmp(const char firststring, const char secondstring); 函数功能:比较两个字符串firststring和secondstring。,2019/4/25,68,#include #include void main(void) char buf1 = “aaa“; char buf2 = “bbb“; char buf3 = “ccc“; int ptr; ptr = strcmp(buf2,buf1); if(ptr 0) cout 0)

37、cout“Buffer 2 is greater than buffer 3“endl; else cout“Buffer 2 is less than buffer 3“endl; ,2019/4/25,69,Buffer 2 is less than buffer 1 Buffer 2 is greater than buffer 3,strlen,函数原型:strlen( const char string ); 函数功能:统计字符串string中字符的个数。,2019/4/25,70,#include #include void main(void) char str = “Nanji

38、ng Computer“; cout“The length of the string is “strlen(str)endl; ,2019/4/25,71,The length of the string is 16,注意:strlen函数的功能是计算字符串的实际长度,不包括0在内。另外,strlen函数也可以直接测试字符串常量的长度。,数组作函数参数,数组名可以作函数的实参和形参,数组元素只能作函数实参。 当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址。 调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递。 数组参数的引用传递,除传送数组名外,调用函数

39、还必须通知被调函数:数组有多少个元素。类型说明符 函数名(数组参数, 数组元素个数),2019/4/25,72,注意:数组参数并不指定数组元素的个数,即中是空的,没有数字。,程序举例,#include int add(int x, int n) return (x + n); void main() int a10 = 9, 8, 7, 6, 5, 4, 3, 2, 1, 0; int i; for( i = 0; i10; i+) ai=add(ai, i); /数组元素作函数参数 for(i = 0; i10; i+) cout ai endl; ,2019/4/25,73,程序举例,do

40、uble mean(double data_array, int numelements) double sum = 0.0; for(int i=0; inumelements; i+) sum += data_arrayi; return sum / numelements; ,2019/4/25,74,int main() double heights100; double h; int n = 0; cout h; while(h 0.0) heightsn = h; n+; cin h; double m = mean(heights, n); cout “The mean is “

41、 m endl; return 0; ,2019/4/25,75,函数参数的引用传递,作用: 当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。 函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,可以通过数组带回。 注意:被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。,2019/4/25,76,程序举例,顺序查找。 在一组数据中查找到待查数据的位置。当一组数据无序时,一般采用顺序查找。 顺序查找是把给定的值与这组数据中的每个值顺序比较,如果找到,就输出这个值的位置,如果找不到则报告没有找到。,2019

42、/4/25,77,#include #define SIZE 10 /求给定值key的位置,找到则返回其下标,找不到返回-1 int seq_search(int v,int n,int key) /v:数组参数 n:数组元素个数 key:待查的值 int i; for(i = 0;i n;i +) if(key = vi) return i; return -1; /没找到 ,2019/4/25,78,void main(void) int dSIZE,KEY,i,index; printf(“Input %d numbers:n“,SIZE); for(i = 0;i = 0) print

43、f(“The index of the key is %d.n“,index); else printf(“Not found.n“); ,2019/4/25,79,运行该程序并输入: Input 10 numbers: 1 2 3 4 5 6 7 8 9 0 Input a key you want to search: 6 输出结果为: The index of the key is 5,2019/4/25,80,程序举例,字符串逆序输出。,2019/4/25,81,#include #include #define LENGTH 80 /反序一个字符串 void reverse(char

44、 s) char c; int i,j; j = strlen(s) - 1; for(i = 0;i j;i +) c = si; si = sj; sj = c; j -; ,2019/4/25,82,void main(void) char strLENGTH + 1; coutstr; reverse(str); cout“The string is reversed:“strendl; ,2019/4/25,83,运行该程序并输入: Input a string:abcd 运行结果为: The string is reversed:dbca,2019/4/25,84,Thank you!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报