资源预览内容
第1页 / 共84页
第2页 / 共84页
第3页 / 共84页
第4页 / 共84页
第5页 / 共84页
第6页 / 共84页
第7页 / 共84页
第8页 / 共84页
第9页 / 共84页
第10页 / 共84页
亲,该文档总共84页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
数组与字符串数组与字符串1学习目标n掌握数组的定义与使用方法,学会利用数组编写程序。n掌握数组元素的初始化方法。n掌握字符数组处理字符串的技巧。n熟悉字符串处理函数的功能及使用方法。n掌握数组作为函数参数的使用方法。2024/7/292知识点n数组:数组的定义;n一维数组:一维数组的存储;一维数组的初始化;n二维数组:二维数组的存储;二维数组的初始化;n字符数组;n字符串处理函数;n数组作函数参数2024/7/293数组n数组是一种集合数据类型,它由许多元素组成,每一个元素都有相同的数据类型,在内存中占用相同大小的存储单元,且在内存中连续存放。n每一个数组有一个名字,数组中的每一个元素有一个序号(或称下标)表示元素在数组中的位置,可以通过下标来识别数组中的每一个元素。n数组的维数和大小是在定义数组时就确定的,程序运行的时候不能改变。2024/7/294数组举例n用数组来表示班级的分数,并把这个数组取名为MARKS。MARKS 0 = 85;MARKS 1 = 92;MARKS 2 = 95;MARKS 3 = 88;n在给数组元素赋值之前,一定要先定义该数组:INT MARKS4;2024/7/295数组举例n定义一个家庭成员的年龄数组:INT AGE4; /定义有4个元素的数组AGEAGE0 = 35; /给每个数组元素赋值AGE1 = 38;AGE2 = 6;AGE3 = 8;n某机构的雇员姓名的数组:CHAR NAMES36 = MARY, JOHN, ALICE; 2024/7/296数组的特点n每个数组元素的数据类型相同,且可以是任何合法的数据类型;n数组可以是一维的、二维的,甚至更高维的;n数组同其它变量一样,在使用前必须定义;n数组各个元素按顺序排列,其位置由下标确定;n数组元素可以同其它变量一样使用。2024/7/297一维数组一维数组2024/7/298一维数组的定义n类型说明符 数组名常量表达式;n数组元素的个数在编译时就必须固定,且最好定义为一个常量。例:const int NE = 100;float annual_tempNE;n各数组元素在内存中是连续存放的。int a10;a0a1a2a3a4a5a6a7a8a92024/7/299程序举例n#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 = 232024/7/2910数组的使用n数组元素的一般引用形式为:数组名下标表达式n数组元素的下标总是从0开始,如果一个数组有n个元素,则第一个元素的下标是0,最后一个元素的下标是n-1。n数组定义和数组元素的引用形式类似,但它们含义不同。int a5; /定义有5个元素的数组aa4 /表示数组中下标为4的元素。2024/7/2911数组的使用n能使用标识符的地方,就能引用数组元素。nC+不检查引用一个数组元素时的下标值是否在数组要求的下标值范围内。但是,程序运行的结果是难以预料的。n引用数组元素时,下标超出了允许的范围,称之为下标溢出下标溢出。2024/7/2912程序举例n求一组学生的平均成绩。#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,&gradei);total = total + gradei;average = (float)total/num;printf(average = %0.2fn,average);please input 5 scoresgrade0 = 90grade1 = 65grade2 = 97grade3 = 57grade4 = 78average = 77.402024/7/2913程序举例n求菲波那契数列#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 35 8 13 21 3455 89 144 233 377610 987 1597 2584 41812024/7/2914数组在内存中如何存储nint marks4;nfloat marks4;内存地址内容500085500292500495500688内存地址内容500085.0500492.0500895.0501288.02024/7/2915数组在内存中如何存储nchar marks5 = Mary;内存地址内容5000M5001a5002r5003y500402024/7/2916数组在内存中如何存储nchar names36 = Mary, John, Alice;500050015002500350045005Mary0500650075008500950105011John0501250135014501550165017Alice02024/7/2917一维数组应用举例n筛法求素数(只能被1和自身整除的正整数是素数)。基本思想:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。1 2 3 4 5 6 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 30 2 3 4 5 6 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 303 5 7 9 11 13 15 17 19 21 23 25 27 292 3 5 7 11 13 17 19 23 292024/7/2918n#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 1923 29 31 37 41 43 47 5359 61 67 71 73 79 83 8997 101 103 107 109 113 127 131137 139 149 151 157 163 167 173179 181 191 193 197 1992024/7/2919一维数组应用举例n求杨辉三角形。所谓杨辉三角形就是二次项的系数:11 21 2 11 3 3 11 4 6 4 12024/7/2920一维数组应用举例n杨辉三角形的性质:每行数字左右对称,由1开始逐渐变大,然后变小,回到1。 第n行的数字个数为n个。 第n行数字和为2n1。 每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。 将第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/7/2921n#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);11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 11 7 21 35 35 21 7 11 8 28 56 70 56 28 8 11 9 36 84 126 126 84 36 9 11 10 45 120 210 252 210 120 45 10 122一维数组的初始化n数组可以在定义时就给出数组元素的初值,称之为初始化。初值放在一对花括号中,各初值之间用逗号隔开。初始化时可只对部分元素赋值。int primes = 1, 2, 3, 5, 7, 11, 13;int primes10 = 1, 2, 3, 5, 7;2024/7/2923程序举例n#include void main(void)int marks4 = 82,92,95,88;coutSecond element is:marks1endl;Second element is 922024/7/2924二维数组二维数组2024/7/2925二维数组的定义n二维数组定义的一般形式为:类型说明符 数组名常量表达式1常量表达式2;float seasonTemp34;春夏秋冬北京11.328.216.5-7.1天津12.427.117.6-5.7上海23.233.525.8-1.32024/7/2926二维数组的定义nC+语言把二维数组看成是一个一维数组,该一维数组的各个元素又是一个一维数组。n二维数组在内存中的排列顺序:2024/7/2927二维数组的初始化n二维数组的初始化可以分行进行。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;n二维数组在内存中是一维的,且由各行元素顺序存放得到,初始化也可以写成: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/7/2928二维数组的初始化n按行初始化能够初始化某一行中的部分元素。int seasonTemp34 = 26, 24, 28; n定义并初始化一个二维数组时,可以省略“常量表达式1”。int seasonTemp 4 = 26, 34, 22, 17, 24, 32, 19, 13, 28, 38, 25, 20;注意注意:常量表达式2一定不能省略,否则程序编译时会出错。2024/7/2929二维数组的使用n访问二维数组元素可通过两个运算符,第一个运算符指定元素的行下标,第二个运算符指定元素的列下标。n程序举例:在数组seasonTemp中查找最高温度。2024/7/2930程序举例nconst 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 rows; +i)for (register j = 0; j highest)highest = tempij; return highest;2024/7/2931程序举例n矩阵的转置。矩阵的转置就是把矩阵的行和列互换。2024/7/2932n#include #define ROW 3#define COL 4void main(void) int aROWCOL,bCOLROW;int i,j;coutPlease input element of the matrix a( ;coutROWCOL);for(i = 0;i ROW;i +) /输入矩阵afor(j = 0;j aij;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/7/2933n运行结果: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 122024/7/2934程序举例n对于nn矩阵,可以只用一个数组,在数组中进行行列元素的互换。2024/7/2935n#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,&smij);for(i = 0;i ROW - 1;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/7/2936n运行结果: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 162024/7/2937程序举例n求解幻方问题。把1放在最上一行正中间的方格中,把下一个整数放置到前一个整数的右上方,n如果到达最上一行,下一个整数放在最后一行同一列的位置;n如果到达最右端,则下一整数放在第一列的同一行的位置;n当到达的方格中已填上数值时,下一个整数就放在刚填上数值的方格的正下方。2024/7/29382024/7/2939n#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,&m);for(i = 0;i m;i +) /初始化for(j = 0;j 0)&(m % 2 != 0) /奇数阶mm = m * m;i = 0;/第一个值的位置j = m / 2;2024/7/2940 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/7/2941n运行结果:Enter the number you wanted517 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 92024/7/2942字符数组字符数组2024/7/2943字符数组n当数组中的元素都是由一个个字符组成时,便称之为字符数组。nC+中,用一个一维的字符数组表示字符串。数组的每一个元素保存字符串的一个字符,并附加一个空字符,表示为0,添加在字符串的末尾,以识别字符的结束。2024/7/2944字符数组的输出n字符串可以用printf或cout函数输出。cout The string s1 is s1 endl;printf(The string s1 is %sn, s1) ;The string s1 is example2024/7/2945nchar s110;nchar s1 = example;char s220 = another example“注意:字符串的长度并不包括结尾符。2024/7/2946nchar str16 = T, h, i, s, , i, s, , a, , s, t, r, i, n, g;nchar c10 = C, ,P,r,o,g,r,a,m;nchar 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/7/2947字符数组的输入nscanfncin2024/7/2948用scanf函数输入字符串nscanf可以一次输入一个或多个字符串,如果一次输入多个字符串,字符串之间用逗号隔开。nchar s110, s210;scanf(“%s”, s1); /输入字符串Learn C+scanf(%s%s, s1, s2); /输入字符串Learn C+2024/7/2949n注意用scanf函数输入字符与输入字符串的不同。nchar str1,str2;char s110,s210;scanf (%c%c,&str1,&str2);scanf (%s%s,s1,s2);2024/7/2950用cin输入字符串nchar s110;cin s1; /输入字符串Learn C+2024/7/2951nchar firstname 12, surname12;cout firstname;cin surname;cout The name entered was firstname surname;nchar firstname 12, surname12;cout firstname surname;cout The name entered was “ firstname “ surname;2024/7/2952字符数组应用举例n求字符串的长度 n从键盘上读一个输入行并输出 n把两个字符串连接起来n把一个数字字符串转换为相应的整数2024/7/2953求字符串的长度n#define MAXLEN 80#include void main(void) char strMAXLEN+1;int len;printf(“Input a string:”);scanf(“%s”,str);len = 0;while(strlen != 0)len+;printf(The length of this string is %dn,len);Input a string:worldThe length of this string is 52024/7/2954从键盘上读一个输入行并输出n#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,line);How are youHow are you2024/7/2955连接两个字符串n#define LENGTH 40#include void main(void) char str1LENGTH + 1,str2LENGTH + 1;char result2 * LENGTH + 1;int len1,len2;coutInput the first string:str1;coutInput the second string.str2;2024/7/2956nlen1 = 0;while(str1len1 != 0) resultlen1 = str1len1;len1 +;len2 = 0;while(str2len2 != 0) resultlen1 = str2len2;len1 +;len2 +;resultlen1 = 0;coutresultendl;运行该程序并输入:Input the first string:GoodInput the second string:bye运行结果为:Goodbye2024/7/2957转换数字字符串为相应的整数n#include #include void main(void) char s10;int i,n,sign;coutInput a numberic strings;i = 0;sign = 1;if(si = + | si = -)/符号sign = (si + = +)?1:-1;for(n = 0;si = 0 & si = 9;i +)n = n * 10 + si - 0;n = sign * n;coutnendl; 运行该程序并输入:Input a numberic string123运行结果为:12358字符串处理函数n头文件string.h包含所有字符串处理函数的说明。n常用的字符串处理函数: 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/7/2959strcpyn函数原型:strcpy(char destination, const char source);n函数功能:将字符串source拷贝到字符串destination中。2024/7/2960n#include #include void main(void) char str110 = “Nanjing ;char str210 = Computer;coutstrcpy(str1,str2)endl;注意:在定义数组时,destination的字符串长度必须大于或等于source的字符串长度。不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。Computer2024/7/2961strncpyn函数原型:strncpy(char destination, const char source, int numchars);n函数功能:将字符串source中前numchars个字符拷贝到字符串destination中。2024/7/2962n#include #include void main(void) char str110 = “Nanjing;char str210 = Computer;coutstrncpy(str1,str2,3)endl;Comjing2024/7/2963n函数原型:strcat(char target, const char source);n函数功能:将字符串source接到字符串target的后面。2024/7/2964Error!n#include #include void main(void) char str1 = “Nanjing ;char str2 = Computer;coutstrcat(str1,str2)endl;Nanjing Computer2024/7/2965strncatn函数原型:strncat(char target, const char source, int numchars);n函数功能:将字符串source的前numchars个字符接到字符串target的后面。2024/7/2966Error!n#include #include void main(void) char str1 = Tsinghua ;char str2 = Computer;coutstrcpy(str1,str2)endl;n运行结果:Tsinghua Com2024/7/2967strcmpn函数原型:int strcmp(const char firststring, const char secondstring);n函数功能:比较两个字符串firststring和secondstring。2024/7/2968n#include #include void main(void) char buf1 = aaa;char buf2 = bbb;char buf3 = ccc;int ptr; ptr = strcmp(buf2,buf1);if(ptr 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 1Buffer 2 is greater than buffer 32024/7/2969strlenn函数原型:strlen( const char string );n函数功能:统计字符串string中字符的个数。2024/7/2970n#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/7/2971数组作函数参数n数组名可以作函数的实参和形参,数组元素只能作函数实参。n当数组作为函数参数时,调用函数中的实参数组只是传送该数组在内存中的首地址。n调用函数向被调函数传递数据地址的方式,称之为函数参数的引用传递。n数组参数的引用传递,除传送数组名外,调用函数还必须通知被调函数:数组有多少个元素。类型说明符 函数名(数组参数, 数组元素个数)注意:数组参数并不指定数组元素的个数,即中是空的,没有数字。2024/7/2972程序举例n#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/7/2973程序举例ndouble mean(double data_array, int numelements) double sum = 0.0;for(int i=0; inumelements; i+)sum += data_arrayi;return sum / numelements;2024/7/2974nint main()double heights100;double h;int n = 0;cout Enter heights: h;while(h 0.0) heightsn = h;n+;cin h;double m = mean(heights, n);cout The mean is m endl;return 0;2024/7/2975函数参数的引用传递n作用:当数组作函数参数时,仅仅传送数组在内存中的首地址,避免了复制每一个数组元素,可以节省机器的内存和运行时间。函数中return语句只能带回一个返回值,如果被调函数中有多个返回值,可以通过数组带回。n注意:被调函数中对形参数椐的不恰当的改变,会破坏调用函数中的实参数据。2024/7/2976程序举例n顺序查找。在一组数据中查找到待查数据的位置。当一组数据无序时,一般采用顺序查找。顺序查找是把给定的值与这组数据中的每个值顺序比较,如果找到,就输出这个值的位置,如果找不到则报告没有找到。2024/7/2977n#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/7/2978void 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/7/2979n运行该程序并输入: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 52024/7/2980程序举例n字符串逆序输出。2024/7/2981n#include #include #define LENGTH 80n/反序一个字符串void reverse(char s)char c;int i,j;j = strlen(s) - 1;for(i = 0;i j;i +)c = si;si = sj;sj = c;j -;2024/7/2982void main(void) char strLENGTH + 1;coutstr;reverse(str);coutThe string is reversed:strendl;运行该程序并输入:Input a string:abcd运行结果为:The string is reversed:dbca2024/7/2983Thank you!2024/7/2984
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号