Ch6-数组与字符串



《Ch6-数组与字符串》由会员分享,可在线阅读,更多相关《Ch6-数组与字符串(84页珍藏版)》请在装配图网上搜索。
1、,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,,Nanjing University,*,,,,单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,,Nanjing University,*,数组与字符串,,,1,,学习目标,,掌握数组的定义与使用方法,学会利用数组编写程序。,,掌握数组元素的初始化方法。,,掌握字符数组处理字符串的技巧。,,熟悉字符串处理函数的功能及使用方法。,,掌握数组作为函数参数的使用方法。,2024/9/23,2,知识点,,数组,:数组的定义;,,一维数组,:,,一
2、维数组的存储;一维数组的初始化;,,二维数组,:,,二维数组的存储;二维数组的初始化;,,字符数组;,,字符串处理函数;,,数组作函数参数,2024/9/23,3,数组,,数组是一种集合数据类型,它由许多元素组成,每一个元素都有相同的数据类型,在内存中占用相同大小的存储单元,且在内存中连续存放。,,每一个数组有一个名字,数组中的每一个元素有一个序号(或称下标)表示元素在数组中的位置,可以通过下标来识别数组中的每一个元素。,,数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变。,2024/9/23,4,数组举例,,用数组来表示班级的分数,并把这个数组取名为,MARKS,。,,MARK
3、S [0] = 85;MARKS [1] = 92;MARKS [2] = 95;MARKS [3] = 88;,,在给数组元素赋值之前,一定要先定义该数组,:,,INT MARKS[4];,2024/9/23,5,数组举例,,定义一个家庭成员的年龄数组,:,,INT AGE[4]; //定义有4个元素的数组AGEAGE[0] = 35; //给每个数组元素赋值,,AGE[1] = 38;AGE[2] = 6;AGE[3] = 8;,,某机构的雇员姓名的数组,:,,CHAR NAMES[3][6] = {"MARY", "JOHN", "ALICE"};,2024/9/23,6,数
4、组的特点,,每个数组元素的数据类型相同,且可以是任何合法的数据类型;,,数组可以是一维的、二维的,甚至更高维的;,,数组同其它变量一样,在使用前必须定义;,,数组各个元素按顺序排列,其位置由下标确定;,,数组元素可以同其它变量一样使用。,2024/9/23,7,一维数组,,2024/9/23,8,一维数组的定义,,类型说明符 数组名,[常量表达式];,,数组元素的个数在编译时就必须固定,且最好定义为一个常量。,,例:,const int NE = 100; float annual_temp[NE];,,各数组元素在内存中是连续存放的,。,,int a[10];,a[0],a[1],a[2
5、],a[3],a[4],a[5],a[6],a[7],a[8],a[9],2024/9/23,9,程序举例,,#include void main(void){ int a[5],sum; //定义数组a和变量sum a[0] = 3; a[1] = 1; a[2] = 7; a[3] = 4; a[4] = 8; sum = a[0] + a[1] + a[2] + a[3] + a[4]; cout<<"sum = "< 6、标总是从0开始,如果一个数组有n个元素,则第一个元素的下标是0,最后一个元素的下标是n-1。,,数组定义和数组元素的引用形式类似,但它们含义不同,。,,int a[5]; //定义有5个元素的数组a,,a[4] //表示数组中下标为4的元素。,2024/9/23,11,数组的使用,,能使用标识符的地方,就能引用数组元素。,,C++不检查引用一个数组元素时的下标值是否在数组要求的下标值范围内。但是,程序运行的结果是难以预料的。,,引用数组元素时,下标超出了允许的范围,称之为,下标溢出,。,2024/9/23,12,程序举例,,求一组学生的平均成绩,。,,#define num 5 7、 //预定义num的值为5#include void main(void) { int grade[num],i,total; float average; total = 0; printf("Please input %d score\n",num); for(i = 0;i 8、8,,average = 77.40,2024/9/23,13,程序举例,,求菲波那契数列,,#include void main(void) { const int NUM = 20; const int COL = 5; int f[NUM + 1],i; f[1] = 0; f[2] = 1; for(i = 3; i<= NUM;i ++) f[i] = f[i - 2] + f[i - 1]; for(i = 1;i <= NUM;i ++) {,,printf("%10d",f[i]); if(i % COL == 0) printf("\n"); 9、}},,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 marks[4];,,,,,,float marks[4];,,,内存地址,内容,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 marks[5] = "Mary";,内存地址,内容,5000,'M',5001,'a',500 10、2,'r',5003,'y',5004,'\0',2024/9/23,16,数组在内存中如何存储,,char names[3][6] = {"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和自身整除的正整数是素数 11、),。,,基本思想:把从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 12、 7 11 13 17 19 23 29,2024/9/23,18,#define RANGE 200#include void main(void) { int sieve[RANGE + 1]; int i,j,count; for(i = 0;i <= RANGE;i ++) sieve[i] = 1;//初始化,,sieve[0] = sieve[1] = 0;//0和1不是素数,,count = 0; for(i = 2;i <= RANGE;i ++) if(sieve[i] == 1)//i是素数{,,printf("%5d",i);//输出素数,,count 13、 ++; if(count % 8 == 0)//每行输出8个值,,printf("\n"); for(j = i;j <= RANGE; j += i) sieve[j] = 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 14、,19,一维数组应用举例,,求杨辉三角形。,,所谓杨辉三角形就是二次项的系数:,,1 1 2 1 2 1 1 3 3 1 1 4 6 4 1,2024/9/23,20,一维数组应用举例,,杨辉三角形,的性质:,,每行数字左右对称,由,1开始逐渐变大,然后变小,回到1。,,第n行的数字个数为n个。,,第n行数字和为2,n-1,。,,每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。,,,,将第,2n+1行第1个数,跟第2n+2行第3个数、第2n+2行第5个数……连成一线,这些数的和是第2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第 15、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 yanghui[LASTROW + 1],row,col; yanghui[0] = 1; printf("%4d\n",yanghui[0]);//输出第一行,,//由前一行生成新的一行,,for(row = 1;row <= LASTROW;row 16、++){,,yanghui[row] = 1; for(col = row - 1;col > 0;col --) yanghui[col] = yanghui[col] + yanghui[col - 1]; for(col = 0;col <= row;col ++) printf("%4d",yanghui[col]);//输出一行,,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 17、 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 primes[10] = {1, 2, 3, 5, 7};,2024/9/23,23,程序举例,,#include void main(void){ int marks[4] = {82 18、,92,95,88}; cout<<"Second element is:"< 19、组看成是一个一维数组,该一维数组的各个元素又是一个一维数组。,,,,,二维数组在内存中的排列顺序:,2024/9/23,27,二维数组的初始化,二维数组的初始化,可以分行进行。,,float seasonTemp[3][4] = { {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 seasonTemp[3][4] = {,11.3, 28.2, 16.5, -7.1, 12.4, 27.1, 20、17.6, -5.7, 23.2, 33.5, 25.8, -1.3,};,2024/9/23,28,二维数组的初始化,,按行初始化能够初始化某一行中的部分元素。,,int seasonTemp[3][4] = {{26}, {24}, {28}};,,定义并初始化一个二维数组时,可以省略,“常量表达式,1”,。,,int seasonTemp,[ ],[4] = { {26, 34, 22, 17}, {24, 32, 19, 13}, {28, 38, 25, 20}};,,注意,:,"常量表达式2"一定不能省略,否则程序编译时会出错。,2024/9/23,29,二维数组的使 21、用,,访问二维数组元素可通过两个,[]运算符,第一个[]运算符指定元素的行下标,第二个[]运算符指定元素的列下标。,,程序举例:,,在数组seasonTemp中查找最高温度,。,2024/9/23,30,程序举例,,const int rows = 3;const int columns = 4;int seasonTemp[rows][columns] = { {26, 34, 22, 17}, {24, 32, 19, 13}, {28, 38, 25, 20}};int HighestTemp (int temp[rows][columns]) { int highest 22、 = 0; for (register i = 0; i highest) highest = temp[i][j]; return highest;},2024/9/23,31,程序举例,,矩阵的转置,。,,矩阵的转置就是把矩阵的行和列互换,。,,2024/9/23,32,#include #define ROW 3#define COL 4void main(void) { int a[ROW][COL],b[COL][ROW]; int i,j; cout<<"Please input element of the matrix a(,,"; cout>a 23、[i][j]; for(i = 0;i < ROW;i ++) //转置,,for(j = 0;j < COL;j ++) b[j][i] = a[i][j]; cout<<"Matrix b:"< 24、10 11 12 Matrix b: 1 5 9 2 6 10 3 7 11 4 8 12,2024/9/23,34,程序举例,,对于n×n矩阵,可以只用一个数组,在数组中进行行列元素的互换。,2024/9/23,35,#define ROW 4#include void main(void) { int sm[ROW][ROW],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 ++) 25、 scanf("%d",i ++) //转置,,for(j = i + 1;j < ROW;j ++){,,temp = sm[i][j]; sm[i][j] = sm[j][i]; sm[j][i] = temp; } printf("The matrix has been transposed:\n"); for(i = 0;i < ROW;i ++){,,for(j = 0;j < ROW;j ++) printf("%5d",sm[i][j]); printf("\n"); }},2024/9/23,36,,运行结果:,,Input element 26、s of a matrix (4×4): 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,2024/9/23,37,程序举例,,求解幻方问题,。,,把1放在最上一行正中间的方格中,,,,把下一个整数放置到,前一个整数的右上方,,,如果到达最上一行,下一个整数放在最后一行,同一列的位置;,,如果到达最右端,则下一整数放在,第一列的同一行的位置;,,当到达的方格中已填上数值时,下一个整数就放在 27、刚填上数,值的方格的正下方。,2024/9/23,38,,,2024/9/23,39,#define MAX 15#include void main(void) { int m,mm,i,j,k,ni,nj; int magic[MAX][MAX]; printf("Enter the number you wanted\n"); 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 = 28、 1;k <= mm;k ++){,,magic[i][j] = k; //求右上方方格的坐标,,if(i == 0) ni = m - 1;//最上一行,则下一个位置在最下一行,,else ni = i - 1; if(j == m - 1) nj = 0;//最右端,则下一个位置在最左端,,else nj = j + 1; //判断右上方方格是否已有数,,if(magic[ni][nj] == 0) {//右上方无值,,i = ni; j = nj; } else i ++;//右上方方格已填上数,,} for(i = 0;i < m;i ++){ 29、,,for(j = 0;j < m;j ++) printf("%4d",magic[i][j]); printf("\n"); } } else //m<=0或m_是偶数,,printf("Error in input data.\n");},2024/9/23,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,2024/9/23,42,字符数组,,2024/9/23,43,字符数 30、组,当数组中的元素都是由一个个字符组成时,便称之为字符数组。,,C++中,用一个一维的字符数组表示字符串。数组的每一个元素保存字符串的一个字符,并附加一个空字符,表示为`\0',添加在字符串的末尾,以识别字符的结束。,2024/9/23,44,字符数组的输出,,字符串可以用,printf或cout函数输出,。,,cout << "The string s1 is " << s1 << endl;,,printf("The string s1 is %s\n", s1) ;,The string s1 is example,2024/9/23,45,,char s1[10];,,,char s1 31、[] = "example";char s2[20] = "another example“,注意,:字符串的长度并不包括结尾符。,2024/9/23,46,,char str[16] = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', ' a', ' ', 's', 't', 'r', 'i', 'n', 'g'};,,,,char c[10] = {'C',' ','P','r','o','g','r','a','m'};,,,,char str[] = {'T','h', 'i', 's', ' ', 'i', 's', ' ', ' a', ' ', 32、 '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 s1[10], s2[10];,,scanf(“%s”, s1); //输入字符串"Learn C++",,,scanf("%s%s", s1, s2); //输入字 33、符串"Learn C++",2024/9/23,49,,注意用scanf函数输入字符与输入字符串的不同。,,char str1,str2;char s1[10],s2[10];scanf ("%c%c",,2024/9/23,50,用cin输入字符串,,char s1[10];,,cin << s1; //输入字符串"Learn C++",2024/9/23,51,,char firstname [12], surname[12];cout > firstname;cin >> surname;cout << "The name entered was "<< firstna 34、me << " "<< surname;,char firstname [12], surname[12];cout > firstname >> surname;cout << "The name entered was “<< firstname << " “<< surname;,2024/9/23,52,字符数组应用举例,,求字符串的长度,,从键盘上读一个输入行并输出,,把两个字符串连接起来,,把一个数字字符串转换为相应的整数,2024/9/23,53,求字符串的长度,#define MAXLEN 80#include void main(void) { char st 35、r[MAXLEN+1]; int len; printf(“Input a string:”); scanf(“%s”,str); len = 0; while(str[len] != '\0') len++; printf("The length of this string is %d\n",len);},Input a string:worldThe length of this string is 5,2024/9/23,54,从键盘上读一个输入行并输出,,#define MAXLEN 80#include void main(void) { char line 36、[MAXLEN + 1],c; int i; i = 0; while((c = getchar()) != '\n') line[i ++] = c; line[i] = '\0'; printf("%s\n",line);},How are you,,How are you,2024/9/23,55,连接,两个字符串,#define LENGTH 40#include void main(void) { char str1[LENGTH + 1],str2[LENGTH + 1]; char result[2 * LENGTH + 1]; int len1,len2 37、; cout>str1; cout>str2;,2024/9/23,56,,len1 = 0; while(str1[len1] != '\0') {,,result[len1] = str1[len1]; len1 ++; } len2 = 0; while(str2[len2] != '\0') {,,result[len1] = str2[len2]; len1 ++; len2 ++; } result[len1] = '\0'; cout< 38、,↙,,,Input the second string:,,bye,↙,,运行结果为:,,,Goodbye,2024/9/23,57,转换数字字符串为相应的整数,,#include #include void main(void) { char s[10]; int i,n,sign; cout>s; i = 0; sign = 1; if(s[i] == '+' || s[i] == '-')//符号,,sign = (s[i ++] == '+')?1:-1; for(n = 0;s[i] >= '0' },,运行该程序并输入:,,,Input a numberic 39、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 numchar 40、s);,,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 str1[10] = {“Nanjing "}; 41、 char str2[10] = {"Computer"}; cout< 42、中,。,2024/9/23,62,,#include #include void main(void) { char str1[10] = {“Nanjing"}; char str2[10] = {"Computer"}; cout< 43、e void main(void) { char str1[] = {“Nanjing "}; char str2[] = {"Computer"}; cout< 44、nclude void main(void) { char str1[] = {"Tsinghua "}; char str2[] = {"Computer"}; cout< 45、lude void main(void) { char buf1[] = "aaa"; char buf2[] = "bbb"; char buf3[] = "ccc"; int ptr;,,,ptr = strcmp(buf2,buf1); if(ptr > 0) cout<<"Buffer 2 is greater than buffer 1"< 46、 2 is greater than buffer 3"< 47、ar str[] = {“Nanjing Computer"}; cout<<"The length of the string is ",,< 48、递数据地址的方式,称之为函数参数的引用传递。,,数组参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素。,,,类型说明符 函数名,(数组参数, 数组元素个数),注意,:数组参数并不指定数组元素的个数,即,[],中是空的,没有数字。,2024/9/23,72,程序举例,,#include int add(int x, int n) { return (x + n);}void main(){ int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; int i; for( i = 0; i<10; i++) a[i]=ad 49、d(a[i], i);,//数组元素作函数参数,,for(i = 0; i<10; i++) cout << a[i] << endl; },2024/9/23,73,程序举例,,double mean(double data_array[], int numelements) { double sum = 0.0; for(int i=0; i 50、ouble h; int n = 0; cout > h; while(h > 0.0) { heights[n] = h; n++; cin >> h; } double m = mean(heights, n); cout << "The mean is " << m << endl; return 0;},2024/9/23,75,函数参数的引用传递,,作用:,,当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。,,函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,,可以通过数组带回。 51、,,注意,:被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。,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 52、 i; for(i = 0;i < n;i ++) if(key == v[i]) return i; return -1; //没找到,,},2024/9/23,78,void main(void) { int d[SIZE],KEY,i,index; printf("Input %d numbers:\n",SIZE); for(i = 0;i = 0) printf("The index of the key is %d.\n",index); else printf("Not found.\n");},2024/9/23,79,,运行该程序并输入: 53、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,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 < j;i ++){,,c = s[i]; s[i] = s[j]; s[j] = c; j --; }},2024/9/23,82,,void main(void) { char str[LENGTH + 1]; cout>str; reverse(str); cout<<"The string is reversed:"<
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。