《c语言程序设计第7章.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第7章.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章第七章 数数 组组本章要点:本章要点:1.建立数组的概念;建立数组的概念;2.掌握一维数组和多维数组的定义;掌握一维数组和多维数组的定义;3.掌握数组的初始化和引用;掌握数组的初始化和引用;4.掌握字符串与字符数组掌握字符串与字符数组.5.掌握用数组进行编程的技术。掌握用数组进行编程的技术。数组的概念数组的概念1.问题的提出问题的提出 假设我们将假设我们将26个数分别存放在个数分别存放在26个变量中,要个变量中,要计算计算26个变量个变量的的和和,如何做如何做?将将26个变量逐个加起来?个变量逐个加起来?能否使用循环语句能否使用循环语句?for(sum=0,i=0;i26;i+)sum=
2、sum+ai;正确吗正确吗?2.使用数组解决问题使用数组解决问题定义一个变量,包含定义一个变量,包含26个数据,称为数组变量。个数据,称为数组变量。main()int i,sum=0,a26;for(i=0;i 26;i+)scanf(“%d”,&ai);for(i=0;i 26;i+)sum=sum+ai;printf(%d,sum);一、回顾一、回顾我们前面使用的数据类型都属于基本类型我们前面使用的数据类型都属于基本类型(整型、实型、字符型)(整型、实型、字符型)其存储特点是:每个变量单独存储,亦称为简单变量其存储特点是:每个变量单独存储,亦称为简单变量如如:x=a;y1=0;y2=-2*
3、x;各变量之间独立存放,无任何联系。各变量之间独立存放,无任何联系。二、构造类型的基本概念二、构造类型的基本概念 在在C语言中,变量类型除了前面已介绍的几种基本类型语言中,变量类型除了前面已介绍的几种基本类型职位,还有另外一些复杂类型,合称为构造类型。职位,还有另外一些复杂类型,合称为构造类型。构造类型:有基本类型构造而成的。(如数组、结构体、构造类型:有基本类型构造而成的。(如数组、结构体、共同体、枚举型)共同体、枚举型)构造类型的每一个分量是一个变量,它就可以是一个简构造类型的每一个分量是一个变量,它就可以是一个简单类型或构造类型。单类型或构造类型。构造类型的分量使用方法与简单变量相同。构
4、造类型的分量使用方法与简单变量相同。构造类型的分量占用相邻的存储空间。构造类型的分量占用相邻的存储空间。对于构造类型的变量来说,重点是访问其分量的方法。对于构造类型的变量来说,重点是访问其分量的方法。三、数组概念三、数组概念 计算机处理数据时,经常出现数据是用某种有序的形计算机处理数据时,经常出现数据是用某种有序的形式进行组织的情况。例如式进行组织的情况。例如 随温度而改变的实验数据随温度而改变的实验数据 按学号排列的成绩表按学号排列的成绩表 这些数据具有共同的特征:这些数据具有共同的特征:1)都是由若干个分量组成的)都是由若干个分量组成的 2)数据的诸分量都是统一类型(可取任何数据类型)数据
5、的诸分量都是统一类型(可取任何数据类型)3)这些分量是按一定的顺序排列的)这些分量是按一定的顺序排列的 数组:数组:一组具有一组具有相同数据类型相同数据类型的数据的的数据的有序有序的的集合集合。线性方程组的线性方程组的mn系数矩阵系数矩阵数组的基本概念:数组的基本概念:1、数组:、数组:一组具有一组具有相同数据类型相同数据类型的数据的的数据的有序有序的的集合集合。2、数数组组元元素素:数数组组中中的的元元素素。数数组组中中的的每每一一个个数数组组元元素素具具有有相相同同的的名名称称,不不同同的的下下标标,可可以以作作为为单单个个变变量量使使用用。在在定定义义一一个个数数组组后后,在在内内存存中
6、中使使用用一一片片连连续续的的空空间间依依次次存存放放数组的各个元素。数组的各个元素。3、数组的下标:、数组的下标:是数组元素的位置的一个索引或指示。是数组元素的位置的一个索引或指示。4、数数组组的的维维数数:数数组组元元素素下下标标的的个个数数。根根据据数数组组的的维维数数可可以将数组分为一维、二维、三维、多维数组以将数组分为一维、二维、三维、多维数组。数组是数组是同类型变量同类型变量的集合的集合,共用共用一个名字一个名字,用用下标区分下标区分;每个变量称作数组元素;每个变量称作数组元素;按下标递增顺序在内存中存放;按下标递增顺序在内存中存放;使用几个下标区分变量,就称是几维数组。使用几个下
7、标区分变量,就称是几维数组。一维数组与数学中的数列对应,二维数组与矩阵对应。很少一维数组与数学中的数列对应,二维数组与矩阵对应。很少使用三维及三维以上的数组。使用三维及三维以上的数组。7.1 一位数组的定义和引用一位数组的定义和引用7.1.1一维数组的定义一维数组的定义定义方式:定义方式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式例:例:int a10表示数组名为表示数组名为a,此数组有此数组有10个元素每个元素都是整数个元素每个元素都是整数说明:说明:(1)数组名定义规则和变量名相同;)数组名定义规则和变量名相同;(2)数组名的常量表达式用方括弧而不是圆括弧括起来)数组名的常量
8、表达式用方括弧而不是圆括弧括起来(3)常量表达式表示元素的个数,即数组长度。例如:)常量表达式表示元素的个数,即数组长度。例如:a10表示表示a数组共有数组共有10个元素,下标从个元素,下标从0开始分别为:开始分别为:a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 注意:没有注意:没有a10 (4)常量表达式中可以包括常量和符号常量,不能包含)常量表达式中可以包括常量和符号常量,不能包含 变量,即数组的大小不能依赖于程序过程中变量的值。变量,即数组的大小不能依赖于程序过程中变量的值。一维数组的存储一维数组的存储c编译程序是怎样管理一个数组呢?编译程序是怎样管理一个数组呢?用连续的内
9、存单元存放各个元素用连续的内存单元存放各个元素如:如:int a5;其内存存储为:其内存存储为:保存数组所需内存量与数组元素的基本类型和数组大小有关保存数组所需内存量与数组元素的基本类型和数组大小有关如上例:总字节数如上例:总字节数=2*5=107.1.2 一维数组元素的引用一维数组元素的引用 C语言规定,只能逐个引用数组元素而不能一次引用整个数语言规定,只能逐个引用数组元素而不能一次引用整个数组。组。数组元素的表示形式为:数组元素的表示形式为:数组名数组名下标下标其中下标可以是整型常量或整型表达式。例如:其中下标可以是整型常量或整型表达式。例如:a0=a5+a7-a2*31000 1002
10、100410061008a0a1a2a3a4n例例7.1 数组元素的引用数组元素的引用main()int i,a10;for(i=0;i=0;i-)printf(“%d”,ai);本例使本例使a0到到a9的值为的值为09,然后按逆序输出。然后按逆序输出。7.1.3 一维数组的初始化一维数组的初始化1、在定义数组时对数组元素赋以初值、在定义数组时对数组元素赋以初值方法方法:将初值依次写在花括号:将初值依次写在花括号 内。内。例如例如:int a4=2,4,6,8其中:其中:a0=2,a1=4,a2=6,a3=8(1)可以只给一部分元素赋值。可以只给一部分元素赋值。例如:例如:int a10=0,
11、1,2,3,4;其中:其中:a0=0,a1=1,a2=2,a3=3,a4=4,a5=0,a6=0,a7=0,a8=0,a9=0(2)如果想使一个数组中全部元素值为如果想使一个数组中全部元素值为0,可以写成:可以写成:int a10=0,0,0,0,0,0,0,0,0,0不能写成:不能写成:int a10=0*10注意:定义成注意:定义成static数组,不赋初值,系统会自动将数组,不赋初值,系统会自动将全部元素赋以全部元素赋以0值。(此处后面有介绍)值。(此处后面有介绍)(3)在对全部数组元素赋初值时,可以不指定数组长度。)在对全部数组元素赋初值时,可以不指定数组长度。例如:例如:int a5
12、=0,1,2,3,4可以写成:可以写成:int a =0,1,2,3,4但是如果被定义的数组长度与提供初值的个数不相同时,但是如果被定义的数组长度与提供初值的个数不相同时,则数组长度不能省略。则数组长度不能省略。例如:例如:int a10=0,1,2,3,4;只初始化了前只初始化了前5个元素,后个元素,后5个元素为个元素为0。例例7-2:数组的初始化:数组的初始化#include void main()int a5=1,2,3,4,5;int b5=1,2,3;int c=1,2,3,4,5;int e5;int i;for(i=0;i5;i+)printf(%d”,ai);printf(“n
13、”);for(i=0;i5;i+)printf(%d”,bi);printf(“n”);for(i=0;i5;i+)printf(%d”,ci);printf(“n”);for(i=0;i5;i+)printf(%d”,ei);printf(“n”);1234512300123450000-32575n例例6.7 求求Fibonacci数列的数列的40个数。个数。Fibonacci数列为:数列为:1,1,2,3,5,8,13,7.1.4 一维数组程序举例一维数组程序举例例例7.2 用数组来处理求用数组来处理求Fibonacci数列问题。数列问题。main()int i;int f20=1,1;
14、for(i=2;i 20;i+)fi=fi-2+fi-1;for(i=0;i 20;i+)if(i%5=0)printf(“n”);printf(“%12d”,fi);fi=fi-2+fi-1i=220例例3 统计全班某门功课期末考试的平均分数和最高分数统计全班某门功课期末考试的平均分数和最高分数(设全班人数为(设全班人数为30)#define N 30main()int i,sum=0,high=0,score;float average;printf(“input everyones scoren”);for(i=0,ihigh)high=score;average=(float)sum/
15、N;printf(“average=%fn”,average);printf(“highest=%dn”,high);用简单变量实现用简单变量实现分析:分析:定义一个整型数组定义一个整型数组score30放全班每位同放全班每位同学的成绩学的成绩用用for循环读入分数,并循环读入分数,并求出总分和平均分求出总分和平均分定义变量定义变量high存放当前存放当前得到的最高分每得到一得到的最高分每得到一个分数都要与个分数都要与high的值的值比较,若比比较,若比high大,则大,则放入放入high中,这样最后中,这样最后high值一定是最高分值一定是最高分用数组实现用数组实现#define N 30m
16、ain()int i,sum=0,high,score30;float average;printf(“input everyones scoren”);for(i=0,iN,i+)scanf(“%d”,&scorei);for(high=score0,i=0;ihigh)high=scorei;average=(float)sum/N;printf(“average=%fn”,average);printf(“highest=%dn”,high);for(high=score0,i=0;ihigh)high=scorei;用数组实现用数组实现#define N 30main()int i,s
17、um=0,high,score30;float average;printf(“input everyones scoren”);for(i=0,iN,i+)scanf(“%d”,&scorei);for(high=score0,i=0;ihigh)high=scorei;average=(float)sum/N;printf(“average=%fn”,average);printf(“highest=%dn”,high);补充:找出补充:找出n个数中超过平个数中超过平均数的那些数均数的那些数例例7.5 统计选票,设候选人有统计选票,设候选人有8人,人,其编号为其编号为18,约定,约定0为统
18、计结束为统计结束标志标志分析:分析:若用简单变量做,则需若用简单变量做,则需8个变量分别存放个变量分别存放8个候选人的个候选人的票数票数 读入一张选票,则进行读入一张选票,则进行判断,累加即判断,累加即8条这样的语句。条这样的语句。main()int x,n1,n2,n3,n4,n5,n6,n7,n8;printf(“input number:”);scanf(“%d”,&x);while(x)if(x=1)n1+=1 if(x=2)n2+=1;if(x=8)n8+=1;printf(“input number:”);scanf(“%d”,&x);输出候选人选票输出候选人选票 用数组统计用数组
19、统计u定义一个数组定义一个数组n9 若:若:n1元素中存放元素中存放1号的票数号的票数 n2元素中存放元素中存放2号的票数号的票数 n3元素中存放元素中存放3号的票数号的票数 n8元素中存放元素中存放8号的票数号的票数u可发现数组元素的下标与要可发现数组元素的下标与要统计的候选人的编号想吻合,统计的候选人的编号想吻合,故可直接采用:故可直接采用:nx=nx+1main()static int x,n9 printf(“input number:”);scanf(“%d”,&x);while(x)nx+=1;printf(“input number:”);scanf(“%d”,&x);for(x
20、=1;x=8;x+)printf(“No.%d=%d”,x,nx);if(x=2)printf(“n”);由此可知:利用数组作为一组计数器,由此可知:利用数组作为一组计数器,通过将统计对象的值与存放该统计值通过将统计对象的值与存放该统计值的下标挂起钩来,这样既可以使程序简洁,的下标挂起钩来,这样既可以使程序简洁,又提高效率又提高效率例例7.3 用冒泡法对用冒泡法对10个数排序(由小到大)。个数排序(由小到大)。冒泡法冒泡法:对将进行排序的数,对将进行排序的数,相邻两个数相邻两个数进行比较,如果满足次序要求,进行比较,如果满足次序要求,保持两者位置不变,否则交换位置,将小的调到前面;保持两者位置
21、不变,否则交换位置,将小的调到前面;985420第一次第一次比较比较895420第二次第二次比较比较859420第三次第三次比较比较854920第四次第四次比较比较第五次第五次比较比较854290854209第一次第一次冒泡排冒泡排序的结序的结果果n个数经过一次冒泡排序后,最大数个数经过一次冒泡排序后,最大数(最小数最小数)将被交换到最后位置,但前面将被交换到最后位置,但前面n-1数仍然无数仍然无序。下一次排序最后一位不必参加排序。序。下一次排序最后一位不必参加排序。第第一一次次冒冒泡泡排排序序算法结论:算法结论:如果有如果有n个数参加冒泡排序,则要进行个数参加冒泡排序,则要进行n-1趟比较。
22、趟比较。在第在第j趟比较中有趟比较中有n-j+1个数参加排序,个数参加排序,(因为已有因为已有j-1个数排个数排好序)要进行好序)要进行n-j次两两比次两两比较。较。本例中第本例中第2趟有趟有5个数参加排序,进行了个数参加排序,进行了4次比较。次比较。854209第一次第一次比较比较584209第二次第二次比较比较548209第三次第三次比较比较542809第四次第四次比较比较542089第二次第二次冒泡排冒泡排序的结序的结果果第第二二次次冒冒泡泡排排序序main()int a10;int i,j,t;printf(“input 10 numbers:n”);for(i=0;i 10;i+)s
23、canf(“%d”,&ai);printf(“n”);for(j=0;j 9;j+)for(i=0;i ai+1)t=ai;ai=ai+1;ai+1=t;printf(“the sorted numbers:n”);for(i=0;i ai+1ai与与ai+1交换交换输出输出a1到到an由前面分析可知由前面分析可知;u要排序的数必须放入数组中要排序的数必须放入数组中u用二重循环控制排序过程用二重循环控制排序过程 外循环外循环j控制比较趟数(控制比较趟数(n-1)趟)趟 内循环内循环i控制一趟比较的次数(控制一趟比较的次数(n-j)次次7.2 二维数组的定义和引用二维数组的定义和引用7.2.1
24、二维数组的定义二维数组的定义n二维数组定义的一般形式:二维数组定义的一般形式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式 常量表达式常量表达式 例:例:float a34,b510;此句定义了一个名为此句定义了一个名为a的的3行行4列的实数数组和一个名列的实数数组和一个名为为b的的5行行10列的实数的数组。列的实数的数组。注意:注意:不能写成:不能写成:float a3,4,b5,10;n在在C语言中,可以把二维数组看成特殊的一维数组,即把语言中,可以把二维数组看成特殊的一维数组,即把把一行看成一个元素,这些特殊的元素组成以一个特殊的把一行看成一个元素,这些特殊的元素组成以一个特
25、殊的一维数组。比如:我们可以把二维数组一维数组。比如:我们可以把二维数组a34看成一个由看成一个由 a0,a1,a2元素组成的数组,每个元素又由四个元素元素组成的数组,每个元素又由四个元素组成,例如组成,例如a0由由a00,a01,a02,a03组成。组成。n二维数组的存放顺序:二维数组的存放顺序:在在C语言中,二维数组中的元素是语言中,二维数组中的元素是按行存放的按行存放的。例如:整型数组例如:整型数组a23的存放形式为的存放形式为a00a01a02a10a11a12 二维数组是多维数组的基础。其它多维数组的定二维数组是多维数组的基础。其它多维数组的定义和元素存放形式类似二维数组。义和元素存
26、放形式类似二维数组。200020022004200620082010数组元素的实际存放顺序是:右边下标比左边下标变化的快数组元素的实际存放顺序是:右边下标比左边下标变化的快a347.2.2 二维数组的引用二维数组的引用n二维数组的元素的表示形式为:二维数组的元素的表示形式为:数组名数组名 下标下标 下标下标 例如:例如:a23表示的是表示的是a二维数组的第二维数组的第3行第行第4列的元素。列的元素。此处我们要特别注意下标不要超界。此处我们要特别注意下标不要超界。n注意:注意:1)下标可以是整型表达式,如)下标可以是整型表达式,如a2-12*2-1;b12=a13/2 2)不能写成)不能写成a2
27、,3的形式;的形式;7.2.3 二维数组的初始化二维数组的初始化(1)按行给二维数组赋初值。例如:)按行给二维数组赋初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(2)可以将所有数据写在一个花扩弧内,系统将按数组排可以将所有数据写在一个花扩弧内,系统将按数组排 列顺序对各元素赋初值。例如:列顺序对各元素赋初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3)可以对部分元素赋初值。例如:)可以对部分元素赋初值。例如:int a34=1,2,3 以存放顺序赋值以存放顺序赋值 int a34=1,5,9;以行赋值以行赋值 它的作用
28、是只对每行第一列赋初值,其他元素自动为它的作用是只对每行第一列赋初值,其他元素自动为0,结果为:结果为:也可以对各行中的某一元素赋初值,其他元素自动为也可以对各行中的某一元素赋初值,其他元素自动为0:int a34=1,0,6,0,0,11;结果为:结果为:(4)如果对全部元素都赋初值,则定义数组时对第一维的)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如:长度可以不指定,但第二维的长度不能省。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成:可以写成:int a 4=1,2,3,4,5,6,7,8,9,10,11,
29、12;例例7.4 二维数组的输入和输出二维数组的输入和输出一般而为数组的处理用二重循环来实一般而为数组的处理用二重循环来实现,用循环变量的值控制数组元素的下标现,用循环变量的值控制数组元素的下标#include void main()int a33,i,j;for(i=0;i=2;i+)for(j=0;j=2;j+)scanf(“%d”,&aij);for(i=0;i=2;i+)for(j=0;j=2;j+)printf(“%5d”,aij);printf(“n”);for(i=0;i=2;i+)for(j=0;j=2;j+)scanf(“%d”,&aji);for(i=0;i=2;i+)fo
30、r(j=0;j=2;j+)if(i+j)%2)printf(“%5d”,aij);for(i=0;i=2;i+)printf(“%5d”,aii);1 4 72 5 83 6 91 2 34 5 67 8 92 4 6 87.2.4 二维数组程序举例二维数组程序举例例例7.4 将二维数组将二维数组 行和列元素互换,存到另行和列元素互换,存到另一个二一个二 维数组中。维数组中。(转置)转置)算法:算法:1)a数组初始化(或赋值)并输出数组初始化(或赋值)并输出2)用二重循环进行转置)用二重循环进行转置 bji=aij2)输出输出b数组数组例例7.4 将二维数组将二维数组 行和列元素互换,存到另一
31、个二行和列元素互换,存到另一个二 维数组中。维数组中。7.2.4 二维数组程序举例二维数组程序举例main()int a23=1,2,3,4,5,6;int b32,i,j;printf(“array a:n”);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(“%5d”,aij);bji=aij;printf(“n”);printf(“array b:n”);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(“%5d”,bij);printf(“n”);对于对于n*n的二维数组,可以在同一的二维数组,可以在同一个数组进行矩阵转置操作个数组进行
32、矩阵转置操作转置转置思路:对称于主对角线的思路:对称于主对角线的元素两两交换元素两两交换#define N 3main()int aNN=1,2,3,4,5,6,7,8,9;int i,j,t;for(i=0;i N;i+)for(j=0;j i;j+)t=aij;aij=aji;aji=t;for(i=0;i N;i+)for(j=0;j max假假max=aijrow=icolum=j输出:输出:max和和row,colummain()int i,j,row=0,colum=0,max;int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for(i=0;
33、i=2;i+)for(j=0;j max)max=aij;row=i;colum=j;printf(“max=%d,row=%d,colum=%dn”,max,row,colum);7.3 字符数组字符数组 7.3.1 字符数组的定义字符数组的定义 在在c语言中,没有专门的语言中,没有专门的字符串变量,而是将字符串存字符串变量,而是将字符串存入字符数组处理。入字符数组处理。即用一个一维数组来存放即用一个一维数组来存放一个字符串,每一个元素存放一个字符串,每一个元素存放一个字符。一个字符。字符数组是数组的一个特字符数组是数组的一个特殊情况,但它的定义方法与上殊情况,但它的定义方法与上述介绍的类似
34、,引用方法可以述介绍的类似,引用方法可以与上述介绍的同,也有其独特与上述介绍的同,也有其独特的引用方法。的引用方法。定义形式:定义形式:char 数组名数组名常量表达式常量表达式常量表常量表达式达式;如:如:char c5;c0=h;c1=a;c2=p;c3=p;c4=y;在在C语言中,字符型和整型是互相语言中,字符型和整型是互相通用的,因此上述定义句可以写为:通用的,因此上述定义句可以写为:int c5;c0=h;c1=a;c2=p;c3=p;c4=y;字符数组的初始化字符数组的初始化1.用字符常量赋初值用字符常量赋初值(即;逐个字符赋给数组中的各元素即;逐个字符赋给数组中的各元素即;逐个字
35、符赋给数组中的各元素即;逐个字符赋给数组中的各元素)char c5=C,h,i,n,a;char c5=C,h,i,n,a;char c10=C,h,i,n,a;char c10=C,h,i,n,a;c4c3c2c1c0anihC注:注:0表示空表示空字符字符null(ASCII为为0)c7c4c5c6c8 c9c3c2c1c000000anihC char diamondchar diamond5 55 5=,*,*,*,*,*,*,*,*定义和初始化一个二维字符数组定义和初始化一个二维字符数组 7.3.4 7.3.4 字符串和字符结束标志字符串和字符结束标志n在在C C语言中,将字符串作为
36、语言中,将字符串作为字符数组字符数组来处理。来处理。为了测定字符串的实际长度为了测定字符串的实际长度C C语言规定了一个语言规定了一个“字符结字符结束标志束标志”,以字符,以字符00代表代表,由它前面的字符组成字符,由它前面的字符组成字符串。串。n系统字符串常量也系统字符串常量也自动加一个自动加一个00作为结束符作为结束符。例如例如“C Program”C Program”共有共有9 9个字符,但在内存中占个字符,但在内存中占1010个个字节,最后一个字节字节,最后一个字节00是由系统自动加上的。是由系统自动加上的。n结束标志不会产生附加的操作或增加有效字符,只起一个结束标志不会产生附加的操作
37、或增加有效字符,只起一个供辨别的标志供辨别的标志2.使用字符串常量给字符数组赋初值使用字符串常量给字符数组赋初值例:例:char c6=“store”;或或 char c6=“store”;或或 char c=“store”;结果结果注注:以字符串方式赋值时,必须保证数组元素个数以字符串方式赋值时,必须保证数组元素个数字符个数字符个数+1(字符串后面自动加上一个(字符串后面自动加上一个0)上述字符串占用的上述字符串占用的空间长度是空间长度是6而不是而不是5上述的初始化与下面的初始化等价。上述的初始化与下面的初始化等价。char c =s,t,o,r,0;而不与下面的等价:而不与下面的等价:ch
38、ar c =s,t,o,r;前者的长度为前者的长度为6,后者的长度为,后者的长度为5。c4c5c3c2c1c00erotsn需要说明的是:需要说明的是:字符数组字符数组并不要求它的最后一个字符为并不要求它的最后一个字符为0,甚至可以不包含,甚至可以不包含0.像以下这样写完全是合像以下这样写完全是合法的法的.char c5=C,h,i,n,a;是否需要加上是否需要加上0,完全根据需要决定。完全根据需要决定。系统对系统对字符串常量字符串常量自动加上一个自动加上一个0,因此,为了,因此,为了使处理方法一致,便于测定字符串的实际长度,以及在程使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应
39、的处理,在字符数组也常常人为加上一个序中作相应的处理,在字符数组也常常人为加上一个0,如:,如:char c6=C,h,i,n,a,0;例例7-12 字符数组初始化字符数组初始化#includevoid main()char a7=a,p,p,l,e;char b7=“apple”;char c7;static char x7;int i;for(i=0;i=6;i+)printf(“%6d%6d%6d%6dn”,ai,bi,ci,xi);由此可知:由此可知:数组初始化后,剩余元素均为数组初始化后,剩余元素均为0数组未初始化,则数组未初始化,则static 数组元数组元素的值为素的值为0,否则
40、元素值是随机的,否则元素值是随机的例例7-12 用一个字符串给字符数组赋初值,然后打印出各元素的用一个字符串给字符数组赋初值,然后打印出各元素的ASCII码码#includevoid main()char str=“This is a string!”;int i=0;while(stri!=0)printf(“%c=%dn”,stri,stri);+i;printf(“%c=%dn”,stri,stri);注意注意:u用字符串给字符数组赋初值,系统自动加上空字用字符串给字符数组赋初值,系统自动加上空字符符0u 空格字符,空格字符,ASII码码32u0空字符空字符,ASII码码0u两者皆无法打
41、印出来两者皆无法打印出来7.3.1 字符数组的引用与输入输出字符数组的引用与输入输出对于字符数组,在程序中既可以逐个引用字符串中的单个对于字符数组,在程序中既可以逐个引用字符串中的单个字符(数组元素)字符(数组元素)也可以一次引用整个字符串(数组)也可以一次引用整个字符串(数组)1.逐个字符数组元素输入输出:用逐个字符数组元素输入输出:用%c格式符描述格式符描述 例:例:scanf(“%c”,&ai);printf(%c%c%c”,a0,a1,a2);main()char c10I,a,m,a,b,o,y int i;for(i=0;i 10;i+)printf(“%c”,ci);printf
42、(“n”);n注意:注意:1.输出字符不包括结束符输出字符不包括结束符0;2.用用“%s”格式符输出字符串时,格式符输出字符串时,printf函数中的输出项函数中的输出项是字符数组名,而不是字符元素名。比如不能写成:是字符数组名,而不是字符元素名。比如不能写成:printf(“%s”,c0);正确写法为:正确写法为:printf(“%s”,c);3.如果数组长度大于字符串实际长度,也只输出到遇如果数组长度大于字符串实际长度,也只输出到遇0 结束。结束。4.如果一个字符数组中含一个以上的如果一个字符数组中含一个以上的0,则遇到第,则遇到第一个一个0 输出就结束。输出就结束。2将整个字符串一次输入
43、或输出将整个字符串一次输入或输出(%s格式符)格式符)输出字符串输出字符串例如:例如:char c=China;printf(%s,c);输出结果为:输出结果为:ChinaC是数组首地址是数组首地址输出时遇输出时遇 0 为止为止 再例如:再例如:char c=pascal0basic;printf(%s,c);输出结果为:输出结果为:pascalprintf(%s%s,c0c0););输入字符串输入字符串例如:例如:char c10;scanf(%s,c);输入:输入:beijing beijing0三个字符串用空格隔开,分别赋三个字符串用空格隔开,分别赋三个字符串用空格隔开,分别赋三个字符串
44、用空格隔开,分别赋给给给给str1str1、str2str2、str3str3三个数组。三个数组。三个数组。三个数组。再例如:再例如:char str110,str210,str310;scanf(%s%s%s,str1,str2,str3);输入:输入:pascal basic c 注意:注意:注意:注意:(1 1)为数组赋值时,)为数组赋值时,如:如:char c10;c=“beijing”char c10;c=“beijing”;因为数组名因为数组名c c是数组首地址,是常量!是数组首地址,是常量!char c10;c=beijing char c10;c=beijing;(2)scan
45、f函数中的输入项如果是字符数组名,不要再加函数中的输入项如果是字符数组名,不要再加地址符地址符&,因为在,因为在C语言中,数组名代表该数组的起始地址。语言中,数组名代表该数组的起始地址。如:如:scanf(“%s”,&c);scanf(“%s”,c);如:如:scanf(“%o”,c);输出结果为首地址值。输出结果为首地址值。(3 3)对某数组)对某数组cc char c14;scanf(“%s”,c);char c14;scanf(“%s”,c);如果输入以下如果输入以下1313个字符个字符 How Howareareyour?your?实际上并不是把这实际上并不是把这1313个字符加上结束
46、符个字符加上结束符“0”“0”放到数组放到数组c c中,而只将空格前的字符中,而只将空格前的字符“How”How”送到送到c c中,由于把中,由于把“How”How”作为一个字符串处理,因此在其后加上结束符作为一个字符串处理,因此在其后加上结束符“0”“0”,其在,其在内存中状态为:内存中状态为:How000000000007.3.6 字符串处理函数字符串处理函数 在在C的函数库中提供了一些用来处理字符串的函数,的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的使用方便。几乎所有版本的C都提供这些函数。下面是几都提供这些函数。下面是几种常用的函数。种常用的函数。1.puts(字
47、符数组字符数组/字符串)字符串)n作用:将一个字符串(以作用:将一个字符串(以0结束的字符序列)输出到结束的字符序列)输出到终端,终端,输完自动换行。输完自动换行。puts函数用的不多。函数用的不多。puts函数输出字符串中可以包函数输出字符串中可以包含转义字符含转义字符.即即puts(str);与与 printf(“%sn”,str);等价);等价或或 puts(“OK”);与与printf(“%sn”,“OK”););或或 printf(“OK!”)等价等价#include#include2.gets(字符数组),字符数组),n作用:从终端输入一个字符串作用:从终端输入一个字符串(以以回车
48、结束)到字符数组,并且得到回车结束)到字符数组,并且得到一个函数值。该函数值是字符数组一个函数值。该函数值是字符数组的起始地址。的起始地址。n如执行下面的函数:如执行下面的函数:gets(str)从键盘输入:从键盘输入:Computer将输入的字符串将输入的字符串”Computer”送送给字符数组给字符数组str(请注意送给数组请注意送给数组的共有的共有9个字符,而不是个字符,而不是8个字符),个字符),函数值为字符数组函数值为字符数组str的起始地址。的起始地址。注意:用注意:用puts和和gets函数只能输入函数只能输入或输出或输出一个字符串一个字符串,例例:#include#includ
49、evoid main()char s100;printf(“请输入一个字符串请输入一个字符串:n”););gets(s);printf(“输入的字符串是输入的字符串是:n”););puts(s)请输入一个字符串:请输入一个字符串:this is a apple.输入的字符串是:输入的字符串是:this is a apple.puts(gets(s);7.3.1 字符数组的引用与输入输出字符数组的引用与输入输出对于字符数组,在程序中既可以逐个引用字符串中的单个对于字符数组,在程序中既可以逐个引用字符串中的单个字符(数组元素)字符(数组元素)也可以一次引用整个字符串(数组)也可以一次引用整个字符串
50、(数组)1.逐个字符数组元素输入输出:用逐个字符数组元素输入输出:用%c格式符描述格式符描述 例:例:scanf(“%c”,&ai);printf(%c%c%c”,a0,a1,a2);复习复习2将整个字符串一次输入或输出将整个字符串一次输入或输出(%s格式符)格式符)输出字符串输出字符串例如:例如:char c=China;printf(%s,c);输出结果为:输出结果为:ChinaC是数组首地址是数组首地址printf(%s%s,c0c0););输入字符串输入字符串例如:例如:char c8;scanf(%s,c);输入:输入:beijing China 注意:输入时遇到空格或回车认为字注意