02Pascal循环结构

更新时间:2024-06-28 01:20:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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.

本文来源:https://www.bwwdw.com/article/drr3.html

Top