资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Nanjing University,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Nanjing University,*,数组与字符串,1,学习目标,掌握数组的定义与使用方法,学会利用数组编写程序。,掌握数组元素的初始化方法。,掌握字符数组处理字符串的技巧。,熟悉字符串处理函数的功能及使用方法。,掌握数组作为函数参数的使用方法。,2024/9/23,2,知识点,数组,:数组的定义;,一维数组,:,一维数组的存储;一维数组的初始化;,二维数组,:,二维数组的存储;二维数组的初始化;,字符数组;,字符串处理函数;,数组作函数参数,2024/9/23,3,数组,数组是一种集合数据类型,它由许多元素组成,每一个元素都有相同的数据类型,在内存中占用相同大小的存储单元,且在内存中连续存放。,每一个数组有一个名字,数组中的每一个元素有一个序号(或称下标)表示元素在数组中的位置,可以通过下标来识别数组中的每一个元素。,数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变。,2024/9/23,4,数组举例,用数组来表示班级的分数,并把这个数组取名为,MARKS,。,MARKS 0 = 85;MARKS 1 = 92;MARKS 2 = 95;MARKS 3 = 88;,在给数组元素赋值之前,一定要先定义该数组,:,INT MARKS4;,2024/9/23,5,数组举例,定义一个家庭成员的年龄数组,:,INT AGE4; /定义有4个元素的数组AGEAGE0 = 35; /给每个数组元素赋值,AGE1 = 38;AGE2 = 6;AGE3 = 8;,某机构的雇员姓名的数组,:,CHAR NAMES36 = MARY, JOHN, ALICE;,2024/9/23,6,数组的特点,每个数组元素的数据类型相同,且可以是任何合法的数据类型;,数组可以是一维的、二维的,甚至更高维的;,数组同其它变量一样,在使用前必须定义;,数组各个元素按顺序排列,其位置由下标确定;,数组元素可以同其它变量一样使用。,2024/9/23,7,一维数组,2024/9/23,8,一维数组的定义,类型说明符 数组名,常量表达式;,数组元素的个数在编译时就必须固定,且最好定义为一个常量。,例:,const int NE = 100;float annual_tempNE;,各数组元素在内存中是连续存放的,。,int a10;,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,2024/9/23,9,程序举例,#include void main(void)int a5,sum; /定义数组a和变量suma0 = 3;a1 = 1;a2 = 7;a3 = 4;a4 = 8;sum = a0 + a1 + a2 + a3 + a4;coutsum = sumendl;,sum = 23,2024/9/23,10,数组的使用,数组元素的一般引用形式为:,数组名,下标表达式,数组元素的下标总是从0开始,如果一个数组有n个元素,则第一个元素的下标是0,最后一个元素的下标是n-1。,数组定义和数组元素的引用形式类似,但它们含义不同,。,int a5; /定义有5个元素的数组a,a4 /表示数组中下标为4的元素。,2024/9/23,11,数组的使用,能使用标识符的地方,就能引用数组元素。,C+不检查引用一个数组元素时的下标值是否在数组要求的下标值范围内。但是,程序运行的结果是难以预料的。,引用数组元素时,下标超出了允许的范围,称之为,下标溢出,。,2024/9/23,12,程序举例,求一组学生的平均成绩,。,#define num 5 /预定义num的值为5#include void main(void) int gradenum,i,total;float average;total = 0;printf(Please input %d scoren,num);for(i = 0;i num;i +) ,printf(grade%d = ,i);scanf(%d,please input 5 scores,grade0 = 90,grade1 = 65,grade2 = 97,grade3 = 57,grade4 = 78,average = 77.40,2024/9/23,13,程序举例,求菲波那契数列,#include void main(void) const int NUM = 20;const 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);,0 1 1 2 3,5 8 13 21 34,55 89 144 233 377,610 987 1597 2584 4181,2024/9/23,14,数组在内存中如何存储,int marks4;,float marks4;,内存地址,内容,5000,85,5002,92,5004,95,5006,88,内存地址,内容,5000,85.0,5004,92.0,5008,95.0,5012,88.0,2024/9/23,15,数组在内存中如何存储,char marks5 = Mary;,内存地址,内容,5000,M,5001,a,5002,r,5003,y,5004,0,2024/9/23,16,数组在内存中如何存储,char names36 = Mary, John, Alice;,5000,5001,5002,5003,5004,5005,M,a,r,y,0,5006,5007,5008,5009,5010,5011,J,o,h,n,0,5012,5013,5014,5015,5016,5017,A,l,i,c,e,0,2024/9/23,17,一维数组应用举例,筛法求素数(只能被,1和自身整除的正整数是素数),。,基本思想:把从1开始的、某一范围内的正整数从小到大顺序排列,,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。,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 27 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,2024/9/23,18,#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不是素数,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);,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 131,137 139 149 151 157 163 167 173,179 181 191 193 197 199,2024/9/23,19,一维数组应用举例,求杨辉三角形。,所谓杨辉三角形就是二次项的系数:,11 21 2 11 3 3 11 4 6 4 1,2024/9/23,20,一维数组应用举例,杨辉三角形,的性质:,每行数字左右对称,由,1开始逐渐变大,然后变小,回到1。,第n行的数字个数为n个。,第n行数字和为2,n1,。,每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。,将第,2n+1行第1个数,跟第2n+2行第3个数、第2n+2行第5个数连成一线,这些数的和是第2n个斐波那契数。将第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依此类推。,2024/9/23,21,#define LASTROW 10#include void main(void) int yanghuiLASTROW + 1,row,col;yanghui0 = 1;printf(%4dn,yanghui0);/输出第一行,/由前一行生成新的一行,for(row = 1;row 0;col -)yanghuicol = yanghuicol + yanghuicol - 1;for(col = 0;col = row;col +)printf(%4d,yanghuicol);/输出一行,printf(n);,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,22,一维数组的初始化,数组,可以在定义时就给出数组元素的初值,称之为初始化。初值放在一对花括号中,各初值之间用逗号隔开。初始化时可只对部分元素赋值。,int primes = 1, 2, 3, 5, 7, 11, 13;,int primes10 = 1, 2, 3, 5, 7;,2024/9/23,23,程序举例,#include void main(void)int marks4 = 82,92,95,88;coutSecond element is:marks1endl;,Second element is 92,2024/9/23,24,二维数组,2024/9/23,25,二维数组,的定义,二维数组定义的一般形式为:,类型说明符 数组名,常量表达式1常量表达式2;,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,2024/9/23,26,二维数组的定义,C+语言把二维数组看成是一个一维数组,该一维数组的各个元素又是一个一维数组。,二维数组在内存中的排列顺序:,2024/9/23,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 = ,11.3, 28.2, 16.5, -7.1, 12.4, 27.1, 17.6, -5.7, 23.2, 33.5, 25.8, -1.3,;,2024/9/23,28,二维数组的初始化,按行初始化能够初始化某一行中的部分元素。,int seasonTemp34 = 26, 24, 28;,定义并初始化一个二维数组时,可以省略,“常量表达式,1”,。,int seasonTemp, ,4 = 26, 34, 22, 17, 24, 32, 19, 13, 28, 38, 25, 20;,注意,:,常量表达式2一定不能省略,否则程序编译时会出错。,2024/9/23,29,二维数组的使用,访问二维数组元素可通过两个,运算符,第一个运算符指定元素的行下标,第二个运算符指定元素的列下标。,程序举例:,在数组seasonTemp中查找最高温度,。,2024/9/23,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)highest = tempij; return highest;,2024/9/23,31,程序举例,矩阵的转置,。,矩阵的转置就是把矩阵的行和列互换,。,2024/9/23,32,#include #define ROW 3#define COL 4void main(void) int aROWCOL,bCOLROW;int i,j;coutaij;for(i = 0;i ROW;i +) /转置,for(j = 0;j COL;j +)bji = aij;coutMatrix b:endl;for(i = 0;i COL;i +) /输出矩阵b,for(j = 0;j ROW;j +) coutbij ; coutendl;,2024/9/23,33,运行结果:,Please input elements of the matrix a(34)1 2 3 45 6 7 89 10 11 12Matrix b:1 5 92 6 103 7 114 8 12,2024/9/23,34,程序举例,对于nn矩阵,可以只用一个数组,在数组中进行行列元素的互换。,2024/9/23,35,#define ROW 4#include void main(void) int smROWROW,i,j,temp;printf(Input elements of a matrix (%d%d):n,ROW,ROW);for(i = 0;i ROW;i +)for(j = 0;j ROW;j +)scanf(%d,i +) /转置,for(j = i + 1;j ROW;j +),temp = smij;smij = smji;smji = temp; printf(The matrix has been transposed:n);for(i = 0;i ROW;i +),for(j = 0;j ROW;j +)printf(%5d,smij);printf(n);,2024/9/23,36,运行结果:,Input elements of a matrix (44):1 2 3 45 6 7 89 10 11 1213 14 15 16The matrix has been transposed:1 5 9 132 6 10 143 7 11 154 8 12 16,2024/9/23,37,程序举例,求解幻方问题,。,把1放在最上一行正中间的方格中,,,把下一个整数放置到,前一个整数的右上方,,如果到达最上一行,下一个整数放在最后一行,同一列的位置;,如果到达最右端,则下一整数放在,第一列的同一行的位置;,当到达的方格中已填上数值时,下一个整数就放在刚填上数,值的方格的正下方。,2024/9/23,38,2024/9/23,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,i +) /初始化,for(j = 0;j 0)&(m % 2 != 0) /奇数阶,mm = m * m;i = 0;/第一个值的位置,j = m / 2;,2024/9/23,40,for(k = 1;k = mm;k +),magicij = k;/求右上方方格的坐标,if(i = 0) ni = m - 1;/最上一行,则下一个位置在最下一行,elseni = i - 1;if(j = m - 1) nj = 0;/最右端,则下一个位置在最左端,elsenj = 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(Error in input data.n);,2024/9/23,41,运行结果:,Enter the number you wanted517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9,2024/9/23,42,字符数组,2024/9/23,43,字符数组,当数组中的元素都是由一个个字符组成时,便称之为字符数组。,C+中,用一个一维的字符数组表示字符串。数组的每一个元素保存字符串的一个字符,并附加一个空字符,表示为0,添加在字符串的末尾,以识别字符的结束。,2024/9/23,44,字符数组的输出,字符串可以用,printf或cout函数输出,。,cout The string s1 is s1 endl;,printf(The string s1 is %sn, s1) ;,The string s1 is example,2024/9/23,45,char s110;,char s1 = example;char s220 = another example“,注意,:字符串的长度并不包括结尾符。,2024/9/23,46,char str16 = T, h, i, s, , i, s, , a, , s, t, r, i, n, g;,char c10 = C, ,P,r,o,g,r,a,m;,char str = T,h, i, s, , i, s, , a, , s, t, r, i, n, g;,char str = This is a string;,char str = This is a string;,2024/9/23,47,字符数组的输入,scanf,cin,2024/9/23,48,用scanf函数输入字符串,scanf可以一次输入一个或多个字符串,如果一次输入多个字符串,字符串之间用逗号隔开。,char s110, s210;,scanf(“%s”, s1); /输入字符串Learn C+,scanf(%s%s, s1, s2); /输入字符串Learn C+,2024/9/23,49,注意用scanf函数输入字符与输入字符串的不同。,char str1,str2;char s110,s210;scanf (%c%c,2024/9/23,50,用cin输入字符串,char s110;,cin firstname;cin surname;cout The name entered was firstname firstname surname;cout The name entered was “ firstname “str1;coutstr2;,2024/9/23,56,len1 = 0;while(str1len1 != 0) ,resultlen1 = str1len1;len1 +;len2 = 0;while(str2len2 != 0) ,resultlen1 = str2len2;len1 +;len2 +;resultlen1 = 0;coutresults;i = 0;sign = 1;if(si = + | si = -)/符号,sign = (si + = +)?1:-1;for(n = 0;si = 0 ,运行该程序并输入:,Input a numberic string,123,运行结果为:,123,58,字符串处理函数,头文件,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 char source, int numchars);,int strcmp(const char firststring, const char secondstring);,strlen( const char string );,2024/9/23,59,strcpy,函数原型:,strcpy(char destination, const char source);,函数功能:,将字符串source拷贝到字符串destination中,。,2024/9/23,60,#include #include void main(void) char str110 = “Nanjing ;char str210 = Computer;coutstrcpy(str1,str2)endl;,注意,:在定义数组时,,destination,的字符串长度必须大于或等于,source,的字符串长度。不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。,Computer,2024/9/23,61,strncpy,函数原型:,strncpy(char destination, const char source, int numchars);,函数功能:,将字符串source中前numchars个字符拷贝到字符串destination中,。,2024/9/23,62,#include #include void main(void) char str110 = “Nanjing;char str210 = Computer;coutstrncpy(str1,str2,3)endl;,Comjing,2024/9/23,63,函数原型:,strcat(char target, const char source);,函数功能:,将字符串source接到字符串target的后面,。,2024/9/23,64,Error!,#include #include void main(void) char str1 = “Nanjing ;char str2 = Computer;coutstrcat(str1,str2)endl;,Nanjing Computer,2024/9/23,65,strncat,函数原型:,strncat(char target, const char source, int numchars);,函数功能:,将字符串source的前numchars个字符接到字符串target的后面,。,2024/9/23,66,Error,!,#include #include void main(void) char str1 = Tsinghua ;char str2 = Computer;coutstrcpy(str1,str2) 0)coutBuffer 2 is greater than buffer 1endl;elsecoutBuffer 2 is less than buffer 1 0)coutBuffer 2 is greater than buffer 3endl;elsecoutBuffer 2 is less than buffer 3endl;,Buffer 2 is less than buffer 1,Buffer 2 is greater than buffer 3,2024/9/23,69,strlen,函数原型:,strlen( const char string );,函数功能:,统计字符串string中字符的个数,。,2024/9/23,70,#include #include void main(void) char str = “Nanjing Computer;coutThe length of the string is ,strlen(str)endl;,The length of the string is 16,注意,:,strlen,函数的功能是计算字符串的实际长度,不包括,0,在内。另外,,strlen,函数也可以直接测试字符串常量的长度。,2024/9/23,71,数组作函数参数,数组名可以作函数的实参和形参,,数组元素只能作函数实参。,当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址,。,调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递。,数组参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素。,类型说明符 函数名,(数组参数, 数组元素个数),注意,:数组参数并不指定数组元素的个数,即,中是空的,没有数字。,2024/9/23,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; ,2024/9/23,73,程序举例,double mean(double data_array, int numelements) double sum = 0.0;for(int i=0; i h;while(h 0.0) heightsn = h;n+;cin h;double m = mean(heights, n);cout The mean is m endl;return 0;,2024/9/23,75,函数参数的引用传递,作用:,当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。,函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,,可以通过数组带回。,注意,:被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。,2024/9/23,76,程序举例,顺序查找。,在一组数据中查找到待查数据的位置。当一组数据无序时,一般采用顺序查找。,顺序查找是把给定的值与这组数据中的每个值顺序比较,如果找到,就输出这个值的位置,如果找不到则报告没有找到。,2024/9/23,77,#include #define SIZE 10/求给定值key的位置,找到则返回其下标,找不到返回-1int 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; /没找到,2024/9/23,78,void main(void) int dSIZE,KEY,i,index;printf(Input %d numbers:n,SIZE);for(i = 0;i = 0)printf(The index of the key is %d.n,index);elseprintf(Not found.n);,2024/9/23,79,运行该程序并输入:Input 10 numbers:1 2 3 4 5 6 7 8 9 0Input a key you want to search:6输出结果为:The index of the key is 5,2024/9/23,80,程序举例,字符串逆序输出。,2024/9/23,81,#include #include #define LENGTH 80,/反序一个字符串,void reverse(char s)char c;int i,j;j = strlen(s) - 1;for(i = 0;i str;reverse(str);coutThe string is reversed:strendl;,运行该程序并输入:,Input a string:abcd,运行结果为:,The string is reversed:dbca,2024/9/23,83,Thank you!,2024/9/23,84,
展开阅读全文