Hướng Dẫn Download & Cài Đặt Hate Pascal If You Can

Link download :   https://goo.gl/U2Wxnu Home:  http://hatepascalifucan.byethost3.com/

Thứ Sáu, 31 tháng 3, 2017

CHƯƠNG TRÌNH CON VÀ ÐƠN VỊ CHƯƠNG TRÌNH Phần 3



Lập trình một bài toán lớn rất phức tạp và vất vả nếu nó phải sử dụng nhiều thuật toán lập đi lập lại. Việc tạo ra nhiều mẫu chương trình con nhằm giảm nhẹ công việc của một lập trình viên (programmer). Tuy nhiên, mỗi chương trình con chỉ có ứng dụng được trong chính chương trình chứa nó mà thôi. Ðể khỏi mất thời gian để viết lại chúng, người ta biến mỗi chương trình con thành các module độc lập, được biên dịch sẵn và lưu trữ trên đĩa như một thư viện. Khi cần ta cứ việc gọi các module này ra mà không cần phải viết lại chúng. Mỗi module như vậy được gọi là một đơn vị chương trình, hay gọi tắt là UNIT. 
           Khái niệm Unit đã được vào sử dụng từ chương trình Pascal version 4.0 trở đi. Có hai loại Unit là các Unit chuẩn do Turbo Pascal tạo sẵn và các Unit tự tạo do người lập trình tự viết ra.

a. Một số Unit chuẩn trong Turbo Pascal 5.5 trở đi 
* Unit SYSTEM           : gồm các hằng, biến, kiểu, hàm, thủ tục trong version 3.0
* Unit CRT                  : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
                chế  độ Text của version 5.5
* Unit PRINTER          : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
   chế độ in ấn.           
* Unit GRAPH             : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
   chế độ đồ thị của version 5.5
* Unit TURBO3           : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
                                                   chế  độ Text của version 3.0
* Unit GRAPH3           : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
                                                  chế độ đồ thị của version 3.0
* Unit DOS                 : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến hệ                                          điều hành MS-DOS
* Unit OVERLAY         : gồm các hằng, biến, kiểu, hàm, thủ tục liên quan đến
  việc truy xuất đĩa phủ lấp khi chạy chương trình. 
            Các Unit trên được lưu trữ trong tập tin TURBO.TPL của Turbo Pascal. 
            Chúng ta có thể sử dụng chương trình TPUMOVER.EXE để lấy ra hoặc đưa vào một hay nhiều Unit nhằm tiết kiệm bộ nhớ hay tăng cường tiện ích sử dụng.
  b. Cách gọi Unit
Muốn sử dụng UNIT thì trong đầu chương trình ta phải khai báo Unit theo cú pháp sau: 
                        USES <Tên Unit> [ { , <Tên Unit> } ] ; 
Ví dụ 7.10                    USES  CRT, GRAPH ;
Ðặc biệt, chỉ riêng Unit SYSTEM thì không cần phải khai báo.
  c. Một số thủ tục và hàm trong Unit CRT
* ClrScr          : thủ tục xóa màn hình
* ClrEol           : thủ tục xóa ký tự bên phải con trỏ màn hình, sau khi xóa con trỏ                  vẫn ở tại chỗ
* InsLine         : thủ tục xen vào một hàng ở vị trí con trỏ màn hình
* DelLine         : thủ tục xóa bỏ một hàng ở vị trí con trỏ màn hình
* GotoXY(XPos, Ypos): đưa con trỏ màn hình về vị trí có tọa độ Xpos và
                                                Ypos.   X có giá trị từ 1 - 80, và Y có giá trị từ 1 - 25
* Delay(time): tạo thời gian trễ tính theo milisecond. Time là một số nguyên
           dùng để làm chậm chương trình cho ta kịp quan sát dữ liệu
* Sound(F)      :   thủ tục tạo ra âm thanh với tần số F (hz). F là số nguyên
* NoSound      :   thủ tục tắt âm thanh
* LowVideo và NormVideo: thủ tục màn hình, khi gọi LowVideo thì mọi ký tự viết ra màn hình có độ sáng yếu dần đi cho đến khi nhận thủ tục NormVideo mới về độ sáng bình thường.
* TextBackGround (color):  thủ tục chọn màu nền, color  cho ở bảng (từ 1 -7)
* KeyPressed: hàm cho giá trị kiểu kết quả Boolean, cho giá trị là True nếu có một phím được bấm.
* TextColor (color):  thủ tục chọn màu chữ, color lấy ở bảng 
               Các hằng số màu của CRT unit
