02Pascal循环结构
更新时间:2024-06-28 01:20:01 阅读量: 综合文库 文档下载
- 02帕萨特推荐度:
- 相关推荐
Turbo Pascal(二) ◆循环结构程序设计
循环结构撕程序中的另一种基本结构,它在许多问题中是很有用的。生活中许多复杂的问题中,常常要做大量同类的处理。如:期末考试后要统计学生的总成绩,要用同样的方法计算每一位同学的总分。
在pascal显示循环程序设计的主要语句有for语句、while语句和repeat语句。 我们先来看下面的问题:
例:统计下面成绩表中每一位同学的总分。 学号 1001 1002 1003 1004 语文 80 85 92 87 数学 95 93 89 91 英语 97 96 98 95 总分 使用顺序结构程序如下: program cj (input,output); var
a,b,c,z:integer; begin
readln(a,b,c); z:=a+b+c;
writeln('1001',z); readln(a,b,c); z:=a+b+c;
writeln('1002',z); readln(a,b,c); z:=a+b+c;
writeln('1003',z); readln(a,b,c);
z:=a+b+c;
writeln('1004',z); end.
以上程序我们只对4位同学的成绩作了统计,有4次数据输入,4次计算总分,4次计算结果,而这4次都是重复操作。我们却使用了这么长的程序。如果有几百个同学的成绩,那就很麻烦了。怎么样才能是编程方便计算机运行也方便呢?我们就可以用循环结构程序设计,简化程序,循环结构的特点是应用循环语句来编写程序,在程序执行过程中实现一部分程序的重复运行。
◇计数循环(for)语句 ☆递增型for循环
递增型for循环语句格式:
for 控制变量:=初值 to 终值 do 循环体语句; ☆递减型for循环
递减型for循环语句格式:
for 控制变量:=初值 downto 终值 do 循环体语句;
递增for语句的功能是先把初值赋值给循环控制变量,然后将初值与循环终值进行比较,当初值小于终值是执行循环语句。然后把控制变量在原值的基础上加1,继续与终值比较,如果仍然小于终值,则再次执行循环体,否则结束循环,执行for循环语句的下一个语句。 例:for i:=5 to 10 do write(i); 输出的结果是5 6 7 8 9 10 循环语句次数的算法: 终值-初值?1
将上面计算总分的程序改进一下:
program cj (input,output);
var
i,a,b,c,z,k:integer;
begin
for i:=1 to 4 do
begin
readln(k,a,b,c); z:=a+b+c;
writeln(k,z:4);
end;
end.
例1. 读入5个数,计算它们的积和平均值。 Program p1; Var
X,acc,sum,i:integer; ave:real; begin
acc:=1;
sum:=0; for i:=1 to 5 do begin read(x); acc:=acc*x; sum:=sum+x; end;
ave:=sum/5;
writeln(acc,ave:12:2); end.
例2.找出100以内所有被2,3,5除余数均为一的数。
例3.寻找100~999之间的水仙花数,所谓水仙花数就是本
333
身是它各位数三次方的和,如153=1+5+3。
例4:编程计算从1到20每个数的平方值。 program xumin17; var m:integer; pf:longint; begin
for m:=1 to 20 do begin
pf:=m*m;
writeln(m,'*',m,'=',pf); end; readln; end.
例5,按正序和反序输出26个小写英文字母。 a b c ?? x y z z y x ?? c b a var
ch:char; begin
for ch:= ‘z’ downto ‘a’ do write(ch:2); end.
例6.计算n的阶乘n!,其中n!=1×2×3×4×??×n。 var
m:longint; n,i:integer; begin
readln(n); m:=1;
for i:=1 to n do
m:=m*i;
writeln(‘m=’,m);
end.
例7.计算:s=1+2+3+4+5+??+99+100。 Var
s,i:integer; begin s:=0;
for i:=1 to 100 do
s:=s+i; writeln(s); end.
For语句练习:
例8、输出1到300之间的能够被3整除的数。 program xumin21; var
m:integer; begin
for m:=1 to 300 do
if m mod 3=0 then write(m,' '); readln; end.
例9、统计1到1000之间能够同时被3和7整除的数的个数,并计算他们的和。 program xumin22;
var m,gs,he:integer; begin
gs:=0; he:=0;
for m:=1 to 1000 do
if (m mod 3=0) and (m mod 7=0) then begin
he:=he+m; gs:=gs+1; end;
writeln('gs=',gs,' ','he=',he); writeln;end.
例10、编程求100到500之间有多少个其各位数字之和为5的倍数,并逐个输出。(例如,172,1+7+2=10) program xumin23;
var a,b,c,gs,m:integer; begin gs:=0;
for m:=100 to 500 do div mod begin
a:=m div 100;
b:=m mod 100 div 10;(掌握如何把某整数各数字拆开) c:=m mod 10; if (a+b+c) mod 5 =0 then begin
gs:=gs+1; write(m,' '); end;
end; writeln('gs=',gs); writeln; end.
例11.计算s=1+3+5+??+99。 Var
s:=0; i,m,s:integer; For i:=1 to 50 do s:=s+2*i-1; begin
writeln(s); s:=0; for i:=1 to 99 do
if i mod 2<>0 then s:=s+i; writeln(s); end.
例12.输入30个数,统计其中正数、负数、零的个数。 var i,n,zs,fs,ling:integer; Begin
zs:=0; fs:=0; ling:=0; For i:=1 to 30 do Begin
Read(n);
If n>0 then zs:=zs+1
Else if n=0 then ling:=ling+1 Else fs:=fs+1; End;
Writeln(zs:4,ling:4,fs:4); End.
当型循环(while)语句
使用for语句编写程序时,必须要事先知道循环次数,如果遇到不能确定循环次数的问题就无法使用了,当型循环语句提供了解决此类问题的方法。
while语句用于“当满足某一条件时进行循环”的情况。
while语句的语法格式:
while 布尔表达式 do
语句;
循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循环就是一个死循环。 例1:求s=2+6+10+??+98的值。
分析:用x代表累加的数据,x赋初值为2,每次循环后增加4。设s为累加器,取x≤98作为布尔表达式。
Program e11; Var
s,x:integer; begin
x:=2;s:=0;
while x<=98 do {当x满足条件时执行do后面的复合语句}
begin
s:=s+x; x:=x+4; end;
writeln('s=',s); end.
例2.计算从0到某个数之间所有奇数的和。1+3+5??+66 program jishu;
var odds,limit,sum:integer; begin
readln(limit); sum:=0; odds:=1;
while odds<=limit do begin
sum:=sum+odds; odds:=odds+2;
end;
writeln(sum); end.
例3.计算S=1+1/2+1/3+1/4+1/5+……+1/n (n=1000) program xu41; var n:integer; s:real; begin n:=1; s:=0;
while n<=1000 do begin
s:=s+1/n; n:=n+1; end;
writeln('s=',s :5:2); readln; end.
例3.百鸡问题:“百钱买百鸡”,内容是3文钱可以买一只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡,用100文钱买了一百只鸡,问有多少只公鸡、多少只母鸡,多少只小鸡? program bjwt;
var x,y,z:integer; begin
for x:=1 to 33 do for y:=1 to 50 do for z:=1 to 99 do
if 3*x+2*y+z/3=100 then writeln('gj=',x, 'mj=',y, 'xj=',z); end.
例4:计算1+2+4+8+??+128+256; program p14; var s,n:integer; begin
s:=0; n:=1;
while n<=256 do begin
s:=s+n; n:=n*2 ; end;
writeln('s=',s); end.
例5:计算两个自然数m和n的最小公倍数。 Var
m,n,s,i:integer; begin
read(m ,n ); 3 4 i:=1; s:=m*i;
while s mod n <> 0 do begin
i:=i+1; s:=m*i; end; writeln(s); end.
while语句练习
习1。求下面算式的值 S = 1+4+7+??+298 Program ex1;
Var s,n:integer; Begin
Repeat S:=0; n:=1;
While n<=298 do s:=s+n; Begin s:=s+n;
n:=n+3; n:=n+3;
until n>298; end;
writeln('s=',s); end.
习2.判断某数是否质数(质数即只能被1和本身整除的自然数)。
program ex2; var
x,i:integer; pd:boolean; begin
readln(x); pd:=true; (标记初始化)
for i:=2 to x-1 do
if x mod i =0 then pd:=false;(注意:这是一个标记) if (x>1) and (pd=true) then writeln('Yes')
else writeln('No');
end.
习3。用while语句更改水仙花数的程序(所谓水仙花数,是指一个三位数abc,如果满足a3+b3+c3=abc,则abc是水仙花数。) program ex3;
var a,b,c,s:integer; begin
s:=100;
while s<=999 do begin
a:=s div 100;
b:=s div 10 mod 10; c:=s mod 10;
if a*a*a+b*b*b+c*c*c=s then write(s:5); s:=s+1; end; writeln; end.
习4。找出1~999中能被3整除,并且至少有一位数字是5的所有整数(使用while语句)。 Program shxe5; Var n:integer; Begin n:=1;
While (n>=1) and (n<=999) do Begin
If (n mod 3=0) and ((n div 100 =5) or (n div 10 mod 10 =5) or (n mod 10 =5)) do Write(n); n:=n+1; end; end.
◆直到型循环(repeat)语句
repeat 语句用于“重复执行循环体,一直到指定的条件为真时为止”。
语法格式为:
repeat 语句1; ?? 语句n;
until 布尔表达式;
repeat重复基本上有和while重复一样的描述循环计算的能力,但有一些不同:在repeat语句的结构中,布尔表达式求值在计算操作之后,而while语句中,布尔表达式求值在计算操作之前,也就是说repeat至少执行一次循环体。while语句的成分语句只能是一个语句。因此,当重复动作包含多个语句时,要用begin和end ,使它变成一个复合语句。而repeat语句的保留字repeat和until已经起语句括号作用,可以包含多个语句而无须begin和end。repeat语句中,当布尔表达式为true时结束循环,而while语句中,是当表达式为false时才结束循环。当描述由计算操作后的情况确定重复是否继续进行的计算时,通常用repeat语句描述。 While语句和repeat语句流程图比较:
例1.输入一个正整数N,把它分解成质因子相乘的形式。 如:36=1 X 2 X 2 X 3 X 3; 19=1 X 19
(提示:设因子为I,从2开始到N,让N重复被I除,如果能整除,则用商取代N,I为一个因子;如果不能整除,再将I增大,继续以上操作,直到I等于N。) program reex1;
var n,i:integer; begin
readln(n); write(n, '='); repeat
for i:=2 to n do
if n mod i=0 then begin write(I, '*'); n:=n div i; end;
i:=10; i:=i+1;
k:=0; until i=n;
while (i>=10) and (i<=30) do end. begin k:=k+i;
i:=i+8; end; writeln('k=',k); Read(n); k:=n; repeat
k:=k-1;
until n mod k = 0; write(k); 输入:12
while、repeat语句练习 例1-1:求s=1+1/2+1/3+??+1/n;恰好大于10时n的值;
program ex1_1; var
s:real; n:integer; begin
s:=0; n:=1; while s<=10 do begin
s:=s+1/n;
n:=n+1; {项数加1} end;
writeln(n); end.
例1-2:根据输入的自然数n,求1×2×3×??×n的值;
program ex1_2;
var n,i:integer; s:longint; begin
read(n); s:=1; i:=1; repeat
s:=s*i; {累乘} i:=i+1;
until i>n; {跳出循环需满足的条件} writeln(s); end.
例1_3:求数列a1,a2,a3,a4,??a20的和。
其中:a1=0 a2=1 a3=a1+a2;
a4=a2+a3; ?? program ex1_3;
var s,a1,a2,i:integer; begin
s:=0; i:=2; a1:=0; a2:=1; repeat
s:=s+a1+a2; a1:=a1+a2; a2:=a2+a1;
i:=i+2; {计算下一个项数i} until i>20; writeln(s); end.
例1_4:求数列的和:s=1+3+9+27+??+729;
program ex1_4;
var s,n:integer; begin
s:=0; n:=1; repeat
s:=s+n; {累加}
n:=n*3; {计算下一项} until n>729; writeln('s=',s); end.
2222
例1_5:求下式中n的最大值:2+4+6+??+n<1500;
program ex1_5;
var s,n:integer; begin
s:=0; n:=2; repeat
s:=s+n*n; {累加,注意累加的项数} n:=n+2; {计算下一项} until s>=1500; writeln('n=',n:4); end.
例2_1:读程序,写结果。
program ex2_1(input,output); var t,n,s:integer; begin
t:=1;n:=3;s:=0; while s<10 do begin t:=t*n; s:=s+t; end;
write('s=',s:6)
end. 例2_2:(repeat循环)
program ex2_2(input,output); var p,m:integer; begin
p:=20; m:=2; repeat
p:=p-m; m:=m+3; until m>p;
write('m,p=',m,' ',p); end.
结果:结果:s= 12 m,p=11 5
◆转向(goto)语句
goto语句是一种无条件转向语句,它可以控制直接从程序的一条语句转向另一条语句。goto语句的语法形式为: goto 标号;
其中标号必须是不超过4位整数的正整数或标识符组成,但标号必须在说明语句中先予以说明。
goto语句会使程序出现一种称为“乱面条”的结构,因此你最好还是不要去用。
计算下列函数
y??x?3x?2??x?1x?2
Program e3_1;
Label one,two; {标号说明} Var x,y:integer; Begin
Readln(x) If x<=2
Then goto two Else y:=x-1; Write(y); Goto one; Two:y:=x+3; One: End.
Program ex3_1;
Var i,j:integer; Begin
For i:=1 to 5 do begin
For j:=1 to 5 do Write('*'); Writeln; End; End. ◆多重循环
在实际应用中单重循环还不能解决问题,需要在循环语句中再引入循环语句,称为循环嵌套。根据嵌套的层数,有二重循环、三重循环等。
例1.编写能够打印如下图形的程序。
********** 5 i j 2*i ******** 4 ****** 3 **** 2 ** 1 program dcxh1;
var i,j:integer; begin
for i:=5 downto 1 do begin
write(' ':6-i); for j:=1 to 2*i do write('*'); writeln; end; end.
例2编程输出以下形状的字符组合:
*
*********
**
******* ***
***** **** *****
***
program dcxh2; * var i,j:integer;
program dcxh3;
begin var i,j:integer;
for i:=1 to 5 do
begin begin
for i:=5 downto 1 do
write(‘ ‘:6-i);
begin for j:=1 to i do
write(‘ ‘:6-i);
write('*');
for j:=1 to 2*i-1 do writeln;
write('*');
end; end. writeln;
end;
end. * program dcxh4; *** var i,j:integer;
***** begin ******* for i:=1 to 5do ********* begin
write(' ':6-i) ;
for j:=1 to 2*i-1 do write('*'); writeln; end; end.
Begin For i:=1 to 5 do Begin For j:=1 to 5 do Write(‘*’); Writeln; End; End. 例3.学校组织学生去某餐厅调查,发现一些国家保护动物上了餐桌,大家受到了深刻的环保教育和爱护动物教育,在该餐厅的工作室中发现了82条动物腿,27个羚羊和山鸡的头,算一下共有多少只羚羊和山鸡被屠杀?
假设有m只羚羊,n只山鸡,每只羚羊4条腿,每只山鸡2条腿,则有
4m+2n=82 m+n=27 可以得出m<21,n<27。 Program dcxh5;
Var m,n:integer; Begin
For m:=1 to 20 do For n:=1 to 27 do
If (m+n=27) and (4*m+2*n=82) then Writeln('lingyang',m,'shanji',n); End.
例4.输出九九乘法表。 program jjb; var
m,n:integer;
begin
for m:=1 to 9 do begin
for n:=1 to m do
write(m,'x',n,'=',m*n:2,' ');(注意:这里为什么用write) writeln; (注意:这里为什么用writeln) end; readln; end.
5、1!+2!+?+10!的值。
分析:这个问题是求1到10自然数的阶乘之和。 Program dcxh5;
var s,t: longint; i,j:integer; begin s:=0;
for i:=1 to 10 do begin t:=1;
for j:=1 to i do s:=s+t; { end;
writeln('s=',s); end.
t:=t*j; { 求N!的值t } 累加N!的值t }
例6、输出下面的数字图形: *****
***
1 *
222 ***
*****
33333
4444444 555555555 For i:=-2 to 2 do Begin Write(‘ ‘:3-abs(i)); program dcxh6;
For j:=1 to 1+abs(i) do var m,n:integer; Write(‘*’); Writeln; begin
End; for n:=1 to 5 do
begin
write(' ':11-n);
for m:=1 to 2*n-1 do write(n); writeln; end; end.
例7上街采购,用500元钱买了90只鸡, 其中母鸡一只15元,公鸡一只10元,小鸡一只5元,正好把钱买完。问母鸡、公鸡、小鸡各买多少只? Program mj;
var i,j,k:integer; begin
for i:=1 to 33 do for j:=1 to 50 do begin
k:=90-i-j;
if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5); end;
end.
例8,将100元面值的人民币,换成小额面值的人民币分别为:10元、5元、2元、1元,共40张。编程计算兑换的方法。
Program rmb;
Var a,b,c ,d:integer; begin
for a:=1 to 10 do for b:=1 to 20 do for c:=1 to 50 do begin
d:=40-a-b-c;
if 10*a+5*b+2*c+d=100 then writeln(a:2,b:2,c:2,d:2);
end; end.
多重循环练习:
习x_1、若一个四位数abcd,满足abcd=a4+b4+c4+d4,则称abcd为玫瑰花数。试求出所有的玫瑰花数。要求采用多重循环语句完成。 Program x_1;
Var s,a,b,c,d:integer; Begin
for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do for d:=0 to 9 do begin
s:=1000*a+100*b+10*c+d;
if sqr(sqr(a))+ sqr(sqr(b))+ sqr(sqr(c))+ sqr(sqr(d))=s then
write(s:6); end; writeln; end.
思考:若一个五位数abcde,满足abcde=a5+b5+c5+d5+e 5,则称abcde为五角星数。试求出所有的五角星数。要求采用多重循环语句完成。 Program x_1_2;
Var s,a,b,c,d,e:longint; Begin
for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do for d:=0 to 9 do for e:=0 to 9 do begin
s:=10000*a+1000*b+100*c+10*d+e;
if sqr(sqr(a))*a+ sqr(sqr(b))*b+ sqr(sqr(c))*c+ sqr(sqr(d))*d+ sqr(sqr(e))*e =s then
write(s:6); end; Writeln; End.
习x_2. 用5元钱买100只纽扣,其中金属纽扣每只5角,有机玻璃纽扣每只1角,小纽扣1角买3个,编程求出各种纽扣各买了多少只?(要求每种纽扣至少买一颗)。 Program x_2;
Var x,y,z:integer; Begin
For x:=1 to 10 do For y:=1 to 50 do Begin
z:=100-x-y;
if 5*x+y+z/3=50 then write(x:3,y:3,z:3); end; writeln; end.
习x_3、输出图形: a a b a b c
a b c d ??
program x_3;
var m,n,ch:char; begin
readln(ch); d
for m:=’a’ to ch do begin
write(’ ’:30-(ord(m)-96)); for n:=’a’ to m do write(n:2); writeln; end; end.
**********1
习x_4、打印金字塔数。
*********121
1 ********12321
1 2 1 … … … 1 2 3 2 1 **123456787654321
*12345678987654321 1 2 3 4 3 2 1
??
1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 program x_4;
var m,n,k:integer; begin
for m:=1 to 9 do begin
write(’ ’:10-m);
for n:=1 to m do write( n );
for k:=m-1 downto 1 do write( k ); writeln; end; end.
习x_5、计算下列算式的值:12+22+32+42+??+1002 (使用while语句) program x_5;
var k:integer;
s:longint; begin
s:=0; k:=12; while k<=1002 do begin
s:=s+k; k:=k+10; end;
writeln(’s=’,s); end.
习x_6、输入30个数,统计其中的正数、负数、零的个数。Program x_6;
Var i,x,a,b,c:integer; Begin
a:=0; b:=0; c:=0;
For i:=1 to 30 do Begin
Read(x);
if x>0 then a:=a+1
else if x=0 then c:=c+1 else b:=b+1; end;
writeln(’zs=’,a, ’fs=’,b, ’ling=’,c); end.
习x_7、写出下面算式的程序:s=1×3×5×7×??×49。(使用while语句) program s; var
n:integer; s:longint; begin
s:=1; n:=1; while n<=99 do begin
s:=s*n; n:=n+2; end;
writeln(s); end.
习x_8、打印下面的图形 ###
######### 5 ####### 4 ##### 3 ###
#
program x_7;
var m,n:integer; begin
writeln(‘###’:11);
for m:=5 downto 1 do begin
wirte(‘ ‘:10-m);
for n:=1 to 2*m-1 write(‘#‘); end; writeln; end.
do 习x_9、编程找出满足下述关系的四位整数abcd:
(ab+cd)(ab+cd)=abcd。例如:2025,(20+25)*(20+25)=2025
program x_9; var
s,ab,cd:integer; begin
for s:=1000 to 9999 do begin
ab:=s div 100; cd:=s mod 100;
if sqr(ab+cd)=s then write(s:6); end; writeln; end.
正在阅读:
02Pascal循环结构06-28
我喜欢的一处景点作文600字07-12
国务院正式公布2022年放假安排07-31
沧海月明总有时04-19
“三深化”、“三推进”、“三项行动”等07-10
【河南中考面对面】2015年中考语文总复习 专题四 古诗文默写备考04-22
浅谈二氧化氯消毒工艺在引黄水厂中的应用07-22
信号与系统实验讲义内容04-12
如何快速建立与客户之间的信任关系07-24
浅谈中学数学教学中的合作学习12-05
- 企业所得税法考试秘笈
- 三级综合医院等级评审标准几点体会(山大二院)
- 全国哲哈忍耶上坟拱北简介
- 大家的日语课后阅读翻译
- 备课13 数据的收集与整理
- 埃塞俄比亚新五年规划
- 2018年安徽省安徽省合肥巢湖市事业单位招聘考试《综合知识》真题
- 高中--《美术鉴赏》课程纲要
- 唯一的听众教学设计
- 二、三年级写话训练
- 最新-2018届广东省佛山市普通高中高三教学质量检测(二)理科综合
- 电网监控与调度自动化作业题及答案
- 岗位廉政风险点查找和防控措施表
- 最经典的100条汽车广告
- 玻璃钢水箱课程设计(二)
- 电网监控与调度自动化 第五章
- 普通高中学生学籍管理办法
- 新人教版五年级下册数学第一单元教案观察物体
- 河北某住宅小区电气施工方案 - secret
- 战术基础动作教案
- 02Pascal
- 循环
- 结构
- 各类材质性能 - 图文
- 关于读书的名人名言
- 浅议外国文学的特点
- 邻二氮菲分光光度法测定微量铁
- 2014年华师计算机基础作业
- 中华医学科技奖形式审查结果公布年份2018推荐奖种医学科学技术 -
- 教师小学简答题
- 2018高三数学全国二模汇编(理科)专题10推理与证明、算法、复数
- 译林英语5Bunit5--6专项训练
- 自控题目
- 光纤光栅研究
- 采矿CAD绘图实用教程四章到五章(共十五章)
- 新人教版八年级英语下册unit 1必背重点词组及句子
- 业务善后函
- clannad经典语录
- 2018年二级建造师考试《市政工程》大纲
- 2013煤矿应急救援预案(未完)
- 未来5年京沪粤文化产业发展前景预测分析
- 2014年天津各地区考试内容等(1) - 图文
- 通信原理习题