信息学复合语句

pascal 中的复合语句教程(主要是关于多个for循环如何让看懂的问题)

好的必有重谢

循环也叫重复。在程序处理中,经常需要重复地执行某一条或一组语句,以最终完成某项任务。
3.4.1 计数循环
我们有时希望重复执行一组语句,重复的次数已知,而不依赖循环中语句的结果,在Pascal语言中这样的结构用FOR语句来描述。
1.其语句格式是:
(1)for 控制变量:=初值 to 终值 do
一条语句;
(2)for 控制变量:=初值 downto 终值 do
一条语句;
其中for、to、downto和do是Pascal保留字。语句都必须只能有一条(一条简单语句或一条复合语句)
2.执行过程
(1)先将初值赋给左边的变量(称为循环控制变量);
(2)判断循环控制变量的值是否已"超过"终值,如已超过,则跳到步骤(6);
(3)如果未超过终值,则执行do后面的那个语句(称为循环体);
(4)循环变量递增(对to)或递减(对downto)1;
(5)返回步骤(2);
(6)循环结束,执行 for 循环下面的一个语句。
3.注意事项
(1)其中初值和终值可以是表达式,控制变量与初值、终值的类型相同,且限于整型、布尔型和字符型等顺序类型,但不能为实型。
(2)对于控制变量为整型时,后续值为原值的基础上加(减)1。对于字符型量,则按ASCII码表的顺序计算。如:’B’的后继值是’C’,前趋值是’A’。
(3)初值与终值在开始重复之前计算,在重复执行过程中,其值不受影响;循环体可以是一条简单语句,也可以是一条复合语句。
(4)控制变量在循环中不能施加任何赋值操作;在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死循环。建议不要在循环体中随意修改控制变量的值。
(5)当初值超过终值时,不执行循环,循环的次数为0;
(6)循环的次数等于ABS(终值-初值)+1
(7)循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。所谓循环控制变量的值"超过"终值,对递增型循环,"超过"指大于,对递减型循环,"超过"指小于。
例1:计算1+2+3+……+100之和。
我们将类似迭加变量这样的功能称之为“累加器”,若迭加变量每次的值是一个常量,则称之为“计数器”与“累加器”是在程序中经常使用的基本操作语句。
程序如下:
program aa;
var
i,s:integer;
begin
s:=0;
for i:=1 to 100 do s:=s+i;
writeln(s);
end.
例2:编程找出四位整数ABCD中满足下述关系的数:
(AB+CD)(AB+CD)=ABCD
程序如下:
program aa;
var
i,m,n,k:longint;
begin
for i:=1000 to 9999 do
begin
m:=i div 100;
n:=i-m*100;
k:=(m+n)*(m+n);
if k=i then
writeln('fu he tiao jian de si wei zheng shu shi:',i);
end;
end.
由上用的方法叫“枚举法”,又称“穷举法”,它是用计算机解题的一种常用的方法。它的基本思路是:一一枚举各种可能情况,并判断每一种可能是符合要求的解。方法虽然很笨,然而与计算机高速处理的能力相结合,也不失为是一种较有用的方法。通过以上例题,我们看到利用循环来处理枚举问题是很方便的。
例3:打印出如下由数字组成的三角形:(字符间无空格)

程序如下:
program aa;
var
i,j,k,L:integer;
begin
L:=5;
for i:=1 to 5 do
begin
write(1:L);
for j:=2 to i do
write(j:1);
for k:=i-1 downto 1 do
write(k:1);
writeln;
L:=L-1;
end;
end.
在一个循环中再包含另一个循环的形式,称之为循环的嵌套。本例中,内层的FOR语句是外层的FOR循环体中的一个语句,而内层的两个循环(J,K)则是并列的,请注意这之间的关系的区别。
练习九
1.判断下面程序的运行结果
(1)program aa;
var
t,s,i:integer;
begin
t:=0;s:=0;
for i:=-5 to 5 do
begin
t:=t+1;
s:=s+t+1;
end;
writeln('t,s=',t,s:10);
end. (2)program aa;
var
a,b:integer;
c,d:boolean;
begin
a:=8;b:=7;
c:=odd(a); d:=odd(b);
writeln('c=',c);
writeln('d=',d);
if a>b then
begin
if c=d then write(c) else write(d);
end;
end.
2.(文件名:k902.pas)打印出如下图形:(字符之间无空格)