Hằng số color
Màu hiển thị
Giá trị
Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White
Ðen
Xanh da trời
Xanh lá cây
Xanh lơ
Ðỏ
Tím
Nâu
Xám nhạt
Xám đậm
Xanh da trời nhạt
Xanh là cây nhạt
Xanh lơ nhạt
Ðỏ nhạt
Tím nhạt
Vàng
Trắng
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
             Ðể tạo ra màu nhấp nháy, ta cộng thêm hằng số Blink của CRT vào bất kỳ màu chữ mà ta chọn. Ta không thể làm nhấp nháy màu nền. 
Ví dụ để trình bày chữ vàng trên nền xanh, ta viết:
                        TextColor(Yellow) ;     TextBackground(Blue) ;
Muốn có một dòng chữ đỏ nhấp nháy thì ra lệnh:     
            TextColor(Red + Blink) ; 
* ReadKey : hàm có kiểu kết quả là Char, khi nhấn các phím chức năng trên bàn phím thì có kết quả là 1 ký tự mã ASCII. Nếu ký tự đầu tiên do ReadKey trả về bằng ASCII 0 thì ký tự kế theo sẽ chỉ định phím như ở bảng dưới. Các phím Home, phím mũi tên, ... luôn tạo nên một ký tự đi theo ASCII 0. Các phím chức năng từ F1 đến F10 sinh ra một trong 4 ký tự tùy theo ta dùng với tổ hợp phím Alt, Ctrl hay Shift hay dùng một mình.
                                                   Các phím chức năng đặc biệt
Tên phím
Bình thường
Alt
Ctrl
Shift
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
Home
  .­
PageUp
  . ¬
  ® .
End
   ¯ .
PageDn
Ins
Del
: (59)
< (60)
= (61)
> (62)
? (63)
@ (64)
A (65)
B (66)
C (67)
D (68)
G (71)
H (72)
I (73)
K (75)
M (77)
O (79)
P (80)
Q (81)
R (82)
S (83)
h (104)
i (105)
j (106)
k (107)
l (108)
m (109)
n (110)
o (111)
p (112)
q (113)
^ (94)
- (95)
. (96)
a (97)
b (98)
c (99)
d (100)
e (101)
f (102)
g (103)
T (84)
U (85)
V (86)
W (87)
X (88)
Y (89)
Z (90)
[ (91)
\ (92)
] (93)



Ðể tạo ra một Unit của mình cần đi qua các bước sau:
Bước 1 :         Tạo ra một file Unit có phần mở rộng là .PAS với bố cục sau:
UNIT <Tên Unit> ; (* Chú ý : Tên Unit phải trùng với tên File *)
INTERFACE          (* Chú ý : Phần giao diện với bên ngoài, không có dấu ; ở đây *)
            [Uses <danh sách các unit>];  {Khai báo các unit dùng trong chương trình }
            [Khai báo các hằng, kiểu, biến dùng chung] ;
            [Khai báo các thủ tục, hàm (tên, danh sách tham số của thủ tục và hàm] ;
IMPLEMENTATION     (* Cài đặt các hàm, thủ tục của Unit, không có dấu ; ở đây *)
                       [Các khai báo kiểu, hằng, biến cục bộ ];
            [Nội dung cài đặt các thủ tục, hàm của unit ];
[BEGIN]                       (* Phần khởi tạo : Initialization Part *)
                       [Các lệnh khởi tạo ];
END.                           (* Dù có BEGIN để khởi tạo hay không, ở đây vẫn có END. *)
Bước 2 :         Dịch file này lên đĩa theo trình tự sau:
i). Gõ Alt - C  để vào Menu COMPILE
ii). Ði đến mục Destination và nhấn Enter để chương trình tự động đổi Memory thành Disk
iii). Gõ C (hoặc F9) để biên dịch chương trình tạo nên một file   .TPU
iv). Khi dịch xong gõ một phím bất kỳ. Sau đó ta có thể lập lại bước a và b
để chuyển Destination từ Disk sang Memory.

