Hiển thị các bài đăng có nhãn Vòng lặp while. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Vòng lặp while. Hiển thị tất cả bài đăng

Thứ Hai, 5 tháng 3, 2012

Tìm ước chung lớn nhất và bội chung nhỏ nhất pascal

Ý tưởng: Lấy số lớn hơn trong 2 số trừ đi nhau. Lặp lại thao tác đến khi nào 2 số bằng nhau -> UCLN. Lấy tích của 2 số chia cho UCLN -> BCNN.

Thuật toán tìm Bội chung nhỏ nhất và Ước chung lớn của 2 số trong Pascal:


Cách 1: Dưới đây là thuật toán tìm UCLN bằng cách trừ đi nhau, được trình bày trong SGK tin học 10.

var x,y,UCLN,BCNN:integer;
begin
readln(x,y);
BCNN:=x*y;
While x<>y do If x>y then x:=x-y else y:=y-x;
UCLN:=x;
BCNN:=BCNN div UCLN;
write(UCLN,' ',BCNN);
end.

Cách 2: Thuật toán Euclide: Ngoài cách tìm UCLN như trên. Các bạn có thể sử dụng cách chia lấy dư (mod), chương trình sẽ tối ưu do phải thực hiện ít phép tính hơn.

Ý tưởng: UCLN của 2 số x, y cũng là UCLN của 2 số y và x mod y, vậy ta sẽ đổi x là y, y là x mod y cho đến khi y bằng 0. Khi đó UCLN là x.

var x,y,UCLN,BCNN,t:integer;
begin
readln(x,y);
BCNN:=x*y;
t:= y mod x;
While t <> 0 do
      Begin
        t:= x MOD y;
        x:= y;
        y:= t;
      End;
ucln:=x;
BCNN:=BCNN div UCLN;
write(UCLN,' ',BCNN);
end.

Cách 3: Tìm UCLN bằng cách dùng đệ quy: Đệ quy được hiểu đơn giản là sự gọi nhiều lần chương trình con trong chương trình. Thực sự, đối với bài toán đơn giản, không ai sử dụng đệ quy vì sẽ làm phức tạp vấn đề và làm chương trình trở nên rắc rối, phải thực hiện nhiều phép tính hơn. Tuy nhiên, nếu bắt buộc phải dùng đệ quy, các bạn có thể tham khảo cách làm dưới đây:

function ucln(x,y:integer):integer;
begin
if x = y then
ucln:=x
else if x > y then
ucln:=ucln(x mod y,y)
else
ucln:=ucln(x, y mod x);
end;
var x,y:integer;
begin
readln(x,y);
write('Ước chung lớn nhất là: ', UCLN(x,y), ' Bội chung nhỏ nhất là: ', (x*y) div UCLN(x,y));
end.

Thứ Năm, 9 tháng 2, 2012

Bài 3: Câu lệnh vòng lặp trong Pascal (for, while, repeat)

- Đánh răng mỗi ngày hai lần, học Tin học mỗi tuần 2 tiết, mỗi ngày tắm một lần...
- Học cho đến khi thuộc bài, rửa tách trà cho đến khi sạch...

Trong cuộc sống, những hành động trên được gọi là lặp đi lặp lặp lại nhiều. Trong Pascal, cách mô tả công việc (hoạt động) được lặp lại nhiều lần gọi là cấu trúc lặp. Có 3 loại cấu trúc vòng lặp như sau:

1. Vòng lặp for

- Đây là vòng lặp căn bản và được sử dụng nhiều nhất trong kiến thức phổ thông. Vòng lặp for dùng để lặp với số lần định trước, có cấu trúc như sau:

for <biến đếm>:= <giá trị đầu> to <giá trị cuối> do <câu lệnh>;

Dạng khác (giảm dần biến đếm của vòng lặp for):

for <biến đếm>:= <giá trị cuối> downto 1 do <câu lệnh>;

vd: Tính tổng các số liên tiếp từ 1 đến 100

program Tinh_tong;
var i,S:integer;
begin   
    S:=0;
    for i:=1 to 100 do S:=S+1;
    write('Tổng là:',S);
    readln;
end.

2. Vòng lặp while

- Cú pháp:  

while <điều kiện> do <câu lệnh>

- Câu lệnh sẽ được lặp lại nhiều lần cho đến khi nào điều kiện còn đúng (nếu điều kiện sai thì các lệnh này sẽ không thực hiện nữa). Đối với lệnh này điều kiện sẽ được kiểm tra trước khi thực hiện lệnh nên nên điều kiện sai thì không có lệnh nào được thực hiện.

vd: Tính tổng các số liên tiếp từ 1 đến 100

var i: byte;
    S: longint;
begin
    S:= 0;
    i:= 1;
    while i <= 100 do
         begin
              S:= S + i;
              i:= i +1;
         end;
    write('Tong tu 1 den 100 la:',S);
    readln;
end.


3. Vòng lặp repeat 

- Cú pháp:

repeat
<câu lệnh>;
until <điều kiện>;

- Câu lệnh giữa repeat và until sẽ được lặp lại nhiều lần khi nào điều kiện sai, nếu điều kiện đúng thì ngưng (ngược với vòng lặp while). Đối với lệnh này điều kiện sẽ được kiểm tra sau khi thực hiện các lệnh giữa repeat và until nên ít nhất các lệnh sẽ được thực hiện trước 1 lần rồi mới kiểm tra điều kiện đúng hay sai (nếu sai thì thực hiện tiếp vòng lặp, đúng thì ngưng).

vd: Tính tổng các số liên tiếp từ 1 đến 100

var i,n: integer;
    S: real;
begin   
    S:=0; i:=1;
    repeat 
    S:=S+i; i:=i+1;
    until i>100;
    writeln('Tong = ',S);
    readln;
end.

Tổng hợp và biên tập

Bài đăng phổ biến