资源描述
第三讲 循环结构一for,2009/09/26,循环结构,引例: 输入n(n=100)个正整数0.30000,输出他们的和与平均值(小数点后保留2位小数)。 输入: 第一行:n。 第二行:n个用空格隔开的正整数。 输出: 第一行:n个数的和。 第二行:n个数的平均值。,样例输入: 4 10 4 20 30 样例输出: 64 16.00,var n,i,x:integer; sum:longint; aver:real; begin readln(n); sum:=0; for i:=1 to n do begin read(x); sum:=sum+x; end; aver:=sum/n; writeln(sum); writeln(aver:0:2); end.,循环结构程序通常由三种循环语句来实现。它们分别为 1)、FOR 循环 2)、当循环 while 3)、直到 repeat循环。,一)、for语句 1、for语句的一般格式: for := to do ; for := to do begin 语句1; 语句2; end; 表达式1 与表达式2的值也称为控制变量的初值和终值。,循环体:重复执行,循环体:重复执行,var n,i,x:integer; sum:longint; aver:real; begin readln(n); sum:=0; for i:=1 to n do begin read(x); sum:=sum+x; end; aver:=sum/n; writeln(sum); writeln(aver:0:2); end.,For语句执行过程 先将初值赋给左边的变量i(称为循环控制变量); 判断循环控制变量的值是否已“超过”终值,如超过则跳到步骤; 如果末超过终值,则执行do后面的那个语句(称为循环体); 循环变量自动递增(对to); 返回步骤; 循环结束,执行循环下面的一个语句。,说明:,1、循环控制变量必须是顺序类型。 如:整数(integer,longint)、字符型 不能是实数型。 不能是int64型。 2、循环次数:终值-初值+1。 3、初始值不一定必须是1。,for := downto do 表达式1表达式2。 循环控制变量每次-1。,例1: 输入n,求s=1+2+3+n的值。n=100.,Var n,i,s:integer; Begin readln(n); s:=0; for i:=1 to n do s:=s+i; writeln(s); End.,例2:输入n,求n以内所有能被2整除但不能被3整除的整数的和。n=1000,var n,i:integer; s:longint; begin readln(n); s:=0; for i: = 1 to n do if (i mod 2=0)and(i mod 30) then s:=s+i; writeln(s); end.,例3、键入一个自然数N(=106),求这个自然数的因数的个数S(包含1和n)。 如: 输入: 6 输出: 4 (1,2,3,6),var n,I,s:longint; begin readln(n); s:=0; for i:=1 to n do if n mod i=0 then s:=s+1; writeln(s); end.,例4: 键入一个自然数N(10000),求这个自然数的所有约数之和S (n的约数不包含1和n)。 如: 输入: 6 输出: 5,var n,i:integer; s:longint; begin readln(n); s:=0; for i:=2 to n-1 do if n mod i=0 then s:=s+i; writeln(s); end.,例5、求100-999中的水仙数。 (若三位数abc,a3+b3+c3=abc,则称abc为水仙数。如153,13+53+33=1+125+27=153,则153称为水仙数)。,var n,a,b,c:integer; begin for n:=100 to 999 do begin a:=n div 100; b:=(n div 10) mod 10; c:=n mod 10; if n=a*a*a+b*b*b+c*c*c then writeln(n); end; end.,例6、 IMO2求出所有这样的3位数:它能被11整除,且所得的商是原三位数的各位数字的平方和。,var n,a,b,c:integer; begin for n:=100 to 999 do begin a:=n div 100; b:=(n div 10) mod 10; c:=n mod 10; if (n mod 11=0) and(a*a+b*b+c*c=n div 11) then writeln(n); end; end.,例7、从键盘上输入n个数,输出他们的最大数,最小数,平均数。 输入: 第一行:n(100). 第二行:n个正整数(1,1000),中间一个空格隔开。 输出: 第一行:最大数。 第二行:最小数。 第三行:n个数的平均值(小数点后保留2位小数)。 样例: 输入: 4 10 4 20 30 输出: 30 4 16.00,var n,i,x,min,max:integer; begin readln(n); min:=1001; max:=0; for i:=1 to n do begin read(x); if xmax then max:=x; if xmin then min:=x; end; writeln(min); writeln(max); end.,例8、输入正整数n(1000000),判断它是否为素数。是素数输出”yes”,不是素数输出”no”.,var n,i,f:longint; begin readln(n); f:=0; for i:=2 to n-1 do if n mod i=0 then begin f:=1; break; end; if f=0 then writeln(yes) else writeln(no); end.,例8、输入正整数k(1000),输出k以内的素数.,For循环语句的嵌套,一重循环。 二重以上称为嵌套。,例9、求100-999中的水仙数。 (若三位数abc,a3+b3+c3=abc,则称abc为水仙数。如153,13+53+33=1+125+27=153,则153称为水仙数)。,var a,b,c:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if a*a*a+b*b*b+c*c*c=100*a+10*b+c then writeln(100*a+10*b+c); end.,例10、 IMO2求出所有这样的3位数:它能被11整除,且所得的商是原三位数的各位数字的平房和。,var a,b,c:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if a*a*a+b*b*b+c*c*c=100*a+10*b+c then writeln(100*a+10*b+c); end.,for循环也称为计数循环。 适合用于能事先确定循环次数的结构,注意: 1、for循环控制变量必须是顺序类型的变量,如整数,但不能是实数型real。整型如:integer,longint. 2、for语句的循环体中绝对不能修改循环控制变量,自动增加。 3、break:只退出当前所在的一层循环。 4、主要循环次数。 正常:=108,例11: 根据公式 计算圆周率的值。 小数点后保留6位小数。 输入:10000 输出:3.141497,var n,i:longint; s,p:real; begin readln(n); s:=0; for i:=1 to n do s:=s+1/i/i; p:=sqrt(6*s); writeln(p:0:8); end.,例12、键入一个自然数N(=109),求这个自然数的因数的个数S(包含1和n)。 如: 输入: 6 输出: 4,var n,I,s,m:longint; begin readln(n); m:= trunc(sqrt(n) ; s:=0; for i:=1 to m do if n mod i=0 then s:=s+2; writeln(s); end.,if n=m*m then s:=s-1;,例13 任何一个n3一定可以表示成n个连续的奇数和。 输入n(n100),输出n3对应的表达式。 样例: 输入:3 输出:7+9+11 (说明:33=7+9+11),var n,x,i:integer; begin readln(n); x:=n*(n-1)+1; write(x); for i:=1 to n-1 do begin x:=x+2; write(+,x); end; end.,
展开阅读全文