Ví dụ  7.11:    Tạo một UNIT tính Cộng, Trừ, Nhân, Chia cho học sinh tiểu học.

            Tên file Unit là TTIEUHOC.PAS với nội dung sau: 

UNIT  TTieuHoc ;                                {Phần đầu : Chương trình Toán Tiểu học }

INTERFACE                                        {Phần giao diện}

            PROCEDURE Cong (Var So1, So2, So3 : Real) ;

            PROCEDURE Tru    (Var So1, So2, So3 : Real) ;

            PROCEDURE Nhan (Var So1, So2, So3 : Real) ;

            PROCEDURE Chia   (Var So1, So2, So3 : Real) ;

INPLEMENTATION                             {Phần cài đặt }

            PROCEDURE Cong ;

            BEGIN

                        IF So1 + So2 = So3 THEN Writeln ('Giỏi lắm ! Em đã làm đúng! ')

                        ELSE Writeln (' Rất tiếc, em đã làm sai ! ');

            END;

            PROCEDURE Tru ;

            BEGIN

                        IF So1 - So2 = So3 THEN Writeln (' Giỏi lắm ! Em đã làm đúng!')

                        ELSE Writeln (' Rất tiếc, em đã làm sai ! ');

            END;

            PROCEDURE Nhan ;

            BEGIN

                        IF So1 * So2 = So3 THEN Writeln ('Giỏi lắm ! Em đã làm đúng !')

                        ELSE Writeln (' Rất tiếc, em đã làm sai ! ');

            END;

            PROCEDURE Chia ;

            BEGIN

                        IF So2 = 0 THEN Writeln ('Số chia phải khác 0')

                                    ELSE

                                    IF So1 / So2 = So3 THEN Writeln ('Giỏi lắm! Em đã làm đúng! ')

                        ELSE Writeln (' Rất tiếc, em đã làm sai ! ');

                        END;

END.                                       {Chấm dứt UNIT } 
Sau khi gõ chương trình Unit trên, đổi Compile Destination thành Disk, biên dịch và tạo tập tin TTIEUHOC.TPU trên đĩa. 
Chương trình Pascal cho bài toán Cộng, trừ, Nhân, Chia dùng Unit TTIEUHOC: 

PROGRAM Toan_Tieu_Hoc ;

USES  CRT, TTieuHoc ;

VAR

            chon : Integer ;

            So1, So2, So3 : Real ; 

            PROCEDURE            Menu (Var chon : integer) ;

                        BEGIN

                                    ClrScr ;

                                    Writeln (' == TOÁN TIỂU HỌC == ') ;

                                    Writeln (' =    0.   Chấm dứt         = ') ;

                                    Writeln (' =    1.   Toán cộng         = ') ;

                                    Writeln (' =    2.   Toán trừ            = ') ;

                                    Writeln (' =    3.   Toán nhân        = ') ;

                                    Writeln (' =    4.   Toán chia          = ') ;

                                    Writeln (‘ ================== ‘) ;

                                    Write     (' Bạn chọn số mấy ?  ') ;

                                    Readln (chon);

                        END ; 

            PROCEDURE  nhapso (Var So1, So2, So3 : real );

                        BEGIN

                                    Write (' Nhập vào số thứ 1 :    ') ;  Readln(So1) ;

                                    Write (' Nhập vào số thứ 2 :    ') ;  Readln(So2) ;

                                    Write (' Kết quả là             :    ') ;  Readln (So3) ;   

                        END ; 

