第6章数组资料课件

上传人:沈*** 文档编号:241660795 上传时间:2024-07-14 格式:PPT 页数:62 大小:2.13MB
返回 下载 相关 举报
第6章数组资料课件_第1页
第1页 / 共62页
第6章数组资料课件_第2页
第2页 / 共62页
第6章数组资料课件_第3页
第3页 / 共62页
点击查看更多>>
资源描述
江汉大学数计学院计算中心江汉大学数计学院计算中心20112011年年1 1月月第第6 6章章 数数 组组C C 语言程序设计语言程序设计2024/7/142第第6章章 数组数组 本章重点介绍本章重点介绍:6.1 一维数组一维数组6.2 二维数组二维数组6.3 字符数组与字符串字符数组与字符串2024/7/143第第6章章 数组数组l一个人一个人N门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?l一个班一个班N门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?.这些数据的特点这些数据的特点这些数据的特点这些数据的特点:具有相同的数据类型。:具有相同的数据类型。:具有相同的数据类型。:具有相同的数据类型。为了方便地使用这些数据,为了方便地使用这些数据,为了方便地使用这些数据,为了方便地使用这些数据,C C C C语言提供了一种语言提供了一种语言提供了一种语言提供了一种构造数据类型:构造数据类型:构造数据类型:构造数据类型:数组。数组。数组。数组。例如:存储学生成绩用例如:存储学生成绩用例如:存储学生成绩用例如:存储学生成绩用实型数组实型数组实型数组实型数组 score5score5score5score5其中:其中:其中:其中:scorescorescorescore是数组名。是数组名。是数组名。是数组名。该数组可以存放该数组可以存放该数组可以存放该数组可以存放5 5 5 5个成绩,个成绩,个成绩,个成绩,分别用下标变量表示:分别用下标变量表示:分别用下标变量表示:分别用下标变量表示:score0,score1,score0,score1,score0,score1,score0,score1,score4score4score4score4。下标变量下标变量下标变量下标变量也称为也称为也称为也称为数组元素数组元素数组元素数组元素。2024/7/1446.1 一维数组一维数组例如:例如:例如:例如:int a10;int a10;floatfloat score5score5;“数据类型数据类型数据类型数据类型”:是数组元素的数据类型。是数组元素的数据类型。是数组元素的数据类型。是数组元素的数据类型。“数组名数组名数组名数组名”:”:遵循遵循遵循遵循C语言语言标识符规则。标识符规则。标识符规则。标识符规则。“常量表达式常量表达式常量表达式常量表达式”:表示数组中有多少个元素,即数:表示数组中有多少个元素,即数:表示数组中有多少个元素,即数:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式组的长度。它可以是整型常量、整型常量表达式组的长度。它可以是整型常量、整型常量表达式组的长度。它可以是整型常量、整型常量表达式或符号常量。或符号常量。或符号常量。或符号常量。6.1.1一维数组的定义一维数组的定义数据类型数据类型数组名数组名常量表达式常量表达式;2024/7/145以下数以下数以下数以下数组组定定定定义义是正确的:是正确的:是正确的:是正确的:#defineN10#defineN10floatscore1N,score2N;floatscore1N,score2N;intnum10+N;intnum10+N;charc26;charc26;以下数组定义是不正确的:以下数组定义是不正确的:以下数组定义是不正确的:以下数组定义是不正确的:intarray(10);intarray(10);intn;floatscoren;intn;floatscoren;doubleba.d;doubleba.d;charstr;charstr;6.1.1 一维数组的定义(续)一维数组的定义(续)2024/7/146数组在内存的存放数组在内存的存放l l数数组下下标从从0开始。开始。l l一一维数数组的数的数组元素元素在内存里在内存里按按顺序序存放。存放。l l数数组名代表名代表数数组的首的首地址地址,即,即score的的值与与score0 的地址的地址值相同。相同。score0score1score2score3score491.534.567.572.084.0低地址低地址高地址高地址score数组数组2024/7/1476.1.2 数组元素的引用数组元素的引用 格式:格式:格式:格式:例如:输入学生成绩例如:输入学生成绩例如:输入学生成绩例如:输入学生成绩 score2=78.5score2=78.5 for(i=0;ifor(i=0;i5 5;i+);i+)scanfscanf(%f%f,&score&scorei);i);例如:例如:例如:例如:fibn=fibn-1+fibn-2;fibn=fibn-1+fibn-2;下标表达式下标表达式下标表达式下标表达式的值必须是的值必须是的值必须是的值必须是整型表达式整型表达式整型表达式整型表达式。数组名数组名下标表达式下标表达式2024/7/1486.1.2 数组元素的引用(续)数组元素的引用(续)说明明:下标从下标从0开始(下界为开始(下界为0),数组的最大下标),数组的最大下标(上界)是数组长度减(上界)是数组长度减1。例如:例如:inta10;scanf(%d,&a10);/*下标越界下标越界*/C编译系统不做越界检查,如果引用的数组元素编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。超出数组范围会破坏其他变量的值。2024/7/1496.1.2 数组元素的引用(续)数组元素的引用(续)是是下标运算下标运算下标运算下标运算符符符符,引用引用数组元素数组元素时,时,VC+系统根据系统根据数组的数组的首地址首地址首地址首地址和和下下下下标标标标数,计算出该元数,计算出该元素的实际地址,取素的实际地址,取出该出该地址地址的的内容内容内容内容进进行操作。行操作。如引用如引用score2:(1)计算计算2000+2*4=2008(2)取出取出2008的内容的内容2000H2004H2008H200CH218CHscore0score1score2score3score491.534.567.572.084.02024/7/14106.1.3 一维数组的初始化一维数组的初始化初始化:在定义数组时给数组元素赋初值。初始化:在定义数组时给数组元素赋初值。1在定义数组时,对全部数组元素赋初值在定义数组时,对全部数组元素赋初值例如:例如:inta5=0,1,2,3,4;此时可以省略数组长度,例如:此时可以省略数组长度,例如:inta=0,1,2,3,4;2在定义数组时,对部分数组元素赋初值在定义数组时,对部分数组元素赋初值例如:例如:inta5=1,2,3;系统为其余元素赋系统为其余元素赋0。3当初值的个数多于数组元素的个数时,编译出错当初值的个数多于数组元素的个数时,编译出错例如:例如:inta5=0,1,2,3,4,5;2024/7/14116.1.4 一维数组应用举例一维数组应用举例【例例】将将将将10101010个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。#defineN10main()inti;floatscoreN;for(i=0;i=0;i-)printf(%6.1f,scorei);运行情况如下:运行情况如下:67748992346783957378 78.073.095.083.067.034.092.089.074.067.02024/7/1412【例例】输入输入5个整数,找出最大数和最小数所个整数,找出最大数和最小数所在位置,并把二者对调,然后输出。在位置,并把二者对调,然后输出。思路:思路:思路:思路:l求最大求最大/小值采用打擂台的方法。小值采用打擂台的方法。l定义一维数组定义一维数组a存放被比较的数。存放被比较的数。l定义变量定义变量max:最大值,:最大值,min:最小值,:最小值,k:最大值下标:最大值下标,j:最小值下标:最小值下标。l各数依次与擂主进行比较,各数依次与擂主进行比较,若若aimax则则:max=ai;k=i;否则判断否则判断:若若aimin则则:min=ai;j=i;l当所有的数都比较完之后,将当所有的数都比较完之后,将aj=max;k=min;l输出输出a数组。数组。2024/7/1413main()main()inta5,max,min,i,j,k;inta5,max,min,i,j,k;for(i=0;i5;i+)for(i=0;i5;i+)scanf(%d,&ai);scanf(%d,&ai);min=a0;max=a0;min=a0;max=a0;j=k=0;j=k=0;for(i=1;i5;i+)for(i=1;i5;i+)if(aimin)min=ai;j=i;if(aimax)max=ai;k=i;elseif(aimax)max=ai;k=i;aj=max;ak=min;aj=max;ak=min;for(i=0;i5;i+)for(i=0;i5;i+)printf(%5d,ai);printf(%5d,ai);printf(n);printf(n);程序运行情况如下:程序运行情况如下:57231 512372024/7/1414【例例】冒泡法排序(从小到大)。冒泡法排序(从小到大)。以以以以6 6个数:个数:个数:个数:3 3、7 7、5 5、6 6、8 8、0 0为例。为例。为例。为例。第一趟排序情况如下:第一趟排序情况如下:第一趟排序情况如下:第一趟排序情况如下:3 73 7 5 6 8 0 5 6 8 0第一次第一次第一次第一次 3 3和和和和7 7比较,不交换比较,不交换比较,不交换比较,不交换 3 3 7 57 5 6 8 0 6 8 0第二次第二次第二次第二次 7 7和和和和5 5比较,交换比较,交换比较,交换比较,交换 3 5 3 5 7 67 6 8 0 8 0第三次第三次第三次第三次 7 7和和和和6 6比较,交换比较,交换比较,交换比较,交换 3 5 6 3 5 6 7 87 8 0 0第四次第四次第四次第四次 7 7和和和和8 8比较,不交换比较,不交换比较,不交换比较,不交换 3 5 6 7 3 5 6 7 8 08 0第五次第五次第五次第五次 8 8和和和和0 0比较,交换比较,交换比较,交换比较,交换 3 5 6 7 0 83 5 6 7 0 8在第一趟排序中,在第一趟排序中,在第一趟排序中,在第一趟排序中,6 6个数比较了个数比较了个数比较了个数比较了5 5次,把次,把次,把次,把6 6个数中个数中个数中个数中的最大数的最大数的最大数的最大数8 8排在最后。排在最后。排在最后。排在最后。2024/7/1415冒泡法排序冒泡法排序(续)(续)第二趟排序情况如下:第二趟排序情况如下:第二趟排序情况如下:第二趟排序情况如下:3 53 5 6 7 0 8 6 7 0 8第一次第一次第一次第一次 3 3和和和和5 5比比比比较较,不交,不交,不交,不交换换 3 3 5 65 6 7 0 8 7 0 8第二次第二次第二次第二次 5 5和和和和6 6比比比比较较,不交,不交,不交,不交换换 3 5 3 5 6 76 7 0 8 0 8第三次第三次第三次第三次 6 6和和和和7 7比比比比较较,不交,不交,不交,不交换换 3 5 6 3 5 6 7 07 0 8 8第四次第四次第四次第四次 7 7和和和和0 0比比比比较较,交,交,交,交换换 3 5 6 0 7 83 5 6 0 7 8在第二趟排序中,最大数在第二趟排序中,最大数在第二趟排序中,最大数在第二趟排序中,最大数8 8不用参加比不用参加比不用参加比不用参加比较较,其余的,其余的,其余的,其余的5 5个数比个数比个数比个数比较较了了了了4 4次,把其中的最大数次,把其中的最大数次,把其中的最大数次,把其中的最大数7 7排在最后,排出排在最后,排出排在最后,排出排在最后,排出7 87 8。以此以此以此以此类类推:推:推:推:第三趟比第三趟比第三趟比第三趟比较较3 3次,排出次,排出次,排出次,排出 6 7 86 7 8第四趟比第四趟比第四趟比第四趟比较较2 2次,排出次,排出次,排出次,排出 5 6 7 85 6 7 8第五趟比第五趟比第五趟比第五趟比较较1 1次,排出次,排出次,排出次,排出 3 5 6 7 83 5 6 7 8最后最后最后最后还还剩下剩下剩下剩下1 1个数个数个数个数0 0,不需再比,不需再比,不需再比,不需再比较较,得到排序,得到排序,得到排序,得到排序结结果:果:果:果:0 3 5 6 7 80 3 5 6 7 82024/7/1416冒泡法排序冒泡法排序(续)(续)从上述过程可以看到:从上述过程可以看到:从上述过程可以看到:从上述过程可以看到:n n n n个数要比较个数要比较个数要比较个数要比较n-1n-1n-1n-1趟,而趟,而趟,而趟,而在第在第在第在第j j j j趟比较中,要进行趟比较中,要进行趟比较中,要进行趟比较中,要进行n-jn-jn-jn-j次两两比较。次两两比较。次两两比较。次两两比较。冒泡法排序冒泡法排序for(i=0;iN;i+)输入输入aifor(j=1;jN;j+)for(i=0;iai+1TFai与与ai+1交换交换输出输出a0aN-12024/7/1417#defineN6#defineN6main()main()intaN;intaN;inti,j,t;inti,j,t;for(i=0;iN;i+)for(i=0;iN;i+)scanf(%d,&ai);scanf(%d,&ai);for(j=1;j=N-1;j+)for(j=1;j=N-1;j+)/*控制比控制比较的趟数的趟数*/for(i=0;iN-j;i+)for(i=0;iai+1)if(aiai+1)t=ai;ai=ai+1;ai+1=t;t=ai;ai=ai+1;ai+1=t;printf(Thesortednumbers:n);printf(Thesortednumbers:n);程序运行情况如下:程序运行情况如下:375680 0356782024/7/1418以以6个数:个数:3、7、5、6、8、0为例。例。思路:思路:思路:思路:第一趟:将第一趟:将第一趟:将第一趟:将第一个数第一个数第一个数第一个数依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如果后面的某数小于果后面的某数小于果后面的某数小于果后面的某数小于第一个数第一个数第一个数第一个数,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较结束后,结束后,结束后,结束后,第一个数第一个数第一个数第一个数则是则是则是则是最小最小最小最小的数。的数。的数。的数。第二趟:第二趟:第二趟:第二趟:将将将将第二个数第二个数第二个数第二个数依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如果后面的某数小于果后面的某数小于果后面的某数小于果后面的某数小于第二个数第二个数第二个数第二个数,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较结束后,结束后,结束后,结束后,第二个数第二个数第二个数第二个数则是则是则是则是次小次小次小次小的数;的数;的数;的数;。【例例】选择法排序(从小到大)。选择法排序(从小到大)。2024/7/1419#defineN5#defineN5main()main()intaN;intaN;inti,j,t;inti,j,t;for(i=0;iN;i+)for(i=0;iN;i+)scanf(%d,&ai);scanf(%d,&ai);printf(n);printf(n);for(i=0;iN-1;i+)/*确定基准位置确定基准位置 */for(j=i+1;jN;j+)if(ajai)t=aj;aj=ai;ai=t;printf(Thesortednumbers:n);printf(Thesortednumbers:n);程序运行情况如下:程序运行情况如下:9678658640 Thesortednumbers:40657886962024/7/14206.2 二维数组二维数组多维数组的空间想象多维数组的空间想象一维数组:一维数组:一维数组:一维数组:一列长表或一个向量一列长表或一个向量一列长表或一个向量一列长表或一个向量多维数组:多维数组:多维数组:多维数组:多维空间的一个数据列阵多维空间的一个数据列阵多维空间的一个数据列阵多维空间的一个数据列阵三维数组:三维数组:三维数组:三维数组:三维空间的一个方阵三维空间的一个方阵三维空间的一个方阵三维空间的一个方阵二维数组:二维数组:二维数组:二维数组:二维空间的一个方阵二维空间的一个方阵二维空间的一个方阵二维空间的一个方阵2024/7/14216.2 二维数组二维数组 数据类型数据类型数组名常量表达式数组名常量表达式1常量表达式常量表达式2;例如:例如:floatx23;6.2.1二维数组二维数组的定义的定义X00X00 X01X01 X02X02X10X10 X11X11 X12X12intinta3,4a3,4,b,b(3,4)(3,4),c,d,c,d(3)(4)(3)(4);2024/7/1422x00 x01x02x10 x11x1220002000H H20042004H H20082008H H200c200cH H20102010H H20142014H H地址地址值值数组元素数组元素二维数组二维数组元素元素在内存中在内存中的的排列顺序排列顺序:按行存放按行存放2024/7/1423x0是数组名,是元素是数组名,是元素x00的地址的地址x1是数组名,是数组名,是元素是元素x10的地址的地址二维数组可看作是一种特殊的一维数组二维数组可看作是一种特殊的一维数组x0-x00,x01,x02x0-x00,x01,x02x1-x10,x11,x12x1-x10,x11,x12例如,可以把例如,可以把例如,可以把例如,可以把x x x x数组看作是包含二个元素的一维数组,数组看作是包含二个元素的一维数组,数组看作是包含二个元素的一维数组,数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。每个元素又是一个含有三个元素一维数组。每个元素又是一个含有三个元素一维数组。每个元素又是一个含有三个元素一维数组。2024/7/1424a34=3;/*下标越界下标越界*/a1,2=1;/*应写成应写成a12=1;*/6.2.2 二维数组元素的引用二维数组元素的引用例:例:inta34;a00=3;a01=a00+10;数组名数组名数组名数组名行下标表达式列下标表达式行下标表达式列下标表达式行下标表达式列下标表达式行下标表达式列下标表达式 数组元素的表示形式数组元素的表示形式:2024/7/14256.2.3 二维数组的初始化二维数组的初始化例:例:inta23=1,2,3,4,5,6;1 1 1 1按行赋初值按行赋初值按行赋初值按行赋初值例例:inta23=1,2,3,4,5,6;初始化后结果:初始化后结果:初始化后结果:初始化后结果:1231234564562 2 2 2按数组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值3 3 3 3给部分元素赋初值给部分元素赋初值给部分元素赋初值给部分元素赋初值例:例:inta23=1,4;初始化后结果:初始化后结果:1004002024/7/14266.2.3 二维数组的初始化(续)二维数组的初始化(续)4 4 4 4数组初始化时,行长度可省,列长度不能省数组初始化时,行长度可省,列长度不能省数组初始化时,行长度可省,列长度不能省数组初始化时,行长度可省,列长度不能省 例如:例如:例如:例如:int aint aint aint a3 3 3 3=1,2,3,4,5,6=1,2,3,4,5,6=1,2,3,4,5,6=1,2,3,4,5,6,7,7,7,7;int b4=1,4,5;int b4=1,4,5;int b4=1,4,5;int b4=1,4,5;初始化初始化初始化初始化结结果:果:果:果:a a 结果结果结果结果:a0:123a0:123a1:456a1:456a2:700a2:700b b b b 结果:结果:结果:结果:b0:1 0 0 0b0:1 0 0 0b0:1 0 0 0b0:1 0 0 0b1:4 5 0 0b1:4 5 0 0b1:4 5 0 0b1:4 5 0 02024/7/1427下面对二维数组的定义都是错误的:下面对二维数组的定义都是错误的:6.2.3 二维数组的初始化(续)二维数组的初始化(续)floatx3=1.0,2.0,3.0,4.0,5.0,6.0;inta,b2,c3;intm24=1,2,3,4,5,6,7,8,9;/*/*编译出错,初值个数多于数组元素的个数编译出错,初值个数多于数组元素的个数编译出错,初值个数多于数组元素的个数编译出错,初值个数多于数组元素的个数*/2024/7/14286.2.4 二维数组应用举例二维数组应用举例【例例例例】给一个给一个给一个给一个4 4行行行行3 3列的二维数组输入列的二维数组输入列的二维数组输入列的二维数组输入/出数据。出数据。出数据。出数据。main()inta43,i,j,k;for(i=0;i4;i+)for(j=0;j3;j+)scanf(%d,&aij);for(i=0;i4;i+)printf(n);for(j=0;j3;j+)printf(%dt,aij);printf(n);程序运行情况如下:程序运行情况如下:123 456 789 101112 1234567891011122024/7/14296.2.4 二维数组应用举例(续)二维数组应用举例(续)【例例例例】有一个有一个有一个有一个N N N NM M M M矩阵,编程序求出其中绝对值矩阵,编程序求出其中绝对值矩阵,编程序求出其中绝对值矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。最大的那个元素的值及其所在的行、列位置。最大的那个元素的值及其所在的行、列位置。最大的那个元素的值及其所在的行、列位置。max=|a00|,row=0,colum=0for(i=0;iN;i+)for(j=0;jmaxTFmax=|aij|row=icolum=j输出绝对值输出绝对值最大的元素及行列下标最大的元素及行列下标2024/7/1430#includemath.h#includemath.h#defineN4#defineN4#defineM5#defineM5main()main()inti,j,row,colum,max,aNM;inti,j,row,colum,max,aNM;/*/*输入数据输入数据输入数据输入数据*/max=a00;row=colum=0;max=a00;row=colum=0;for(i=0;iN;i+)for(i=0;iN;i+)for(j=0;jM;j+)for(j=0;jmax)if(abs(aij)max)max=abs(aij);max=abs(aij);row=i;row=i;colum=j;colum=j;/*/*输出数据输出数据输出数据输出数据*/程序运行情况如下:程序运行情况如下:3456126723 1267439854 6545661624 3783256419 max=98,row=1,colum=32024/7/14316.3 字符数组与字符串字符数组与字符串字符数组字符数组字符数组字符数组:可以存放若干个可以存放若干个可以存放若干个可以存放若干个字符字符字符字符,也可以存放也可以存放也可以存放也可以存放字符串字符串字符串字符串。6.3.1 6.3.1 基本概念基本概念C Ch hi in na a00字符串:字符串:字符串:字符串:字符串的末尾必须有字符串的末尾必须有字符串的末尾必须有字符串的末尾必须有00字符,它的字符,它的字符,它的字符,它的ASCIIASCII码值为码值为码值为码值为0 0。C Ch hi in na a不是字符串不是字符串是字符是字符是字符是字符串串串串2024/7/1432再例如:再例如:再例如:再例如:chara35;chara35;a a数组是一个二维的字符数组,可以存放数组是一个二维的字符数组,可以存放数组是一个二维的字符数组,可以存放数组是一个二维的字符数组,可以存放1515个字个字个字个字符符符符或或或或3 3个长度不大于个长度不大于个长度不大于个长度不大于4 4的字符串的字符串的字符串的字符串。6.3.2 字符数组的定义字符数组的定义例如:例如:例如:例如:chars10;chars10;s s数组是一维数组是一维数组是一维数组是一维字符数组字符数组字符数组字符数组,它可以存放,它可以存放,它可以存放,它可以存放1010个字符个字符个字符个字符或或或或一个一个一个一个长度不大于长度不大于长度不大于长度不大于9 9的字符串的字符串的字符串的字符串。注意:字符串只能存放在字符数组中。注意:字符串只能存放在字符数组中。2024/7/14336.3.3 字符数组的初始化字符数组的初始化C Ch hi in na a1 1用字符常量赋初值用字符常量赋初值用字符常量赋初值用字符常量赋初值例如:例如:例如:例如:charc5=C,h,i,n,a;charc5=C,h,i,n,a;再例如:再例如:再例如:再例如:charc6=C,h,i,n,a,0;charc6=C,h,i,n,a,0;C Ch hi in na a00是字符串是字符串是字符串是字符串不是字符串不是字符串2024/7/14346.3.3 字符数组的初始化(续)字符数组的初始化(续)再例如:再例如:再例如:再例如:chara310=basic,pascal,c;chara310=basic,pascal,c;a as st tr ri in ng g00002 2用字符串常量赋初值用字符串常量赋初值用字符串常量赋初值用字符串常量赋初值例如:例如:例如:例如:charstr10=astring;charstr10=astring;或或或或charstr10=astring;charstr10=astring;b ba as si ic c0000000000p pa as sc ca al l00000000c c000000000000000000是字符串吗?是字符串吗?是字符串吗?是字符串吗?2024/7/14356.3.3 字符数组的初始化(续)字符数组的初始化(续)例如:例如:例如:例如:chars37=s,t,r,i,n,g;chars37=s,t,r,i,n,g;GG o oo od dmm o or rn ni in ng g!003 3初始化时长度的省略初始化时长度的省略初始化时长度的省略初始化时长度的省略例如:例如:例如:例如:chars1=Goodmorning!;chars1=Goodmorning!;s10s113例如:例如:例如:例如:chars2=s,t,r,i,n,g;chars2=s,t,r,i,n,g;s st tr ri in ng gs st tr ri in ng g00思考:哪个数组存放的是字符串思考:哪个数组存放的是字符串?2024/7/14366.3.4 6.3.4 字符数组的引用字符数组的引用【例例】对字符数组对字符数组c1赋赋09,对字符数,对字符数组组c2赋赋AZ,然后输出,然后输出c1和和c2数组中的数组中的数据。数据。1对字符数组元素的引用对字符数组元素的引用可以为可以为数组元素数组元素赋值,也可以输入赋值,也可以输入/输出输出元元素的值。素的值。2024/7/1437程序如下:程序如下:main()charc110,c226;inti;for(i=0;i10;i+)c1i=i+48;for(i=0;i26;i+)c2i=i+A;for(i=0;i10;i+)printf(%c,c1i);printf(n);for(i=0;i26;i+)printf(%c,c2i);printf(n);2024/7/14382对字符数组的整体引用对字符数组的整体引用 输出字符串输出字符串例如:例如:例如:例如:charc=China;printf(%s%s,c c););输出结果为:输出结果为:输出结果为:输出结果为:ChinaChinaC是数组首地址是数组首地址输出时遇输出时遇0为止为止 再例如:再例如:再例如:再例如:charccharc=pascal=pascal00basic;basic;printf(printf(%s%s,c);,c);输出结果为:输出结果为:输出结果为:输出结果为:pascalpascal2024/7/14392对字符数组的整体引用(续)对字符数组的整体引用(续)输入字符串输入字符串输入字符串输入字符串例如:例如:例如:例如:charc10;charc10;scanf(%s,c)scanf(%s,c);输入:输入:输入:输入:beijingbeijing b be ei ij ji in ng g00三个字符串用空格隔开,分别赋三个字符串用空格隔开,分别赋三个字符串用空格隔开,分别赋三个字符串用空格隔开,分别赋给给给给str1str1、str2str2、str3str3三个数组。三个数组。三个数组。三个数组。再例如:再例如:再例如:再例如:charstr110,str210,str310;charstr110,str210,str310;scanf(%s%s%s,str1,str2,str3);scanf(%s%s%s,str1,str2,str3);输入:输入:输入:输入:pascalbasiccpascalbasicc 注意:不可以为数组整体赋值,例如:注意:不可以为数组整体赋值,例如:charc10;c=charc10;c=beijingbeijing ;因为因为因为因为c c是数组首地址,是常量!是数组首地址,是常量!是数组首地址,是常量!是数组首地址,是常量!注意:注意:“%s%s”遇空格、遇空格、TabTab和回车结束输入。和回车结束输入。2024/7/14406.3.5 字符串处理函数字符串处理函数说说明:明:明:明:程序中如果程序中如果程序中如果程序中如果调调用下面介用下面介用下面介用下面介绍绍的的的的8 8个字符串个字符串个字符串个字符串处处理函数,理函数,理函数,理函数,在程序的开始在程序的开始在程序的开始在程序的开始应该应该写写写写:#include stdio.h 或或或或#include string.h 预处预处理命令,否理命令,否理命令,否理命令,否则则在在在在VC+6.0VC+6.0中中中中编译编译会出会出会出会出现现警告警告警告警告信息。信息。信息。信息。在字符串在字符串在字符串在字符串处处理函数中,凡是用数理函数中,凡是用数理函数中,凡是用数理函数中,凡是用数组组名或字符串首名或字符串首名或字符串首名或字符串首地址作参数的地方,都可以用指地址作参数的地方,都可以用指地址作参数的地方,都可以用指地址作参数的地方,都可以用指针变针变量作参数。量作参数。量作参数。量作参数。指指指指针变针变量的概念在第量的概念在第量的概念在第量的概念在第8 8章介章介章介章介绍绍。2024/7/14411字符串输出函数字符串输出函数puts()调用格式用格式:puts(str)功能功能:输出一个字符串,:输出一个字符串,输出后自出后自动换行行。说明明:strstr可以是字符数组名或字符串常量。可以是字符数组名或字符串常量。例如例如:char str1=China;char str1=China;char str2=Beijing;char str2=Beijing;puts(str1);puts(str1);puts(str2);puts(str2);输出结果:输出结果:China China BeijingBeijing 2024/7/14422字符串输入函数字符串输入函数gets()调用格式用格式:gets(str)gets(str)功能功能:从键盘读入一个字符串存入从键盘读入一个字符串存入str数组中,并且数组中,并且得到一个函数值,该函数值是得到一个函数值,该函数值是str数组的首地址。数组的首地址。说明明:strstrstrstr是数组名。是数组名。是数组名。是数组名。程序运行情况如下:程序运行情况如下:Howareyou?Finethankyou.Howareyou?Finethankyou.例如例如:main()charc120,c220;gets(c1);gets(c2);puts(c1);puts(c2);2024/7/144314-7月-24C语言程序设计教程43字符串输入输出举例字符串输入输出举例#include#include main()main()char s20,s120;char s20,s120;scanf(scanf(“%s%s”,s);,s);printf(printf(“%sn%sn”,s);,s);scanf(scanf(“%s%s%s%s”,s,s1);,s,s1);printf(printf(“s=%s,s1=%ss=%s,s1=%s”,s,s1);,s,s1);puts(puts(“nn”););gets(s);puts(s);gets(s);puts(s);程序运行过程:How do you do?HowHow do you do?s=How,s1=doHow do you do?How do you do?2024/7/14443字符串连接函数字符串连接函数 strcat()调用格式:调用格式:strcat(str1,str2)strcat(str1,str2)功能:功能:把把str2str2中的字符串连接到中的字符串连接到str1str1字符串的后字符串的后面,结果放在面,结果放在str1str1数组中,函数值是数组中,函数值是str1str1的值。的值。b b e ei ij ji in n g ga an n d ds sh h a an n g gh h a a i i00必须足够大输出结果:输出结果:输出结果:输出结果:beijingandshanghaibeijingandshanghai例如:例如:char str121=beijing and;char str121=beijing and;char str2=shanghai;char str2=shanghai;printf(%s,strcat(str1,str2);printf(%s,strcat(str1,str2);2024/7/14454字符串复制函数字符串复制函数strcpy()调用格式:调用格式:strcpy(str1,str2)strcpy(str1,str2)功能:功能:将将将将str2str2str2str2中的字符串复制到中的字符串复制到中的字符串复制到中的字符串复制到str1str1str1str1数组中。数组中。数组中。数组中。B Be ei ij ji in ng g00s1必须足够大思考:这样赋值s1=Beijing;或 s1=s2;可以吗?为什么?s1的结果的结果例如:例如:char s110,s2=Beijing;char s110,s2=Beijing;strcpy(s1,s2);strcpy(s1,s2);或:或:strcpy(s1,Beijing);strcpy(s1,Beijing);2024/7/14465字符串比较函数字符串比较函数strcmp()调用格式:调用格式:strcmp(str1,str2)strcmp(str1,str2)abcde0str1abcde0str2abc00 abcde0a abcd0 Abcde0str1str2str1str2strcmp(str1,str2)=0strcmp(str1,str2)=0strcmp(str1,str2)0strcmp(str1,str2)0strcmp(str1,str2)0strcmp(str1,str2)0)printf(s1s2);elseprintf(s1s2);程序输出结果:程序输出结果:程序输出结果:程序输出结果:s1s2s1s2思考:若有语句if(s1=s2)printf(s1=s2);比较的是什么?2024/7/14486求字符串长度函数求字符串长度函数strlen()调调用格式:用格式:用格式:用格式:strlen(str)strlen(str)strlen(str)strlen(str)功能:功能:功能:功能:测试字符串长度。函数值就是测试字符串长度。函数值就是strstr中字符的中字符的个数。个数。思考:字符串China和str数组在内存中各占几个字节?输出结果:输出结果:输出结果:输出结果:5 5例如:例如:charstr10=China;printf(%d,strlen(str);或或printf(%d,strlen(China);2024/7/144914-7月-24C语言程序设计教程49【例例】从键盘上输入两个字符串,若不相等,从键盘上输入两个字符串,若不相等,从键盘上输入两个字符串,若不相等,从键盘上输入两个字符串,若不相等,将短的字符串连接到长的字符串的末尾并输出。将短的字符串连接到长的字符串的末尾并输出。将短的字符串连接到长的字符串的末尾并输出。将短的字符串连接到长的字符串的末尾并输出。#include#includemain()intlen1,len2chars180,s280;gets(s1);gets(s2);if(strcmp(s1,s2)!=0)if(strlen(s1)strlen(s2)strcat(s1,s2);puts(s1);elsestrcat(s2,s1);puts(s2);输入:输入:输入:输入:youyou ThankThank 输出:输出:输出:输出:ThankyouThankyou6.3.6字符数组应用举例字符数组应用举例2024/7/14506.3.6字符数组应用举例字符数组应用举例(续续)【例例例例】从标准输入设备上输入一个字符串,分别统从标准输入设备上输入一个字符串,分别统从标准输入设备上输入一个字符串,分别统从标准输入设备上输入一个字符串,分别统计其中计其中计其中计其中每个数字每个数字每个数字每个数字、空格空格空格空格、字母字母字母字母及及及及其他字符其他字符其他字符其他字符出现的次出现的次出现的次出现的次数。数。数。数。思路:思路:思路:思路:用用gets()函数读字符串,然后判断每一个字符函数读字符串,然后判断每一个字符是否是是否是数字数字、空格空格、大小写字母大小写字母或或其他字符其他字符,用循,用循环实现。环实现。注意:注意:注意:注意:此题要求此题要求分别分别统计统计每个数字每个数字出现的次数,而出现的次数,而不是统计数字出现的总次数。不是统计数字出现的总次数。用一个一维整型数组存放每个数字出现的次数。用一个一维整型数组存放每个数字出现的次数。2024/7/1451chars80;inti,sp=0,oth=0,lett=0;intdig10=0;gets(s);for(i=0;si!=0;i+)if(si=0&si=A&si=a&si=z)lett+;elseoth+;for(i=0;i10;i+)printf(%d:%d个个,i,digi);printf(nspace:%dletter:%dother:%dn,sp,lett,oth);程序运行情况如下程序运行情况如下:China 1949.10.12004.10.10:4个 1:5个 2:2个 3:0个 4:1个 5:0个 6:0个 7:0个 8:0个 9:2个space:1 letter:5 other:52024/7/145214-7月-24C语言程序设计教程52【例例】从从从从键键键键盘盘盘盘上上上上输输输输入入入入一一一一个个个个正正正正整整整整数数数数,判判判判断断断断其其其其是是是是否否否否为为为为回回回回文文文文数数数数。所所所所谓谓谓谓回回回回文文文文数数数数是是是是顺顺顺顺读读读读与与与与反反反反读读读读都都都都一一一一样样样样的的的的数数数数,如如如如:12321,2345543212321,2345543212321,2345543212321,23455432都是回文数。都是回文数。都是回文数。都是回文数。思路:思路:将将数数n按按位位对对10求求模模,求求出出每每一一位位数数字字并并按按顺顺序序保保存在数组存在数组digit中;中;根根据据回回文文数数的的特特点点,将将分分解解出出的的数数字字序序列列的的左左、右两端数字两两比较,并向中间靠拢;右两端数字两两比较,并向中间靠拢;用用i,k两两个个变变量量记记录录两两端端数数字字序序号号,若若直直到到位位置置重重叠时各位数字都相等,则为回文数,否则,不是。叠时各位数字都相等,则为回文数,否则,不是。6.3.6字符数组应用举例(续)字符数组应用举例(续)2024/7/1453#include stdio.h#includestring.hmain()inti,k,digit10;longn,m;puts(输入一个正整数输入一个正整数:);scanf(%ld,&n);m=n;k=0;dodigitk+=m%10;m/=10;while(m!=0);k-;for(i=0;ik;i+,k-)if(digiti!=digitk)break;if(ik)printf(%ld不是一个回文数不是一个回文数,n);elseprintf(%ld是一个回文数是一个回文数,n);134431134431134431134431是一个回文数是一个回文数是一个回文数是一个回文数 2024/7/14546.3.6字符数组应用举例字符数组应用举例(续)(续)【例例例例】输入某月份的整数值输入某月份的整数值输入某月份的整数值输入某月份的整数值1 1 1 112121212,输出该月份,输出该月份,输出该月份,输出该月份的英文名称。的英文名称。的英文名称。的英文名称。Illegalm onth.0J Ja an nu ua ar ry y00Decen m ber 0思路:思路:将将1212个英文月份以字符串的形式存放到个英文月份以字符串的形式存放到month1315month1315中,一行存放一个字符串。中,一行存放一个字符串。2024/7/1455main()charmonth15=Illegalmonth.,January,February,March,April,May,June,July,August,September,October,Novenber,December;intm;printf(nInputmonth:);scanf(%d,&m);printf(%d:%sn,m,(m12)?month0:monthm);程序运行情况如下:程序运行情况如下:程序运行情况如下:程序运行情况如下:Inputmonth:Inputmonth:1010 10:October10:October2024/7/14566.3.6字符数组应用举例字符数组应用举例(续)(续)【例例例例】将将将将N N N N个国家名按字母顺序排序后输出。个国家名按字母顺序排序后输出。个国家名按字母顺序排序后输出。个国家名按字母顺序排序后输出。思路:思路:从键盘输入从键盘输入N N个国家名称存放到一个二维字个国家名称存放到一个二维字符数组中,然后用符数组中,然后用选择法选择法对这对这N N个字符串个字符串排序排序。程序如下程序如下:#defineN5#defineN5#defineM10#defineM10#includestdio.h#includestdio.hmain()main()charsNM,strM;inti,j;2024/7/14576.3.6字符数组应用举例字符数组应用举例(续)(续)for(i=0;iN;i+)for(i=0;iN;i+)gets(si);gets(si);for(i=0;iN-1;i+)for(i=0;iN-1;i+)for(j=i+1;jN;j+)for(j=i+1;j0)if(strcmp(si,sj)0)strcpy(str,si);strcpy(str,si);strcpy(si,sj);strcpy(si,sj);strcpy(sj,str);strcpy(sj,str);for(i=0;iN;i+)for(i=0;iN;i+)puts(si);puts(si);选择法排序选择法排序2024/7/1458例例:输入一串字符,统计其中有多少个单词,单词之输入一串字符,统计其中有多少个单词,单词之间用空格分隔开。间用空格分隔开。_this_is_a_test_OK空格空格没有单词没有单词word=0记数记数num=0空格空格没有单词没有单词word=0记数记数num=0空格空格没有单词没有单词word=0记数记数num=0空格空格没有单词没有单词word=0记数记数num=0t有单词有单词word=1记数记数num=1h有单词有单词word=1记数记数num=1i有单词有单词word=1记数记数num=1s有单词有单词word=1记数记数num=1空格空格已有单词已有单词word=0记数记数num=1i有单词有单词word=1记数记数num=2s有单词有单词word=1记数记数num=2空格空格已有单词已有单词word=0记数记数num=2a有单词有单词word=1记数记数num=3空格空格已有单词已有单词word=0记数记数num=3t有单词有单词word=1记数记数num=4e有单词有单词word=1记数记数num=4s有单词有单词word=1记数记数num=4t有单词有单词word=1记数记数num=4空格空格已有单词已有单词word=0记数记数num=4空格空格已有单词已有单词word=0记数记数num=4空格空格已有单词已有单词word=0记数记数num=4O有单词有单词word=1记数记数num=5K有单词有单词word=1记数记数num=50结束。有单词结束。有单词word=1记数记数num=5 main()charstr81;inti,num=0,word=0;gets(str);for(i=0;stri!=0;i+)if(stri=)word=0;elseif(word=0)word=1;num+;printf(“Thereare%dwordsintheline.n”,num);Str字符数组长度要足够长字符数组长度要足够长gets(str);for(i=0;stri!=0;i+)if(stri=)word=0;elseif(word=0)word=1;num+;2024/7/14592024/7/1460数组(一)课后作业数组(一)课后作业1.复复习一一维数数组的概念,的概念,对讲义中的例中的例题:【例例】将将将将10101010个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。【例例例例】输输入入入入5 5个整数,找出最大数和最小数所在位置,并把个整数,找出最大数和最小数所在位置,并把个整数,找出最大数和最小数所在位置,并把个整数,找出最大数和最小数所在位置,并把二者二者二者二者对调对调,然后,然后,然后,然后输输出。出。出。出。【例例例例】冒泡法排序(从小到大)。冒泡法排序(从小到大)。冒泡法排序(从小到大)。冒泡法排序(从小到大)。【例例例例】选择选择法排序(从小到大)。法
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!