Giới thiệu về ngôn ngữ Pascal


I. Giới thiệu về ngôn ngữ PASCAL :

PASCAL là một trong những ngôn ngữ lập trình cấp cao được giáo sư Niklaus Wirth ở trường Đại học Zurich (Thuỵ Sĩ) thiết kế và công bố vào năm 1971.Ông đặt tên cho ngôn ngữ này là Pascal để tưởng nhớ đế Blaise Pascal, nhà Toán học, triết học nổi tiếng của Pháp ở thế kỷ 17.  Sau được sửa đổi trong năm 1972 và ngày càng đựơc chuẩn hoá, đến nay trở thành ngôn ngữ phổ cập trong dạy lập trình cũng như được ứng dụng rộng rãi trên các máy vi tính.

Ngôn ngữ Pascal nhanh chóng có ảnh hưởng sâu rộng và chiếm được cảm tình của những người lập trình vì nhiều nguyên nhân; trong đó có nguyên nhân đáng kể là tính cấu trúc chặt chẽ và khoa học. Tính cấu trúc của ngôn ngữ này thể hiện  trên 3 mặt:

1) Tổ chức dữ liệu có tính cấu trúc.
2) Xây dựng được đầy đủ các cấu trúc điều khiển để thực hiện giải thuật.
3) Tạo cho chương trình khả năng cấu trúc. 

Vì vậy khi lập trình, cần cố gắng khai thác hết sức mạnh của ngôn ngữ này về phương diện cấu trúc, nhằm đạt tới các bài giải toán có hiệu suất cao. 

II.  Những khái niệm cần thiết :

1. Các Kí tự :
Các kí tự trong ngôn ngữ Pascal gồm : 
+ 26 chữ cái la tinh hoa : A, B,... Z ( mã số từ 65 tới 90 trong bảng mã ASCII )
+ 26 chữ cái la tinh thường a, b...  z ( mã số 97 --> 122 )
+ Kí tự gạch nối   :  _          ( mã số 95 )   
+ 10 kí tự chữ số  :  0, 1, 2,..., 9          (mã số 48 --> 57 )
+ Cộng + , trừ  -  , nhân * , chia  / , bằng nhau  =  , lớn hơn  >  , nhỏ hơn  < 
dấu mở ngoặc (  hoặc dấu  đóng ngoặc )
+ Các kí tự đặc biệt khác :
. , ; , : , [ ,  ] ,  { ,  } ,  ?  , !  , \  ,  & ,  % ,  # ,   $   
+ Kí tự dấu cách (còn gọi là  dấu trống - có mã số 32  ) Tạo 1 khoảng cách bằng độ rộng chứa 1 kí tự, dấu cách dùng để phân cách 2 từ. 

2. Các từ khoá:  Là các từ riêng của Pascal đã được xác định ngữ nghĩa  trước, người lập trình phải tuân theo ngữ nghĩa này, không được dùng từ khoá vào các định nghĩa khác 

Danh sách các từ khoá :
Program, Begin, End, Procedure, Function, Unit, Implementation, Interface ...
Uses, Const, Type, Var, Label, Array, String, Record, Set of ... , File of ... 
If  ... then  ... Else ..., Case  ...  of,
For  ...  to  ... do, For  ...   downto ... do, While ... do, Repeat ...  until
With, goto, Exit, Halt, Forward, and, or, xor , not, in, div, mod, SHL, SHR 
3. Tên:  Là dãy các kí tự chữ cái hoặc chữ số và dấu gạch nối dùng để xác định các đại lượng khác nhau trong chương trình. 
Qui định đặt tên: 
+ Chiều dài tối đa 127 kí tự. 
+ Không được đặt kí tự chữ số làm kí tự đầu của tên. 
+ Không được đặt tên trùng với từ khoá.
Nên đặt tên có tính gợi nhớ để dễ theo dõi và hiệu chỉnh chương trình, không nên đặt tên quá dài và trùng với các tên chuẩn nêu dươí đây

