Giáo trình Tin học đại cương - Phần 2 - Chương 3: Các thủ tục vào ra dữ liệu và cấu trúc điều khiển

Phép gán dùng ñể gán giá trị của một biểu thức cho một biến. Kí hiệu phép gán là :=

Cú pháp

 Tên_biến:=Biểu thức;

Ý nghĩa:Khi gặp lệnh này, trước hết máy sẽ tính giá trị của biểu thức ở vế phải rồi gán giá

trị tính ñược cho biến ở vế trái.

Chú ý: kiểu dữliệu của biểu thức phải phù hợp với kiểu dữliệu của biến ởvếtrái.

Ví dụ: Với các biến ñã ñược khai báo thích hợp ở ñầu chương trình, trong thân chương trình

ta có thể viết

x:=5; nghĩ là biến x nhận giá trị 5

x:=x+1; giá trị của biến x ñược thay thế bởi giá trị của chính nó tăng thêm một

delta:=b*b-4*a*c; tính giá trị của delta trong chương trình giải phương trình bậc 2

doan:= true;

chu_cai:= 'A';

pdf17 trang | Chuyên mục: Pascal | Chia sẻ: dkS00TYs | Lượt xem: 1741 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình Tin học đại cương - Phần 2 - Chương 3: Các thủ tục vào ra dữ liệu và cấu trúc điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
uá 
Biểu_thức2. 
Lưu ñồ của lệnh lặp FOR: 
BiÕn_®iÒu_khiÓn:=BiÓu_thøc1 
DO 
 BiÕn_®iÒu_khiÓn<BiÓu_thøc2 
BiÕn_®iÒu_khiÓn:=Pred(BiÕn_®iÒu_khiÓn) 
KÕt thóc 
§óng 
Sai 
B¾t ®Çu 
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 135 
 135 
Với dạng này thì câu lệnh FOR trong ví dụ 1 ở trên ñược viết là: 
 For I:=n downto 1 do S:=S+i; 
Tổng S sẽ ñược cộng dồn theo thứ tự từ n ñến 1, tức là S=n+(n-1)+...+2+1. 
Ví dụ: Viết chương trình in ra các kí tự trong bảng mã ASCII theo thứ tự giảm dần. 
 Các kí tự trong bảng mã ASCII có mã giảm dần từ 255 ñến 0. Ta dùng hàm CHR(n) 
ñể nhận ñược kí tự. 
 Chưng trình ñược viết như sau: 
Program In_cac_ki_tu; 
Uses crt; 
Var I:integer; 
Begin 
 Clrscr; 
 For i:=255 downto 0 do write(chr(i):4); 
 Readln; 
End. 
c. Các lưu ý 
 1) Sau từ khoá DO chỉ ñược viết một lệnh, do ñó nếu cần thực hiện nhiều hơn một 
lệnh ñơn thì phải sử dụng câu lệnh phức hợp 
 2) Các lệnh lặp có thể lồng nhau, chẳng hạn dạng: 
 FOR I:=1 TO n DO 
 FOR J:=1 TO m DO 
Khi ñó với mỗi giá trị của biến ñiều khiển của vòng lặp ngoài thì biến ñiều khiển của vòng lặp 
trong sẽ chạy hết các giá trị của nó. Tức là với mỗi giá trị của I thì J sẽ chạy từ 1 tới m. Xét ví 
dụ ñoạn chương trình sau: 
For I:= 1 to 2 do 
For J:=1 to 3 do 
 begin 
 k:=i+j; 
 writeln(k); 
 end; 
sẽ cho kết quả là: 
2 
3 
4 
3 
4 
5 
 3) sau từ khoá DO không ñược tuỳ tiện thay ñổi giá trị của Biến_ñiều_khiển, 
làm như vậy ta có thể không kiểm soát ñược giá trị của Biến_ñiều_khiển và có thể làm rối 
vòng lặp. 
Ví dụ: In ra tất cả các chữ số có 3 chữ số mà tổng các chữ số chia hết cho 3. 
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 136 
 136 
 Trong bài toán này mỗi số ñều có 3 chữ số, chữ số hàng trăn có thể nhận giá trị từ 1 
