《第五章第二节二维数组与枚举类型》由会员分享,可在线阅读,更多相关《第五章第二节二维数组与枚举类型(8页珍藏版)》请在金锄头文库上搜索。
1、第二节二维数组与枚举类型例 5.6假设四个商店一周内销售自行车的情况如下面表一所示,自行车牌号 永久牌 飞达牌 五羊牌第一商店 35 40 55第二商店 20 50 64第三商店 10 32 18第四商店 38 36 28表一几种牌号自行车的单价如表二所示。求各店本周出售自行车的总营业额。单价 元永久牌 395飞达牌 398五羊牌 384表二解:把表一看成是由行(每个店占一行)与列(每种牌号占一列)共同构成的数据组,按表格排列的位置顺序,用 A 数组表一各数据表示如下:A1,1=35 A1,2=40 A1,3=55 第一行共三个数据A2,1=20 A2,2=50 A2,3=64 第二行共三个数
2、据A3,1=10 A3,2=32 A3,3=18 第三行共三个数据A4,1=38 A4,2=36 A4,3=28 第四行共三个数据A 数组有 4 行 3 列,每个数组元素由两个下标号表示,这样的数组称为二维数组。表二的数据按排列顺序用 B 数组表示如下:B1=395 B2=398 B3=384B 数组有 3 个数据,用一维数组表示,下标号与表一中列的序号有对应关系。计算各店营业额并用 T 数组表示:T1=A1,1*B1+A1,2*B2+A1,3*B3 计算第一商店的营业额T2=A2,1*B1+A2,2*B2+A2,3*B3 计算第二商店的营业额T3=A3,1*B1+A3,2*B2+A3,3*B
3、3 计算第三商店的营业额T4=A4,1*B1+A4,2*B2+A4,3*B3 计算第四商店的营业额T 数组共有 4 个数据,为一维数组,下标号与商店号有对应关系。输出 T 数组各元素的值。Pascal 程序:Program Exam56;Var A: array1.4,1.3 of integer; 定义二维数组,整数类型B: array1.3 of integer; 一维数组,3 个元素T: array1.4 of integer; 一维数组,4 个元素i,j: integer;Beginfor i:=1 to 4 do 输入表一的数据Begin Write(A,i,: ); 提示输入哪一行
4、for j:=1 to 3 do Read(ai,j); 每行 3 个数据Readln; 输完每行按回车键 end;for i:=1 to 3 do 输入表二的数据BeginWrite(B, I ,:); 提示第几行Readln(B i ); 输入一个数据按回车end;for i:=1 to 4 do 计算并输出BeginT i :=0;Write( :5,I:4);for j:=1 to 3 doBeginWrite(Ai , j:6);T i =T i +Ai , j*Bj;end;Write(T i :8);end;Readln; end.程序中定义二维组方式与一维数组形式相同。二维数组
5、的元素由两个下标确定。二维数组元素的格式如下:数组名 下标 1,下标 2 常用下标 1 代表数据在二维表格中的行序号,下标 2 代表所在表格中列的序号。例 5.7输入学号从 1101 至 1104 的 4 名学生考试语文、数学、化学、英语、计算机六门课的成绩,编程求出每名学生的平均分,按每名学生数据占一行的格式输出。解:根据题目所给数据及要求,定义如下数据类型:学生成绩:在数据表格中每人的成绩占一行,每行 6 列(每科占一列) ;定义二维数组 s,各元素为实型;个人平均分:定义一维数组 av,各元素为实型;个人总分:是临时统计,为计算机平均分服务,用简单实型变量 t;处理步骤为:用双重循环按行
6、 i 按列 j 输入第 i 个人第 j 科成绩存入 s i, j;每读入一科成绩分,就累计到个人总分 t 中;输完第 i 个人的各科成绩,就计算出第 i 个人平均分并存入数组 av(i)中;重复上述步骤,直到全部学生的成绩处理完毕;用双重循环按行列形式输出完整的成绩表。Pascal 程序:Program Exam57;const NB=1101; NE=1104;Var s: arrayNB.NE,1.6 of real; 定义二维数组(学生成绩)av: arrayNB.NE of real; 定义一维数组(平均成绩)i: NB.NE; i 为子界类型(学号范围)j: 1.6; j 为子界类型
7、(课程范围)Name Chin Math Phys Chem Engl Comp Ave1101 87 91 78 85 67 781102 69 84 79 95 91 891103 86 69 79 89 90 881104 88 89 92 87 88 81 t: eal; t 为实数类型(计总成绩)Begin for i:=NB to NE do 用 i 控制处理一位学生成绩begint:=0;write(i, : );for j:=1 to 6 do 输入并计算每人的门成绩beginread(si , j);t:=t+si , j; 累加个人总分end;av i :=t / 6; 求
8、个人平均分readln 输完门分按一次回车键end;writeln; 输出学生成绩表writeln( :5, * ); writeln( :5,Name Chin Math Phys Chem Engl Comp Ave);writeln( :5,-);for i:=NB to NE dobeginwrite( :5, i:4, :2); 输出学号for j:=1 to 6 dowrite(si,j:4:1, :2); 输出门成绩writeln(av i :4:1); 输出平均分end;readlnEnd.程序中的学生成绩用键盘输入方式赋给二维数组各元素,如果是少量已知数据,也可在常量说明部分
9、,直接给二维数组各元素赋常数,现将本例题改为如下程序:Program Exam57_1;Const NB=1101; NE=1104; 定义常量Type Cou=(Chin,Math,Phys,Chem,Engl,Comp); 自定义枚举类型Num=NB.NE; 自定义子界类型Const s: arrayNum,Cou of real 定义二维数组并赋常数=(87,91,78,85,67,78),(69,84,79,95,91,89),(86,69,79,89,90,88),(88,89,92,87,88,81);Var av: arrayNum of real; 定义一维数组(平均成绩)i:
10、 Num; i 为子界类型(学号范围)j: Cou; j 为子界类型(课程范围)t: real; t 为实数类型(计总成绩)Beginfor i:=NB to NE do 用 i 控制处理一位学生成绩begin t:=0;for j:=Chin to Comp do 计算每人的门成绩t:=t+si,j; 累加个人总分av i :=t / 6; 求个人平均分end;writeln; 输出学生成绩表writeln( :5,*); writeln( :5,Name Chin Math Phys Chem Engl Comp Ave);writeln( :5,-);for i:=NB to NE do
11、beginwrite( :5, i:4, :2); 输出学号for j:=Chin to Comp dowrite(si,j:4:1, :2); 输出门成绩writeln(av i :4:1); 输出平均分end;End.程序说明部分定义了枚举类型。枚举类型常用自然语言中含义清楚、明了的单词(看成代码)来表示“顺序关系” ,是一种顺序类型,是根据说明中的排列先后顺序,才具有 0,1,2n 的序号关系,可用来作循环变量初值和终值,也可用来作数组下标。但枚举类型不是数值常量或字符常量,不能进行算术运算,只能作为“序号关系”来使用。例 5.8从红(red)、黄(yellow)、兰(blue)、白(w
12、hite)、黑(black)五种颜色的球中,任取三种不同颜色的球,求所有可能的取法?解:将五种颜色定义为枚举类型;a,b,c 都是枚举类型中取不同颜色之一;a 的取值范围从 red to black;b 的取值范围从 red to black,但必须 a b;c 的取值范围从 red to black,且必须 (a b) and (c b);每次打印取出的三个球的颜色,即第一个到第三个(for n:=1 to 3)当 n=1:取 a 的值,根据 a 的“顺序”值输出对应颜色字符串;当 n=2:取 b 的值,根据 b 的“顺序”值输出对应颜色字符串;当 n=3:取 c 的值,根据 c 的“顺序”值输出对应颜色字符串;直至 a,b,c 的取值范围全部循环完毕。Pascal 程序:program ex58;type color=(red,yellow,blue,white,black);var a,b,c,dm: color;nn: 1.3;s: integer;b