4. Tên chuẩn:  
      Tên chuẩn là những tên được Pascal đặt trước và định nghĩa sẵn .
       Danh sách các tên chuẩn 
Boolean, Char, Integer, Real, Byte, Text ...
False, True, MaxInt  
Abs, Chr, Cos, Sin, Arctan, Eof, Eoln 
Exp, Ln, Odd, Ord 
Round, Trun , Sqr, Sqrt, Pred, Succ 
Dispose, New, Close, Get, Put, Read, Readln, Write, Writeln, Reset, ReWrite  
... 
 Các kiểu dữ liệu đơn giản và phép toán tương ứng  

 I.   Kiểu số nguyên :

Từ khoá Phạm vi Số byte nhớ
Integer -32768 .. 32767 2 Byte
Byte 0 .. 255 1 Byte
Word 0 .. 65535 2 Byte
ShortInt -128 .. 127 1 Byte
LongInt -2147483648.. 2147483647 4 Byte

Những qui định về kiểu số nguyên :
+ Không gán trị vượt quá phạm vi của kiểu .
+ Các chữ số phải viết liền nhau 
+ Số âm: phải đặt dấu trừ ngay sát chữ số đầu tiên của số
+ Không được sử dụng dấu chấm thập phân .
+ Để viết số dưới dạng cơ số 16 (dạng Hexa) đặt dấu $ sát chữ số đầu .
Các phép toán (operater):
       a) Phép toán số học:
Cộng : +      Cho kết quả là số nguyên
Trừ    : - Cho kết quả là số nguyên
Nhân : * Cho kết quả là số nguyên
Chia  : /      Cho kết quả là số thực  
Div    :  Cho  thương nguyên  của phép chia 
Mod  :  Dư nguyên của phép chia.
       b) Phép toán quan hệ:
=   ( bằng )
>   ( lớn hơn )
<   ( nhỏ hơn )
>= ( Không nhỏ thua )
<= ( Không lớn hơn )
<> ( Khác )
Kết quả của các phép toán quan hệ là Kiểu Boolean (Có 2 giá trị: True, False)

II.   Kiểu thực :

Kiểu Phạm vi Số chữ số có nghĩa Số Byte
Single 1.5E-45  ..   3.4E+38 7-8 4
Real 2.9E-39  ..   1.7E+38 11-12 6
Double 5.0E-324 .. 1.7E+308 15-16 8
Extended 3.4E-4932 .. 1.1E+4932 19-20 10
Comp -9.2E+18  ..  9.2E+18 19-20 8

+ Trong 4 kiểu trên, phạm vi được hiểu như là trị tuyệt đối của phạm vi.
+ Cách viết số ở cột phạm vi là cách viết chữ số kiểu động, 
1.5E-45 = 1.5 * 10 -45 ;  3.4E+38 = 3.4 * 10 38
+ Kiểu số thực với mode thường dùng là Real. Còn các kiểu còn lại phải dùng mode 8087 ( Đầu chương trình phải có hưóng biên dịch {$N+}.)  Các phép toán trên kiểu số thực: Cũng có các phép toán như kiểu nguyên; nhưng không có phép DIV và MOD và kết quả của mọi phép toán trên Real là Real; kết quả của mọi phép toán trên Extended là Extended

III.  Kiểu Boolean:

           Kiểu Boolean chỉ có 2 giá trị: True và False. (trong đó False < True)
           Một giá trị kiểu Boolean chiếm 1 Byte bộ nhớ.
Các phép toán lôgic trên kiểu Boolean:

Phép OR
               True           False
True         True          True
False        True          False

Phép AND
                True          False
True          True         False
False         False        False
Phép XOR
                True         False
True          False       True
False         True        False

Phép NOT
x = True  --> Not (x) = False
x = False --> Not (x)  = True


IV. Kiểu Kí tự:  (Kiểu Char)