ñến 9, chữ số hàng chục, chữ số hàng ñơn vị ñều có thể nhận giá trị từ 0 ñến 9. ðể quét hết 
các chữ số có 3 chữ số ta dùng 3 vòng lặp lồng nhau, sau ñó ta kiểm tra ñièu kiện nếu tổng các 
chữ số chia hết cho 3 thì in ra số ñó. 
 Chương trình ñược viết như sau: 
Program In_cac_so; 
Uses crt; 
Var t,c,v:integer; 
Begin 
 Clrscr; 
 For t:=1 to 9 do 
 For c:=0 to 9 do 
 For v:=0 to 9 do 
 If (t+c+v) mod 3 = 0 then writeln(t,c,v); 
 Readln; 
End. 
4.2- Lệnh lặp có số bước lặp không xác ñịnh 
 ở trên ta ñã xét lệnh lặp có số bước lặp xác ñịnh, tức là số lần thực hiện công việc lặp 
ñi lặp lại là ñược ñịnh trước. Nhưng trong khi lập trình có những bài toán yêu cầu thực hiện 
một công việc nào ñó mà số lần lặp là không thể xác ñịnh trước ñược, mà phụ thuộc vào một 
biểu thức ñiều kiện nào ñó. Có hai dạng lệnh lặp với số bước lặp không xác ñịnh. 
a. Lệnh lặp với ñiều kiện trước 
• Dạng lệnh: 
 WHILE DO ; 
ý nghĩa: 
 Khi gặp câu lệnh này, trước tiên máy sẽ kiểm tra . Nếu có giá 
trị ñúng (TRUE) thì ñược thực hiện. Thực hiện xong lệnh này máy sẽ quay lại kiểm 
tra ñể thực hiện ... quá trình tiếp diễn ñến khi sai thì dừng. 
Sơ ñồ 
• Ví dụ: 
VD1: Một người gửi tiết kiệm không kì hạn với số tiền ban ñầu là A ñồng Hỏi sau bao nhiêu 
tháng người ñó thu ñược số tiền là B ñồng, biết rằng lãi suất là 1.8%? 
Sai 
§óng 
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 137 
 137 
Phân tích bài toán: Ta biết rằng gửi tiết kiệm không kì hạn thì số tiền thu ñược sau mỗi tháng 
sẽ bằng số tiền tháng trước cộng với lãi của tháng ñó. Nếu gọi S là số tiền thu ñược sau mỗi 
tháng, t là số tháng gửi, ls là lãi suất thì ta có: 
nếu t=0 --> S0=A (gửi 0 tháng) 
nếu t=1 --> S1=S0 +S0*ls (gửi 1 tháng) 
nếu t=2 --> S2= S1 +S1*ls (gửi 2 tháng) 
... 
ðây chính là quy luật ñể thực hiện vòng lặp tính số tiền thu ñược. Như vậy ta phải so sánh số 
tiền thu ñược S sau mỗi tháng với số tiền cần ñạt B: nếu S ñạt hoặc vượt B thì ta có kết luận 
của bài toán. ðây cũng là ñiều kiện dừng vòng lặp. Ta sẽ sử dụng một biến ñếm t ñể ñếm số 
lần thực hiện lặp, cũng chính là số tháng gửi. 
Chương trình ñược viết như sau: 
Program Gui_tiet_kiem; 
Const ls=0.018; 
Var A,B,S:real; 
 t:integer; 
Begin 
 Clrscr; 
Write('Cho biet so tien gui ban dau:'); 
 Readln(A); 
 Write('Cho biet so tien can dat :'); 
 Readln(B); 
 S:=A; 
 t:=0; 
 WHILE S<B DO 
 begin 
 S:=S+S*ls; 
 t:=t+1; 
 end; 
 Writeln(' Ban can gui it nhat la ', t, ' thang'); 
 Readln; 
