例L3_2 读入三个数,找出并打印其中的最大数。 解:
PROGRAM L3_2; VAR
a,b,c:real; BEGIN
write('a=?'); read(a); write('b=?'); read(b); write('c=?'); read(c); IF a
THEN a:=b; IF a THEN a:=c; writeln('ZuiDaShu:',a) END. 3.2.2 复合语句 在IF语句中,跟在THEN或ELSE后的语句可能不止一个,这时要用到复合语句的概念。 复合语句是一个以BEGIN开始,以END结束的语句。在BEGIN与END之间可以包括若干个语句,每个语句之间以分号分开。一般形式为: BEGIN (语句1); (语句2); … (语句n) END 一个复合语句从外部看来,相当于一个语句。 例L3_3 读两个数,将大数存于x,小数存于y。 解: PROGRAM L3_3; VAR x,y,temp:real; BEGIN write('x=?'); readln(x); write('y=?'); readln(y); IF x THEN BEGIN temp:=x; 16 x:=y; y:=temp END; writeln('x=',x:8:2,',y=',y:8:2) END. 3.2.3 复合IF语句 在IF语句中,THEN或ELSE后的语句本身也可能是IF语句。此时称为IF语句的嵌套(或称为复合IF语句)。 例如语句 IF(条件1) 假 THEN(语句1) 真 条件1 ELSE IF(条件2) THEN(语句2) ELSE(语句3) 假 真 条件2 就是一个复合IF语句,在它的 ELSE后又是一个IF语句。 语句3 语句2 语句1 例L3_4 输入某学生成绩,根据成绩的好坏输出相应评语。如果成绩在90分以上,输出评语:优秀(outstanding);如果成绩在60到90之间,输出评语:良好(satisfactory);如果成绩不足60分,输出评语:不及格(unsatisfactory)。 有时IF语句可能会有两种不同的理解。例如语句: IF (条件1) THEN IF (条件2) THEN (语句1) ELSE (语句2) 我们可以认为ELSE与后一个THEN配对,其流程图如图3_8(1)所示。 但是,我们也可以认为ELSE与前一个THEN配对,其流程图如图3_8(2)所示。 假 真 条件1 假 真 条件1 假 条件2 真 假 条件2 真 语句2 语句1 语句2 语句1 图3_8(1) 图3_8(2) 17 为了避免产生不同的理解,PASCAL系统规定ELSE总是与同一层前面最靠近它的,还没有ELSE与之配对的THEN配对。因此,上面的语句肯定是按第一种理解,即ELSE与后一个THEN配对。 如果要求按第二种理解执行流程图,可以通过在IF语句中加BEGIN、END的办法来实现。写成 IF(条件1) THEN BEGIN IF(条件2) THEN(语句1) END ELSE(语句2) 3.3 CASE语句 CASE语句是实现选择结构程序设计的另一种语句。它的使用有时比IF语句来得简单、直观。 CASE语句(或称情况语句)的一般形式是 CASE (表达式) OF (值表1):(语句1); (值表2):(语句2); …… (值表n):(语句n) END 在CASE语句头上的表达式必须是有序类型(整型、字符型、布尔型以及后面要介绍的枚举型、子界型)。值表是一些由逗号分开的常数。表达式所有可能的值必须在值表中出现,且每个值只能出现一次。 如果当前表达式的值在某个值表i中出现,则该程序只执行对应该值表i的语句,然后执行整个CASE语句后的下一语句。 例L3_5 输入年、月,输出该月有几天。 讨论:每年的1、3、5、7、8、10、12月,每月有31天;4、6、9、11月,每月有30天;2月闰年有29天,平年有28天。 年号能被4整除,但不能被100整除,或者年号能被400整除的年均是闰年。 用year、month、days分别表示年、月、每月天数。它们均为整数。 闰年的条件可以写成如下的布尔表达式: (year MOD 4 = 0) AND (year MOD 100 <> 0) OR (year MOD 400 = 0) PROGRAM L3_5; VAR year,month,days:integer; BEGIN write(‘year=?’); readln(year); write(‘month=?’); 18 readln(month); CASE month OF 1,3,5,7,8,10,12:days:=31; 4,6,9,11:day:=30; 2:IF(year MOD 4 = 0) AND (year MOD 100 <> 0) OR (year MOD 400 = 0) THEN days:=29 ELSE days:=28 END; writeln(‘year=’,year,’,month=’,month,’,days=’days) END. 例L3_6 输入两个运算量及一个运算符,输出运算结果。这相当于计算器计算。 讨论:设两个运算量为x和y,一个运算符为oper,运算结果为result。 现在假定运算符只可能是+、-、*、/,将oper说明为字符型。x、y和result说明为实型。 习题 XT3_1 编制程序,根据输入的x值,计 PROGRAM XT3_1; 算y与z并输出。 CONST PI=3.14159; 2??x?1(x?2.5) VAR y??2 x,y,z:real; ??x?1(x?2.5) BEGIN ?? write('x=?'); ??2x?3(x?0) read(x); ?z??0(x?0) IF x<=2.5 ?? THEN y:=x*x+1 ?x?5(x?0) ELSE y:=x*x-1; ?2 IF x<0 THEN z:=-PI/2*x+3 ELSE IF x=0 XT3_2 对一批货物征收税金,价格在1 THEN z:=0 万元以上的货物征税5%,在5000元以上,1 ELSE z:=PI/2*x-5; 万元以下的货物征税3%,在1000元以上, writeln('x=',x:6:2,', y=',y:6:2,', z=',z:6:2) 5000元以下的货物征税2%,1000元以下的 END. 货物免税。编写一程序,读入货物价格,计算并输出税金。 19 XT3_3 输入某学生成绩,若成绩在85分以上,输出very good,若成绩在60分到85分之间,输出good,若成绩低于60分,输出no good。 XT3_4 输入3个数,将其中最小数输出。 XT3_5 输入3个字母,按字母表顺序从小到大输出这3个字母。 XT3_6 输入二次方程的3个系数a、b、c,计算二次方程的根。程序应考虑实根和复根两种情形。二次方程如下: ax2+bx+c=0 提示:PASCAL不能表示复数。若为复根,应分别计算并输出实、虚部,在输出时将+、-与i用字符形式输出。 lnx+lny Ⅰ象限 XT3_7 输入x、y,根据所处象限,用相应sinx+siny Ⅱ象限 z= 公式计算z。 e2x+e3x Ⅲ象限 tan(x+y) Ⅳ象限 XT3_8 输入x、y及象限,计算z。z的计算公式同XT3_7题,要求用CASE语句编程序。 XT3_9 输入班号,输入该班学生人数。应用CASE语句编程序。 班号 人数 91 30 92 32 93 30 94 30 95 32 96 25 阅读学习《全国信息奥林匹克联赛培训教程(一)》(信息学奥林匹克科学委员会主编,清华大学出版社)及网上教案,阅读要求见下表: 阅读内容 5.2 Pascal程序的一般结构和输入输出语句 5.3.2 顺序结构 5.3.2 选择结构 页 码 《全国信息奥林匹克联赛培训教程(一)》P94 要求 全看 《全国信息奥林匹克联赛培训教程(一)》P100 《全国信息奥林匹克联赛培训教程(一)》P101 全看 看1、条件选择结构P101至P104 全看 全看 看1、整型;2、5.4.1 运算对象的显式定义 5.4.2 表达式 5.4.3 Pascal的简《全国信息奥林匹克联赛培训教程(一)》P116 《全国信息奥林匹克联赛培训教程(一)》P120 《全国信息奥林匹克联赛培训教程(一)》P121 20