Một  kí tự chiếm 1 byte bộ nhớ. Mỗi kí tự tương ứng với 1 mã số, ghi trong bảng mã ASCII (American Standar Code Information Interchange). Có tất cả 256 kí tự đánh số từ Mã số 0 tới mã số 255. Vậy kiểu kí tự có 256 giá trị. Các kí tự từ 0 đến 31 là các kí tự điều khiển, không in ra được, chúng dùng để điều khiển quá trình vào, ra các thiết bị ngoại vi.
Ví dụ: Kí tự có mã số 13 báo hiệu hết dòng trên màn hình và máy in
  Kí tự có mã số 10 chuyển con trỏ màn hình xuống đầu dòng dưới, và chuyển đầu kim in xuống đầu dòng in tiếp theo.
  Kí tự có mã số 7 làm phát chuông kêu ...
Chú ý:
              + Để biểu diễn kí tự , phải đặt kí tự trong dấu nháy. ví dụ: a   A  ] ... hoặc dùng hàm Char ví dụ: Char(97) , Char(65) , Char(93) ... hoặc dùng kí hiệu  #97 , #65 , #93 ...

Sau đây là 1 chương trình nhỏ hiện các kí tự và mã số của chúng lên màn hình :

Uses crt;
Var i : Byte;
BEGIN
      Clrscr; 
For i:=33 to 255 do Write(i:4,Char(i):2,#32#32);
        Readln;
END.

V. Kiểu Xâu kí tự:  (Kiểu String)
Xâu kí tự là dãy các kí tự đặt giữa 2 dấu nháy đơn. Số kí tự của xâu không quá 255.
Các phép toán trên xâu kí tự sẽ đề cập ở phần sau. Có thể tạo ra kiểu xâu kí tự có độ dài n (1<=n<255) bằng khai báo 
  
                        Var       Tên_biến  :  String[n];

C - Dữ liệu kiểu mảng

Khai báo mảng 1 chiều:   
+   Mảng có N phần tử, chỉ số của các phần tử là số nguyên từ 1 đến N 
Type       Tên_kiểu   =  Array[1..N] of  <Kiểu_phần _tử >;
Var         Tên_biến   :   Tên_kiểu ;
+   Mảng có N phần tử, chỉ số của các phần tử là số nguyên từ -1 đến N-2 
Type       Tên_kiểu   =  Array[-1..N-2] of  <Kiểu_phần _tử >;
+   Mảng có 10 phần tử , chỉ số của các phần tử là kí tự từ  A  đến  K 
Type       Tên_kiểu   =  Array[ A  ..  K] of  <Kiểu_phần _tử >;
Khai báo mảng 2 chiều :   
+   Mảng có NxN phần tử , chỉ số của các phần tử là cặp số nguyên từ (i,j) 
Type       Tên_kiểu   =  Array[1..N,1..N] of  <Kiểu_phần _tử >;
Khai báo mảng 3 chiều :   
+   Mảng có N xN xN phần tử , chỉ số của các phần tử là bộ 3 số nguyên từ (i,j,k) 
Type       Tên_kiểu   =  Array[1..N,1..N ,1..N] of  <Kiểu_phần _tử >;

Chú ý  :

Mỗi phần tử thứ i của mảng 1 chiều (mảng A với chỉ số nguyên chẳng hạn) được tương ứng với 1 ô nhớ trong máy  Muốn nạp hoặc lấy giá trị  ô nhớ đó, phải thông qua phần tử thứ i của mảng tương ứng với ô nhớ ấy kí  hiệu là A[i].  
Mỗi phần tử có chỉ số (i,j) của mảng 2 chiều ( mảng A với chỉ số là cặp số nguyên  chẳng hạn được kí hiệu A[i,j] trong đó i là chỉ số hàng, j là chỉ số cột   

Như vậy việc duyệt các giá trị của các phần tử của mảng rất dễ dàng. Song cần lưu ý biến chỉ số của mảng không được vượt ra ngoài phạm vi đã khai báo. Ví dụ Mảng A khai báo có 10 phần tử với chỉ số từ -5 đến 4 thì kí hiệu A[5] là phạm lỗi.
Nhược điểm của kiểu mảng là tốn bộ nhớ do khai báo ban đầu phải lường trước mọi giá trị của dãy nào đó đều được đưa vào mảng, nên kích thước mảng sẽ lớn, nhưng thực tế có thể không dùng hết các phần tử của mảng đã khai báo.

D - Một số hàm thông dụng

1) ABS(x) : giá trị tuyệt đối của x có kiểu như  x

2) SQR(x)  : Bình phương của x có kiểu như x 

