收藏 分销(赏)

语言补充内容caserepeat.pptx

上传人:鼓*** 文档编号:14719923 上传时间:2026-11-05 格式:PPTX 页数:37 大小:1.55MB 下载积分:8 金币
下载 相关
语言补充内容caserepeat.pptx_第1页
第1页 / 共37页
语言补充内容caserepeat.pptx_第2页
第2页 / 共37页


点击查看更多>>
资源描述
语言补充内容caserepeat,情况语句的一般形式:,case of,:语句1;,:语句2;,:,:语句n;,else 语句n+1;,end;,其中case、of、end是Pascal的保留字,表达式的值必须是顺序类型,它可以是整型、布尔型及以后学习的字符型、枚举型和子界型。情况标号表是一串用逗号隔开的与表达式类型一致的常量序列。语句可以是任何语句,包括复合语句和空语句。,case语句的执行过程,先计算表达式(称为情况表达式)的值,如果它的值等于某一个常量(称为情况常量,也称情况标号),则执行该情况常量后面的语句,在执行完语句后,跳到case语句的末尾end处。,说明,情况表达式必须是顺序类型的;,情况常量是情况表达式可能具有的值,因而应与情况表达式具有相同的类型;,情况常量出现的次序可以是任意的;,同一情况常量不能在同一个case语句中出现两次或两次以上;,每个分语句前可以有一个或若干个用逗号隔开的情况常量;,如果情况表达式的值不落在情况常量的范围内,则认为本case语句无效,执行case语句的下一个语句。Free pascal中增加了一个“否则”的情况,即增加一个else子句,但也是可省的。,每个常量后面只能是一个语句或一个复合语句,以分号结束。,例3.9,根据x的值,求函数Y的值:,【分析】,利用case语句进行程序设计,关键在于巧妙地构造情况表达式。本例中三种情况可用一个表达式区分出来:Trunc(x/100)。因为x在(0,100)之间时表达式值为0;x在100,200)时表达式值为1;其余部分可用else子句表示。源程序如下:,program 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(month);,case month of,1,3,5,7,8,10,12:days:=31;,4,6,9,11 :days:=30;,2 :days:=28;,else days:=0;,end;,if days0 then writeln(days);,end.,运行结果:,输入:10,输出:31,例3.11,期未来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为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元笔即可。,从以上对买笔方案的调整,可以看出笔的数目都是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;end;,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);/分二行输入,,第一行是二个操作数,readln(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 语句可以实现“直到型循环”。repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。,直到循环语句的一般形式:,Repeat,;,:,;,until;,其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。,说明:,repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。,repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。,repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来,repeat 和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人时,正好不多。求校体操队至少是多少人?,【分析】,设校体操队为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:=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相乘,而且本次的乘积主下一次相乘的被乘数,因此也只需取末两位参与运算就可以了。,Program 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:integer;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-until循环是可以互相转化的,具体用哪个,还要看个人喜好,但他们也存在细微区别,那就是while语句的循环体有可能一次都不会被执行,而repeat语句中循环体至少执行一次。for 循环在大多数场合也能用while和repeat-until循环来代替。一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。,记录类型,在程序中对于组织和处理大批量的数据来说,数组是一种十分方便而又灵活的工具,但是数组在使用中有一个基本限制,这就是:一个数组中的所有元素都必须具有相同的类型。但在实际问题中可能会遇到另一类数据,它是由性质各不相同的成份组成的,即它的各个成份可能具有不同的类型。例如,有关一个学生的数据包含下列项目:,学号字符串类型,姓名字符串类型,年龄整型,性别字符型,成绩实型数组,Pascal给我们提供了一种叫做,记录,的结构类型。在一个记录中,可以包含不同类型的并且互相相关的一些数据。,记录类型的定义,在pascal中,记录由一组称为“域”的分量组成,每个域可以具有不同的类型。,记录类型定义的一般形式:,record,:;,:;,:,:;,end;,说明:,域名也称域变量标识符,应符合标识符的语法规则。在同一个记录中类型中,各个域不能取相同的名,但在不同的记录类型中,两个类型中的域名可以相同。,记录类型的定义和记录变量可以合并为一个定义,如:,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。,域变量的使用和一般的变量一样,即域变量是属于什么数据类型,便可以进行那种数据类型所允许的操作。,记录的嵌套,当一个记录类型的某一个域类型也是记录类型的时候,我们说发生了记录的嵌套,看下面的例子:,例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,设计一个函数比较两个dates日期类型记录变量的迟早。,设函数名、形参及函数类型定义为:,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:boolean;,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 DATE 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,的记录变量名和“.”。,说明:,一般在with后只使用一个记录变量名。如:,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后接若干个记录名时,应是嵌套的关系。如有记录说明:,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 student=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;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个日期,再对每个日期输出第二天的日期。输入日期的格式是月、日、年。,例如: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=maxdays 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)or(year mod 4=0)and(year mod 1000),then maxdays:=29 else maxdays:=28;,end;,文件操作,在程序设计中,常常需要从键盘输入大量数据,操作相当麻烦、也很容易出错;同时,在程序运行后也往往会产生大量的输出数据(结果),这给验证结果的正确性和测试程序的对错也带来了很大的麻烦。能不能有一种方法,让程序自动从某个地方读取数据运行,再将程序的运行结果保存到指定的地方呢?当然可以,这就是Pascal中的“文件”类型。,文件在使用时必须在程序内部以一定的语句与实际文件联系起来,建立一一对应的关系,用内部文件的逻辑名对实际文件进行操作。,使用文件大致有以下几个步骤;,()在使用文件前,必须对文件类型和变量进行说明;,()建立内部文件(程序中的文件)与外部文件(磁盘上的实际文件)的联系;,()打开文件,为文件读写作准备;,()对文件进行读、写操作;,()在使用完文件后,,一定要记住关闭文件,,确保文件的完整性和可靠性,否则会引起文件处理错误。切记切记!,Free Pascal将文件分为三类:文本文件(顺序)、有类型文件(顺序或随机)和无类型文件(顺序或随机)。下面只对竞赛中用到的文本文件及其操作进行介绍。,文本文件又称为正文文件或行文文件,可供人们直接阅读,是人机通信的基本数据形式之一。文本文件可用文字编辑程序(如记事本、word等)直接建立、阅读和编辑,也可以由Pascal程序在运行过程中建立。,文本文件的定义:,文本文件的类型为TEXT,它是由ASCII字符组成的,是Pascal提供的标准文件之一。标准文件 TEXT已由Pascal说明如下:,type text=file of char;,因此,TEXT同标准类型Integer、real、char等一样可以直接用于变量说明之中,无需再由用户说明。例如:,var f1,f2:text;,这里定义了两个文本文件变量F1和F2。,写入文本文件,文本文件内容写入操作步骤为:,定义文本文件变量;,把一外部文件名赋于文本文件变量,使该文本文件与一相应外部文件相关联;,命令格式: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),功能:打开已存在的文件并追加(即文件中的原有信息不丢失),这在竞赛中不会用到。,对文件进行写操作;,命令格式: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);/准备写操作,writeln(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);/关联并准备读操作,readln(f,n,m);,writeln(n:4,m:4);,for i:=1 to n do /共有n行内容,begin,for j:=1 to m do /每行有m个值,begin,read(f,x);,write(x:4);,end;,writeln;,end;,close(f);,readln;/起暂停作用,end.,由于文本文件是以ASCII码的方式存储,故查看文本文件的内容是极为方便。,行结束和文件结束函数,除了上述几个重要的过程外,在文本文件的使用过程中还经常用到两个重要的函数。,Eoln函数,:行结束函数,函数值为布尔型,当文件指针指向回车换行符时,函数值为真(true),否则为假(false)。Eoln函数一般用在从一个已打开的文件中读取数据时判断一行的数据是否读完。如果文件是以写状态打开的,则Eoln函数的值总是假。Eoln函数的调用形式为:Eoln(f);一般可以省略参数(包括括号)。,Eof函数,:文件结束函数,函数值为布尔型,当文件指针指向文件结束标志(ctrl+z)时,函数值为真(true),否则为假(false)。Eof函数一般用在从一个已打开的文件中读取数据时判断文件是否结束。Eof函数的调用形式为:Eof(f);也可省略参数。,文本文件的特点,元素均为字符型,但在将文件元素读入到一个变量(整型,实型或字符串型)中时,Pascal会自动将其转换为与变量相同的数据类型。与此相反在将一个变量写入文本文件时,也会自动转换为字符型。,文件的读写操作,有文本文件的每一个一个非常实用的技巧,就是利用input和output这两个变量,input是Free Pascal默认的输入设备,事先不更改,指的是键盘。output是Free Pascal默认的输出设备,事先不更改,指的是显示器。这两个设备变量,我们可以更改它们的值,让它们和我们所要求的文件相关联,利用这一特性,就可以达到更加灵活的编程风格。下面几个例子,读写操作全用input和output这两个变量,同学们仔细体会。,
展开阅读全文

开通  VIP、SVIP  下载更划算
下载10份以上建议开通 VIP 会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        关注我们

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服