《《C语言数组》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C语言数组》PPT课件.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6 6章章 数数 组组北京科技大学北京科技大学 计算机系计算机系C C 语言程序设计语言程序设计1第第6章章 数组数组 本章重点介绍本章重点介绍:6.1 一维数组一维数组6.2 二维数组二维数组6.3 字符数组与字符串字符数组与字符串2023/1/172第第6章章 数组数组l l一个人一个人一个人一个人N N门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?l l一个班一个班一个班一个班N N门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?门课的成绩怎样存储和处理?.这些数据的特点这些数据的特点这些数据的特
2、点这些数据的特点:具有相同的数据类型。:具有相同的数据类型。:具有相同的数据类型。:具有相同的数据类型。为了方便地使用这些数据,为了方便地使用这些数据,为了方便地使用这些数据,为了方便地使用这些数据,C C C C语言提供了一种语言提供了一种语言提供了一种语言提供了一种构造数据类型:构造数据类型:构造数据类型:构造数据类型:数组。数组。数组。数组。例如:存储学生成绩用例如:存储学生成绩用例如:存储学生成绩用例如:存储学生成绩用实型数组实型数组实型数组实型数组 score5score5score5score5其中:其中:其中:其中:scorescorescorescore是数组名。是数组名。是数
3、组名。是数组名。该数组可以存放该数组可以存放该数组可以存放该数组可以存放5 5 5 5个成绩,个成绩,个成绩,个成绩,分别用下标变量表示:分别用下标变量表示:分别用下标变量表示:分别用下标变量表示:score0,score1,score4score0,score1,score4score0,score1,score4score0,score1,score4。下标变量下标变量下标变量下标变量也称为也称为也称为也称为数组元素数组元素数组元素数组元素。2023/1/1736.1 一维数组一维数组例如:例如:例如:例如:int a10;int a10;float float score5score5;
4、“数据类型数据类型数据类型数据类型”:是数组元素的数据类型。是数组元素的数据类型。是数组元素的数据类型。是数组元素的数据类型。“数组名数组名数组名数组名”:”:遵循遵循遵循遵循C C语言语言语言语言标识符规则。标识符规则。标识符规则。标识符规则。“常量表达式常量表达式常量表达式常量表达式”:表示数组中有多少个元素,即数:表示数组中有多少个元素,即数:表示数组中有多少个元素,即数:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式组的长度。它可以是整型常量、整型常量表达式组的长度。它可以是整型常量、整型常量表达式组的长度。它可以是整型常量、整型常量表达式或符号常量。或符号常量
5、。或符号常量。或符号常量。6.1.1 一维数组的定义一维数组的定义数据类型数据类型 数组名数组名常量表达式常量表达式;2023/1/174以下数组定义是正确的:以下数组定义是正确的:以下数组定义是正确的:以下数组定义是正确的:#define N 10#define N 10float score1N,score2N;float score1N,score2N;int num10+N;int num10+N;char c26;char c26;以下数组定义是不正确的:以下数组定义是不正确的:以下数组定义是不正确的:以下数组定义是不正确的:int array(10);int array(10);i
6、nt n;float scoren;int n;float scoren;double ba.d;double ba.d;char str;char str;6.1.1 一维数组的定义(续)一维数组的定义(续)2023/1/175数组在内存的存放数组在内存的存放l l数组下标从数组下标从数组下标从数组下标从0 0开始。开始。开始。开始。l l一维数组的数组元素一维数组的数组元素一维数组的数组元素一维数组的数组元素在内存里在内存里在内存里在内存里按顺序按顺序按顺序按顺序存放。存放。存放。存放。l l数组名代表数组的首数组名代表数组的首数组名代表数组的首数组名代表数组的首地址,即地址,即地址,即地
7、址,即scorescore的值的值的值的值与与与与score0 score0 的地址的地址的地址的地址值相同。值相同。值相同。值相同。score0score1score2score3score491.534.567.572.084.0低地址低地址高地址高地址score数组数组2023/1/1766.1.2 数组元素的引用数组元素的引用 格式:格式:格式:格式:例如:输入学生成绩例如:输入学生成绩例如:输入学生成绩例如:输入学生成绩 for(i=0;ifor(i=0;i5 5;i+);i+)scanf scanf(%f%f,&score&scorei);i);例如:例如:例如:例如:fibn=f
8、ibn-1+fibn-2;fibn=fibn-1+fibn-2;下标表达式下标表达式下标表达式下标表达式的值必须是的值必须是的值必须是的值必须是整型表达式整型表达式整型表达式整型表达式。数组名数组名下标表达式下标表达式2023/1/1776.1.2 数组元素的引用(续)数组元素的引用(续)说明说明:下标从下标从下标从下标从0 0开始(下界为开始(下界为开始(下界为开始(下界为0 0),数组的最大下标),数组的最大下标),数组的最大下标),数组的最大下标(上界)是数组长度减(上界)是数组长度减(上界)是数组长度减(上界)是数组长度减1 1。例如:例如:例如:例如:int a10;int a10;
9、scanf(%d,&a10);/*scanf(%d,&a10);/*下标越界下标越界下标越界下标越界*/C编译系统不做越界检查,如果引用的数组元素编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。超出数组范围会破坏其他变量的值。2023/1/1786.1.2 数组元素的引用(续)数组元素的引用(续)是是下标运算下标运算下标运算下标运算符符符符,引用引用数组元素数组元素时,根据数组的时,根据数组的首首首首地址地址地址地址和和下标下标下标下标数,计数,计算出该元素的实际算出该元素的实际地址,取出该地址地址,取出该地址的的内容内容内容内容进行操作。进行操作。如引用如引用 sco
10、re2:(1)计算计算 2000+2*4=2008(2)取出取出2008的内容的内容2000H2004H2008H200CH218CHscore0score1score2score3score491.534.567.572.084.02023/1/1796.1.3 一维数组的初始化一维数组的初始化初始化:在定义数组时给数组元素赋初值。初始化:在定义数组时给数组元素赋初值。1 1在定义数组时,对全部数组元素赋初值在定义数组时,对全部数组元素赋初值在定义数组时,对全部数组元素赋初值在定义数组时,对全部数组元素赋初值 例如:例如:例如:例如:int a5=0,1,2,3,4;int a5=0,1,2
11、,3,4;此时可以省略数组长度,例如:此时可以省略数组长度,例如:此时可以省略数组长度,例如:此时可以省略数组长度,例如:int a=0,1,2,3,4;int a=0,1,2,3,4;2 2在定义数组时,对部分数组元素赋初值在定义数组时,对部分数组元素赋初值在定义数组时,对部分数组元素赋初值在定义数组时,对部分数组元素赋初值 例如:例如:例如:例如:int a5=1,2,3;int a5=1,2,3;系统为其余元素赋系统为其余元素赋系统为其余元素赋系统为其余元素赋 0 0。3 3当初值的个数多于数组元素的个数时,编译出错当初值的个数多于数组元素的个数时,编译出错当初值的个数多于数组元素的个数
12、时,编译出错当初值的个数多于数组元素的个数时,编译出错 例如:例如:例如:例如:int a5=0,1,2,3,4,5;int a5=0,1,2,3,4,5;2023/1/17106.1.4 一维数组应用举例一维数组应用举例【例例例例6.16.16.16.1】将将将将10101010个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。个人的成绩输入计算机后按逆序显示。#define N 10#define N 10main()main()int i;float scoreN;int i;float scoreN;for(i=0;iN;i+)for
13、(i=0;i=0;i-)for(i=N-1;i=0;i-)printf(%6.1f,scorei);printf(%6.1f,scorei);运行情况如下:运行情况如下:运行情况如下:运行情况如下:67 74 89 92 34 67 83 95 73 7867 74 89 92 34 67 83 95 73 78 78.0 73.0 95.0 83.0 67.0 34.0 92.0 89.0 74.0 67.0 78.0 73.0 95.0 83.0 67.0 34.0 92.0 89.0 74.0 67.02023/1/1711【例例6.2】输入输入5个整数,找出最大数和最小数个整数,找出最
14、大数和最小数所在位置,并把二者对调,然后输出。所在位置,并把二者对调,然后输出。思路:思路:思路:思路:l l求最大求最大求最大求最大/小值采用打擂台的方法。小值采用打擂台的方法。小值采用打擂台的方法。小值采用打擂台的方法。l l定义一维数组定义一维数组定义一维数组定义一维数组a a存放被比较的数。存放被比较的数。存放被比较的数。存放被比较的数。l l定义变量定义变量定义变量定义变量maxmax:最大值,:最大值,:最大值,:最大值,minmin:最小值,:最小值,:最小值,:最小值,k k:最大值下标:最大值下标:最大值下标:最大值下标 ,j j:最小值下标:最小值下标:最小值下标:最小值下
15、标 。l l各数依次与擂主进行比较,各数依次与擂主进行比较,各数依次与擂主进行比较,各数依次与擂主进行比较,若若若若aai imax max 则则则则:maxmax=a=ai i;k k=i i;否则判断否则判断否则判断否则判断:若若若若aai imin min 则则则则:minmin=a=ai i;j=;j=i i;l l当所有的数都比较完之后,将当所有的数都比较完之后,将当所有的数都比较完之后,将当所有的数都比较完之后,将aj=aj=maxmax;k k=minmin;l l输出输出输出输出a a数组。数组。数组。数组。2023/1/1712main()main()int a5,max,m
16、in,i,j,k;int a5,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;else if(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
17、,ai);printf(n);printf(n);程序运行情况如下:程序运行情况如下:5 7 2 3 1 5 1 2 3 72023/1/1713【例【例6.4】冒泡法排序(从小到大)。】冒泡法排序(从小到大)。以以以以6 6个数:个数:个数:个数:3 3、7 7、5 5、6 6、8 8、0 0为例。为例。为例。为例。第一趟排序情况如下:第一趟排序情况如下:3 7 5 6 8 0第一次第一次 3和和7比较,不交换比较,不交换 3 7 5 6 8 0第二次第二次 7和和5比较,交换比较,交换 3 5 7 6 8 0第三次第三次 7和和6比较,交换比较,交换 3 5 6 7 8 0第四次第四次 7
18、和和8比较,不交换比较,不交换 3 5 6 7 8 0第五次第五次 8和和0比较,交换比较,交换 3 5 6 7 0 8在第一趟排序中,在第一趟排序中,6个数比较了个数比较了5次,把次,把6个数中个数中的最大数的最大数8排在最后。排在最后。2023/1/1714冒泡法排序冒泡法排序(续)(续)第二趟排序情况如下:第二趟排序情况如下:第二趟排序情况如下:第二趟排序情况如下: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
19、 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次,
20、把其中的最大数次,把其中的最大数次,把其中的最大数次,把其中的最大数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,不需再比较,得到排序结
21、果:,不需再比较,得到排序结果:,不需再比较,得到排序结果:,不需再比较,得到排序结果:0 3 5 6 7 80 3 5 6 7 82023/1/1715冒泡法排序冒泡法排序(续)(续)从上述过程可以看到:从上述过程可以看到:从上述过程可以看到:从上述过程可以看到:n n n n个数要比较个数要比较个数要比较个数要比较n-1n-1n-1n-1趟,而趟,而趟,而趟,而在第在第在第在第j j j j趟比较中,要进行趟比较中,要进行趟比较中,要进行趟比较中,要进行n-jn-jn-jn-j次两两比较。次两两比较。次两两比较。次两两比较。冒泡法排序冒泡法排序for(i=0;iN;i+)输入输入ai fo
22、r(j=1;jN;j+)for(i=0;iai+1 T F ai与与ai+1交换交换输出输出a0aN-12023/1/1716#define N 6#define N 6main()main()int aN;int aN;int i,j,t;int i,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;
23、ai=ai+1;ai+1=t;t=ai;ai=ai+1;ai+1=t;printf(The sorted numbers:n);printf(The sorted numbers:n);程序运行情况如下:程序运行情况如下:3 7 5 6 8 0 0 3 5 6 7 82023/1/1717以以6个数:个数:3、7、5、6、8、0为例。为例。思路:思路:思路:思路:第一趟:将第一趟:将第一趟:将第一趟:将第一个数第一个数第一个数第一个数依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如果后面的某数小于果后面的某数小于果后面的某数小于果后面的某数小于第一个数第
24、一个数第一个数第一个数,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较结束后,结束后,结束后,结束后,第一个数第一个数第一个数第一个数则是则是则是则是最小最小最小最小的数。的数。的数。的数。第二趟:第二趟:第二趟:第二趟:将将将将第二个数第二个数第二个数第二个数依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如依次和后面的数比较,如果后面的某数小于果后面的某数小于果后面的某数小于果后面的某数小于第二个数第二个数第二个数第二个数,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较,则两个数交换,比较结束后,结束后,结束后,结束后,第二个数第
25、二个数第二个数第二个数则是则是则是则是次小次小次小次小的数;的数;的数;的数;。【例例6.5】选择法排序(从小到大)。选择法排序(从小到大)。2023/1/1718【例【例6.5】选择法排序(续)】选择法排序(续)图6.3 选择法排序for(i=0;iN;i+)输入ai for(j=0;jN-1;j+)for(i=j+1;iai T F aj与ai交换 输出a0aN-12023/1/1719#define N 5#define N 5main()main()int aN;int aN;int i,j,t;int i,j,t;for(i=0;iN;i+)for(i=0;iN;i+)scanf(%
26、d,&ai);scanf(%d,&ai);printf(n);printf(n);for(j=0;jN-1;j+)for(j=0;jN-1;j+)/*/*确定基准位置确定基准位置确定基准位置确定基准位置 */*/for(i=j+1;iN;i+)for(i=j+1;iai)if(ajai)t=aj;aj=ai;ai=t;t=aj;aj=ai;ai=t;printf(The sorted numbers:n);printf(The sorted numbers:n);程序运行情况如下:96 78 65 86 40The sorted numbers:40 65 78 86 962023/1/172
27、06.2 二维数组二维数组 数据类型数据类型 数组名常量表达式数组名常量表达式1常量表达式常量表达式2;例如:例如:float x23;6.2.1 二维数组二维数组的定义的定义X00X00 X01X01 X02X02X10X10 X11X11 X12X12int int a3,4a3,4,b,b(3,4)(3,4),c ,d,c ,d(3)(4)(3)(4);2023/1/1721x00 x01x02x10 x11x1220002000H H20042004H H20082008H H200c200cH H20102010H H20142014H H地址地址 值值 数组元素数组元素二维数组二维
28、数组元素元素在内存中在内存中的的排列顺序排列顺序:按行存放按行存放2023/1/1722x0是数组名,是元素是数组名,是元素x00的地址的地址x1是数组名,是数组名,是元素是元素x10的地址的地址二维数组可看作是一种特殊的一维数组二维数组可看作是一种特殊的一维数组x0-x00,x01,x02x0-x00,x01,x02x1-x10,x11,x12x1-x10,x11,x12例如,可以把例如,可以把例如,可以把例如,可以把x x x x数组看作是包含二个元素的一维数组,数组看作是包含二个元素的一维数组,数组看作是包含二个元素的一维数组,数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元
29、素一维数组。每个元素又是一个含有三个元素一维数组。每个元素又是一个含有三个元素一维数组。每个元素又是一个含有三个元素一维数组。2023/1/1723a34=3;/*下标越界下标越界*/a1,2=1;/*应写成应写成 a12=1;*/6.2.2 二维数组元素的引用二维数组元素的引用例:例:int a34;a00=3;a01=a00+10;数组名数组名数组名数组名行下标表达式列下标表达式行下标表达式列下标表达式行下标表达式列下标表达式行下标表达式列下标表达式 数组元素的表示形式数组元素的表示形式:2023/1/17246.2.3 二维数组的初始化二维数组的初始化例:例:例:例:int aint a
30、2 2 3 3=1,2,3,4,5,6=1,2,3,4,5,6;1 1 1 1按行赋初值按行赋初值按行赋初值按行赋初值例例:int a23=1,2,3,4,5,6;初始化后结果:初始化后结果:初始化后结果:初始化后结果:1 2 3 1 2 3 4 5 6 4 5 6 2 2 2 2按数组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值按数组元素在内存中排列的顺序对各元素赋初值3 3 3 3给部分元素赋初值给部分元素赋初值给部分元素赋初值给部分元素赋初值例:例:int a23=1,4;初始化后结果:初始化后结果:1 0 0
31、4 0 02023/1/17256.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;初始化结果:初始化结果:初始化结果:初始化结果:
32、a a 结果结果结果结果:a0:1 2 3 a0:1 2 3 a1:4 5 6a1:4 5 6a2:7 0 0a2:7 0 0b 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 02023/1/1726下面对二维数组的定义都是错误的:下面对二维数组的定义都是错误的:6.2.3 二维数组的初始化(续)二维数组的初始化(续)float x3=1.0,2.0,3.0,4.0,5.0,6.0;int a ,b 2,c3;int m24=1,2,3,4,5,6
33、,7,8,9;/*/*编译出错,初值个数多于数组元素的个数编译出错,初值个数多于数组元素的个数编译出错,初值个数多于数组元素的个数编译出错,初值个数多于数组元素的个数*/2023/1/17276.2.4 二维数组应用举例二维数组应用举例【例例例例6.66.6】给一个给一个给一个给一个4 4行行行行3 3列的二维数组输入列的二维数组输入列的二维数组输入列的二维数组输入/出数据。出数据。出数据。出数据。main()main()int a43,i,j,k;int a43,i,j,k;for(i=0;i4;i+)for(i=0;i4;i+)for(j=0;j3;j+)for(j=0;j3;j+)sca
34、nf(%d,&aij);scanf(%d,&aij);for(i=0;i4;i+)for(i=0;i4;i+)printf(n);printf(n);for(j=0;j3;j+)for(j=0;j3;j+)printf(%dt,aij);printf(%dt,aij);printf(n);printf(n);程序运行情况如下:程序运行情况如下:1 2 3 4 5 6 7 8 9 10 11 12 1 2 34 5 67 8 910 11 122023/1/17286.2.4 二维数组应用举例(续)二维数组应用举例(续)【例例例例6.76.76.76.7】有一个有一个有一个有一个NMNMNMNM
35、矩阵,编程序求出其中绝对矩阵,编程序求出其中绝对矩阵,编程序求出其中绝对矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。值最大的那个元素的值及其所在的行、列位置。值最大的那个元素的值及其所在的行、列位置。值最大的那个元素的值及其所在的行、列位置。图图6.4 查找最大元素查找最大元素max=|a00|,row=0,colum=0 for(i=0;iN;i+)for(j=0;jmax T F max=|aij|row=i colum=j输出绝对值输出绝对值最大的元素及行列下标最大的元素及行列下标2023/1/1729#include math.h#include math.h#d
36、efine N 4#define N 4#define M 5#define M 5main()main()int i,j,row,colum,max,aNM;int i,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;/*/*输出数据
37、输出数据输出数据输出数据*/程序运行情况如下:程序运行情况如下:34 56 12 67 23 12 67 43 98 54 65 45 66 16 24 37 83 25 64 19 max=98,row=1,colum=32023/1/17306.3 字符数组与字符串字符数组与字符串字符数组字符数组字符数组字符数组:可以存放若干个可以存放若干个可以存放若干个可以存放若干个字符字符字符字符,也可以存放也可以存放也可以存放也可以存放字符串字符串字符串字符串。6.3.1 6.3.1 基本概念基本概念C Ch hi in na a00字符串:字符串:字符串:字符串:字符串的末尾必须有字符串的末尾必须
38、有字符串的末尾必须有字符串的末尾必须有00字符,它的字符,它的字符,它的字符,它的ASCIIASCII码值为码值为码值为码值为0 0。C Ch hi in na a不是字符串不是字符串是字符是字符是字符是字符串串串串2023/1/1731再例如:再例如:再例如:再例如:char a35;char a35;a a数组是一个二维的字符数组,可以存放数组是一个二维的字符数组,可以存放数组是一个二维的字符数组,可以存放数组是一个二维的字符数组,可以存放1515个字个字个字个字符或符或符或符或3 3个长度不大于个长度不大于个长度不大于个长度不大于4 4的字符串。的字符串。的字符串。的字符串。6.3.2
39、字符数组的定义字符数组的定义例如:例如:例如:例如:char s10;char s10;s s数组是一维字符数组,它可以存放数组是一维字符数组,它可以存放数组是一维字符数组,它可以存放数组是一维字符数组,它可以存放1010个字符或个字符或个字符或个字符或一个长度不大于一个长度不大于一个长度不大于一个长度不大于9 9的字符串。的字符串。的字符串。的字符串。注意:字符串只能存放在字符数组中。注意:字符串只能存放在字符数组中。2023/1/17326.3.3 字符数组的初始化字符数组的初始化C Ch hi in na a1 1用字符常量赋初值用字符常量赋初值用字符常量赋初值用字符常量赋初值例如:例如
40、:例如:例如:char c5=C,h,i,n,a;char c5=C,h,i,n,a;再例如:再例如:再例如:再例如:char c6=C,h,i,n,a,0;char c6=C,h,i,n,a,0;C Ch hi in na a00是字符串是字符串是字符串是字符串不是字符串不是字符串2023/1/17336.3.3 字符数组的初始化(续)字符数组的初始化(续)再例如:再例如:再例如:再例如:char a310=basic,pascal,c;char a310=basic,pascal,c;a as st tr ri in ng g00002 2用字符串常量赋初值用字符串常量赋初值用字符串常量赋
41、初值用字符串常量赋初值例如:例如:例如:例如:char str10=a string;char str10=a string;或或或或char str10=a string;char str10=a string;b b a a s si i c c 0 0 0 0 0 0 0 0 0 0p p a a s s c c a a l l 0 0 0 0 0 0 0 0c c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0是字符串吗?是字符串吗?是字符串吗?是字符串吗?2023/1/17346.3.3 字符数组的初始化(续)字符数组的初始化(续)例如:例如:例如:例如:ch
42、ar s37=s,t,r,i,n,g;char s37=s,t,r,i,n,g;GGo o o o d dmmo o r r n n i i n n g g!0 03 3初始化时长度的省略初始化时长度的省略初始化时长度的省略初始化时长度的省略例如:例如:例如:例如:char s1=Good morning!;char s1=Good morning!;b0b13例如:例如:例如:例如:char s2=s,t,r,i,n,g;char s2=s,t,r,i,n,g;s st tr ri in ng gs st tr ri in ng g00思考:哪个数组存放的是字符串思考:哪个数组存放的是字符串
43、?2023/1/17356.3.4 6.3.4 字符数组的引用字符数组的引用【例例6.8】对字符数组对字符数组c1赋赋 09,对字符,对字符数组数组c2赋赋 AZ,然后输出,然后输出c1和和c2数组中数组中的数据。的数据。1对字符数组元素的引用对字符数组元素的引用可以为可以为数组元素数组元素赋值,也可以输入赋值,也可以输入/输出输出元元素的值。素的值。2023/1/1736程序如下:程序如下:main()main()char c110,c226;int i;char c110,c226;int i;for(i=0;i10;i+)for(i=0;i10;i+)c1i=i+48;c1i=i+48;
44、for(i=0;i26;i+)for(i=0;i26;i+)c2i=i+A;c2i=i+A;for(i=0;i10;i+)for(i=0;i10;i+)printf(%c,c1i);printf(%c,c1i);printf(n);printf(n);for(i=0;i26;i+)for(i=0;i0strcmp(str1,str2)0strcmp(str1,str2)0strcmp(str1,str2)0)printf(s1s2);else if(strcmp(s1,s2)0)printf(s1s2);else printf(s1s2);else printf(s1s2);程序输出结果:程序
45、输出结果:程序输出结果:程序输出结果:s1s2s1=0&si=0&si=A&si=a&si=A&si=a&si=z)lett+;lett+;else oth+;else oth+;for(i=0;i10;i+)for(i=0;i10;i+)printf(%d:%d printf(%d:%d个个个个 ,i,digi);,i,digi);printf(nspace:%d letter:%d printf(nspace:%d letter:%d other:%dn,sp,lett,oth);other:%dn,sp,lett,oth);程序运行情况如下程序运行情况如下程序运行情况如下程序运行情况如下
46、:0:40:4个个 1:51:5个个 2:22:2个个 3:03:0个个 4:14:1个个 5:05:0个个 6:06:0个个 7:07:0个个 8:08:0个个 9:29:2个个space:1 letter:5 other:5space:1 letter:5 other:52023/1/17516.3.6 字符数组应用举例字符数组应用举例(续)(续)【例例例例6.106.106.106.10】输入某月份的整数值输入某月份的整数值输入某月份的整数值输入某月份的整数值1 1 1 112121212,输出该,输出该,输出该,输出该月份的英文名称。月份的英文名称。月份的英文名称。月份的英文名称。I
47、Il ll le eg ga al lmm o on nt th h.00J Ja an nu ua ar ry y00D De ec ce en n mm b be er r00思路:思路:将将将将12121212个英文月份以字符串的形式存放到个英文月份以字符串的形式存放到个英文月份以字符串的形式存放到个英文月份以字符串的形式存放到month1315month1315month1315month1315中,一行存放一个字符串。中,一行存放一个字符串。中,一行存放一个字符串。中,一行存放一个字符串。2023/1/1752main()main()char month 15=char month
48、15=Illegal month.,Illegal month.,January,February,March,April,January,February,March,April,May,June,July,August,May,June,July,August,September,October,Novenber,Decenmber;September,October,Novenber,Decenmber;int m;int m;printf(nInput month:);printf(nInput month:);scanf(%d,&m);scanf(%d,&m);printf(%d:%
49、sn,printf(%d:%sn,mm,(m12)?month0:monthm,(m12)?month0:monthm););程序运行情况如下:程序运行情况如下:程序运行情况如下:程序运行情况如下:Input month:Input month:1010 10:October10:October2023/1/17536.3.6 字符数组应用举例字符数组应用举例(续)(续)【例例例例6.116.116.116.11】将将将将N N N N个国家名按字母顺序排序后输出。个国家名按字母顺序排序后输出。个国家名按字母顺序排序后输出。个国家名按字母顺序排序后输出。思路:思路:从键盘输入从键盘输入从键盘输
50、入从键盘输入N N N N个国家名称存放到一个二维字个国家名称存放到一个二维字个国家名称存放到一个二维字个国家名称存放到一个二维字符数组中,然后用符数组中,然后用符数组中,然后用符数组中,然后用选择法选择法选择法选择法对这对这对这对这N N N N个字符串个字符串个字符串个字符串排序排序排序排序。程序如下程序如下:#define N 5#define N 5#define M 10#define M 10#include stdio.h#include stdio.hmain()main()char sNM,strM;int i,j;2023/1/17546.3.6 字符数组应用举例字符数组应