分析:可用两重循环来做:
for i:=1 to 5 do
begin
write('*':6-i);
for j:=2 to 2*i-1 do
write('*');
writeln;
end;
3.(文件名:k903.pas)求N!=1*2*3*…*N ,这里N不大于10。
分析:程序要先输入N,然后从1累乘到N。注意累乘器使用前要置1
4.(文件名:k904.pas)输出1-100之间的所有偶数。数字间隔一空格,每行输出10个数。
分析:每行输出10个数可用下面语句实现:(K为记录现在打印了多少个数,I为循环变量)
for i:=1 to 100 do
begin
if not odd(i) then
begin
k:=k+1;
if (k mod 10=0) then writeln(i) else write(i,' ');
end;
end;
运行结果:
2 4 6 8 10 12 14 16 18 20
......
82 84 86 88 90 92 94 96 98 100

当型循环语句(WHILE语句)是这样描述循环的:当指定条件成立时,重复执行指定的语句。
1.语句格式: while 布尔表达式 DO 一条语句
2.执行过程:先求布尔表达式的值,当其值为真(TRUE)时,重复执行指定语句,当其值为假(FALSE)时,终止循环。
3.注意事项:
(1)为了能使WHILE循环正常终止,表达式中所含变量在循环指定的语句中一定要有更改,即有可能使表达式的值为假,使循环结束。否则循环永不结束,将出现死循环。
(2)由于先判断条件,布尔表达式中的变量必须在循环语句之前先赋初值。
(3)循环中指定的语句一般情况下是多条语句,必须使用BEGIN和END将它们括起来形成一条复合语句。
(4)WHILE循环允许条件一开始就不成立,这种情况下WHILE语句什么也没有做。
下面我们通过一些例题,来加深认识。
例1:输入若干个字符,它的终止符是’#’,计算输入的字符中字母’A’出现的次数(包含大小写)。
程序如下:
PROGRAM AA;
VAR CH:CHAR;I:INTEGER;
BEGIN
I:=0;
READ(CH);
WHILE CH<>'#' DO
BEGIN
IF (CH='A')OR(CH='a') THEN I:=I+1;
READ(CH);
END;
WRITELN('A,a=',I);
END.
在执行时,每当输入的字符为’A’或’a’,则将变量i原有的值加上1再赋给I,相当于使i在原有的基础上加1,如前所叙,这里的i变量称为计数器。
当输入一个’#’的时候,循环条件不成立,循环结束,输出结果。
在本程序中,输入数据’#’就是循环结束的标志,这种在程序中人为设置循环结束条件的方法我们将它叫作结束标志法,在设计循环结构程序时经常要用到这种方法。
例2:求输入的一个整数的各位数字之和。
程序如下:
PROGRAM AA;
VAR X,T,S:INTEGER;
BEGIN
READLN(X); S:=0;
WHILE X<>0 DO
BEGIN
T:=X MOD 10;
S:=S+T;
X:=X DIV 10
END;
WRITELN(S);
END.
例3:求两个自然数M,N的最小公倍数。
PROGRAM AA;
VAR M,N,I,S:LONGINT;
BEGIN
WRITE('INPUT TWO NUMBERS:' );
READLN(M,N);
I:=1;
S:=M*I;
WHILE S MOD N<>0 DO
BEGIN
I:=I+1;
S:=M*I
END;
WRITELN('[',M,',',N,']=',S);
END.
程序中关系式表达S MOD N的作用是判断一个数是否能被另一个数整除,这在程序中经常用到。

再结合实例研究一下,相信就明白了!