End. 
VD2: Ta có thể viết lại chương trình tính tổng S=1+2+...+n sử dụng lệnh lặp WHILE... DO... 
như sau: 
Program Tinh_tong1; 
Var i,n:integer; 
 S:real; 
Begin 
 Write('Cho biet gia tri cua n:'); 
 Readln(n); 
 S:=0; 
 i:=1; 
 While i<= n do 
 begin 
 S:=S+i; 
 i:=i+1; 
 end; 
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 138 
 138 
 Writeln(' Tong tinh duoc la S:',S:10:2); 
End. 
 Như vậy ta có thể dùng lệnh lặp có số bước lặp không xác ñịnh ñể thay cho lệnh lặp có số 
bước lặp xác ñịnh. Tuy nhiên khi ñó biến ñiều khiển vòng lặp không tự ñộng thay ñổi mà ta 
phải ñưa nó vào thân vòng lặp (biến i trong VD trên). 
b. Lệnh lặp với ñiều kiện sau 
• Dạng lệnh: 
 REPEAT UNTIL ; 
ý nghĩa: 
 Khi gặp câu lệnh này, trước tiên máy sẽ cho thực hiện , sau ñó kiểm tra <ñiều 
kiện>. Nếu có giá trị sai (FALSE) thì quay lại thực hiện . Thực hiện xong 
lệnh này máy sẽ lại kiểm tra ñể thực hiện ... quá trình tiếp diễn ñến khi 
 ñúng thì dừng. 
Sơ ñồ 
• Ví dụ: Lấy lại VD gửi tiết kiệm ở trên. Bây giờ ta sẽ viết lại chương trình sử dụng dạng 
lệnh lặp với ñiều kiện sau. Chương trình chỉ cần thay ñổi một chút ở lệnh lặp. 
Program Gui_tiet_kiem; 
Const ls=0.018; 
Var A,B,S:real; 
 t:integer; 
Begin 
 Write('Cho biet so tien gui ban dau:'); 
 Readln(A); 
 Write('Cho biet so tien can dat :'); 
 Readln(B); 
 S:=A; 
 t:=0; 
 REPEAT 
 S:=S+S*ls; 
 t:=t+1; 
 UNTILS>=B; 
 Writeln(' Ban can gui it nhat la ', t, ' thang'); 
 Readln; 
§óng 
 §iÒu kiÖn 
LÖnh 
Sai 
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 139 
 139 
End. 
Ta thấy rằng trong phần thân của vòng lặp các lệnh ñặt giữa REPEAT và UNTIL không cần 
sử dụng câu lệnh phức hợp begin...end; 
Bạn ñọc có thể sử dụng lệnh này ñể viết lại chương trình tính tổng ở trên. 
c. Các lưu ý khi sử dụng các lệnh lặp WHILE và REPEAT 
 1) Trong thân vòng lặp phải có ít nhất một lệnh làm thay ñổi giá trị của biểu thức ñiều 
kiện nhằm dừng vòng lặp. Nếu ñiều kiện luôn ñược thoả mãn thì lệnh có thể rơi vào vòng lập 
vô tận. Khi ñó chỉ còn cách là tắt máy hoặc dừng chương trình. 
Xem ví dụ sau: 
 I:=1; 
 WHILE I<2 DO write('Stop!'); 
Vòng lặp này sẽ chạy vô tận vì trong thân vòng lặp sau từ khoá DO chỉ có một lệnh in ra xâu 
chữ 'Stop!', không có lệnh nào làm thay ñổi giá trị của I. Tức là với I ñược khởi tạo ban ñầu là 
1 luôn nhỏ hơn 2, ñiều kiện luôn thoả mãn. 
 2) Trong lệnh lặp với ñiều kiện trước WHILE thì thân vòng lặp (sau từ khoá DO) phải 
sử dụng câu lệnh phức hợp begin... end; còn trong lệnh lặp với ñiều kiện sau thì không cần. 
 3) Trong lệnh lặp với ñiều kiện trước, máy luôn kiểm tra ñiều kiện trước khi thực hiện 
