《(25)--第六章C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《(25)--第六章C语言程序设计.ppt(118页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计基础第6章 数组本章内容6.1 班级数学成绩排名6.2 班级总成绩排名6.3 搜索好友6.4 程序举例6.5 旅客的航空逾重行李费用计算及查询本章学习目标掌握一维数组的定义、初始化及引用掌握二维数组的定义、初始化及引用理解数组元素在内存中的存放形式掌握字符串的输入、输出和处理熟练使用数组设计程序获得运用数组解决实际问题的能力学习导引基本数据类型的变量只能存储一个数据,存储多个数据需要定义多个变量,这些变量称为离散变量,没有办法表示数据之间的关系。计算机处理的数据很多是同一数据类型的一批数据。C语言提供了数组来管理这些数据,将这些数据顺序存放在一片连续的存储单元,并通过数组名和下标
2、访问每个数据。经常在循环结构的控制下,对这些数据进行处理,使C程序处理批量数据简单化。6.1 班级数学成绩排名 例6-1 输入一个班级20名学生数学成绩并对其排名。对两名或三名学生的数学成绩进行排名,可以通过定义两个或三个变量进行比较来完成。对于20名学生的数学成绩,不可能定义20个变量进行排名,而需要通过C语言提供的数组管理这20个成绩。假设数组名为a,成绩顺序存放到数组a中,每个成绩则由数组元素存储,如图6-1所示。其下面一行数为成绩存储在数组中的序号,也称为下标。C语言通过数组名和下标访问每个成绩,例如,通过a0访问第一个学生的成绩。6.1 班级数学成绩排名 在这20个成绩中,选择一个最
3、高成绩存放在a0中;然后,从剩下的19个元素中,挑选 第二高成绩存放在a1中;这样一直到下标为18的元素;剩余的两个成绩,高成绩存放在下 标为18元素中,低成绩存放在下标为19元素中,这样便完成了排序。6.1 班级数学成绩排名6.1 班级数学成绩排名程序运行结果如下:仅用一个下标即可确定数组元素的数组称为一维数组,需要用两个下标才可以确定数组 元素的数组称为二维数组,需要用三个下标才可以确定数组元素的数组称为三维数组。C语言还可以定义四维、五维、六维等多维数组。6.1.1 一维数组的定义 必须先在程序中定义数组,即通知计算机,该数组可以存放多少个元素,元素的数据类型 是什么。这样C语言才可以把
4、该批数据作为数组来使用。如例6-1中定义的数组a:int a20;它表示定义了一个整型数组,数组名为a,此数组有20个整型数据元素。一维数组定义的一般形式为:数据类型 数组名 整型常量表达式;6.1.1 一维数组的定义 数组定义说明:(1)数据类型是指数组中所有元素的数据类型,可以是整型、实型、字符型、指针型、结构体 型及联合体型等。(2)数组名是用户定义的标识符,代表整个数组。它是分配给数组的连续内存空间的首地 址,也是数组第一个元素的内存地址。(3)“”是数组的标志,“”中间必须是整型常量或整型常量表达式,它决定了数组中数 组元素的个数,也称为数组的长度。(4)最后用分号结束。这个分号是绝
5、对不能省略的。6.1.1 一维数组的定义例如:int a10;/*说明整型数组a,有10个元素*/float b10,c20;/*说明实型数组b,有10个元素,实型数组c,有20个元素*/char ch20;/*说明字符数组ch,有20个元素*/对于数组类型说明应注意以下几点:(1)数组类型实际上是指数组元素的类型。一个数组中,所有元素的数据类型是相同的,不能在一个数组中存放不同类型的数据。(2)数组名的书写规则应符合标识符的命名规则。6.1.1 一维数组的定义 (3)数组名不能与其他变量名相同。例如:int main()int a;float a10;这是语法错误。(4)方括号中常量表达式表
6、示数组元素的个数,如a5表示数组a有5个元素。6.1.1 一维数组的定义 (5)不能在方括号中用变量来表示元素的个数,但是可以是常量表达式。例如:int main()int a3+2;是合法的。但是下述说明方式是错误的。int main()int n=5;int an;6.1.2 一维数组元素的引用 C语言规定,数组是一组有序数据的集合,不能直接存取整个数组,只能存取数组的元素。数组元素是组成数组的基本单元,数组元素也是变量,引用数组元素的方式为:数组名后跟一 个下标,下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名下标 其中,下标必须是整型,可以是整型常量、变量或表达式。C语言规
7、定,下标的下限为0,上限为数组长度减1。例6-1中定义的数组inta20,数组a每个元素的引用如图6-2所示。6.1.2 一维数组元素的引用 数组元素通常也称为下标变量,即由下标确定的变量。定义数组后,数组中每一个元素其 实就相当于一个变量。对变量的一切操作同样适用于下标变量。在 C语言中只能逐个地使 用下标变量,而不能一次引用整个数组。例如输出长度为10的整型数组a,通常使用循环语句逐个输出各下标变量:for(i=0;ia1,则交换;比较第二个元素和第三个元 素,如果a1a2,则交换;依次类推,直到比较第n-1个元素和第n个元素,如果an-2 an-1,则交换;这是第一趟冒泡排序,在n个元素
8、中,值最大的元素放到了an-1位置,即数组的最后一个位置。6.1.4 一维数组程序举例对前n-1个元素进行第二趟冒泡排序,值次大元素放到an-2的位置。重复上述过程,经过n-1趟冒泡排序后,整个数组的元素按照升序排列。6.1.4 一维数组程序举例程序执行结果如下:6.1.4 一维数组程序举例例6-5 从键盘接收10个数据,采用选择法进行排序并输出。选择排序的过程如下:设k=0,代表第一个元素下标。ak依次与后面的n-1个元素比较,如果aka j,则k=j。比较到最后一个元素后,如果k的值不为0,则a0与ak互换。这样a0存放了n个元素中最小的值。这是第一趟选择排序。6.1.4 一维数组程序举例
9、 第一个元素已经选定,应该从第二个元素开始新的一轮选择。设k=1,代表第二个元素下标,ak依次与后面的n-2个元素比较,如果akaj,则k=j。最后,如果k的值不为1,则a1与ak互换,这样a1存放了这一轮n-1个元素的最小值。这是第二趟选择排序。重复上述过程,经过n-1次选择排序后,整个数组的元素按照升序排序。6.1.4 一维数组程序举例 6.1.4 一维数组程序举例程序执行结果如下:6.2 班级总成绩排名 利用一维数组可以处理“一组”相关数据,比如班级的数学成绩。而要处理“多组”相关数 据,比如矩阵是一个二维表格,就不方便用一个一维数组表示;班级多名学生、多门课程的成绩表,它也是一个二维表
10、格。数组元素可以是任何类型,当数组元素是数组时,这种数组就是多维数组。凡是具有相同数据类型的二维数据表格,都可以使用一个数组元素为一维数组的一维数组来 表示,这种数据结构称为二维数组。6.2 班级总成绩排名 班级成绩表的每一行视为一个数组元素,该数组元素由5列组成;所有的行组成数组,数 组的长度是20,其数据类型是长度为5的整型一维数组,这就是二维数组。二维数组又常常称为矩阵,表6-1为205的矩阵。例6-6 班级总成绩排名。为了测试的方便,把 M 更改为3,仅仅输入前3名同学的成绩。程序运行结果如下:本程序中使用了二维数组,下面将介绍二维数组的定义、初始化、引用和使用。6.2.1 二维数组的
11、定义和引用 一维数组只有一个下标,其数组元素称为单下标变量。多维数组元素有多个下标,以标识 它在数组中的位置,所以称为多下标变量。下面介绍二维数组。多维数组可由二维数组类推 而得到。二维数组定义的一般形式:类型说明 数组名常量表达式1常量表达式2;其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。对于 二维数组的理解,可以想象其为一个矩阵。常量表达式1的值为行数;常量表达式2的值为列 数;元素的总个数为两维长度之积。6.2.1 二维数组的定义和引用 例如二维数组inta23,可以存储一个23矩阵B的6个数据,如下所示:二维数组元素也称为双下标变量,其表示形式为:数组名下标
12、1下标26.2.1 二维数组的定义和引用 其中下标1是第一维的下标,取值范围是从0开始至第一维长度减1;下标2是第二维的下标,取值范围是从0开始至第二维长度减1。例如二维数组int a23,共计6个双下标变量,分别是a00,a01,a02,a10,a11 及 a12。如存储矩阵B的数据则 a00=7,a01=5,a02=9,a10=2,a11=8,a12=6。6.2.1 二维数组的定义和引用 C语言把二维数组看成是一个特殊的一维数组,每个数组元素又是一个一维数组,如int a23,可以看成有两个元素a0,a1的一维数组,而a0,a1又是拥有3个整型数组元素构成的一维数组,a0可以看成由a00,
13、a01和a02构成的一维数组名,a1可以看成由a10,a11和a12构成的一维数组名。6.2.1 二维数组的定义和引用 一维数组中,数组元素是按照线性顺序存储到内存的,数组名是分配给数组连续存储空间的首地址。C语言中,二维数组是一个特殊的一维数组,该数组按照线性存放。其每个元素所对应的一个数组也是按照线性存放的。二维数组名也是分配给整个二维数组连续存储空间的首地址。这就是C语言中二维数组在物理上采用的按行存储的顺序存储方式,也称为以行序为主序的顺序存储结构。在三维数组中,也是按照线性顺序存储一组元素,元素的个数为第一维的长度,每个元素对应二维数组再以行序进行存储,这样可以推广到多维数组,从而可
14、以在以字节为单位的内存中,线性存储所有的元素。6.2.1 二维数组的定义和引用 在二维数组中,欲计算某个元素aij的地址,必须知道第二维的大小。C语言双下标变量的有效地址计算公式如下:有效地址=数组的起始地址+(i*第二维大小+j)*sizeof(数组元素数据类型)假如二维数组int a23的首地址为5000,保存矩阵B的数据,则数组a的存储结构下图所示。6.2.2 二维数组的初始化 二维数组定义的同时也可以初始化,具体方法有多种。1.分行初始化 二维数组是一个特殊数组,可通过构成一个初始值列表。因为每个元素又是一个一维 数组,所以每个初始值又是一个构成的初始列表,表示一行。双层的所构成的初始
15、值列表 的初始化称为分行初始化。int a23=7,5,9,2,6,8;其中第一行7,5,9,顺序初始化a0;第二行2,6,8,顺序初始化a1。与一维数组初 始化一样,都是从下标0开始一一对应进行赋初值。该方法一行对一行,界限清楚,容易理解,也不容易出错。6.2.2 二维数组的初始化 分行初始化中允许对行部分初始化,即对行的前半部分初始化,没有初始化部分赋予缺省值0。int a23=7,2,6;相当于 int a23=7,0,0,2,6,0;int a23=7,5;相当于 int a23=7,5,0,0,0,0;分行初始化时,不允许出现内部为空的情况(最少有一个初值)。不代表不给该行初 始化,
16、而是语法错误。如inta23=,2,6,8;是错误的。6.2.2 二维数组的初始化 分行初始化时,如果所有的行都有对应的初始化,此时定义二维数组的第一维的大小可以 省略,编译器会根据初值表的个数来确定。但是第二维的大小必须给定,即使每行的元素全部 列出也不能省略。int a3=7,2,6;相当于 in ta23=7,0,0,2,6,0;2.按顺序赋初值 将所有的数据包括在一个花括号内,初值列表不分行,所有的初值通过逗号分开。赋值的规 则是按照元素在内存中的排列顺序进行赋值,先初始化第一行,然后初始化第二行,依次类推 int a23=7,5,9,2,6,8;相当于 int a23=7,5,9,2
17、,6,8;6.2.2 二维数组的初始化 该方法相对简单,效果与分行赋值一样。但是,当数组元素较多时,容易出现混乱、遗漏和 出错,程序的可读性相对差一些。采用此方法可以部分赋初值,但只能给最前面的行列赋初值,后面的没有对应初值的元素赋缺省值0。int a23=7,5;相当于 int a23=7,5,0,0,0,0;如果全部赋值时,数组第一维长度可以省略,编译系统可以通过第二维的长度,结合初值 列表的长度计算出第一维的长度 int a3=7,5,9,2,6,8;相当于 int a23=7,5,9,2,6,8;6.2.2 二维数组的初始化 对于 Visual C+系统,即使没有全部赋值,也可以根据第
18、二维的长度,结合初始列表长度计算出第一维的长度,此时没有赋值的元素赋缺省值0。int a3=7,5,9,2;相当于 int a23=7,5,9,2,0,0;int a3=7,5;相当于 int a13=7,5,0;6.2.2 二维数组的初始化例6-7 求出66矩阵 A主对角线元素的平均值。6.2.3 二维数组程序举例例6-8 打印如下所示的杨辉三角形的图形,(打印六行),要求用二维数组实现。N行的杨辉三角形可以看作 N*N方阵的下三角,各行的数值分布有如下关系:(1)数据的第0列和对角线元素都为1;(2)数组其余各元素是上一行同列和上一行前一列的两个元素之和。6.2.2 二维数组的初始化例6-
19、9 输出55螺旋矩阵 A。螺旋矩阵的第一行是从左到右顺序递增,最后一列从上到下递增,最后一行从右到左递增,第一列从下到上递增到第二行,第二行从左到右顺序递增到倒数第二列,这样螺旋进行递增,直到矩阵数据布满。本例首先要对矩阵赋值,再打印出该矩阵。6.2.2 二维数组的初始化例6-9 输出55螺旋矩阵 A。6.2.2 二维数组的初始化6.2.2 二维数组的初始化更改N为8,则程序运行结果如下:6.3 搜索好友例6-10 按照姓名搜索好友。姓名是一个字符串,搜索好友是从一列姓名中查找是否有相同的字符串。如果有相同的字符串,则表示找到了好友。采用字符类型的二维数组存储一列姓名,每一行是一个姓名字符串。
20、从键盘通过scanf函数输入好友的姓名,使用strcmp库函数与存储的姓名一个一个比对寻找,如果找到了好友,则输出所在的行号;没有找到好友,则给出提示信息。strcmp函数原型在string.h头文件中,源程序需要包含该头文件。6.3 搜索好友6.3 搜索好友6.3 搜索好友运行程序,输入JackSbone,结果如下:当输入 Abel时,结果如下:上面的代码定义并使用了一种特殊的数组字符串数组。在 C语言中没有字符串数 据类型,字符串是存储在字符数组中,并以0结束的字符序列。也就是说,字符串是存储在以 0结尾的一维字符数组中。0字符的作用是标识字符串的结束。6.3.1 字符数组的定义和引用1.
21、字符数组的定义 字符数组就是数组的数据类型为字符型的数组,字符数组中的每个元素存放一个字符。其定义方法与前面介绍的数组的定义方法类似。例如:char c10;c0=I;c1=;c2=a;c3=m;c4=;c5=h;c6=a;c7=p;c8=p;c9=y;以上定义了c为字符数组,包含10个元素。6.3.1 字符数组的定义和引用 由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整形数组存放字符数据,例如:int c10;c0=a;2.字符数组的初始化 字符数组初始化最容易理解的方式是用“初始化列表”,把各个字符一次赋给数组中各元素。例如:char c10=I,a,m,h,a,p,p
22、,y;把10个字符依次分别赋给c0c9这10个元素。6.3.1 字符数组的定义和引用 如果在定义字符数组时不进行初始化,则数组中个元素的值是不可预料的。如果花括号中提供的初始值个数(即字符个数)大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面的那些元素,其余的元素自动定为空字符(即0)。例如:char c10=c,p,r,o,g,r,a,m数组状态如图6-7所示。6.3.1 字符数组的定义和引用 如果提供的初值个数与预定的数组长度相同,定义时可以省略数组长度,系统会自动根据 初值个数确定数组长度。例如:char c=I,a,m,h,a,p,p,y;数组c的长
23、度自动定义为10,尤其在赋初值的字符个数较多时,比较方便。也可以定义和初始化一个二维字符数组,例如:char c5=H,e,l,l,o,w,o,r,l,d6.3.1 字符数组的定义和引用 3.字符数组元素的引用 字符数组元素的引用方法也是通过下标的方法进行引用的,引用字符数组中的一个元素,得到一个字符。例6-11 输出一个已知的字符串。定义一个字符数组,并用“初始化列表”对其赋以初值。然后用循环逐个输出此字符数组中的字符。6.3.1 字符数组的定义和引用6.3.1 字符数组的定义和引用例6-12 存储两个字符序列Hello和world,并分成两行输出。6.3.1 字符数组的定义和引用 程序运行
24、结果如下:对char a25二维字符数组分行初始化全部的元素,然后按行输出每个元素。6.3.2 字符串和字符串结束标志 在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。介绍字符串常量时,已说明字符串总是以0作为串的结束符。因此当把一个字符串存储到一个字符数组时,结束符0也存入数组,并以此作为该字符串是否结束的标志。有了0标志后,就不必再用字符数组的长度来判断字符串的长度。C语言允许用字符串的方式对数组作初始化。例如:char c=C,p,r,o,g,r,a,m,0;可写为:char c=C program;或去掉写为:char c=C program;6.3.2 字符串和字
25、符串结束标志 用字符串方式赋值比用字符逐个赋值要多占一个字节。这个字节用于存放字符串结束标 志0。上面的数组c在内存中的实际存放情况为:0是由 C编译系统自动加上的。由于采用了0标志,所以在用字符串赋初值时一般无须指定数组的长度,由系统自行处理即可。6.3.3 字符数组的输入输出 字符数组存储字符串后,字符数组的输入输出将变得简单方便,可用printf函数和scanf 函数输入输出一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。例6-13 使用printf输出字符串。6.3.3 字符数组的输入输出 注意本例的printf函数中,使用的格式字符串为%s,表示输出的是一个字符串。
26、而在输出表列中给出数组名即可。但不能写为:printf(%s,str);例6-14 使用scanf输入字符串。6.3.3 字符数组的输入输出 scanf函数接收字符串时,任何时候都会忽略掉前导的空格,读取输入字符并保存到字符数组,直到遇到空格、tab或回车符为止。scanf函数会自动在字符串后面加上0。程序中由 于定义数组长度为15,因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志0。对字符数组,如果不作初始化,则必须说明数组长度。当用scanf函数输入字符串时,字符串中不能含有空格、tab或回车,否则字符数组的输入将结束,空白符用字符串结束标志0替代,标识字符串的输入结
27、束。例如,当输入的字符串中含有空格时,运行情况为:6.3.3 字符数组的输入输出 从输出结果可以看出空格以后的字符都未能输出。如果要保存一行包括空格和tab字符的字符串,可以采用gets函数实现。用scanf函数输入字符串时,用于接收字符串的字符数组要足够长,以便保存字符串和其结束符,否则,与字符串常量初始化字符数组一样,函数将把超过字符数组定义的长度之外的字符也顺序保存在数组范围之外,可能覆盖其他内存变量的内容,造成程序出错。为了避免出错,可以使用域宽来实施控制。6.3.3 字符数组的输入输出char str15;scanf(%14s,str);输入函数最多读入14个非空格或tab字符到st
28、r数组。如果输入超过14个非空格或tab字符,则scanf函数停止接收字符,并把str最后一个字节用于存放字符串结束标志0;如果 没有输入超过14个,则结束标志0仍放在字符串的后面。6.3.4 字符串处理函数 C语言提供了丰富的字符串处理库函数,包括字符串的输入、输出、合并、修改、比较、转换、复制及搜索等。使用这些函数可大大减轻程序员编程的负担。用于基本输入输出的字符串函数包括puts和gets两个函数。在使用这两个函数前应在程序中包含头文件stdio.h,使用其他字符串函数则应包含头文件string.h。下面介绍几个最常用的字符串函数。1.字符串输出函数puts 格式:puts(字符数组名)
29、功能:把字符数组中的字符串输出到显示器。6.3.4 字符串处理函数 从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由printf函数取代。当需要按一定格式输出时,通常使用printf函数。6.3.4 字符串处理函数 2.字符串输入函数gets 格式:gets(字符数组名)功能:从标准输入设备键盘输入一个字符串。6.3.4 字符串处理函数 运行结果如下 当输入的字符串中含有空格或制表符(即使空格在字符串之前)时,输出仍为全部字符串。说明gets函数并不以空格或制表符作为字符串输入结束的标志,而以回车作为输入结束的标志,这与scanf函数不同。6.3.4
30、 字符串处理函数3.字符串连接函数strcat 格式:strcat(字符数组名1,字符数组名2)功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串结束标志0。该函数返回值是字符数组1的首地址。6.3.4 字符串处理函数6.3.4 字符串处理函数程序运行结果如下:本程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数 组1的长度应足够大,否则不能全部存储连接后的字符串。6.3.4 字符串处理函数4.字符串复制函数strcpy 格式:strcpy(字符数组名1,字符数组名2)功能:把字符数组2中的字符串复制到字符数组1中。串结束标志0一同复制。字符
31、数组2可以是一个字符串常量。这时相当于把一个字符串赋给一个字符数组。例6-18 使用字符串复制函数strcpy。6.3.4 字符串处理函数6.3.4 字符串处理函数5.字符串比较函数strcmp 格式:strcmp(字符数组名1,字符数组名2)功能:按照 ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。字符串1等于字符串2,返回值等于0;字符串1大于字符串2,返回值大于0;字符串1小于字符串2,返回值小于0。该函数可用于比较两个字符串常量,或比较以“0”结束的数组和字符串常量。6.3.4 字符串处理函数 该函数可用于比较两个字符串常量,或比较以“0”结束的数组和字符串常量。
32、在C语言中,不能使用关系运算符“”“0,输出 结果st1st2。6.3.4 字符串处理函数6.求字符串长度函数strlen格式:strlen(字符数组名)功能:求字符串的实际长度(不含字符串结束标志0)并作为函数返回值。例6-20 使用求字符串长度函数strlen6.3.4 字符串处理函数6.3.4 字符串处理函数程序运行结果为:6.4 程序举例例6-21 将数组中的10个数据按照从大到小的顺序排序。然后再输入 一个数,插入到排 好序的数组中,使数组中的数仍然是从大到小的顺序。首先,采用选择法将数组中的数据按从大到小的顺序排序,然后,从最后一个数组元素开 始,向前寻找新数据的插入位置,如果当前
33、数据小于新输入的数据,向前移动一个位置,如果 前数据大于等于新输入数据,其后就是要插入数据的位置。新数据插入后保持从大到小的顺序。6.4 程序举例 程序运行结果如下:上面的程序首先对数组a中的10个数从大到小排序,并输出排序结果。然后输入要插入 的整数tmp。再用 while语句把tmp和数组元素从后向前逐个比较,如果发现有tmpai 时,则由ai移动到i+1的位置。如果ai小于等于tmp,则i+1为插入点。如果所有的元 素均大于被插入数,此时i=10,结果是把n赋予a10。6.4 程序举例如果程序运行时输入47,应该插入到 54和28之间,程序运行结果如下:从结果可以看出47已插入到54和2
34、8之间。6.4 程序举例例6-22 在下面二维数组a中选出各行最大的元素保存到一维数组b中。a34=3,16,87,65,4,32,11,108,10,25,12,37 本题的编程思路是,在数组a的每一行中寻找最大的元素,找到之后把该值赋给数组b相 应的元素即可。程序如下:6.3.4 字符串处理函数6.3.4 字符串处理函数 程序运行结果如下:本程序采用for语句的嵌套循环查找每行中最大值。外循环控制逐行处理,内循环来寻 找该行的最大值,并把获得最大值赋值给数组b中相应的元素。当外循环完成时,数组b中已 存储数组a各行中的最大值。程序最后的两个for语句分别输出数组a和数组b。6.4 程序举例
35、例6-23 输入五个国家的名称按字母顺序排列输出。多个国家名字符串可以采用一个二维字符数组来保存,通过gets函数输入国家名。用 strcmp进行比较,采用选择法进行排序,交换两个字符串时,需要一个临时字符数组,用strcpy函数来实现。6.4 程序举例程序运行结果如下:6.4 程序举例 上面程序第一个for语句中,用gets函数输入五个国家名称字符串。在第二个for语句 中嵌套了一个for语句组成双重循环,完成按字母顺序排序的工作。最后一个for循环语句输出排好顺序的国家名称。6.5 旅客的航空逾重行李费用计算及查询 虽然例5-17能够实现对多名旅客进行航空逾重行李费用计算,但不能存储旅客的
36、信息,也就不能实现统计和查询。为此,例6-24用两个一维数组和一个多维数组分别保存行李重量、逾重行李的费用及旅客的姓名,从而实现查询和统计功能。6.5 旅客的航空逾重行李费用计算及查询 例6-24 假设最多能够处理100名旅客的航空逾重行李费用计算,定义数组 weight 100和charge100用于保存行李重量和逾重行李费用;用数组owner10020保存旅客的姓名。三个数组的相同下标表示是某一个旅客的信息。在进行旅客信息的输入时,如果输入旅客的姓名为END,则视为本次输入结束。然后输出本次旅客的人数、总重量及总费用。随后进入查询阶段,输入旅客姓名查询行李的重量和逾 重收费信息,同样如果输
37、入旅客的姓名为END,则视为查询结束。在进行查询时,使用了stricmp函数,这样可忽略字母的大小写进行字符串比较。程序运行结果如下:6.5 旅客的航空逾重行李费用计算及查询 上面的程序实现了旅客行李逾重收费计算和查询功能。至此,旅客的航空逾重行李计算程序 Verson1.0版本就完成了。如果收费管理和查询管理使用两个模块,就会使整个结构变得更加清晰。另外,该程序进行的收费信息只能在程序运行期间使用,如果程序关闭,则信息完全丢失。还有,一个旅客的信息分别存储在三个数组中,信息之间的联系依靠数组的下标来实现,没有能够把一个旅客的信息聚集在一起实现统一的管理。如果要完成以上新的功能,需要学习完函数、结构体和文件的内容后才能实现。