例1:用5元钱买100只钮扣,其中金属钮扣每只5角,有机玻璃钮扣每只1角,小钮扣1分钱买3个,编程求出各种钮扣各买了多少只?
分析:设用X,Y,Z分别表示金属钮扣,有机扣,小钮扣的只数,依题意可得下列方程组:X+Y+Z=100 (1) 50X+10Y+Z/3=500 (2)
这是一个不定方程组,一般情况下有多组解,但5元钱全部用来买金属钮扣最多可以买10只,全部用来买有机玻璃钮扣最多买50只,所以小钮扣最多买:100-X-Y只,由此可编写程序如下:
program aa;
var
x,y,z:integer;
begin
for x:=1 to 10 do
for y:=1 to 50 do
begin
z:=100-x-y;
if 50*x+10*y+z/3=500 then writeln('jshk:',x,' yjk:',y,' nk:',z);
end
end.
例2:已知:faibonacai(费波那契)数列的前几个数分别为0,1,1,2,3,5...,编程求此数列的第N项.
分析:先考虑好解题的算法:仔细观察该数列,发现其规律是:
F1=0(N=1) F2=1 (N=2)
Fn=Fn-2+Fn-1 (N>=3)
也就是从第三项起,每次均为它的前两项之和.
program aa;
var
f,n,p,L,t:longint;
begin
write('n=');
read(n);
p:=0;
L:=1;
t:=2;
while (t<>n) and (n>2) do
begin
t:=t+1;
f:=p+L;
p:=L;
L:=f;
end;
if n=1 then writeln(p);
if n=2 then writeln(L);
if n>2 then writeln(f);
end.
运行结果:
n=20
4181
在这个例子中,我们采用的是“递推”算法。所谓递推是指在一个数的序列中,下一项的值是在前一项值的基础上推算出来,也就是下一项对前一项有某种依赖关系。
例3:用尼考曼彻斯法求两个自然数A和B的最大公约数。
分析:求两个自然数A和B的最大公约数(GCD),有许多种方法,尼考曼彻斯法是一种求GCD的方法,其特色是做一系列减法,辗转相减,从而最后求得GCD。
比如:A和B是35和21,一系列减法过程是::
(35,21)=(14,21)
(14,21)=(21,14)=(7,14)
(7,14)=(14,7)=(7,7)
7-7=0,于是(35,21)=7
考察整个过程,均是由一系列的减法操作构成,这当中唯一要处理的是:当A<B时,要交换A,B的值,其终止条件是差为零。
于是可得程序如下:
program aa;
var
a,b,r:integer;
begin
read(a,b);
while a<>0 do
begin
if a<b then
begin
r:=a; a:=b; b:=r;
end;
a:=a-b;
end;
writeln(b);
end.
测试数据:
输入:35 21
输出:7
整个程序简洁明了,同时由于避开了除法运算,所以速度较快。
例4:求两个自然数M,N的最大公约数。
分析:我们在上例中介绍了求两个自然数A和B的最大公约数的尼考曼彻斯法。下面再介绍另外一种方法:辗转相除判余法。这是一种来自算术中求最大公约数的方法,用M除以N,若余数R为零,则此时N就是M,N的最大公约数,若余数不为零,则将上次的除数N作为被除数,上次的余数作为除数,再次相除后求余数R,如此不断反复辗除,不断判余数是否为零,直到R=0时为止,故而我们称之为“辗转相除判余法”。当R=0时,除数即为所求的M,N两个数的最大公约数。
程序如下:
program aa;
var
a,b,r:integer;
begin
readln(a,b);
r:=a mod b;
while r<>0 do
begin
a:=b;
b:=r;
r:=a mod b;
end;
writeln(b);
end.
编写程序首先要确定算法,但是算法都是需要经过一番思考以后才能正确写出来,这个思考的过程就是“由具体到抽象”的过程。在本例中,用A统一代表多次除法中的被除数,以B统一代表除数,用R统一代表余数,就是一种抽象的方法,是经过对各个数据归纳整理以后得到的一种抽象,在程序设计中,我们将要大量的使用这种方法。经过以上几道示例的演示,想必大家能逐渐学会和掌握这种方法。
通过以上的讨论可以发现,Pascal中,顺序结构是一种最简单的基本结构。如果不去局部的考虑程序中的选择结构和循环结构,把它们看作一个复合语句,那么程序本身就可以看作是一个顺序的结构,反过来更细地去看选择结构或循环结构的成分,那么它们的主要运行部分(循环体,被选择到的语句等)实际上又是顺序结构或一个复合语句。在编写程序时,若循环次数已知,通常采用FOR语句;若循环次数未知,则应选用WHILE语句。在进行循环程序设计时,一定要搞清楚在循环前应做什么事(通常在循环前要做一些准备工作,如:累加,计数器清零,变量赋初值等),在循环中需做什么事,解决什么问题,在循环后又要做什么事。如果将该做的事情忘了,或把它们放错了顺序或位置,则不能得到正确的结果。在设计一个较大规模Pascal程序时,可按照结构化的思想把大程序按功能划分成小的由基本结构组成的模块,分别进行设计。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-26
循环次数已知时,可以用for语句实现循环结构。
for语句有两种格式:递增型和递减型。
(1)递增型for语句格式
for<循环变量>:=<初值>to<终值>do<语句>;
(2)递减型for语句格式 ,
for<循环变量>:=<初值>downto<终值>do<语句>;
其中,“循环变量"为一个有序类型的数据,
在第一种形式中,使用的是保留字to,循环变量则从“初值"开始逐一增加到“终值";
在第二种形式中,使用的是保留字downto,“循环变量"则从“初值"开始逐一递减到“终值",每次执行一次循环体语句。
下面继续改写上述求1~1 O之和的程序代码如下:
var i,s:integer;
begin
s:=0;
for i:=1 to 10 do
s:=s+i;
end;

