《NOIP(全国青少年信息学奥林匹克联赛)复习Pascal.ppt》由会员分享,可在线阅读,更多相关《NOIP(全国青少年信息学奥林匹克联赛)复习Pascal.ppt(29页珍藏版)》请在三一办公上搜索。
1、一、复习回顾,基本结构,顺序结构,选择结构,循环结构,过程和函数,标准类型,整型 integer 0-2 3678,实型 real 两种表示:小数表示法、科学表示法,字符型 char 如:a、A、,布尔型 boolean 如:真 true 假 false,文件类型 file,常量:指在程序执行过程中值不能改变的量。,变量:指在程序执行过程中值可以改变的量。,表达式和函数:,常量的说明:如:圆周率 Const pi=3.14;,注意:变量必须先说明再使用!变量说明:VAR x:integer;,算术运算符:div(整除)34 div 5=6 mod(取余)34 mod 5=4,常用函数:,函数名
2、,功能,举例,Abs(x),求变量的绝对值,Abs(-5.4)=5.4,Sqr(x),求变量x的平方,Sqr(2)=4,Sqrt(x),求变量x的平方根,Sqrt(4)=2,Chr(x),取ASCII码的值,Chr(48)=0,Ord(x),取字符的ASCII值,ord(A)=65,Trunc(x),截尾函数,Trunc(1.99)=1,Round(x),舍入取整,Round(-3.9)=-4 round(-3.1)=-3Round(3.9)=4 round(3.1)=3,pred,前导函数,Pred(2)=1 pred(b)=a,succ,后继函数,Succ(1)=2 Succ(a)=b,表
3、达式,1、写出一个整数被3整除所得余数的表达式。,x mod 3,2、写出计算圆的周长表达式。,2*pi*r,3、将任一大写字母转换成小写字母。,Chr(ord(x)+ord(a)ord(A),4、写出表示年龄大于50岁的表达式。,N50,5、写出一个数既能被3整除又能被5整除的表达式。,(x mod 3=0)and(x mod 5=0),基本语句:,一、赋值语句 变量:=表达式;,功能:先计算后赋值,二、输入语句 read/readln read(变量1,变量2,。)readln(变量1,变量2,。),功能:依次从键盘上读入数据。,三、输出语句 write/writeln,write(变量1
4、,变量2,。)writeln(变量1,变量2,。),例:从键盘输入两个数,交换后输出。,Program ex_1(input,output);var a,b,c:integer;begin writeln(请输入两个数:);read(a,b);c:=a;a:=b;b:=c;writeln(交换后的值是:,a:5,b:5)End.,程序首部,说明部分,语句部分,运行:请输入两个数:,3 4,交换后的值是:4 3,例:从键盘输入一个三位数,分离出百位、十位和个位并输出。,Program ex_2(input,output);var x,ge,shi,bai:integer;begin writel
5、n(请输入一个三位数:);read(x);ge:=x mod 10;bai:=x div 100;shi:=(x-bai*100)div 10;writeln(bai=,bai,shi=:10,shi,ge=:10,ge)End.,程序首部,说明部分,语句部分,运行结果:请输入一个三位数:,836,bai=8 shi=3 ge=6,四、选择结构的程序设计,格式一:If 条件 then 语句1;,格式二:If 条件 then 语句1 else 语句2;,格式一功能:如果条件成立则执行then后的语句1,否则执行该条件语句的下一条语句。,格式二功能:如果条件成立则执行then后的语句1,否则执行e
6、lse后的语句2。,例:输入一个数X,要求不使用ABS函数,输出其绝对值。,分析:首先输入一个数给X,然后判断X是否小于0,如果是则(-X)为X的绝对值,否则输出X。,Program ex_3(input,output);var x:real;begin readln(x);if x0 then writeln(-x)else writeln(x)End.,例4、将输入的两个非负实数中较大的放在max里,小的放在min里,并输出。,算法:(1)输入两个数max,min(2)判断max是否小于min,如果小于min,则交换max和min的值,(3)输出max,min的值,Program ex_4
7、(input,output);var max,min,t:real;begin read(max,min);if maxmin then begin t:=max;max:=min;min:=t end;writeln(max,min)End.,If 语句嵌套,在格式一或格式二中,当语句1或语句2本身也是一个条件语句时,称该语句为条件语句嵌套。,注意:1、else语句总是和与它最近的那个还没有其他的else配对的if/then配对。如果内层的else子句要省,则写一个空语句或采用复合语句,即增加语句括号。,2、在书写程序时采用缩进式,以增强程序的可读性。,Case语句,Case 表达式 of
8、常数表1:语句1;常数表2:语句2;。常数表n:语句n;Else 语句n+1End;,表达式为有序类型,整型、布尔型、字符型,例5:输入两个数(不为0)及一个算术运算符,输出其运算结果。,Program ex_5(input,output);var x,y,s:real;ch:char;begin writeln(请输入x、y 以及运算符:);readln(x,y);readln(ch);case ch of+:s:=x+y;-:s=x-y;*:s=x*y;/:s=x/y end;Writeln(x,ch,y,=,s)end.,例6、打印某年某月有几天。,分析:某年某月的天数分为这几种情况:(
9、1)每年的1,3,5,7,8,10,12这七个月每月为31天。(2)每年的4,6,9,11这四个月为30天;(3)2月又分为两种情况:闰年为29天,否则为28天。,判断闰年的条件:年数能被4整除,并且不能被100整除,但可以被400整除的年份为闰年。(year mod 4=0)and(year mod 1000)or(year mod 400=0),Program ex_6(input,output);var year,month,len:integer;begin writeln(input year and month);readln(year,month);,Case month of
10、1,3.5,7,8,10,12:len:=31;4,6,9,11:len:=30;2:begin if(year mod 4=0)and(year mod 1000)or(year mod 400=0)then len:=29 else len:=28 end End;Writeln(len);End.,循环结构,一、计数循环,For 控制变量:=初值 to 终值 do,循环体语句;,For 控制变量:=初值 downto 终值 do,循环体语句;,控制变量为有序类型,执行过程:(1)先将初值赋值给控制变量;(2)比较控制变量与终值,如果超过则不执行循环体中的语句,结束循环;(3)否则执行循环
11、体中的语句;(4)将控制变量的后继值赋给控制变量;(5)从(2)开始重复。,循环的执行次数为:|终值-初值|+1,例7:计算1+2+3+100之和。,Program ex_7(input,output);var I,s:integer;begin s:=0;for I:=1 to 100 do s:=s+I;writeln(s);End.,循环体,循环执行次数为:(100-1)+1=100,执行结果为:5050,执行过程:,I,s 初值为0,输出,1,0+1=1,s=s+I,=100,初值为1,终值100,2,=100,1+2=3,3,=100,3+3=6,99,=100,4851+99=49
12、50,100,=100,4950+100=5050,5050,101,条件不成立退出循环,例8、编程找出四位整数abcd中满足下述关系的数:(ab+cd)(ab+cd)=abcd,分析:由题意知:abcd是个四位数,故其范围是:1000-9999,然后对每一个数看它的高两位和低两位数和的平方是否与该数相等。,分离高两位和低两位的方法是:,高位:ab=abcd div 100 低位:cd=abcd mod 100,Program ex_8(input,output);var I,m,n,k:integer;begin for I:=1000 to 9999 do begin m:=I div 1
13、00;n:=I mod 100;k:=(m+n)*(m+n);if k=I then writeln(符合条件的四位整数是:,I)end;end.,本题采用穷举法,又叫枚举法,当型循环,While 布尔表达式 do 语句,执行过程:先求布尔表达式的值,当其值为真时,重复执行指定语句;当其值为假时,终止循环。,注意:为了能使while循环正常终止,一定要有一条能改变布尔表达式值的语句,让表达式的值为假,从而使循环结束。,Program ex_9(input,output);var x:integer;begin x:=1;while x100 do begin write(x:5);x:=x+2
14、;end;end.,例9、输出1-100之间的奇数,执行过程:,1,成立,x=x+2=3,成立,1,3,x=x+2=5,成立,5,x=x+2=7,成立,7,x=x+2=99,成立,99,x=x+2=101,条件不成立退出循环,循环次数为:(100-1)div 2+1,分析:(1)让一个变量I呈自然数列增长,即一开始I=1;(2)让m作为一个因子,I作为另一个因子进行乘法运算,可以得到积s,此时s必定是m的倍数;(3)再判断s是否能被n整除,若能整除转(5),否则执行下一步(4);(4)I变量增长1,再去执行(2);(5)输出s,此时s即为m,n的最小公倍数。,例10、求两个自然数m,n的最小公
15、倍数。,Program ex_9(input,output);var m,n,I,s:integer;begin write(请输入两个自然数);readln(m,n);I:=1;s:=m*I;while s mod n0 do begin I:=I+1;s=m*i;end;write(m,n的最小公倍数为:,s);end.,注意:关系表达式 s mod n 的作用是判断一个数是否能被另一个数整除,在程序中常用到。,直到型循环,Repeat 语句1;语句2;。语句nUntil 布尔表达式,执行过程:先执行指定的语句,然后判断条件,当条件不成立时,继续执行指定的语句,直到条件成立时终止循环。,注
16、意:为了能使repeat/until循环正常终止,循环体中要有一条能改变布尔表达式值的语句,让表达式的值为真,从而使循环结束。,分析:该问题的思路如同“打擂台”,即先有任意一人站在擂台上,然后第二个人上来与它比武,胜者留在台上,如此反复,直到第n个人比完为止。(共打n-1次比赛),最后留在台上的人肯定是最强者。,例11、从n个数中挑选出最大的数。,Program ex_11(input,output);var n,x,m,y:integer;begin readln(n);readln(x);m:=0;repeat readln(y);if x=y then x:=y m:=m+1;until
17、 m=n-1;writeln(n,个数中最大的是:,x);end.,多重循环:循环套循环,For I:=初值1 to 终值1 do begin for j:=初值2 to 终值2 do begin end;end;,外循环,内循环,外循环体,内循环体,注意:1、循环次数为(|终值1-初值1|+1)*(|终值2-初值2|+1),2、外循环变化一次,内循环要从初值变化到终值一次。,例12、求100-999中的水仙花数。(如三位数abc=a3+b3+c3,则称abc为水仙花数。,用三重循环编程序:,Program ex_12(input,output);var a,b,c:integer;begin
18、 for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if a*a*a+b*b*b+c*c*c=a*100+b*10+c then write(a*100+b*10+c:6);readln;end.,运行结果:153 370 371 407,例13 四个学生上地理课时,回答我国四大淡水湖大小时这样说。甲说:“最大洞庭湖,最小洪泽湖,鄱阳湖第三”;乙说:“最大洪泽湖,最小洞庭湖,鄱阳湖第二,太湖第三”;丙说:“最小洪泽湖,洞庭湖第三”;丁说:“最大鄱阳湖,最小太湖,洪泽湖第二,洞庭湖第三”。其中每个学生仅答对一个,请编程确定湖的大小。,分析:本题
19、为逻辑判断题,每个湖的大小不一样,所以分别用1、2、3、4表示它们的各自的大小。用四重循环来进行列举,然后再分别对他们所说的话作判断即可。,program ex_13(input,output);var dong,hong,bo,tai:integer;begin for dong:=1 to 4 do for hong:=1 to 4 do if hongdong then for bo:=1 to 4 do if(hongbo)and(dong bo)then begin tai:=10-dong-hong-bo;if(ord(dong=1)+ord(hong=4)+ord(bo=3)=1
20、)and(ord(hong=1)+ord(dong=4)+ord(bo=2)+ord(tai=3)=1)and(ord(dong=3)+ord(hong=4)=1)and(ord(bo=1)+ord(tai=4)+ord(hong=2)+ord(dong=3)=1 then writeln(dong:,dong,hong:,hong,bo:,bo,tai:,tai);end;end.,运行结果:dong:2 hong:4 bo:1 tai:3,甲说:“最大洞庭湖,最小洪泽湖,鄱阳湖第三”;,程序如下:,例14 用5元钱买100只纽扣,其中金属纽扣每只5角,有机玻璃和每只1角,小揿扣1分钱买3个
21、,编程求出各种纽扣各买了多少只?,分析:用x、y、z分别表示金属纽扣,有机扣,揿扣的只数,依题意可得:,X+y+z=100(1),50X+10y+z/3=500(2),这是一个不定方程组,一般有多组解。由方程(1)可知X,Y,Z的范围,它们分别为:1x100 1y100 1x100,(2)式转化为:150X+30y+z=1500,Program ex_14(input,output);var x,y,z:integer;begin for x:=1 to 100 do for y:=1 to 100 do for z:=1 to 100 do if(x+y+z=100)and(150*x+30
22、*y+z=1500)then write(金属扣:,x,有机扣:,y,揿扣:,z)end.,用三重循环编程,程序如下:,法II 在法I的基础上改进,由方程(2)可知 1x10、1y50 循环次数:10*50*100=50000次,是法I的5%,运行时间缩短了很多。,法III 在法II的基础上可以将方程(1)改为:z=100-x-y,这样可以减少一重循环。使程序的运行时间变得更短。,Program ex_14c(input,output);var x,y,z:integer;begin for x:=1 to 10 do for y:=1 to 50 do begin z:=100-x-y;if
23、(150*x+30*y+z=1500)then write(金属扣:,x,有机扣:,y,揿扣:,z)end;end.,缩短多重循环的运行时间的改进方法是:(1)缩小终值与初值的距离(2)减少循环嵌套的层数,例15 已知faibonacci(费波那契数列)的前几个数分别为 0,1,1,2,3,5,编程求此数列的前n项。,分析:观察找规律:f1=0(n=1)f2=1(n=2)fn=fn-1+fn-2(n=3)即从第三项起,后一项是前两项之和。现用f表示fn,p表示f的前一项(fn-1),l表示它的前两项(fn-2),则有等式f=p+l,p l f第一次 0 1 f=0+1=1(第三项)第二次 1
24、1 f=1+1=2(第四项)第三次 1 2 f=1+2=3(第五项)。,程序如下:,Program ex_15(input,output);var n,p,l,t:integer;t记录第几项 begin read(n);p:=0;l:=1;t:=2;write(0,1);打印前两项 while tn do begin f:=p+l;if(t mod 4=0)then writeln;每行打印四个数 write(f:6);p:=l;l:=f;t:=t+1;end;end.,本题采用递推法,递推即在一个序列中,下一项的值是在前一项值的基础上推算出来的,也就是下一项对前一项有某种依赖关系。,For/while/repeat/语句使用时注意:,(1)已知循环次数,宜用 for 循环;,(2)当循环次数未知则选用while 或repeat语句。,(3)在进行循环程序设计时,一定要搞清楚在循环前应做什么事,(通常在循环前要做一些准备工作,如:累加,计数器清零,变量赋初值等),在循环中需做什么事,解决什么问题,在循环后又要做什么事。若将该做的事忘了,或将它们放错顺序或位置,则不能得到正确的结果。,