3) SQRT(x) : Căn bậc hai của x có kiểu Real

4) Sin(x) : sin của x có kiểu Real

5) Cos(x) : côsin của x có kiểu Real

6) Arctan(x) : a rctg của  x có kiểu Real

7) Ln(x) : Loga cơ số e của  x có kiểu Real

8) Exp(x) : cho  e x

9) Random(n) : Cho một số nguyên ngẫu nhiên từ 0 tới n-1 ( n nguyên )

10) Odd(n)     : cho giá trị  True nếu n lẻ; cho giá trị  False  nếu n chẵn 

11) Round(x) : là số nguyên làm tròn của số thực x  

12) Trunc(x) :  là số nguyên, bằng phần nguyên của số thực x

13) Int(x) :  là số thực, bằng phần nguyên của số thực x

14) Frac(x) : là số thực, bằng phần thập phân của số thực x 

Với các kiểu dữ liệu vô hướng đếm được (Kiểu số nguyên: Integer, Byte, LongInt, ShortInt, Word, Kiểu  Lôgic: Boolean, Kiểu kí tự: Char ) có quan hệ thứ tự nên còn được xây dựng các hàm sau đây :    ORD,  PRED, SUCC

Ví dụ :   
ORD(10)  = 10  ,  PRED(10)  = 9  , SUCC(10)  = 11
ORD(B) = 66  ,  PRED(B) =A  , SUCC(B) =C
ORD(False)  = 0  , ORD(True)    = 1  ,
ORD(3*4=12) = 1  ,    ORD(3*4=11) = 0  ,
PRED(True) = False  , SUCC(False) = True

15) INC(x,k)      :  Tăng số nguyên x lên thêm k đơn vị (x := x+k)
16) DEC(x,k) :  Giảm số nguyên x đi k đơn vị (x := x-k)

E -  Cấu trúc một chương trình dạng đơn giản  

Một chương trình TURBO PASCAL có các thành phần sau:

(* Phần khai báo chương trình *)
Program  Tên_chương_trình;
Uses        Tên _các_ Unit_ cần _thiết ;
Label        Tên_nhãn;
Const  Tên_hằng  =  Giá_trị_của_hằng;
Type Tên_kiểu    :   Kiểu_hằng ;
Var Tên_biến :   Kiểu_biến; 

(* Phần thân chương trình *)
Procedure    Tên_thủ_tục_1(Tên_tham_trị ; Var  Tên_tham_biến : Kiểu_tham_biến);
Uses        Tên _các_ Unit_ cần _thiết ;
Label        Tên_nhãn;
Const  Tên_hằng =  Giá_trị_của_hằng;
Type Tên_kiểu    :   Kiểu_hằng ;
Var Tên_biến :   Kiểu_biến;
Begin
(* Phần thân của thủ tục 1 gồm các lệnh nào đó  *)
  End ;
......

Procedure    Tên_thủ_tục_n(Tên_tham_trị ; Var  Tên_tham_biến : Kiểu_tham_biến);
Uses        Tên _các_ Unit_ cần _thiết ;
Label        Tên_nhãn;
Const  Tên_hằng =  Giá_trị_của_hằng;
Type Tên_kiểu    :   Kiểu_hằng ;
Var Tên_biến :   Kiểu_biến;
Begin
(* Phần thân của thủ tục n gồm các lệnh nào đó  *)
  End ;