另可参考:
信息学奥赛Pascal教程:第六课 For循环语句
http://hi.baidu.com/zheng_mo/blog/item/ec5246deda6faa1548540384.html

http://datong.furongedu.com/AreaInfo/Templates/Default/ViewInfo.aspx?ClassID=75&InfoID=6669

http://mcs.baoan.net.cn/Forum/5930

信息学奥林匹克竞赛
来得及,不过要看你是什么省的了,有些省很强,要进省队参加noi根本很难。如果你有点数学基础会好一点。英语对于noip不是很重要。当然好的话你可以上英语网站题库。教材,我看这个比较好《奥赛经典》,语言篇,基础篇,提高篇,一本本看过来。然后看一本好像是《信息学奥林匹克竞赛指南》,红色的书,...

缅怀Pascal
if else 以上只适合单行,多行需要复合语句。在pascal中符合语句就相当于C里的大括号。case 程序会计算case后表达式的值,然后看看对应第几个表达式的值,然后执行第几句语句(如果有多句记得用begin-end复合语句)。如果都没有匹配则执行else后的内容。循环结构 for while repeat-until 函数Pascal有函数...

什么是NP问题
给定一个大数Y,我们可以问Y是否是复合数。例如,我们可能问53308290611是否有非平凡的因子。回答是肯定的,虽然手工找出一个因子很麻烦。从另一个方面讲,如果有人声称答案是"对,因为224737可以整除53308290611",则我们可以很快用一个除法来验证。验证一个数是除数比首先找出除数来简单得多。用于验证一个正面答案所需的...

pascal基础知识
1.用计算机解决问题的步骤:① 分析问题 ② 算法设计 ③ 描述算法 ④ 编程实现 从上面的求解问题过程可以看出,关键在于前三步的解决:第一步就是解决模型的数据结构,第二步是解决问题的算法,第三步是形式化地描写算法。2.算法的定义:算法是一组有穷的规则,它们规定了解决某一特定类型问题的一...

NP防护是什么
P\/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它被“克雷数学研究所”(Clay Mathematics Institute, 简称CMI)在千禧年大奖难题中收录。P\/NP问题中包含了复杂度类P与NP的关系。1971年史提芬·古克(Stephen A. Cook) 和 Leonid Levin 相对独立的提出了下面的问题,即是否两个复杂度类P和NP是...

高中信息学奥赛主要搞些什么
1、信息学奥林匹克竞赛的考核方式是采用封闭式(连续3~4小时)上机编程解题的形式,不限编程语言,竞赛题量通常较大。2、程序完成后要通过严格的数据测试,这就对同学们编程能力有更高的要求:不但要能编程,编好的程序能运行,而且所设计的程序还要能通过在各种边界条件下和各种环境下设置的测试数据。

零基础初学者学习编程语言应该学习哪一种?
常见的编程语言是很多的,比如:C语言、c++、C#、Java、asp、PHP、JavaScript,还有一些标记语言html、css等。对于初学者,想做简单的编程的话,建议从C语言开始入门。C语言是最主流的基础语言。现在软件开发上所用的的主流的高级编程语言大多数都是以C语言为基础演化而来的,掌握好C语言有助于学习其他的...

何谓“NP完全问题”?
P\/NP问题P\/NP问题是在理论信息学中计算复杂度理论领域里至今没有解决的问题,它被“克雷数学研究所”(Clay Mathematics Institute, 简称CMI)在千禧年大奖难题中收录。P\/NP问题中包含了复杂度类P与NP的关系。1971年史提芬·古克(Stephen A. Cook) 和 Leonid Levin 相对独立的提出了下面的问题,即是否...

相似回答