VòngLặp I. Vònglặp có số bớc lặp các định Trớc hết chúng ta xét ví dụ sau : Giả sử ta phải viết ra màn hình các số từ 0 đến 24, mỗi số chiếm 1 dòng Việc này có thể thực hiện bằng 25 lệnh Writeln Writeln(0) Writeln(1) Writeln(24) Cách viết này rõ ràng là dài dòng và tẻ nhạt trong khi nó có quy luật Chúng ta có thể thay thế bằng lệnh Writeln(I) trong đó I là một biến nguyên bất kì nhận giá trị từ 0 24 FOR I:=0 TO 24 DO Writeln(I) Vònglặp này cho I chạy từ 0 đến 24 với mỗi giá trị của I, máy sẽ thực hiện công việc viết sau chữ DO (làm), ở đây là Writeln(I) Mẫu viết tổng quát : FOR Biến_điều_khiển:=Giá_trị_đầu TO Giá_trị_cuối DO <việc> Và ngợc lại ta có mẫu : FOR Biến_điều_khiển:=Giá_trị_đầu DOWNTO Giá_trị_cuối DO <việc> II. Vònglặp có số bớc lặp không xác định Có 2 kiểu vònglặp không xác định REPEAT WHILE <biểu thức Boolean>DO <công việc>; BEGIN UNTIL <Biểu thức Boolean>; <công việc>; END; Trong lệnh REPEAT . UNTIL . máy tính sẽ lặp đi lặp lại chu kì sau : thực hiện <công việc> cho đến khi <biểu thức Boolean> có giá trị TRUE. Giữa REPEAT và UNTIL không cần dùng BEGIN và END Còn trongvònglặp WHILE . DO máy tính sẽ lặp đi lặp lại chu kì sau : chừng nào <biểu thức Boolean> có giá trị TRUE thì đi thực hiện <công việc> đợc đặt giữa BEGIN và END Cả hai vònglặp đều có số lần lặp không xác định trớc. Cần phải lu ý là trong khi thực hiện <công việc> lặp, ta phải có một lệnh làm thay đổi một biến trong biểu thức Boolean để thay đổi giá trị biểu thức nhằm dừng vònglặp lại vì nếu không vònglặp sẽ chạy mãi không dừng VD : Tính A = 1 + 1/2 + 1/3 + . + 1/N Dùng REPEAT và cho I chạy thuận A:=0;I:=1; REPEAT A := A + 1/I; I := I + 1; UNTIL I>N; Writeln('Tổng = ',A:10:8); Dùng WHILE và cho I chạy ngợc A:=0;I:=N; WHILE I>0 DO BEGIN A := A + 1/I; I := I - 1; END; 1 Bài 1:{ Nhập số nguyên dơng N. Sau đó nhập N số nguyên dơng. Tìm số lớn nhất, nhỏ nhất và tính trung bình của các phần tử} var i,a,n:integer;{Khai báo i,a,n kiểu integer} max,min,tong:integer;{Khai báo max,min,tong kiểu integer} begin write('N = ');readln(n);{Nhập N} min:=maxint;{Gán min bằng maxint} max:=0;tong:=0;{Gán max và tổng bằng 0} for i:=1 to n do{Cho i chạy từ 1 đến n} begin write('So thu ',i,' : ');readln(a);{Đọc số thứ i vào biến a} if min>a then min:=a;{Nếu min>a thì gán min bằng a} if max<a then max:=a;{Nếu max<a thì gán max bằng a} inc(tong,a);{Tăng tổng lên a đơn vị} end; writeln('Max = ',max);{Xuất max} writeln('Min = ',min);{Xuất min} writeln('Trung binh : ',tong/n:0:2);{Xuất trung bình} readln; end. Bài 2: { Năm nay con a tuổi, cha b tuổi. Dùng WHILE tính xem sau mấy năm nữa hoặc trớc đây mấy năm tuổi cha gấp đôi tuổi con Hớng dẫn Nếu a*2=b thì ở hiện tại Nếu a*2<b thì ở tơng lai Nếu a*2>b thì ở trong quá khứ} var a,b,so:integer;{a,b,so kiểu integer} begin write('Nhap tuoi con, tuoi cha : ');readln(a,b);{Nhập tuổi con, tuổi cha} if a=b*2 then write('Hien tai tuoi cha gap doi con'){Nếu a=b thì ở hiện tại} else if a*2<b then{Ngợc lại nếu a*2<b thì} begin so:=0;{Gán so bằng 0} while (a+so)*2<b+so do inc(so);{Trong khi (a+so)*2<b+so thì tăng số lên} writeln('Sau ',so,' nam nua tuoi cha gap doi tuoi con');{Xuất ra sau "so" nam nua} end else begin so:=0;{Gán so bằng 0} while (a-so)*2>b-so do inc(so);{Trong khi (a-so)*2<b-so thì tăng số lên} writeln('Truoc day ',so,' nam tuoi cha gap doi tuoi con');{Xuất ra truoc do "so" nam} end; readln; end. 2 Bài 3: { Nhập 2 số nguyên dơng. Tìm ớc chung lớn nhất và bội chung nhỏ nhất của 2 số đó Hớng dẫn UCLN(a,b) = UCLN(a,a-b) nếu a>b = UCLN(a,b-a) nếu b>a BCNN(a,b) = a*b div UCLN(a,b)} var a,b:integer;{a,b kiểu integer} tich:longint;{tich kiểu longint} begin write('A, B = ');readln(a,b);{Đọc a,b} tich:=a*b;{Gán tich bằng a*b} while a<>b do{Trong khi a<>b thì} if a>b then a:=a-b else b:=b-a;{Nếu a>b thì gán a=a-b ngợc lại gán b=b-a} writeln('UCLN = ',a);{Xuất UCLN (a hoặc b)} writeln('BCNN = ',tich div b);{Xuất BCNN} readln; end. Bài 4: { Dùng REPEAT . UNTIL in ra màn hình bảng nhân N (từ Nx1 tới Nx10)} var i,n:integer;{Khai báo i,n kiểu integer} begin write('N = ');readln(n);{Đọc N} i:=0;{Gán i bằng 0} repeat inc(i);{Tăng i} writeln(n:2,' x ',i:2,' = ',n*i:3);{Xuất n,i,n*i} until i=10; readln; end. Bài 5:{ In ra màn hình các giá trị sin, cos, tan của các góc 0, 5, 10, 15 . 90 Hớng dẫn Dùng hàm sin(x) cos(x) nhng phải đổi số độ sang radian (X có đơn vị là radian) bằng CT Radian = pi*Số độ / 180 Tính tang dựa vào CT tan=sin/cos nhng nhớ tan90 không tồn tại} const pi=3.14;{Khai báo hằng pi=3.14} var i:integer;{i kiểu integer} x:real;{x kiểu real} begin for i:=0 to 18 do{Cho i chạy từ 0 đến 18 (i*5 tơng ứng số độ)} begin x:=pi*i*5/180;{Đổi i*5 độ sang x radian} write('Sin ',i*5:2,' = ',sin(x):0:5,' ');{Xuất sin} write('Cos ',i*5:2,' = ',cos(x):0:5,' ');{Xuất cos} if i<>18 then write('Tan ',i*5:2,' = ',sin(x)/cos(x):0:5){Nếu i<>18 thì xuất sin(x)/cos(x)} else write('Tan 90 khong ton tai');{Ngợc lại xuất Tan không tồn tại} writeln; end; readln; end. 3 Bài 6: { Biết N! = 1x2x3x xN In ra màn hình giai thừa các số từ 1 tới 12 1! = 1 2! = 2 3! = 6 Hớng dẫn Phải dùng kiểu longint để tính vì số rất lớn } uses crt; var i,n:longint;{Khai báo i,n kiểu longint} begin clrscr;{Xoá màn hình} n:=1;{Gán n bằng 1} for i:=1 to 12 do{Cho i chạy từ 1 đến 12} begin n:=n*i;{Gán n bằng n*i} writeln(i,' ! = ',n);{Xuất ra N} end; readln; end. Bài 7: { Nhập số nguyên dơng N (N<10). a. In ra màn hình các chỉnh hợp lặp chập 3 của N phần tử b. In ra màn hình các chỉnh hợp không lặp chập 3 của N phần tử. c. In ra màn hình các tổ hợp chập 3 của N. Hớng dẫn Chỉnh hợp lặp : i=1->N j=1->N k=1->N : Xuất i,j,k Chỉnh hợp không lặp : i=1->N j=1->N k=1->N : Nếu i<>j<>k thì xuất Tổ hợp i=1->N-2 j=i+1->N-1 k=j+1->N : Xuất i,j,k} var i,j,k,n:byte;{i,j,k,n kiểu byte} begin write('N = ');readln(n);{Đọc N} writeln('Cac chinh hop lap :'); for i:=1 to n do{Cho i chạy từ 1 đến N} for j:=1 to n do{Cho j chạy từ 1 đến N} for k:=1 to n do{Cho k chạy từ 1 đến N} write(i,j,k,' '); readln; writeln('Cac chinh hop khong lap :'); for i:=1 to n do{Cho i chạy từ 1 đến N} for j:=1 to n do{Cho j chạy từ 1 đến N} for k:=1 to n do{Cho k chạy từ 1 đến N} if(i<>j)and(j<>k)and(i<>k)then write(i,j,k,' ');{Nếu i<>j<>k thì xuất mới xuất i,j,k} 4 readln; writeln('Cac to hop :'); for i:=1 to n-2 do{Cho i chạy từ 1 đến N-2} for j:=i+1 to n-1 do{Cho j chạy từ i+1 đến N-1} for k:=j+1 to n do{Cho k chạy từ j+1 đến N} write(i,j,k,' '); readln; end. Bài 8: { In ra màn hình bảng cửu chơng từ 1->10 Hớng dẫn Dùng hàm GOTOXY(x,y) để di chuyển tới toạ độ cột x dòng y trên màn hình Ta chia chiều ngang màn hình thành 5 cột, chiều dọc màn hình thành 2 hàng. Từ hàng 2 11 ta in bảng 1,2,3,4,5. Từ hàng 13 22 ta in bảng 6,7,8,9,10 Khi ta tới hàng i x j thì toạ độ bắt đầu sẽ là y = j+1 nếu i<6 = j+12 nếu i>=6 x = ((i-1)mod 5)*16+1;} uses crt; var i,j,x,y:byte;{i,j,x,y kiểu byte} begin clrscr;{Xoá màn hình} for i:=1 to 10 do{Cho i chạy từ 1 đến 10 (i là bảng)} for j:=1 to 10 do{Cho j chạy từ 1 đến 10} begin if i<6 then y:=j+1 else y:=j+12;{Tính y theo CT ở phần thuật toán} x:=((i-1)mod 5)*16+1;{Tính x theo CT ở phần thuật toán} gotoxy(x,y);{Nhảy tới vị trí x,y} write(i,' x ',j,' = ',i*j); end; readln; end. Bài 9: { Viết chơng trình giải bài toán : Trăm trâu, trăm bó cỏ Trâu đứng ăn năm Trâu nằm ăn ba Lụ khụ trâu già 3 con 1 bó Hỏi mỗi loại có mấy con Hớng dẫn Điều kiện trên thoả khi : 100 = (std*5+stn*3+stg3) và std+stn+stg3*3=100 Trong đó std : Số trâu đứng <=20 stn : Số trâu nằm <=33 stg3 : Số bó cỏ trâu già ăn<=33} 5 var std,stn,stg3:byte;{std,stn,stg3 kiểu byte} begin clrscr; for std:=1 to 20 do{Cho std chạy từ 1 đến 20} for stn:=1 to 33 do{Cho stn chạy từ 1 đến 33} for stg3:=1 to 33 do{Cho stg3 chạy từ 1 đến 33} if(std*5+stn*3+stg3=100)and(std+stn+stg3*3=100)then{Nếu ĐK đề bài thoả} begin writeln('So trau dung : ',std);{Xuất std} writeln('So trau nam : ',stn);{Xuất stn} writeln('So trau gia : ',stg3*3);{Xuất stg} writeln; end; readln; end. Bài 10: { Tìm tất cả các số có 3 chữ số sao cho abc = A^3 + B^3 + C^3} var a,b,c:byte;{a,b,c kiểu byte} begin writeln('Cac so can tim la : '); for a:=1 to 9 do{Cho a chạy} for b:=0 to 9 do{Cho b chạy} for c:=0 to 9 do{Cho c chạy} if a*100+b*10+c=a*a*a+b*b*b+c*c*c then writeln(a,b,c);{Nếu ĐK thoả thì xuất a,b,c} readln; end. Bài 11: { Nhập số nguyên N. a. In ra màn hình N số nguyên dơng lẻ đầu tiên là bội của 3 b. In ra màn hình số nguyên chẵn đầu tiên chia hết cho 3 d 2, chia 5 d 4 c. In ra màn hình các số chính phơng nhỏ hơn hoặc bằng N*N Hớng dẫn a. Dễ thấy dãy là cấp số cộng. Số nguyên đầu tiên là 3, công sai là 6 Số nguyên dơng lẻ thứ i là bội của 3 3+(i-1)*6 b. Dãy là cấp số cộng. Số nguyên đầu tiên là 14, công sai là 3*5*2=30. Số thứ i sẽ có công thức 14+(i-1)*30; c. Dễ dàng nhận ra đó là những số i*i(i<=N)} var i,n:integer;{Khai báo i,n kiểu integer} begin write('N = ');readln(n);{Đọc N} writeln('Cau a'); for i:=1 to n do write(3+(i-1)*6:5);{Cho i chạy và in ra n phần tử theo CT ở thuật toán} writeln;writeln('Cau b'); for i:=1 to n do write(14+(i-1)*30:5);{Cho i chạy và in ra n phần tử theo CT ở thuật toán} writeln;writeln('Cau c'); for i:=1 to n do write(i*i:5);{Cho i chạy và in ra n phần tử theo CT ở thuật toán} readln; end. 6 Bài 12: { Nhập một số N kiểu longint. a. In ra màn hình số chữ số của nó. b. Tính số M bằng cách lấy ngợc lại số N VD : N = 1234 Có 4 chữ số M = 4321 Hớng dẫn Lần lợt cắt từng chữ số của N từ trái qua N = N div 10. Tăng số chữ số lên 1 và kết hợp chữ số đó vào trớc M} var n,m:longint;{N, M kiểu longint} scs:byte;{scs kiểu byte} begin write('N = ');readln(n);{Đọc N} m:=0;scs:=0;{Gán m và scs bằng 0} while n>0 do{Trong khi n>0 thì} begin m:=m*10+n mod 10;{Kết hợp chữ số hàng đơn vị của N vào sau M} inc(scs);{Tăng số chữ số lên 1} n:=n div 10;{Cắt bỏ chữ số hàng đơn vị của N} end; writeln('So chu so : ',scs);{Xuất số chữ số} writeln('M = ',m);{Xuất M} readln; end. Bài 13:{ Nhập chiều dài, chiều rộng của một hcn. Hãy vẽ ra màn hình VD : a=4 b=6 a. * * * * * * * * * * * * * * * * * * * * * * * * b.* * * * * * * * * * * * * * * *} uses crt; var i,j,a,b:byte;{i,j,a,b kiểu byte} begin clrscr;{Xoá màn hình} write('A, B = ');readln(a,b);{Đọc a,b} writeln('Cau a'); for i:=1 to a do{Cho a chạy từ 1 đến a} begin for j:=1 to b do write('* ');{In ra b kí tự '* '} writeln; end; writeln('Cau b'); 7 for j:=1 to b do write('* ');writeln;{In ra b kÝ tù '* '} for i:=1 to a-2 do{Cho i ch¹y tõ 1 ®Õn a-2} begin write('* '); for j:=1 to b-2 do write(' ');{In ra b kÝ tù ' '} writeln('*'); end; for j:=1 to b do write('* ');{In ra b kÝ tù '* '} readln; end. Bµi 14: { NhËp ®é cao h cña mét tam gi¸c. In ra mµn h×nh c¸c tam gi¸c cã d¹ng * ***** * ** **** *** *** *** ***** **** ** ******* ***** * ********* h=5} uses crt; var i,j,h:byte;{i,j,h kiÓu byte} begin clrscr;{Xo¸ mµn h×nh} write('H = ');readln(h);{NhËp H} writeln('Cau a'); for i:=1 to h do{Cho i ch¹y tõ 1 ®Õn h} begin for j:=1 to i do write('*');{In ra i kÝ tù '*' cña dßng i} writeln; end; readln; writeln('Cau b'); for i:=h downto 1 do{Cho i ch¹y tõ h xuèng 1} begin for j:=1 to i do write('*');{In ra i kÝ tù '*' cña dßng i} writeln; end; readln; writeln('Cau c'); for i:=1 to h do{Cho i ch¹y tõ 1 ®Õn h} begin for j:=1 to h-i do write(' ');{In ra h-i kÝ tù ' '} for j:=1 to 2*i-1 do write('*');{In ra 2*i-1 kÝ tù '*'} writeln; end; readln; end. 8 Bài 15: { Tìm các số tự nhiên nhỏ hơn 1000 sao cho nó bằng tổng các ớc của nó (không kể chính nó) Hớng dẫn Cho i chạy từ 2 đến 1000 - Tính tổng các ớc của i - Nếu tổng = i thì xuất i} var i,j,tong:integer;{i,j,tong kiểu integer} begin writeln('Cac so can tim'); for i:=2 to 1000 do{Cho i chạy từ 2 đến 1000} begin tong:=0;{Gán tong bằng 0} for j:=1 to i div 2 do{Cho j chạy từ 1 đến i div 2} if i mod j=0 then tong:=tong+j;{Nếu i chia hết cho j thì cộng j vào tong} if tong=i then writeln(i);{Nếu tong=i thì xuất i} end; readln; end. Bài 16: { Nhập số N. Kiểm tra N xem nó có phải là số nguyên tố không Hớng dẫn Cho i chạy từ 2 đến trunc(sqrt(n)). - Nếu trong lúc chạy N mod i=0 thì N không nguyên tố - Ngợc lại N nguyên tố} var i,n:integer;{i,n kiểu integer} kq:boolean;{kq kiểu boolean} begin write('N = ');readln(n);{Đọc N} kq:=true;{Gán kq bằng true} for i:=2 to trunc(sqrt(n))do{Cho i chạy từ 2 đến trunc(sqrt(N))} if n mod i=0 then{Nếu n chia hết cho i thì} begin kq:=false;{Gán kq=false} break;{Bẻ gãy vònglặp bằng lệnh Break (không cho vònglặp chạy tiếp} end; if kq then writeln('So nguyen to')else write('Khong la so nguyen to');{Nếu kq thì N là số nguyên tố ngợc lại thì không} readln; end. 9 . vòng lặp đều có số lần lặp không xác định trớc. Cần phải lu ý là trong khi thực hiện <công việc> lặp, ta phải có một lệnh làm thay đổi một biến trong. Biến_điều_khiển:=Giá_trị_đầu DOWNTO Giá_trị_cuối DO <việc> II. Vòng lặp có số bớc lặp không xác định Có 2 kiểu vòng lặp không xác định REPEAT WHILE <biểu thức Boolean>DO