{=====================Chương Trình Chính  ========================}

            BEGIN

                   CLRSCR;

                   REPEAT

                        Menu (chon) ;

                        CASE chon OF

                                    1 : BEGIN

                                                Writeln ;

                                                Writeln (' ==  Toán cộng == ') ;

                                                Nhapso(So1, So2, So3) ;

                                                Cong(So1, So2, So3) ;

                                         END; 

                                    2 : BEGIN

                                                Writeln ;

                                                Writeln (' ==  Toán trừ == ') ;

                                                Nhapso(So1, So2, So3) ;

                                                Tru(So1, So2, So3) ;

                                         END;                       

                                    3 : BEGIN

                                                Writeln ;

                                                Writeln (‘ ==  Toán nhân == ‘) ;

                                                Nhapso(So1, So2, So3) ;

                                                Nhan(So1, So2, So3) ;

                                         END;                       

                                    4 : BEGIN

                                                Writeln ;

                                                Writeln (‘ ==  Toán chia == ‘) ;

                                                Nhapso(So1, So2, So3) ;

                                                Chia(So1, So2, So3) ;

                                         END;

                                    END;  {case}

                                    Writeln (' Gõ bất kỳ phím nào để tiếp tục ... ');

                                    Readln;

                        UNTIL chon = 0;

            END.                                       {Ngưng làm toán}

CHƯƠNG TRÌNH CON VÀ ÐƠN VỊ CHƯƠNG TRÌNH Phần 2



Khi truyền tham số trong Pascal, đòi hỏi phải có sự tương ứng về tên của kiểu dữ liệu của các tham số hình thức và tham số thực. Một số định nghĩa và qui tắc về truyền tham số trong Pascal: 

CHƯƠNG TRÌNH CON VÀ ÐƠN VỊ CHƯƠNG TRÌNH Phần 1

Khi lập trình, chúng ta thường có những đoạn chương trình hay phép tính lặp lại nhiều lần. Nếu mỗi lần lặp lại, ta phải viết những đoạn lệnh như nhau thì chương trình của chúng ta trở nên dài dòng, rối rắm và mất thời gian vô ích.

CÁC THỦ TỤC XUẤT/NHẬP Phần 2

4. Cấu trúc lặp

a. Lệnh FOR
 Cấu trúc FOR cho phép lặp lại nhiều lần một dãy lệnh. Số lần lặp lại dãy lệnh đã biết trước. Phát biểu FOR có 2 dạng: 
            FOR .. TO .. DO                     đếm lên
            FOR .. DOWNTO ..DO          đếm xuống 
* Cú pháp tổng quát là:       
            FOR <biến đếm> := <trị đầu> TO/DOWNTO <trị cuối>  DO <Công việc>;

            * Lưu đồ:
                                        
     Hình 6. 6:  Lưu đồ phát biểu FOR .. TO .. DO 
Chú ý:  Trị đầu, trị cuối là các biến hoặc hằng và biến đếm phải là kiểu rời rạc.

Ví dụ 6.15:   Chương trình in một dãy số từ  0 đến 9
            PROGRAM Day_So ;

            VAR    

                        i : Integer ;

            BEGIN

                        FOR  i := 0 TO 9  DO Write (i) ;

                        Readln ;

            END.
 b. Lệnh WHILE .. DO
* Lưu đồ của lệnh
Description: https://websrv1.ctu.edu.vn/coursewares/khoahoc/tinhocdc/images/ch6/ch6.ht125.gif
Hình 6. 7:  Lưu đồ cấu trúc WHILE .. DO 
* Ý nghĩa lưu đồ:
Trong khi mà điều kiện còn đúng thì cứ thực hiện Công việc, rồi quay trở về kiểm tra điều kiện lại. Vòng lặp được tiếp tục, đến khi điều kiện đặt ra không còn đúng nữa thì đi tới thực hiện lệnh tiếp theo 
            * Cú pháp
                                    WHILE <điều kiện> DO <Công việc>
 Description: https://websrv1.ctu.edu.vn/coursewares/khoahoc/tinhocdc/images/ch6/ch6.ht126.gif
Hình 6.8:  Sơ đồ cú pháp  lệnh WHILE .. DO 
Ghi chú:
  · Ðiều kiện trong cấu trúc lặp WHILE .. DO là một biểu thức logic kiểu Boolean chỉ có 2 giá trị là Ðúng (True) hoặc Sai (False)
  · Nếu điều kiện Ðúng thì chương trình sẽ chạy trong cấu trúc WHILE .. DO.
 · Sau mỗi lần lặp, chương trình trở lại kiểm tra điều kiện. Tùy theo biểu thức logic của điều kiện là Ðúng hay Sai thì chương trình sẽ thực hiện Công việc tương ứng.
  · Nếu Sai thì chuyển xuống dưới cấu trúc WHILE .. DO 




