1. Trang chủ
  2. » Giáo án - Bài giảng

Pascal - Vòng lặp

8 705 2
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Pascal - Vòng lặp
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Thông Tin
Thể loại bài luận
Thành phố Hồ Chí Minh
Định dạng
Số trang 8
Dung lượng 55,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Writeln24 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 WritelnI trong đó I là một biến nguyên bất kì nhận giá trị từ 0..24

Trang 1

Vòng Lặp

I Vòng lặ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òng lặ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ò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

<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 trong vòng lặ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ò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ểu thức Boolean để thay đổi giá trị biểu thức nhằm dừng vòng lặp lại vì nếu không vòng lặ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;

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}

Trang 2

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

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;

Trang 3

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

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ử

Trang 4

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}

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

Trang 5

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}

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}

Trang 6

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

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;

Trang 7

writeln('Cau b');

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

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

Trang 8

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òng lặp bằng lệnh Break (không cho vòng lặ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

Ngày đăng: 28/07/2013, 01:25

TỪ KHÓA LIÊN QUAN

w