lệnh, do ñó nếu ñiều kiện sai ngay từ ñầu thì lệnh không ñược thực hiện lần nào. Còn trong 
lệnh lặp với ñiều kiện sau, máy luôn thực hiện lệnh một lần rồi mới kiểm tra ñiều kiện, dù ban 
ñầu ñiều kiện có thể ñúng. Nhớ rằng trong lệnh lặp với ñiều kiện sau lệnh ñược quay lại thực 
hiện chỉ khi ñiều kiện sai. 
 4) Các lệnh lặp có thể viết lồng nhau 
 5) Người ta thường dùng các lệnh lặp có số bước lặp không xác ñịnh ñể quay vòng 
thực hiện nhiều lần cả một công việc nào ñó hoặc cả chương trình, cho phép tạo sự tương tác 
giữa người sử dụng và máy. Xem ví dụ mẫu sau: 
Program VD; 
Var tieptuc:char; 
 ... { các biến của chương trình } 
Begin 
 Repeat 
 ... 
 { ñoạn chương trình thực hiện công việc và thay ñổi ñiều kiện kiểm 
tra} 
 write(' Ban co tiep tuc nua hay khong (C/K)'); 
 readln(tieptuc); 
 UNTIL (tieptuc='k') or (tieptuc='K'); 
End; 
d. Lệnh nhảy vô ñiều kiện GOTO 
Lệnh GOTO cho phép chương trình nhảy vô ñiều kiện tới một vị trí nào ñó thông qua tên 
nhãn. Nhãn là một số nguyên hoặc một tên ñược khai báo trong phần LABEL ở ñầu chương 
trình. Trong chương trình nhãn ñược ñặt vào vị trí phù hợp kèm theo mộ dấu hai chấm (:). 
Xem ví dụ sau: 
Program VDNHAN; 
Uses crt; 
Label N1,N2; 
Var a,b,s:real; 
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 140 
 140 
Begin 
 a:=1; b:=2; 
 N1: a:=a+1; 
 if a<5 then GOTO N1; 
 N2: s:=a+b; 
 if s<10 then GOTO N2; 
 writeln('a=', a, 'b=',b); 
 readln; 
End. 
Thường người ta ít dùng lệnh GOTO trong chương trình PASCAL vì nó sẽ phá vỡ tính có cấu 
trúc của chương trình PASCAL. Nếu có thể, ta nên tránh dùng lệnh này. 
Bài tập chương III 
Viết chương trình cho các bài toán sau: 
1. Tính n giai thừa: n! =1.2...n với n>1 
2. Tính các tổng: S=1/2 + 1/4 +...+ 1/(2k) 
 Q=1.1!+2.2!+...+n.n! 
3. Tìm và in ra tất cả các số chính phương nhỏ hơn một số cho trước, cho biết có bao nhiêu số 
chính phương như vậy. 
4. Viết chương trình giải bài toán cổ: " Vừa gà vừa chó, bó lại cho tròn, ba mươi sáu con, một 
trăm chân chẵn. Hỏi có bao nhiêu gà, bao nhiêu chó?" 
5. Viết chương trình tìm ước số chung lớn nhất của 2 số nguyên dương cho trước. 
6. Tính Ex=1
1 2
2
+ + + + +
x x x
n
n
! !
...
!
... với ñộ chính xác ε=10-4 ( ABS(xn/n!) < ε ), giá trị x 
ñược nhập vào từ bàn phím khi chạy chương trình. 
7. Cần có 50000 ñ từ các loại giấy bạc 1000ñ, 2000ñ và 5000ñ. Tìm tất cả các phương án có 
thể. 
8. Chuyển một số thập phân nguyên dương thành một số nhị phân, in ra màn hình dạng 
X10 = Y2 
9. Tính tích phân xác ñịnh của một hàm số trên một ñoạn cho trước 
10. Viết chương trình tìm và in ra màn hình các số nguyên tố nhỏ hơn một số cho trước. 

File đính kèm:

  • pdfGiáo trình Tin học đại cương - Phần 2 - Chương 3_Các thủ tục vào ra dữ liệu và cấu trúc điều khiển.pdf