Function    Tên_Hàm(Tên_tham_trị; Var  Tên_tham_biến : Kiểu_tham_biến):Kiểu_giá_trị_hàm ;
Uses        Tên _các_ Unit_ cần _thiết ;
Label        Tên_nhãn;
Const  Tên_hằng =  Giá_trị_của_hằng;
Type Tên_kiểu    :   Kiểu_hằng ;
Var Tên_biến :   Kiểu_biến;
Begin
(* Phần thân của hàm gồm các lệnh nào đó  *)
  End ;
BEGIN
(* Thân của chương trình chính gồm các lệnh, trong đó có cả lệnh gọi thủ tục và hàm *)
END.
Chú ý :  Khi khai báo hằng hoặc biến , máy sẽ cấp phát vùng nhớ cho chúng. Giá trị trong vùng nhớ này chính là giá trị của hằng và biến tương ứng. Ví dụ: 
Var x : Integer;
ch : Char;
S : String[30];
y : Real;
nam : Boolean;
thì x được cấp phát vùng nhớ 2 Byte , Ch được cấp phát vùng nhớ 1 Byte, S được cấp phát vùng nhớ 31 Byte, y được cấp phát vùng nhớ 4 Byte, nam được cấp phát vùng nhớ 1 Byte  ...

F-  Bước đầu sử dụng phần mềm TURBO PASCAL 7.0  

TURBO PASCAL  là phần mềm nhằm soạn thảo, sửa chữa, biên dịch và chạy chương trình .

Để khởi động TURBO PASCAN 7.0 cần có tối thiểu 2 File 
+ Turbo.EXE                                            :   403.655 Kb
+ Turbo.TPL ( Chứa các Unit chuẩn )      :     48.432 Kb

Tại dấu mời của DOS ( thường là tại thư mục chứa 2 File trên ) gõ TURBO và ấn ENTER  thì TURBO được nạp vào bộ nhớ. Trên màn hình xuất hiện Local Menu  như sau :

File  Edit  Search  Run  Compile  Debug  Tools  Options  Window  Help
______________________________________________________________________



 F1 Help  F2 Save  F3 Open  Alt+F9 Compile  F9 Make  Alt+F10 Local menu


File, Edit,  Search, Run, Compile, Debug, Tools, Options, Window, Help gọi là các mục chọn của Local Menu. Đó là các nhóm chức năng của TURBO. Để chọn một chức năng nằm trong mục chọn, ấn và giữ phím ALT đồng thời gõ kí tự chữ trắng trong tên mục chọn

Ví dụ :

Ấn và giữ  phím Alt đồng thời  gõ F  để hiện ra menu dọc của mục chọn File như hình sau:


File  Edit  Search  Run  Compile  Debug  Tools  Options  Window  Help

  New            
  Open...      F3
  Save          F2
  Save as...
  Save all
 ------------------
  Change dir...
  Print
  Printer setup...
  DOS shell
  Exit       Alt+X

F1 Help  Create a new file in a new Edit window

Các dòng New, Open, Save, Save as, Save all, Change dir, Print, Print Seup, DOS shell, Exit được gọi là các mục chọn dọc trong Mục chọn File của Local Menu. Đó là từngchức năng riêng của  nhóm này.
Để tìm hiểu kỹ càng về từng nhiệm vụ của các mục chọn dọc nằm trong các Menu dọc, tương ứng với các mục chọn của Local Menu, hãy tìm qua sách khác giới thiệu về Môi trường TURBO. Ở đây chúng ta bước đầu chỉ tìm hiểu một số chức năng chính:

