永发信息网

信息学复合语句

答案:2  悬赏:60  手机版
解决时间 2021-04-05 02:11
  • 提问者网友:感性作祟
  • 2021-04-04 16:52
信息学复合语句
最佳答案
  • 五星知识达人网友:長槍戰八方
  • 2021-04-04 17:08
循环也叫重复。在程序处理中,经常需要重复地执行某一条或一组语句,以最终完成某项任务。
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于是可得程序如下:
program aa;
var
a,b,r:integer;
begin
read(a,b);
while a<>0 do
begin
if a 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程序时,可按照结构化的思想把大程序按功能划分成小的由基本结构组成的模块,分别进行设计。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