Ví dụ 6.16:  Chương trình tính trung bình n số:  x1 + x2 + x3 + ... + xn
  
              Program Trung_binh_Day_So ;

              VAR

                        n, count : Integer ;

                        x, sum, average : real ;

              BEGIN

                        count := 1 ;

                        sum   := 0 ;

                        Write (' Nhập n = ') ;

                        readln (n) ;

                        WHILE  count  < n+1  DO

                                    BEGIN

                                                Write (' Nhp giá tr thứ' , count,' ca x = ' ) ;

                                                readln (x) ;

                                                sum  := sum + x ;

                                                count := count + 1 ;

                                    END ;

                        average  :=  sum/n ;

                        Writeln (' Trung bình là ='  , average : 10 : 3 ) ;

                        Writeln (' Nhn Enter để thoát ...' ) ;

                        Readln ;

              END.
c. Lệnh REPEAT .. UNTIL
   Câu lệnh REPEAT .. UNTIL dùng trong các trường hợp khi biến điều khiển không có kiểu rời rạc và đặc biệt trong các trường hợp số lần lặp không biết trước.
Hình 6.9:  Lưu đồ cấu trúc của REPEAT .. UNTIL 
* Ý nghĩa câu lệnh:
Nếu điều kiện logic là Sai (False)  thì lặp lại lệnh cho đến khi điều kiện Ðúng  thì mới thoát ra khỏi cấu trúc REPEAT .. UNTIL. 
Nếu có nhiều câu lệnh thì mỗi lệnh ngăn cách nhau bằng dấu chấm phẩy (;)Công việc của REPEAT và UNTIL không nhất thiết phải dùng lệnh ghép để nhóm từ 2 lệnh đơn trở lên thành công việc.
 
Hình 6.10:  Sơ đồ cú pháp REPEAT .. UNTIL 
Ví dụ 6.17:  Với bài toán trung bình cộng một dãy số ở ví dụ trước có thể viết theo cấu trúc REPEAT .. UNTIL như  sau: 
              PROGRAM Trung_binh_Day_So ;

              VAR   n, count : Integer ;

                        x, sum : real ;

              BEGIN

                        count := 1 ;

                        sum   := 0 ;

                        Write := (' Nhập n = ') ;  readln (n) ;

                                    REPEAT

                                                Write (' Nhập giá trị thứ' , count, 'của x =  ') ;

                                                readln(x) ;

                                                sum  := sum + x ;

                                                count := count + 1 ;

                                    UNTIL count > n ;

                        Writeln (' Trung bình là ='  , sum/n : 8 :2 ) ;

                        Readln ;

              END. 
Ghi chú:
 
 
So sánh 2 cách viết WHILE .. DO và REPEAT .. UNTIL ta thấy có sự khác biệt: 
 
 
- Trong cấu trúc WHILE .. DO thì <Ðiều kiện> được kiểm tra trước, nếu thỏa <Ðiều kiện> thì mới thực hiện <Công việc>. 
 
 
- Ngược lại, trong cấu trúc REPEAT .. UNTIL thì <Công việc> sẽ được thực thi trước sau đó mới kiểm tra <Ðiều kiện>, nếu không thỏa <Ðiều kiện> thì tiếp tục thi hành <Công việc> cho đến khi <Ðiều kiện> là đúng. 
 
 
Lệnh REPEAT .. UNTIL thường được sử dụng trong lập trình, nhất là lúc người sử dụng muốn tiếp tục bài toán ở trường hợp thay đổi biến mà không phải trở về chương trình và nhấn tổ hợp phím Ctrl + F9 lại. 


Ví dụ 6.18:       Nhân 2 số a và b 
            PROGRAM Tich;

            VAR     a, b : integer ;

                                    CK : char ;

            BEGIN

                                    REPEAT

                                                Write (' Nhập số a = '); Readln (a) ;

                                                Write (' Nhập số b = '); Readln (b) ;

                                    Writeln (' Tích số của a x b là :' , a*b : 10 ) ;

                                                Writeln (' Tiếp tục tính nữa không (CK) ? ');

                                                Readln (CK) ;

UNTIL upcase(CK) = K; {hàm chuyển đổi ký tự trong biến}
                                              {CK thành ký tự in hoa}

                        END.