ALT_F +NEW        Mở một trang văn bản mới để  soạn một chương trình mới.
F3    (ALT_F + OPEN) Mở 1 File (File này đã được ghi vào đĩa bây giờ muốn mở ra để  xem lại hoặc sửa đổi, nếu File này chưa có trên đĩa thì phải gõ tên File vào dòng sáng hiện trên màn hình  sau đó soạn chương trình mới).
F2 (ALT_F +SAVE)    Lưu  chương trình  vào File đang mở. Nếu chương trình này là chương trình mới và chưa được đặt tên thì màn hình hiện lên một khung yêu cầu đặt tên File cho chương trình mới này.
ALT_F +SAVE  AS    Lưu chương trình vào File với tên khác (phải nhập tên mới vào)
ALT_X    (ALT_F +EXIT)  Để thoát khỏi soạn thảo chương trình, kết thúc TURBO trở về môi trường cũ.

F9          Để biên dịch chương trình   
CTRL_F9        Để chạy toàn bộ chương trình 
F7 Lần theo dõi từng dòng lệnh
F8 Lần theo dõi từng dòng lệnh trong chương trình chính .
CTRL_F7    Theo dõi giá trị của các biến khi cho chạy F7 hoặc F8

Trong khi soạn và thử nghiệm và chạy chương trình, có thể dùng nhiều loại cửa số khác nhau trên màn hình. Cửa sổ nào có con trỏ được gọi là cửa sổ hiện hành.
F6 Để chuyển từ cửa sổ này sang cửa sổ kia.
F5 Để phóng to hoặc thu nhỏ cửa sổ hiện hành.   
CTRL_F5 Sau đó dùng phím  mũi tên (     ) di chuyển cửa sổ hiện hành đến vị trí thích hợp, hoặc dùng SHIFT + phím  mũi tên (     ) để thay đổi kích thước cửa sổ, cuối cùng  ENTER                    
Alt_F3 Để đóng cửa sổ soạn thảo hiện hành (có con trỏ).

Trong khi soạn thảo chương trình thường dùng các thao tác sau :

+ Phím ENTER  (  )   Đưa con trỏ về đầu dòng tiếp theo
+ Phím  mũi tên  (       ) Di chuyển con trỏ 
+ HOME Đưa con trỏ về đầu dòng
+ END Đưa con trỏ về cuối dòng
+ CTRL_HOME Đưa con trỏ về đầu trang
+ CTRL_ END Đưa con trỏ về cuối trang

+ CTRL_PAGE UP Đi lên 1 trang  màn hình văn bản 
+ CTRL_ PAGE DOWN Đi xuống 1 trang màn hình văn bản

+ Phím DEL Xoá kí tự tại vị trí con trỏ
+ Phím BACK SPACE  Xoá kí tự ngay bên trái vị trí con trỏ 
+ Phím SPACE BAR Tạo 1 kí tự trống
+ SHIFT_Phím mũi tên(       ) Đánh dấu khối 
+CTRL_INSERT Chép khối đánh dấu vào CLIPBOARD 
+SHIFT_INSERT Chép CLIPBOARD vào văn bản hiện thời (tại vị trí con trỏ)
+CTRL_C Chép khối đánh dấu vào văn bản hiện thời (tại vị trí con trỏ)
+CTRL_V Chuyển khối đánh dấu vào vị trí mới trong văn bản hiện thời
+CTRL_DEL Xoá đoạn văn bản đã đánh dấu khối
+CTRL_K + H Xoá hộp sáng trên đoạn văn bản đã đánh dấu

+CTRL_F1 Hiện màn hình giúp đỡ tương ứng với từ tại vị trí con trỏ
+SHIFT_F1 Hiện bảng giúp đỡ sử dụng các lệnh, thủ tục, hàm, toán tử, ...
G - Thủ tục vào ra dữ liệu, thủ tục liên quan màn hình 

