第一部分 单重循环
一、for 语句(也称“计数循环”)
for 语句用来描述已知重复次数的循环结构。for 语句有两种形式:
(1) for 控制变量:=初值 to 终止值 do 循环体;
(2) for 控制变量:=初值 downto 终止值 do 循环体;
其中:循环体可以是简单语句,也可以是复合语句;
第一种形式的for 语句是递增循环。首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终止值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值改为它的后续值,并重新判断控制变量的值是否小于或等于终止值。当控制变量的值大于终止值时,退出for循环,执行for语句之后的语句。第一种形式的for 语句是递减循环。首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值改为它的前趋值,并重新判断是否大于或等于终止值。当控制变量的值小于终止值时,退出for循环,执行for语句之后的语句。for 语句中的初值、终值、控制变量的数据都必须是顺序类型。当初值和终止值确定后,重复的次数就确定不变了,并且控制变量在重复语句内不能施加任何赋值操作。
例:计算1+2+3+……+99+100
program jia; var n,sum:integer; begin sum:=0; for i:=1 to 100 do sum:=sum+i; writeln(sum); end.
二、while语句(叫也“当型循环”)
while语句用于“当满足某一条件时进行循环”的情况。while语句的语法格式:
while 布尔表达式 do 循环体;
循环结束条件在进入循环体之前测试,若最初的测试值为false,则根本不进入循环体,也就是说while循环是是属于当型循环。为了能使while重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循环就是一个死循环。
例:计算从0到某个数之间所有奇数的和。
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:1) 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语句描述。
四、goto语句
goto语句是无条件转向语句,它可以控制直接从程序的一条语句转向另一条语句。
goto语句的语法形式为: goto 标号;
其中标号必须是不超过4位整数的正整数或标识符组成,但标号必须在说明语句中先予以说明。goto语句会使程序出现一种称为“乱面条”的结构,因此你最好还是不要去用。
练习:
1.编程计算从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.
2、编程计算 S1=1+2+3+……+99+100, S2=1+2+3+……n
program xumin18; var m,n:integer; s:longint; begin write('n='); readln(n); for m:=1 to n do s:=s+m; writeln('s=',s); readln; end.
3、计算(阶乘)n!,其中 n 由键盘输入。(n!=1*2*3*……*n)
program xumin19; var m,n:integer; jc:longint; begin write('n='); readln(n); jc:=1; (注意阶乘变量必须初始化为1,为什么?) for m:=1 to n do jc:=jc*m; writeln(n,'!=',jc); readln; end.
4、按正序和反序输出26个英文字母。
PROGRAM xumin20; VAR m:integer; zf:char; BEGIN FOR m:=65 to 90 do begin zf:=chr(m); write(zf); end; WRITELN; FOR m:=90 downto 65 do begin zf:=chr(m); write(zf); end; readln; END.
5、输出1到1000之间的能够被3整除的数。
program xumin21; var m:integer; begin for m:=1 to 100 do if m mod 3=0 then write(m, ' '); readln; end.
6、统计1到1000之间能够同时被3和7整除的数的个数,并计算他们的和。
program xumin22; var m,gs,he:integer; begin for m:=100 to 300 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); readln; end.
7、编程求100到300之间有多少个其各位数字之和为5的倍数,并逐个输出。(例如,172,1+7+2=10)
program xumin23; var a,b,c,gs,m:integer; begin for m:=100 to 300 do begin a:=m div 100; b:=(m -a*100) div 10; (掌握如何把某整数各数字拆开) c:=m mod 100; if (a+b+c) mod 5 =0 then begin gs:=gs+1; write(m,' '); end; end; writeln('gs=',gs); readln; end.
8、若三位数abc,满足a*a*a+b*b*b+c*c*c=abc,则称abc为水仙花数 例如:153,因为13+53+33=1+125+27=153。求100-999中的水仙花数。
program xumin24; var gs,a,b,c,i:integer; begin for i:=100 to 999 do begin a:=i div 100; b:=(i-a*100) div 10; c:=i mod 10; if a*A*a+b*b*b+c*c*c=i then begin writeln(a,'*',a,'*',a,'+',b,'*',b,'*',b,'+',c,'*',c,'*',c,'=',i); gs:=gs+1; end; end; writeln('gs=',gs); readln; end.
9、求2-1000中的守形数(若某数的平方,其低位与该数本身相同,则称该数为守形数。例如25,25*25=625,625的低位25与原数相同,则称25为守形数
program xumin25; var i,a:integer; begin for i:=2 to 9 do begin a:=(i*i) mod 10; if a=i then writeln(i,'*',i,'=',i*i); end; writeln; for i:=10 to 99 do begin a:=(i*i) mod 100; if a=i then writeln(i,'*',i,'=',i*i); end; writeln; for i:=100 to 999 do begin a:=(i*i) mod 1000; if a=i then writeln(i,'*',i,'=',i*i); end; readln; end.
10、判断某数是否质数(素数)。
分析:质数(素数)是只能被1和它本身整除,也即某数m是质数,则,2到m-1中的任何数都不能整除m。
program xumin26; var x,i,flag:integer; begin readln(x); flag:=1; (标记初始化) for i:=2 to x-1 do if x mod i =0 then flag:=0; (注意:这是一个标记) if (x>1) and (flag=1) then writeln('Yes') else writeln('No'); readln; end.
11、找3-1000中的亲密数对,注意不要重复显示。(如果A的因子和等于B,B的因子和等于A,且A<>B,则称A,B为亲密数对。例如284和220,220的因子有1,2,4,5,11,20,22,44,55,110,他们和为284,284的因子有1,2,4,71 112,他们和为220。
12、输入n,输出1到n中的所有完全数(完全数指所有的因数之和等于它本身的数,如6=1+2+3,6是完全数)
13、已知Faibonacai(费波那契)数列的前几项0、1、1、2、3、5、8 13 21 34……,编程输出求出前20项。
program fibonacai; var f1,f2,f3,t:integer; begin f1:=0; f2:=1; write(f1,' ',f2,' '); for t:=3 to 20 do begin f3:=f1+f2; write(f3,' '); f1:=f2; f2:=f3; end; readln; end.
14、数列A1,A2,A3,A4,……,A20 。已知 A1=0,A2=1,A3=1, A4=A1+2*A2+A3, A5=A2+2*A3+A4 …输出求出前20项。
program shulie; var a1,a2,a3,a4,t:integer; begin a1:=0; a2:=1; a3:=1; write(a1,' ',a2,' ',a3,' '); for t:=3 to 20 do begin a4:=a1+2*a2+a3; write(a4,' '); a1:=a2; a2:=a3; a3:=a4; end; readln; end.
思考题:
1、求两个自然数m,n的最小公倍数和最大公约数,其中m,n通过键盘输入,最小公倍数和最大公公约数通过屏幕输出;
第二部分 多重循环(循环的嵌套)
1、什么是循环的嵌套?
当重复语句的语句部分本身又是一个循环语句时,则称这样的循环为循环的嵌套!
2、应用举例:
1)
题1、若一个三位数abc,满足abc=a3+b3+c3,则称abc为水仙花数。试求出所有的水仙花数。要求采用多重循环语句完成。
题2、若一个四位数abcd,满足abcd=a4+b4+c4+d4,则称abcd为玫瑰花数。试求出所有的玫瑰花数。要求采用多重循环语句完成。
题3、若一个五位数abcde,满足abcde=a5+b5+c5+d5+e5,则称abcde为五角星数。试求出所有的五角星数。要求采用多重循环语句完成。
2)编程输出以下形状的字符组合:
| 题1 |
题2 |
题3 |
***** ***** ***** ***** ***** |
* ** *** **** ***** |
* ** *** **** *****
|
program tuxing; var i,j:integer; begin for i:=1 to 5do begin for j:=1 to 5 do write('*'); writeln; end; readln; end. |
program tuxing; var i,j:integer; begin for i:=1 to 5do begin for j:=1 to i do write('*'); writeln; end; readln; end. |
program tuxing; var i,j:integer; begin for i:=1 to 5do begin write('':6-i) ; for j:=1 to i do write('*'); writeln; end; readln; end. |
| 题4 |
题5 |
* *** ***** ******* ********* |
********* ******* ***** *** * |
program tuxing; 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; readln; end. |
program tuxing; var i,j:integer; begin for i:=5 downto 1 do begin write('':6-i) ; for j:=1 to 2*i-1 do write('*'); writeln; end; readln; end. |
3)输出九九乘法表。
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.
4)求质数表:输入一个自然数n,输出1到之间的所有质数。(当n比较大时,就应该采用快速法)
program xumin27; var x,i,n,flag,y:integer; begin readln(n); for x:=1 to n do begin flag:=1; y:=x div 2;{y:=trunc(x/2);Y:=trunc(sqrt(x))} (为什么可以这样优化?) for i:=2 to y do if x mod i =0 then flag:=0; if (x>1) and (flag=1) then write(x,' '); end; readln; end.
|