版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、情况语句(CASE语句),上面我们知道可以用嵌套的if语句实现多分支的选择结构。但是如果分支越来越多时,用嵌套的if语句实现多分支就显得繁杂。当多分支选择的各个条件由同一个表达式的不同结果值决定时,可以用case语句实现。它的选择过程,很象一个多路开关,即由case语句的选择表达式的值,决定切换至哪一语句去工作。因此在分支结构程序设计中,它是一种强有力的手段。在实现多路径分支控制时,用case对某些问题的处理和设计,比用if语句写程序具有更简洁、清晰之感。,情况语句的一般形式:,case of :语句1; :语句2; : :语句n; else 语句n+1; end; 其中case、of、end
2、是Pascal的保留字, 表达式的值必须是顺序类型,它可以是整型、布尔型及以后学习的字符型、枚举型和子界型。情况标号表是一串用逗号隔开的与表达式类型一致的常量序列。语句可以是任何语句,包括复合语句和空语句。,case语句的执行过程,先计算表达式(称为情况表达式)的值,如果它的值等于某一个常量(称为情况常量,也称情况标号),则执行该情况常量后面的语句,在执行完语句后,跳到case语句的末尾end处。,说明,情况表达式必须是顺序类型的; 情况常量是情况表达式可能具有的值,因而应与情况表达式具有相同的类型; 情况常量出现的次序可以是任意的; 同一情况常量不能在同一个case语句中出现两次或两次以上;
3、 每个分语句前可以有一个或若干个用逗号隔开的情况常量; 如果情况表达式的值不落在情况常量的范围内,则认为本case语句无效,执行case语句的下一个语句。Free pascal中增加了一个“否则”的情况,即增加一个else子句,但也是可省的。 每个常量后面只能是一个语句或一个复合语句,以分号结束。,例3.9根据x的值,求函数Y的值:,【分析】利用case语句进行程序设计, 关键在于巧妙地构造情况表达式。本例中三种情况可用一个表达式区分出来:Trunc(x/100)。因为x在(0,100)之间时表达式值为0;x在100,200)时表达式值为1 ;其余部分可用else子句表示。源程序如下:,pro
4、gram ex3_9; var x,y:real; begin write(Input x:);readln(x); case trunc(x/100) of 0:y:=x+1; 1:y:=x-1; else y:=-1; end; /end of case,每个case对应一个end writeln(x=,x:8:2,y=,y:8:2); end.,例3.10 判断2006年,每个月份的天数。,【分析】 程序分为:输入月份,计算该月的天 数,输出天数。程序如下:,Program ex3_10; Var month,days : integer; begin readln(year,month
5、); case month of 1,3,5,7,8,10,12 : days : =31; 4,6,9,11 : days : =30; 2 : if (year mod 400=0)or(year mod 4=0)and(year mod 1000) then days : =29 else days:=28; else days : =0; end; if days0 then writeln(days); end.,运行结果: 输入:10 输出:31,例3.11 期未来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价
6、为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。,【分析】,对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为x div 4支。由于小q要把钱用完,故我们可以按以下方法将钱用完: 若买完x div 4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完x div 4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;若买完x div 4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。 从以上对买笔方案的调整,可以看出
7、笔的数目都是x div 4,因此该方案的确为最优方案。,程序如下:,Program ex3_11; Var a,b,c : integer; /a,b,c分别表示在买笔方案中 ,6元、5元和4元钱笔的数目 x,y : integer; /x,y分别表示剩余班费和 买完最多的4元笔后剩的钱 begin readln(x); /输入x c : =x div 4;/4元笔最多买的数目 y : =x mod 4;/求买完c支4元笔后剩余的钱数y case y of 0 : begin a : =0; b : =0; end; 1 : begin a : =0; b : =1; c : =c-1; en
8、d; 2 : begin a : =1; b : =0; c : =c-1; end; 3 : begin a : =1; b : =1; c : =c-2; end; end; writeln(a, ,b, ,c); /三个数间以空格隔开 end.,例3.12 试编写一个根据用户键入的两个操作数和一个运算符,由计算机输出运算结果的程序。,【分析】 只考虑加(+)、减(-)、乘(*)、除(/)四种运算,利用Case语句。,Program ex3_12; Var result,x,y : real; ch : char; begin readln(x,y);/分二行输入, 第一行是二个操作数 r
9、eadln(ch);/第二行是运算符 result := 0; case ch of + : result := x+y;,- : result := x-y; * : result := x*y; / : if y0 then/考虑被0除的特殊情况 result := x/y else writeln(error!); end; writeln(result :0 :2); end.,运行结果: 输入:15 3 + 输出18.00 输入:5 0 / 输出:error!,直到循环(REPEAT语句),用while语句可以实现“当型循环”,用repeat-until 语句可以实现“直到型循环”。
10、repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。 直到循环语句的一般形式: Repeat ; : ; until ; 其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。,说明: repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。 repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。 repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来, repeat 和
11、until已经起了begin和end的作用。while循环和repeat循环是可以相互转化的。,例4.13 求两个正整数m和n的最大公约数。程序采用repeat-until循环实现。 Program ex4_13; var m,n,r : integer; begin readln(m,n); repeat /辗转相除法 r : =m mod n; m: =n; n: =r; until r=0; writeln(m); end.,例4.14 校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至
12、少是多少人? 【分析】设校体操队为X人,根据题意X应是7的倍数,因此X的初值为7,以后用inc(x,7)改变X值; 为了控制循环, 用逻辑变量yes为真(True) 使循环结束; 如果诸条件中有一个不满足, yes 的值就会为假(false),就继续循环。 Program ex4_14; var x: integer; yes : boolean; begin x:=0; repeat yes :=true; inc(x,7); if x mod 2 1 then yes:=false; if x mod 3 1 then yes:=false; if x mod 4 1 then yes:=
13、false; if x mod 5 1 then yes:=false; if x mod 6 1 then yes:=false; until yes; /直到yes的值为真 writeln(All =, x) ; readln end. 程序中对每个X值,都先给Yes 赋真值,只有在循环体各句对X进行判断时,都得到“通过”(此处不赋假值)才能保持真值。,例4.15 求1992个1992的乘积的末两位数是多少? 【分析】积的个位与十位数只与被乘数与乘数的个位与十位数字有关,所以本题相当于求1992个92相乘,而且本次的乘积主下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。 Progr
14、am ex4_15; var a,t : integer; Begin a := 1; t := 0; repeat t := t+1; a := (a*92) mod 100; until t=1992; writeln(a); Readln; End.,例4.16 利用格里高公式求。/4=1-1/3+1/5-1/7+,直到最后一项的值小于10-6为止. 【分析】 解本题的关键就是求右边数值序列的和,序列有明显的特点:分母是从1开始的奇数,加、减号轮流出现,因此,我们可以用m=n+2表示序列数值的变化,用f=-f来设置它们知项的符号位。 Program ex4_16; var f : int
15、eger; n,t,pai : real; begin pai : =0; t : =1; n : =1; f : =1; repeat pai : =pai+t; n : =n+2; f : =-f; t : =f/n; until abs(t)1e-6; pai : =pai*4; writeln(pai : 10 : 8); end. 运行结果: 3.14159066,以上我们已介绍了三种循环语句。一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和repeat-until循环, 而且 while 循环和repeat-u
16、ntil循环是可以互相转化的,具体用哪个,还要看个人喜好,但他们也存在细微区别,那就是while语句的循环体有可能一次都不会被执行,而repeat语句中循环体至少执行一次。for 循环在大多数场合也能用while和repeat-until循环来代替。一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。,记录类型,在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成
17、份可能具有不同的类型。例如,有关一个学生的数据包含下列项目: 学号字符串类型 姓名字符串类型 年龄整型 性别字符型 成绩实型数组 Pascal给我们提供了一种叫做记录的结构类型。在一个记录中,可以包含不同类型的并且互相相关的一些数据。,记录类型的定义,在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型。 记录类型定义的一般形式: record :; :; : : :; end;,说明: 域名也称域变量标识符, 应符合标识符的语法规则。在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名可以相同。 记录类型的定义和记录变量可以合并为一个定义,
18、如: type date=record year:1900.1999; month:1.12; day:1.31 end; var x:date; 可以合并成: var x: record year:1900.1999; month:1.12; day:1.31 end; 对记录的操作,除了可以进行整体赋值, 还能对记录的分量域变量进行。 域变量的表示方法如下: 记录变量名.域名 如前面定义的记录X,其3个分量分别为:x.year ,x.month ,x.day。 域变量的使用和一般的变量一样, 即域变量是属于什么数据类型,便可以进行那种数据类型所允许的操作。,记录的嵌套,当一个记录类型的某一
19、个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子: 例7.5 某人事登记表可用一个记录表示, 其中各项数据具有不同的类型,分别命名一个标识符。而其中的“出生年月日”又包括三项数据,还可以用一个嵌套在内层的记录表示。 具体定义如下: type sexs=(male,female); date=record year:1900.1999; month:1.12; day:1.31; end; personal=record name:string15; sex:sexs; birthdate:date; home:string40; end;,例7.6 设计一个函数比较两个date
20、s日期类型记录变量的迟早。 设函数名、形参及函数类型定义为: AearlyB(A,B:dates):boolean; 函数的形参为两个dates类型的值参数。当函数值为true 时表示日期A早于日期B,否则日期A迟于日期B或等于日期B。显然不能对、两个记录变量直接进行比较,而要依具体的意义逐域处理。,程序如下: program ex7_6; type dates=record year:1900.1999; month:1.12; day:1.31 end; var x,y:dates; function AearlyB(A,B:dates):boolean; var earln:boolea
21、n; begin early:=false; if (A.yearB.year) then early:=true; if (A.year=B.year)and(A.monthB.month) then early:=true; if (A.year=B.year)and(A.month=B.month)and(A.dayB.day) then early:=true; AearlyB:=early; end; of AearlyB BEGIN write(Input DATE X(mm-dd-yy):)readln(X.month,X.day,X.year); write(Input DAT
22、E Y(mm-dd-yy):)readln(Y.month,Y.day,Y.year); if AearlyB(X,Y) then writeln(Date X early!) else writeln(Date X not early!); END.,开域语句,在程序中对记录进行处理时,经常要引用同一记录中不同的域,每次都按例7.6的格式引用,非常乏味。为此Pascal提供了一个with语句,可以提供引用域的简单形式。 开域语句一般形式: with do 功能: 在do后的语句中使用with后的记录的域时, 只要直接写出域名即可,即可以省略例7.6的记录变量名和“.”。,说明: 一般在wit
23、h后只使用一个记录变量名。如: write(Input year:); readln(x.year); write(Input month:); readln(x.month); write(Input day:); readln(x.day); 可以改写成: with x do begin write(Input year:);readln(year); write(Input month:);readln(month); write(Input day:);readln(day); end; 设x,y是相同类型的记录变量,下列语句是非法的: with x,y do.;,with后接若干个记
24、录名时,应是嵌套的关系。如有记录说明: var x:record i:integer; y:record j:0.5; k:real; end; m:real end; 可以使用: with x do begin read(i); with y do read(j,k); readln(m); end; 或简写为: with x,y do readln(i,j,k,m);,例7.7 输入40个学生记录(每个学生记录包括学号、姓名、年龄、成绩),组成记录数组,然后按成绩由高到低的次序排序,输出排序后的全部学生记录。 程序如下: Program ex7_7; const n=40; type st
25、udent=record num : integer; name : string8; sex : char; age : 5.100; score : real; end; var stu : student; temp;student; i,j : integer;,begin for i : =1 to n do with stui do readln(sex,num,age,score,name); for i : =1 to n-1 do/选择排序 for j : =i+1 to n do if stui.scorestuj.score then begin temp : =stui
26、; stui : =stuj; stuj : =temp; end; writeln(num : 8,name : 10,sex : 14,age : 10,score : 8); /输出 for i : =1 to n do with stui do begin write(num : 8,name : 18); if sex=m then write(maLe : 8) else write(femaLe : 8); writeln(age : 8,score : 8 : 1); end; end.,例7.8 读入10个日期,再对每个日期输出第二天的日期。输入日期的格式是月、日、年。 例如
27、:9301993,输出的格式为10/1/1993。 【分析】可用一个记录变量today表示日期。 知道一个日期后要更新为第二天的日期,应判断输入的日期是否为当月的最后一天,或当年的最后一天。 program ex7_8; type date=record month:1.12; day:1.31; year:1900.1999; end; var today:array1.10of date; i:integer; maxdays:28.31; begin for i:=1 to 10 do with todayi do readln(month,day,year);,if day=maxda
28、ys then begin day:=1; if month=12 then begin month:=1;year:=year+1; end else month:=month+1; end else day:=day+1; writeln(month,/,day,/,year); end; end.,for i:=1 to 10 do with todayi do /求第i个日期中月份最后一天maxdays begin case month of 1,3,5,7,8,10,12:maxdays:=31; 4,6,9,11 :maxdays:=30; 2:if(year mod 400=0)
29、 or( year mod 4=0)and(year mod 1000) then maxdays:=29 else maxdays:=28; end;,文件操作,在程序设计中,常常需要从键盘输入大量数据,操作相当麻烦、也很容易出错;同时,在程序运行后也往往会产生大量的输出数据(结果),这给验证结果的正确性和测试程序的对错也带来了很大的麻烦。能不能有一种方法,让程序自动从某个地方读取数据运行,再将程序的运行结果保存到指定的地方呢?当然可以,这就是Pascal中的“文件”类型。 文件在使用时必须在程序内部以一定的语句与实际文件联系起来,建立一一对应的关系,用内部文件的逻辑名对实际文件进行操作。
30、使用文件大致有以下几个步骤; ()在使用文件前,必须对文件类型和变量进行说明; ()建立内部文件(程序中的文件)与外部文件(磁盘上的实际文件)的联系; ()打开文件,为文件读写作准备; ()对文件进行读、写操作; ()在使用完文件后,一定要记住关闭文件,确保文件的完整性和可靠性,否则会引起文件处理错误。切记切记! Free Pascal将文件分为三类:文本文件(顺序)、有类型文件(顺序或随机)和无类型文件(顺序或随机)。下面只对竞赛中用到的文本文件及其操作进行介绍。 文本文件又称为正文文件或行文文件,可供人们直接阅读,是人机通信的基本数据形式之一。文本文件可用文字编辑程序(如记事本、word等
31、)直接建立、阅读和编辑, 也可以由Pascal程序在运行过程中建立。,文本文件的定义:,文本文件的类型为TEXT,它是由ASCII字符组成的,是Pascal提供的标准文件之一。标准文件 TEXT已由Pascal说明如下: type text=file of char; 因此,TEXT同标准类型Integer、real、char等一样可以直接用于变量说明之中,无需再由用户说明。 例如: var f1,f2:text; 这里定义了两个文本文件变量F1和F2。,写入文本文件,文本文件内容写入操作步骤为: 定义文本文件变量; 把一外部文件名赋于文本文件变量,使该文本文件与一相应外部文件相关联; 命令格
32、式:assign(f,name) f为定义的文本文件变量 name为实际文件文件名 如:assign(f1,file1.in) 或:assign(f1, pas/file1.out) 这样在程序中对文本文件变量F1的操作,也就是对外部实际文件 File1.in或 File1.out的操作。上例中文件 File1.in是存贮在当前目录中,而文件File1.out则是存贮在PAS子目录中。 打开文本文件,准备写; 命令格式:Rewrite(f) 功能:创建并打开新文件准备写,若已有同名文件则删除再创建 命令格式:Append(f) 功能:打开已存在的文件并追加(即文件中的原有信息不丢失),这在竞赛
33、中不会用到。 对文件进行写操作; 命令格式:Write(f,) 或:Writeln(f,) 功能:将项目内容写入文件f中,Write和Writeln的用法与写在屏幕上一样。 文件操作完毕后,关闭文件。 命令格式:Close(f),例7.9 从键盘上读入如下的数据,把它们写入名为b.txt的文件中。 3 4 29 30 50 60 80 90 70 75 60 50 70 45 Program ex7_9; var i,j,n,m,x : integer; f : text; begin readln(n,m); assign(f,b.txt); rewrite(f); /准备写操作 write
34、ln(f,n:4,m:4); for i : =1 to n do /共n行内容 begin for j : =1 to m do /每行有m个值 begin read(x); write(f,x:4); end; readln; /输入时屏幕换行 writeln(f); /把回车符写入输出文件中 end; close(f); end.,读取文本文件,文本文件内容读出操作步骤: 定义文本文件变量; 用Assign(f,name)命令,将内部文件f与实际文件name联系起来; 当需要从文件中读取数据(输入)到内存时,应先调用reset过程打开该文件,再用read或readln将数据读入到内存变量中,且只能从文件的开头读数据; 命令格式:reset(f); read(f,)或readln(f,) 文件操作完毕,用Close(f)命令关闭文件。,例7.10 读出例7.9建立的文本文件,并输出在屏幕。 Program ex7_10; var i,j,n,m,x : integer; f : text; begin assign(f,b.txt); reset(f); /关联并准备读操作 r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省恩施州东城中学2026届初三下学期第三次统练语文试题含解析
- 智能家居产品永久质量保证承诺书7篇
- 2026年江苏省泰州市泰兴市黄桥教育联盟初三第一次中考适应性考试(一诊)英语试题试卷含解析
- 山东省青岛市黄岛十中学2026年初三中考调研测试(二)英语试题含解析
- 2026年湖南省株洲湘渌实验校初三下学期开学考语文试题含解析
- 特色民族工艺品质量承诺书4篇
- 项目成本控制模板标准化管理
- 公司治理质量保证承诺书(5篇)
- 企业信息资源管理与整合解决方案手册
- 按时交付物流服务保证承诺书范文9篇
- GB/T 20013.1-2025核医学仪器例行试验第1部分:γ辐射计数系统
- 2025年甘肃省高考数学真题(新课标ⅱ卷)(含答案解析)
- 五年(2021-2025)高考生物真题分类汇编专题专题08 生物与环境(解析版)(河北专用)
- 前鼻韵母unvn课件
- 2025年政治法制素养题库及答案
- 中山市招投标管理办法
- 医院一站式服务课件
- 板式支护、槽钢支护施工方法
- 浙江专升本政治试题及答案
- 2025年数据中心机房第三方验证测试方案-方案设计
- 2024学年外研版三起六年级英语下册M9单元整体教学设计
评论
0/150
提交评论