1 )  WRITE (danh sách kết quả ra);  sẽ lần lượt ghi ra trên dòng màn hình các giá trị tương ứng với các biến và các hằng, bắt đầu ghi từ vị trí hiện thời của con trỏ màn hình.
2 )  WRITELN (danh sách kết quả ra);  sẽ lần lượt ghi ra trên dòng màn hình các giá trị tương ứng với các biến và các hằng, bắt đầu ghi từ vị trí hiện thời của con trỏ màn hình. Ghi xong, con trỏ màn hình tự động dời xuống đầu dòng tiếp theo của màn hình.

3)  WRITELN;  Lệnh chuyển con trỏ xuống đầu dòng dưới.

4) READLN(danh sách tên biến);  Nhập từ bàn phím lần lượt các giá trị  cho các biến được nêu trong danh sách. Sau khi gõ giá trị của biến cuối cùng thì gõ ENTER. Con trỏ trên màn hình tự động chuyển xuống dòng dưới. 

5) READLN;    Lệnh dừng chờ cho đến khi gõ ENTER  mới thi hành lệnh tiếp theo và con trỏ chuyển xuống đầu dòng dưới.

6) Gotoxy(x1,y1);  Lệnh di chuyển con trỏ màn hình tới vị trí cột x1, dòng y1. (Trên màn hình ở chế độ  25 line  trang màn hình  có 25 dòng, 80 cột)

7) Textcolor(n);       với n là số nguyên từ 0 tới 15: Đặt chế độ màu cho chữ viết trên màn hình.

8) TextBackGround(n);  Đặt chế độ màu cho màn hình.

9) Clrscr;              Xoá sạch trên trang màn hình 

Lưu ý 1: Khi nhập giá trị cho các biến bằng lệnh Readln(ds biến ), máy chưa thực hiện lệnh tiếp theo của chương trình, chỉ khi gõ ENTER  máy nạp giá trị vào các vùng nhớ tương ứng với các biến, sau đó mới thực hiện lệnh tiếp theo.

Lưu ý 2: Để kiểm tra dữ liệu nhập vào có đúng kiểu đã khai báo không, dùng hàm IoResult(Kiểu Boolean) theo dõi với chế độ hướng dẫn biên dịch là  {$I-}. Sau khi nhập giá trị cho biến   (x  chẳng hạn) nếu giá trị của hàm IoResult = 0 thì giá trị nhập cho x là đúng; ngược lại nếu IoResult <>0 thì nhập sai. Ví dụ : Đoạn chương trình nhập giá trị cho biến  x nguyên dương là:

Uses   Crt;
Var      x  : Integer;
Begin
Repeat
  Write(Nhap gia tri x = );
{$I-}   Readln(x); {I$+}
Until  (IoResult =0) and ( x>0);
            Readln
End.


Nguồn: ST -- đang chỉnh sửa

1. Qua cầu


Kết quả hình ảnh cho qua cầu
Bốn người cần đi qua một chiếc cầu. Do cầu yếu nên mỗi lần đi không quá hai người, và vì trời tối nên phải cầm đèn mới đi được. Bốn người đi nhanh chậm khác nhau, qua cầu với thời gian tương ứng là 10 phút, 5 phút, 2 phút và 1 phút. Vì chỉ có một chiếc đèn nên mỗi lần qua cầu phải có người mang đèn trở về cho những người kế tiếp. Khi hai người đi cùng nhau thì qua cầu với thời gian của người đi chậm hơn. Ví dụ sau đây là một cách đi:
  • Người 10 phút đi với người 5 phút qua cầu, mất 10 phút.
  • Người 5 phút cầm đèn quay về, mất 5 phút.
  • Người 5 phút đi với người 2 phút qua cầu, mất 5 phút.
  • Người 2 phút cầm đèn quay về, mất 2 phút.
  • Người 2 phút đi với người 1 phút qua cầu, mất 2 phút.
  • Thời gian tổng cộng là 10+5+5+2+2 = 24 phút.
Em hãy tìm cách đi khác với tổng thời gian càng ít càng tốt, và nếu dưới 19 phút thì thật tuyệt vời!

code tham khảo