1. Giới thiệu về ngôn ngữ lập trình là gì ?



tải về 0.58 Mb.
trang1/6
Chuyển đổi dữ liệu30.08.2016
Kích0.58 Mb.
#28832
  1   2   3   4   5   6
NGÔN NGỮ LẬP TRÌNH TURBO PASCAL
CHƯƠNG I: CẤU TRÚC CỦA CHƯƠNG TRÌNH PASCAL
1. Giới thiệu về ngôn ngữ lập trình

1.1. Ngôn ngữ lập trình là gì ?

Ngôn ngữ lập trình là một hệ thống các kí hiệu, hệ thống các quy tắc cú pháp và một bộ các chỉ thị (hay còn gọi là câu lệnh) dùng để viết các thuật toán giải các bài toán thành các chương trình máy tính. Những chương trình này sẽ được đưa vào máy "chạy" để tính toán, xử lí bài toán.

Ngôn ngữ lập trình ra đời cùng với sự ra đời của MTĐT vì khi MTĐT ra đời đương nhiên người ta phải nghĩ đến việc xây dựng ngôn ngữ cho chúng. Các thế hệ MTĐT liên tục phát triển, do đó ngôn ngữ lập trình cũng phát triển theo. Có nhiều loại ngôn ngữ lập trình khác nhau, từ ngôn ngữ bậc thấp chuyển lên ngôn ngữ bậc cao.

+ Ngôn ngữ bậc thấp (ngôn ngữ máy): Chỉ sử dụng 2 kí hiệu 0 và 1 để mã hoá mọi đại


lượng và phép toán. Ngôn ngữ này có ưu điểm là chương trình chạy nhanh, không phải qua
khâu dịch. Tuy nhiên những chương trình viết bằng ngôn ngữ này rất cồng kềnh, viết mất rất
nhiều thời gian, dễ sai sót, khó kiểm tra; mặt khác mỗi loại máy có một ngôn ngữ máy riêng.

+ Ngôn ngữ tập hợp: Khắc phục một số nhược điểm trên người ta nghĩ cách thay thế một số mã nhị phân bằng các chữ cái và cho ra đời ngôn ngữ tập hợp (còn gọi là ngôn ngữ kí hiệu). Ưu điểm là việc lập trình đã dễ dàng hơn, tuy nhiên cần phải có chương trình dịch từ ngôn ngữ tập hợp ra ngôn ngữ máy, và vẫn còn phụ thuộc vào từ máy.

+ Ngôn ngữ bậc cao: Chương trình được viết gần với ngôn ngữ tự nhiên của con người, do đó dễ dàng cho người lập trình, tuy nhiên chương trình sẽ chạy chậm hơn. Năm 1958, ALGOL - ngôn ngữ lập trình bậc cao đầu tiên ra đời. Năm 1960 nó được bổ sung, chỉnh lí và có ảnh hưởng sâu sắc đến các ngôn ngữ lập trình bậc cao sau này như FORTRAN, C, BASIC, PASCAL,...
1.2. Turbo Pascal

PASCAL là ngôn ngữ lập trình bậc cao của tác giả Niklaus Wirth (giáo sư người Thuỵ sĩ), được công bố vào đầu những năm 1970. Tên PASCAL là để kỉ niệm nhà Toán học người Pháp B. Pascal.

- PASCAL là ngôn ngữ lập trình có tính cấu trúc và tính hệ thống: các kiểu dữ liệu đa
dạng, các cấu trúc điều khiển chặt chẽ, các cấu trúc khối trong chương trình rõ ràng...
- PASCAL là ngôn ngữ lập trình có định kiểu rõ ràng: các đại lượng (biến và hằng) đã
được khai báo để sử dụng với kiểu dữ liệu này thì không thể đem dùng lẫn với kiểu khác.
- PASCAL ban đầu được sáng tác để làm ngôn ngữ dạy học cho những người mới học lập trình. Đặc tính sáng sủa, dễ hiểu, dễ đọc của nó giúp người mới học có thể viết một chương trình máy tính một cách dễ dàng. Sau khi ra đời, do có nhiều ưu điểm, PASCAL đã được nhiều hãng máy tính phát triển và cài đặt cho nhiều hệ thống máy tính, như: ISO PASCAL
(PASCAL chuẩn ), ANSI PASCAL v.v. Phổ biến nhất hiện nay ở nước ta cũng như trên thế
giới là việc cài đặt TURBO PASCAL cho các hệ thống máy tính. TURBO PASCAL được hãng BORLAND INTERNATIONAL hoàn thiện với các ưu điểm là chương trình viết gọn,dịch nhanh, không ngừng được cải tiến đáp ứng yêu cầu của người sử dụng. TURBO PASCAL đã được phát triển qua các phiên bản ngày càng mở rộng và phức tạp. Việc khai thác sâu các tính năng của từng phiên bản là do khả năng và nhu cầu của người lập trình. Giáo trình này chọn version 5.0 làm chuẩn để minh hoạ, tuy nhiên người đọc có thể áp dụng cho các phiên bản sau này như 6.0, 7.0.

2. Yêu cầu phần mềm và cách khởi động

2.1. Yêu cầu phần mềm

Phần mềm TURBO PASCAL có khá nhiều File, tuy nhiên để có thể bước đầu học và sử dụng được, trên đĩa cần có tối thiểu các file sau:

- TURBO.EXE: file chính, chứa cả chương trình dịch, hệ soạn thảo và các dịch vụ gỡ rối...

- TURBO.TPL: là thư viện các chương trình mẫu có sẵn của TURBO PASCAL

- Nếu có sử dụng đồ hoạ thì cần chép thêm đơn vị GRAPH.TPU và một số file phụ trợ khác tuỳ theo kiểu màn hình và kiểu chữ sử dụng.

2.2. Khởi động và thoát TURBO PASCAL

Thông thường các file nói trên nằm trong thư mục TP (hoặc TURBO hay TP5, TP7 tuỳ theo phiên bản hay người sử dụng)

Ta chuyển vào thư mục này bằng lệnh CD TP, sau đó gõ TURBO . Màn hình sẽ hiện ra như sau:
- Dòng 1: là dòng menu chính, trên đó có ghi các mục cơ bản nhất để người sử dụng có thể chọn bằng cách ấn đồng thời Alt+ chữ cái đầu của mục. Ví dụ: Alt+F để mở mục File.
- Dòng 2: là dòng trạng thái, cho người dùng biết một số thông số soạn thảo như toạ độ con trỏ, chế độ soạn thảo là viết chèn hay viết đè, tên tệp đang làm việc...
- Dòng cuối cùng là dòng hướng dẫn, nhắc người sử dụng một số phím chức năng chính.
Phần màn hình rộng ở giữa là phần soạn thảo để ta nhập và chạy chương trình. Người mới học lập trình nên ghi nhớ ngay các phím chức năng:

F2 ghi tệp đang soạn thảo vào đĩa. Nếu chưa đặt tên sẽ có thông báo để ta gõ tên vào (tên được đặt theo quy định của MS-DOS )

F3 mở tệp mới

Alt+F9 dịch chương trình

Ctrl+F9 dịch và cho chạy chương trình

Alt+X Kết thúc PASCAL trở về hệ điều hành



3. Những quy định về cách viết biểu thức và chương trình

3.1. Bộ kí tự

TURBO PASCAL sử dụng bộ chữ viết như sau:

- Bộ 26 chữ cái Latinh: A, B, ..., Z ; a, b, ..., z

- Bộ các chữ số: 0, 1, ..., 9

- Các kí hiệu Toán học: +, -, * , /, =, <, >, ...

- Dấu gạch nối, dấu chấm, dấu ngoặc và các kí hiệu đặc biệt khác: _ . , ; ? [ ] ( ) $ % ...



3.2 Từ khóa

Từ khoá là một số từ dành riêng của TURBO PASCAL, những từ này đã được gán sẵn những chức năng đặc biệt, ta không được dùng vào việc đặt tên hay các công việc khác.


Sau đây là một số từ quan trọng, bạn đọc sẽ lần lượt biết các từ khoá và chức năng của từng từ qua các bài học.

- Các từ khoá chung: Program, begin, end

- Các từ khoá để khai báo: uses, const, type, label, var
procedure, function

array, string, record, ...

- Các từ khoá lệnh:

if... then... else...

case ...of ...

for .... to ... do...


while... do...
repeat... until...

- Một số tên chuẩn:

Boolean, char, integer, real,
read, readln, write, writeln,
abs, cos, sin, sqrt, exp...
3.3 Tên

Tên là một dãy kí tự dùng để chỉ tên các đại lượng như tên hằng, tên biến, tên kiểu hay tên chương trình con. Tên được đặt theo quy tắc sau: bắt đầu bởi một chữ cái, rồi đến chữ số hay dấu gạch nối và không dài quá 127 kí tự (!). Tên thường được đặt mang tính gợi nhớ. TURBO PASCAL không phân biệt chữ hoa và chữ thường khi viết từ khoá hay tên.

Ví dụ : khi viết chương trình giải phương trình bậc 2, ta có thể đặt tên chương trình là GIAI_PHUONG_TRINH_BAC2, đặt tên biến chứa biệt thức ∆ là delta (không được dùng kí hiệu ∆), đặt tên các nghiệm là X1 và X2,...

- Dấu chấm phảy (;) dùng để ngăn cách các câu lệnh trong một chương trình

- Lời giải thích được đặt trong cặp dấu (* ... *) hoặc { ... }, các nội dung được chứa trong cặp dấu này sẽ bị chương trình bỏ qua trong khi dịch.


4. Cấu trúc chung của một chương trình PASCAL

Ta hiểu một chương trình máy tính là một dãy các lệnh, các chỉ thị hướng dẫn máy thực hiện một nhiệm vụ, một xử lí nào đó trên tập các dữ kiện vào và cho ra kết quả.


Một chương trình PASCAL có cấu trúc chung như sau:

PROGRAM Tên_ chương_trình;

USES Danh sách đơn vi.;

LABEL Danh sách nhãn;

CONST Danh sách hằng;

TYPE Danh sách kiểu;

VAR Danh sách biến;

PROCEDURE Khai báo thủ tục;

FUNCTION Khai báo hàm;

BEGIN


{ Các câu lệnh; }

END.


Một chương trình PASCAL điển hình gồm 3 phần: Phần tiêu đề, phần khai báo, phần thân chương trình.

4.1. Phần tiêu đề

Phần này có dạng

PROGRAM Tên_ chương_trình;

bắt đầu bằng từ khoá PROGRAM, ít nhất một dấu cách rồi đến tên chương trình, kết thúc bởi dấu chấm phảy (;). Tên_ chương_trình do ta đặt ra, mang ý nghĩa nội dung của chương trình, dấu ; là bắt buộc phải có.

Ví dụ : Program Giai_PT_bac2;

Phần tiêu đề là tuỳ chọn, có thể có hay không cũng được, nhưng nếu đã có thì phải đủ các thành phần như trên.


4.2. Phần khai báo

Phần này mô tả các đối tượng của bài toán mà chương trình sẽ xử lí. Các khai báo khác nhau được viết cách nhau bởi dấu ;. Gồm:

Khai báo đơn vị uses ...

Khai báo nhãn label

Khai báo hằng: const

Khai báo kiểu: Type

Khai báo biến: Var

Khai báo chương trình con: Procedure


Function

Các khai báo của phần này tuỳ thuộc từng bài toán cụ thể mà có thể có hay không, hoặc có


một hoặc một vài khai báo. Cách khai báo và sử dụng cụ thể sẽ được giới thiệu ở trong mỗi
phần sau.

4.3. Phần thân chương trình

Phần này được bắt đầu bởi từ khoá BEGIN , kết thúc bởi từ khoá END và dấu chấm (.) hết.


Đặt giữa BEGIN và END là các lệnh của chương trình , các lệnh được viết cách nhau bởi dấu
; như sau:

BEGIN


Lệnh 1;

Lệnh 2;


Lệnh n;

END.


Phần này bắt buộc phải có đối với mọi chương trình, nó chứa các lệnh xử lí các dữ liệu đã
được mô tả ở phần khai báo. Đây là phần chính của chương trình để giải quyết bài toán.
Người lập trình phải bỏ nhiều công sức để thiết kế thuật giải và viết chương trình cho phần
này.

4.4. Các bước cơ bản khi lập trình

Trước khi viết một chương trình giải quyết một bài toán nào đó, người lập trình phải biết cách giải bài toán đó hay chính xác hơn phải biết thuật giải để giải bài toán và trình bày thuật giải bằng ngôn ngữ lập trình .



Bước 1: Soạn thảo chương trình

Đây là bước viết mới một chương trình, có thể viết trên giấy trước rồi nhập vào máy, sửa lỗi, cập nhật. Các chương trình này được gọi là chương trình nguồn, tên chúng được tự động gán đuôi PAS. Ta có thể dùng một hệ soạn thảo văn bản nào đó, thường là hệ soạn thảo văn bản của chính TURBO PASCAL.



Bước 2: Dịch chương trình (Alt+F9)

Gọi chương trình dịch (compiler) dịch chương trình nguồn đã viết ở bước 1 sang dạng mã máy, kết quả thường tạo ra các tệp dạng *.EXE, *.OBJ. Bước này sẽ cho phép ta phát hiện các lỗi để sửa. Thường các lỗi cú pháp như thiếu dấu ; hoặc viết sai từ khoá, sai tên sẽ được thông báo. Ta phải sửa hết các lỗi rồi chuyển sang bước 3.



Bước 3: Chạy chương trình và thử (Ctrl+F9)

Nếu các dữ kiện được cung cấp chính xác mà chương trình cho kết quả sai thì ta phải


xem lại thuật giải. Đây là lỗi đặc biệt nghiêm trọng vì nó không thể hiện ra ngoài qua các
thông báo lỗi và có thể làm sai toàn bộ bài toán. Ta cũng phải quay lại bước 1 để sửa và chạy
lại.

Câu hỏi ôn tập chương I

1- Nêu quy tắc đặt tên trong Turbo Pascal. Cho 3 ví dụ tên đặt đúng, 3 ví dụ tên đặt sai.

2- Nêu cấu trúc chung của một chương trình Turbo Passcal.

CHƯƠNG II: CÁC KIỂU DỮ LIỆU CƠ SỞ VÀ CÁCH KHAI BÁO

1. Khái niệm dữ liệu, kiểu dữ liệu

1.1. Khái niệm dữ liệu

Dữ liệu là tất cả các thông tin có thật được máy tính xử lí. Chúng có nhiều dạng khác nhau, thể hiện qua các đối tượng cần xử lí như văn bản, số liệu, âm thanh, hình ảnh,...



1.2. Kiểu dữ liệu

Kiểu dữ liệu là tập hợp tất cả các giá trị mà một đại lượng thuộc kiểu đó có thể nhận được, trên đó xác định một số phép toán. Điều đó có nghĩa là một đại lượng (biến, hằng,...) chỉ có thể nhận một tập hợp các giá trị nhất định (chứ không phải mọi giá trị có thể có) và trên tập hợp các giá trị đó có xác định một số phép toán. Chẳng hạn kiểu số nguyên thông thường chỉ nhận các giá trị trong phạm vi -215 đến 215-1, trên đó có các phép toán số học +, -, *, /, div, mod và các phép so sánh =,<,>.



1.3. Phân loại các kiểu dữ liệu

TURBO PASCAL phân loại các kiểu dữ liệu như sau


Kiểu dữ liệu

Kiểu vô hướng đơn giản Kiểu dữ liệu có cấu trúc Con

trỏ
Kiểu cơ sở Kiểu do người dùng

định nghĩa


Kiểu Kiểu số Kiểu Kiểu Kiểu liệt Kiểu Mảng Bản Tập Tệp Kiểu

logic nguyên số kí tự kê khoảng con ghi hợp xâu

Bool thực kí tự
2. Các kiểu dữ liệu đơn giản

2.1. Kiểu số nguyên

Kiểu số nguyên bao gồm tất cả các số nguyên có thể biểu diễn được trên máy tính. Từ khoá : Integer

Phạm vi biểu diễn: từ -32768 đến 32767 , tức -215 đến 215-1 ( dùng 2 byte=16 bit ) Như vậy kiểu integer chỉ là một đoạn của tập số nguyên

Các phép toán: Kiểu integer được thực hiện với tất cả các phép toán dành cho số nguyên thông thường

+ Các phép toán số học: + ( cộng) , - ( trừ ), * ( nhân ) , / ( chia ) , DIV ( phép chia lấy phần nguyên, ví dụ: 7 div 3=2), MOD ( phép chia lấy phần dư, ví dụ: 7 mod 3=1)
+ Các phép so sánh: = ( bằng ) , < ( nhỏ hơn ) , <= ( nhỏ hơn hoặc bằng ), > ( lớn hơn) , >= ( lớn hơn hoặc bằng ), <> ( khác )

Trong TURBO PASCAL, ngoài kiểu số nguyên được khai báo với từ khoá integer nói trên


còn có các kiểu số nguyên khác ( xem bảng ) phục vụ cho các mục đích tính toán khác nhau
Kiểu Phạm vi biểu diễn Kích thước (byte)

( từ khoá )

Byte 0..255 1

Shortint -128..127 1

Integer -32768..32767 2

Word 0..65535 2

Longint -2147483648.. 2147483647 4
2.2. Kiểu số thực

Kiểu số thực là tập hợp tất cả các số thực có thể biểu diễn được trên máy tính. Không phải tất cả các số thực đều có thể biểu diễn được trên máy tính mà độ lớn và độ tinh xác của nó phụ thuộc vào máy và chương trình dịch.

- Kiểu số thực được khai báo với từ khoá real

- Phạm vi biểu biễn: từ 1.9x10-39 đến 1.7x1038

- Các phép toán: Kiểu real có thể thực hiện với tất cả các phép toán của số thực thông thường: +, -, *, / và các phép so sánh ( không có phép div và mod dành cho số thực ).

- Cách viết số thực dạng dấu phảy động:

Trong máy tính số thực được viết dùng dấu chấm để ngăn giữa phần nguyên và phần lẻ thập phân. Trong dạng dấu phảy động số thực được viết theo dạng: AE+b, trong đó A gọi là phần định trị, E+b gọi là phần mũ.

Ví dụ: Ta xem xét các cách viết khác nhau của cùng 1 số 824.12345=8.2412345x102 hay 8.2412345E+2


=824123.45x10-3 hay 824123.45E-3

Trong TURBO PASCAL, ngoài kiểu số thực được khai báo với từ khoá real nói trên còn có các kiểu số thực khác ( xem bảng ) phục vụ cho các mục đích tính toán với độ lớn và độ chính xác khác nhau


Kiểu Phạm vi biểu diễn

( từ khoá )

Single 1.5E-45..3.4E+38

Real 2.9E-39..1.7E+38

Double 5.0E-324..1.7E+308

Extended 3.4E-4932..1.1E+4932

* Các hàm số học chuẩn dùng cho kiểu số nguyên và số thực: Đây là những hàm được định nghĩa sẵn trong TURBO PASCAL, ta có thể sử dụng như các công cụ để tính toán
Tên hàm ( trong TP )

ABS(X)


SQR(X)

SQRT(X)


LN(X)

EXP(X)


SIN(X)

COS(X)


ARCTAN(X)

SUCC(n)


PRED(n)

TRUNC(X)


ROUND(X)
2.3. Kiểu kí tự

Cho kết quả ( hàm)

| X (giá trị tuyệt đối của X)

X2 ( X bình phương)

X (căn bậc 2 của X )

lnX (Logarit Nepe)

eX

sinX ; X cho bằng radian

cosX; X cho bằng radian

arctangX


n+1 ( số tiếp theo của n ) , n nguyên n-1 ( số kề trước của n ) , n nguyên

cắt, cho phần nguyên của X Làm tròn phần lẻ của X Kiểu kí tự là tập hợp tất cả các kí tự của bảng mã máy tính ( ASCII ) Từ khoá Char

Có thể sử dụng các phép toán so sánh đối với kiểu kí tự, kí tự nào đứng trước theo thứ tự của bảng mã máy tính sẽ được coi là nhỏ hơn, kí tự đứng sau được xem là lớn hơn
Ví dụ: 'a' < 'b'

Hằng kí tự được viết trong cặp dấu nháy ' '


Các hàm dùng cho kiểu kí tự:

Tên hàm ( trong TP )

ORD(C)

CHR(n)


SUCC(C)

PRED(C)
2.4. Kiểu logic (Boolean)

Từ khoá Boolean

Cho kết quả ( hàm)

cho số thứ tự của kí tự C trong bảng mã cho kí tự có số thứ tự là n

cho kí tự đứng kề sau

cho kí tự đứng kề trước

Các phép toán logic: NOT , AND, OR, XOR Các phép toán so sánh: =, <, >, ...

Kiểu logic boolean chỉ có 2 giá trị : True và False Người ta định nghĩa: False < True

2.5. Kiểu liệt kê (Enumerated scalar type)

Là kiểu cho phép người lập trình có thể tự định nghĩa ra các kiểu vô hướng bằng cách liệt kê các giá trị của kiểu vô hướng ra thông qua các tên do người lập trình tạo ra. Danh sách các giá trị này được đặt trong ngoặc đơn và được mô tả bằng một tên kiểu trong phần mô tả (Phần TYPE).

Từ khoá: TYPE

Ví dụ:


TYPE

Boolean=(False, True);

Color=(Red, Blue, Green, While, Black);

Một biến vô hướng có thể định nghĩa thông qua các kiểu đã được mô tả trong phần TYPE


như sau:

VAR


Ketqua: Boolean;

Mau1, Mau2: Color;

Hoặc khai bái trực tiếp với mô tả kiểu dữ liệu:
VAR

Gioitinh: (Nam, nu);

Ngay: (Chunhat, Hai, Ba, Tu, Nam, Sau, Bay);

Ví dụ:


Ketqua:= True;
Mau1:=Blue;
Gioitinh:=Nam;
Ngay:=Chunhat;

2.6. Kiểu khoảng con (Sub- range Type)
Là kiểu vô hướng được dụng khi một biến chỉ được láy giá trị trong một khoảng (xác định bởi cận trên và cận dưới).

Quy tắc định nghĩa:

Hang_can_duoi..Hang_can_tren;

Trong đó: Hang_can_duoi < Hang_can_tren, và cùng kiểu.  Tác dụng: - Tiết kiệm ô nhớ.

- Có thể kiểm tra giá trị của biến khi chạy chương trình không được vượt ra khỏi giới hạn của khoảng con.

Ví dụ:


TYPE

Ngay= (Chunhat, Hai, Ba, Tu, Nam, Sau, Bay); Chu_cai_hoa='A'..'Z';

VAR

ch: Chu_cai_hoa;



Ngay_lam_viec: Hai..Bay;
3. Các khai báo

3.1. Khai báo đơn vị

Đơn vị là một kiểu tổ chức của chương trinh Pascal, trong đó có các chương trình con, nhằm


thực hiện một một chức năng nào đó. Ta khai báo các đơn vị sử dụng trong chương trình theo
cú pháp sau:

Uses Tên_đơn_vi;

CRT là đơn vị chuẩn quản lý màn hình, bàn phím; GRAPH là đơn vị đồ họa. PRINTER là đơn vị khai báo máy in, máy in được cài đặt tên là LST.

Ví dụ 1: Uses crt;

Ví dụ 2: Uses crt, graph, printer;

3.2. Khai báo nhãn

Nhãn là một tên trong Pascal. Nhãn dùng đánh dấu một câu lệnh trong chương trình để có thể chuyển điều khiển tới đó. Khai báo nhãn trong chương trình theo cú pháp sau:


Label Tên_nhãn;

Cách đánh dấu nhãn cho câu lệnh như sau: Tên_nhãn : Câu lệnh;

Ví dụ:

Label Tiep;



Tiep : Readln(x);

3.3. Khai báo hằng

Hằng là đại lượng không thay đổi giá trị trong quá trình xử lí. Ta khai báo hằng theo cú


pháp:

const Tên_hằng=Giátrị ;

ở đó: Tên_hằng do ta đặt ra, Giátrị là giá trị mà tên hằng sẽ nhận và giữ không đổi suốt quá trình xử lí.

Ví dụ: const n=10; { khai báo hằng số nguyên n=10}

pi=3.1416; { khai báo hằng số pi }

ki_tu='Y'; { khai báo hằng kí tự ki_tu nhận kí tự Y}



3.4. Khai báo kiểu

Khai báo kiểu là định nghĩa một kiểu dữ liệu do người sử dụng tạo ra. Khai báo kiểu có cú pháp sau:

Type Tên_kiẻu = Mô_ tả_kiểu;

Ví dụ: Type Mau = (do, xanh, vang, tim, nau);

Type Phuong_tien_GT = (xe_dap, xe_may, o_to, tau_hoa); Type Tuoi_nguoi = 1..300;

3.5. Khai báo biến

Biến là đại lượng có thể thay đổi giá trị trong quá trình xử lí. Biến của chương trình là tên của ô nhớ cất giữ dữ liệu. Muốn sử dụng biến nào ta phải khai báo trước biến đó bằng cách viết tên biến trong phần khai báo ở đầu chương trình sau từ khoá Var.

Cú pháp:

Var Tên_biến:Kiểu_dữ_liệu;

ở đó: Tên_biến do ta đặt ra, Kiểu_dữ_liệu là tên của một trong các kiểu dữ liệu của TURBO PASCAL, dấu hai chấm bắt buộc phải có để ngăn giữa 2 phần của khai báo, dấu chấm phảy kết thúc dòng khai báo. Các biến có cùng kiểu có thể được khai báo cùng nhau bằng cách viết các tên biến cách nhau bởi dâú phảy (,), nhóm các biến khác kiểu nhau được viết cách nhau bởi dấu ;

Ví dụ: Var i:integer; { khai báo một biến có tên là I, biến này có kiểu nguyên}

x,y,z:real; { khai báo 3 biến x,y,z nhận các giá trị có kiểu thực }

t: char; { khai báo biến t có kiểu kí tự }

kiem_tra:boolean; { khai báo biến logic }

Tuoi: 1..300;

Đối với mỗi bài toán, khi phân tích thuật toán, ta phải xác định rõ ngay chương trình cần phải
nhập vào các dữ kiện gì ? các kết quả trung gian nào cần phải được chứa, dữ liệu ra là những
gì?... để từ đó có phần khai báo chính xác, không bị thiếu mà cũng không thừa gây lãng phí ô
nhớ (!)

4. Biểu thức và câu lệnh

4.1. Biểu thức

Biểu thức là một công thức tính toán để có một giá trị theo một công thức toán học nào đó. Một biểu thức bao gồm các toán tử kết hợp với các toán hạng.

Các toán tử trong TURBO PASCAL gồm: các phép toán số học ( +, -, *, / ), các phép so sánh ( =, <, >, ...), các phép toán logic ( NOT, AND, OR);

Các toán hạng: gồm các hằng, các biến, các hàm được dịnh nghĩa trong TURBO PASCAL Thứ tự ưu tiên các phép toán như sau:

1. dấu ngoặc ( ) nội dung viết trong dấu ngoặc được ưu tiên thực hiện trước nhất

2. phép lấy đối ( - ), phép NOT

3. các phép tính loại nhân, chia: *, /, DIV, MOD, AND

4. các phép tính loại cộng, trừ: +, -, OR

5. các phép so sánh: +, <>, <, >, ...

Chú ý: Biểu thức trong Pascal chỉ được viết trên 1 dong do đó phải chú ý dùng các dấu ( ) để viết cho chính xác.Trong Pascal viết là: (b*b- 4*a*c)/(1+sqrt(2*a*b) Biểu thức toán học viết là:


2  sin x cos x

2 sin x 1 Trong Pascal viết là: (2+ sqrt (sin(x)+cos(x)))/(2* sin(x)+1)

122

4.2. Câu lệnh
Câu lệnh xác định công việc, thao tác mà chương trình phải thực hiện để xử lí các dữ liệu đã
mô tả, khai báo. Các lệnh viết cách nhau bởi dấu (;), TURBO PASCAL phân loại các lệnh
như sau:

- Lệnh đơn: là các lệnh không chứa các lệnh khác

- Lệnh có cấu trúc: thường chứa nhiều hơn một lệnh đơn, bao gồm khối lệnh, các lệnh thử và rẽ nhánh, các lệnh lặp.

- Lệnh hợp thành ( còn gọi là lệnh phức hay lệnh ghép ): gồm một nhóm các lệnh được đặt


giữa cặp từ khoá begin ... end; ( dấu chấm phảy (;) kết thúc chứ không phải dấu chấm ) như
sau:

begin


lệnh1;

lệnh2;


lệnhn;

end;


Dạng lệnh này cho ta thấy tính có cấu trúc của TURBO PASCAL. Một nhóm các lệnh giải
quyết trọn vẹn một công việc nào đó sẽ được tổ chức trong một khối lệnh dạng này, và từng
công việc của bài toán lớn sẽ được giao cho từng người làm trước khi ghép lại để giải bài toán
tổng thể. Chúng ta sẽ đề cập kĩ hơn về vấn đề này ở phần chương trình con ( thủ tục và hàm ).

Bài tập chương 2

Hãy viết các khai báo biến 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.

phím khi chạy chương trình.

6. 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ể.

7. 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



CHƯƠNG III : CÁC THỦ TỤC VÀO RA DỮ LIỆU

VÀ CÁC CẤU TRÚC ĐIỀU KHIỂN

1. Phép gá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';



2. Các thủ tục Vào- Ra dữ liệu

2.1. Các thủ tục vào dữ liệu

Các biến của chương trình có thể nhận giá trị thông qua phép gán ở trong chương trình, tuy nhiên, để gán giá trị cho biến thông qua các thiết bị nhập chuẩn như bàn phím ta dùng một trong 2 thủ tục sau:

read( danh sách các tên biến);

readln(danh sách các tên biến);

ý nghĩa: nhập giá trị cho từng biến trong danh sách tên biến bằng cách gõ vào từ bàn phím. Các biến trong danh sách các tên biến viết cách nhau bởi dấu phảy (,). Khi nhập các giá trị cụ thể, các giá trị phải phù hợp với các biến trong danh sách về số lượng biến, kiểu của biến và vị trí các biến trong danh sách. Các giá trị số được viết cách nhau bởi ít nhất một dấu khoảng trắng (dấu cách).

Các biến trong thủ tục này cho phép là các kiểu sau: Nguyên, thực, kí tự, xâu kí tự, khoảng con,... Không được là kiểu logic.

Ví dụ: với các khai báo ở trên (bài 2.III), ta có thể viết

read(x,y,z);

readln(t);
khi chạy chương trình ta có thể gõ: 3 6 4 

N

nghĩa là biến x nhận giá trị 3, biến y nhận giá trị 6, biến z nhận giá trị 4 còn biến t nhận giá trị N ( kiểu char).


Hai cách viết read và readln có ý nghĩa như nhau về tác dụng nhập dữ liệu, chỉ khác là sau khi thực hiện xong chức năng này thì lệnh readln sẽ đưa con trỏ về đầu dòng tiếp theo, còn lệnh read thì không.

Ngoài 2 cách viết trên còn có thủ tục readln; không có tham số cho phép dừng chương trình chờ gõ một phím bất kì trước khi tiếp tục.

Chú ý: Khi vào dữ liệu cho biến kí tự hoặc biến xâu kí tự ta dùng thủ tục Readln(..) và mỗi biến trong một thủ tục.

Ví dụ: Đầu chương trình khai báo các biến Var t: string; p: char; i,j,k : integer;

Trong thân chương trình vào dữ liệu cho các biến trên có thể viết như sau: Readln(t); readln(p); readln(i,j,k);

2.2. Các thủ tục ra dữ liệu

Có 2 cách viết dữ liệu ra màn hình:

write( các mục cần ghi ra );

writeln( các mục cần ghi ra );

- ý nghĩa: đưa ra màn hình các kết quả tính toán trong chương trình, giá trị các biến, hay tất cả những gì nằm giữa cặp dấu nháy ' ... '

- Ví dụ: write(x,y); In ra màn hình các giá trị x và y, kết quả trên màn hình là 36

Có thể viết thành:

write(x);

write(y);
hay rõ hơn: write('x=',x);write('y=',y); thì kết quả là x=3 y=6

các kí tự 'x=' và 'y=' nằm trong cặp dấu ngoặc chỉ có tác dụng trình bày, làm phân biệt rõ các giá trị được viết ra.

Hai cách viết trên có ý nghĩa như nhau về việc thể hiện dữ liệu ra màn hình, tuy nhiên thủ tục writeln sẽ chuyển con trỏ xuống đầu dòng tiếp theo sau khi thực hiện, con thủ tuc write giữ nguyên vị trí con trỏ.

Ngoài 2 dạng trên còn có thủ tục writeln; không có tham số chỉ có tác dụng đưa ra một dòng trắng không chứa gì.



2. 3. Kết hợp read, readln và write, writeln để nhập dữ liệu

Ta có thể kết hợp các thủ tục trên để tạo ra dạng nhập dữ liệu sáng sủa và đẹp mắt theo mẫu: write(' câu nhắc nhập dữ liệu '); readln(biến);

Ví dụ:

write( ' Hãy nhập dữ liệu cho biến x:'); hay write('x=');



readln(x); readln(x);

kết quả sẽ là:

Hãy nhập dữ liệu cho biến x:( ta gõ ) 3 hay x= ( ta gõ ) 3

nên viết câu dẫn nhập gợi ý biến sẽ được nhập vào, không nên bỏ qua hoặc viết

writeln( ' Hãy nhập dữ liệu cho biến x:'); hay writeln('x=');

read(x); read(x);

vì như thế khi chạy chương trình con trỏ nhập sẽ nhảy xuống dòng dưới dòng hướng dẫn, nhìn

không đẹp mắt thế này

Hãy nhập dữ liệu cho biến x: hay x=

( ta gõ ) 3 ( ta gõ ) 3

2.4. Viết ra dữ liệu có quy cách
Một trong những yêu cầu khi trình bày dữ liệu ra màn hình là phải sáng sủa, đúng quy cách, dễ đọc, dễ hiểu. TURBO PASCAL có các quy định cho các kiểu dữ liệu như sau
*. Viết ra kiểu số nguyên

write(i:n); hoặc writeln(i:n);

trong đó I là số nguyên cần ghi ra, n là số chỗ dành để viết ra số nguyên đó trên màn hình,
máy sẽ bố trí số nguyên từ phải sang trái, nếu thừa sẽ bỏ trống bên trái.
Ví dụ: với I=23, j=234 thì writeln(i);writeln(i:5); writeln(j:5); sẽ cho
23

_ _ 23
_ 234

Như vậy viết không có quy cách sẽ căn lề trái, trong khi viết có quy cách sẽ căn phải. *- Viết ra kiểu số thực

mẫu 1:


write(r:m:n); hoặc writeln(r:m:n);

trong đó r là số thực cần ghi ra, m là số chỗ dành cho cả số thực ( kể cả dấu chấm ngăn cách


phần nguyên và phần lẻ, nếu có) n là số chỗ dành cho phần lẻ thập phân.
mẫu 2:

write(r:n);

trong đó n là số chỗ cho cả số thực viết dưới dạng e-mũ Ví dụ: với r=123.45

thì writeln(r); writeln(r:8:3); writeln(r:7); sẽ cho kết quả

1.234500000E+02 ( 10 chữ số dành cho phần lẻ )

123.450


1.2E+00 ( có làm tròn )

*- Viết ra kiểu kí tự

Với kiểu kí tự, viết không quy cách sẽ cho ra kí tự bình thường, mỗi kí tự chiếm một chỗ, còn viết có quy cách thì các kí tự sẽ được bố trí từ phải sang trái, thêm các dấu khoảng cách vào bên trái nếu thừa chỗ.

Ví dụ: với t='Y' thì

writeln(t); writeln(t:3); writeln('PASCAL'); writeln('PASCAL':8);

sẽ cho


Y
Y

PASCAL


PASCAL

*- Viết ra kiểu boolean

kiểu boolean với 2 giá trị là TRUE và FALSE cũng được viết ra theo dạng
write(ok); hoặc writeln(ok:n);

trong đó ok là biến kiểu boolean, n là số chỗ để viết ra biến ok. e- In ra máy in

Các thủ tục write và writeln cũng dùng để đưa dữ liệu ra máy in. Muốn vậy, ở đầu chương trình phải có lời gọi chương trình chuẩn USES PRINTER; ở đầu chương trình và phải có thành phần Lst và dấu phảy (,) đứng trước nội dung cần in ra.

Ví dụ: writeln(Lst, 'kết qủa là', S:8:2);

*- Các thủ tục trình bày màn hình của TURBO PASCAL

Đây là những thủ tục có sẵn của TURBO PASCAL phục vụ cho việc trình bày màn hình. Muốn dùng các thủ tục này phải có lời gọi chương trình chuẩn USES CRT; ở đầu chương trình. Các thủ tục đó là:

CLRSCR; xoá toàn bộ màn hình, chuyển con trỏ về góc trên bên trái của màn hình. CLREOF; xoá các kí tự bên phải vị trí con trỏ hiện thời

GOTOXY(x,y); chuyển con trỏ màn hình đến điểm có toạ độ (x,y) ( màn hình văn bản có 25 dòng, 80 cột, trong thủ tục này x là toạ độ cột, y là toạ độ dòng )

TEXTCOLOR(Mau); thiết lập màu cho văn bản, Mau là số nguyên có thể nhận giá trị từ 0 trở lên, giá trị lớn nhất của Mau phụ thuộc loại màn hình của máy. Ta có thể chỉ định Mau bằng một chữ cái tiếng Anh chỉ màu ( xem bảng )

Số nguyên chỉ màu Tên màu

0 Black

1 Blue


2 Green

3 Cyan


4 Red

5 Magenta

6 Brown

7 LightGrey



8 DarkGrey

9 LightBlue

10 LightGreen

11 LightCyan

12 LightRed

13 LightMagenta

14 Yellow

15 White
TEXTBACKGROUND(Mau); xác lập màu nền cho văn bản.

Ví dụ: đoạn lệnh chương trình in dòng chữ THU DO HA NOI màu xanh trên nền vàng lên màn hình

uses CRT;

textbackground(14);
textcolor(blue);

write(' THU DO HA NOI');


2.5. Các chương trình ứng dụng những lệnh đã học
* Bài toán 1: Tính diện tích và chu vi của hình tròn.

Phân tích bài toán :Trong bài toán này biến vào là R; biến ra là: s (diện tích), cv ( chu vi); các biến đều có kiểu số thực.

Tính toán theo công thức sau:
s = 3.14* R2 ;

cv = 2* 3.14 * R.


Chương trình được viết như sau:

Program Dien_tich_chu_vi_hinh_tron; Uses crt;

Var cv, s, r : real;
Begin

Clrscr;


Write(' hay nhap vao ban kinh r: ');
Readln(r);

S:= 3.14 * r*r;


Cv:=2*3.14*r;

Writeln(' Dien tich = ', s:8:2);


Writeln(' Chu vi = ', cv:8:2);
Readln;

End.
* Bài toán 2: Bài toán tính lương, bảo hiểm xã hội, bảo hiểm y tế và tiền lĩnh của cán bộ công chức nhà nước. Theo quy định hiện nay thì lương = hệ số lương * 350000;


bảo hiểm xã hội = 5% * lương ; bảo hiểm y tế = 1% * lương;
tiền lĩnh = lương - bảo hiểm xã hội - bảo hiểm y tế.

Phân tích bài toán: Trong bài toán này các biến vào là Ht ( họ và ten) kiểu xâu kí tự và biến HS (hệ số lương) kiểu số thực. Các biến ra là Ht, HS, luong, BHXH ( bảo hiểm xá hội) kiểu thực, BHYT ( bảo hiểm y tế) kiểu thực, TL ( tiền lĩnh ) kiểu thực.

Tính toán theo các công thức đã cho ở trên.

Trong chương trình có sử dung các câu lệnh trình bày màn hình. Chương trình như sau:

Program Tinh_luong;

Uses Crt;

Var HT:string[25]; LUONG, HS, BHXH, BHYT, TL:Real;

Begin
Clrscr;

Textcolor(red);

Textbackground(Blue);


Gotoxy(10,5);

Write(' Nhap ho va ten: '); Readln(HT); Write(' Nhap he so luong '); Readln(HS); LUONG:= HS * 350000;

HBXH:= LUONG * 0.05;

BHYT:= LUONG * 0.01;

TL:= LUONG-BHXH-BHYT;

WRITELN(HT:25,HS:6:2,LUONG:10:1,BHXH:10:1,BHYT:10:1,TL:10:1); READLN;

END.
3. Các lệnh điều kiện

Phần này ta sẽ nghiên cứu các lệnh cho phép chương trình rẽ nhánh thực hiện một công việc dựa trên giá trị một điều kiện nào đó. Có 2 dạng lệnh điều kiện là câu lệnh điều kiện (cho phép rẽ tối đa 2 nhánh) và câu lệnh lựa chọn (cho phép rẽ nhiều nhánh).

3.1. Câu lệnh điều kiện

a. Dạng lệnh

 Dạng đơn giản

IF <điều kiện> THEN < lệnh >;

trong đó

<điều kiện> là một biểu thức điều kiện liên hệ bởi các toán tử: =, < , > , <= , >= và (hoặc) các phép toán logic NOT, AND, OR

< lệnh > có thể là một câu lệnh đơn giản hoặc phức hợp.

- ý nghĩa : khi gặp lệnh này, trước tiên máy sẽ kiểm tra <điều kiện>, nếu <điều kiện> là đúng thì sẽ cho thực hiện < lệnh >, còn nếu <điều kiện> sai thì máy sẽ bỏ qua < lệnh > và chuyển sang công việc tiếp theo.

 Dạng tổng quát

IF < điều kiện > THEN < lệnh1 > ELSE < lệnh2 >;

- ý nghĩa : khi gặp lệnh này, trước tiên máy cũng sẽ kiểm tra <điều kiện>, nếu <điều kiện> là
đúng thì sẽ cho thực hiện < lệnh1 >, còn trái lại là <điều kiện> sai thì máy sẽ thực hiện >.

Sơ đồ khối của câu lệnh điều kiện như sau

b. Ví dụ áp dụng§iÒu kiÖnVD1: Viết chương trình nhập vào một số a tuỳ ý, rồi kiểm tra nếu a không âm thì in ra căn bậc 2 của a, trái lại in ra thông báo 'số âm không có căn bậc 2'

Chương trình được viết như sau:

Program canbac2;

Uses crt;

Var a: real;
Begin

write(' Hay nhap vao so a:');


readln(a);

if a >= 0 then writeln(' Can bac hai cua a la:', sqrt(a))

else writeln(' So am khong co can bac hai');
Readln;

End.


VD2: Viết chương trình giải phương trình bậc hai ax2+bx+c=0

Program GPTB2;

Uses crt;
var

a,b,c,x1,x2,dta:real;


Begin

clrscr;


gotoxy(5,5);

writeln('CHUONG TRINH GIAI PHUONG TRINH BAC HAI');


writeln;

write('Vao cac he so:');


readln(a,b,c);

dta:=b*b-4*a*c;


if dta>0 then
begin

writeln('Phuong trinh co 2 nghiem thuc:'); X1:=(-b+sqrt(dta))/(2*a);

X2:=(-b-sqrt(dta))/(2*a);
writeln('X1=',X1:6:2);
writeln('X2=',X2:6:2);
end;

if dta=0 then

writeln('Phuong trinh co nghiem kep X=',-b/(2*a):6:2); if dta<0 then

begin


writeln('Phuong trinh co 2 nghiem phuc:');

writeln('X1=',-b/(2*a):6:2,'-',sqrt(-dta):6:2,'i');


writeln('X2=',-b/(2*a):6:2,'+',sqrt(-dta):6:2,'i');
end;

readln;
End.

Lưu ý: - Câu lệnh phức hợp: trong chương trình có những chỗ TURBO PASCAL chỉ cho phép viết một lệnh, nhưng ta lại muốn viết nhiều hơn một lệnh thành phần thì các lệnh thành phần đó phải được đặt trong cặp từ khoá Begin ... end; (dấu chấm phảy kết thúc). Chẳng hạn trong ví dụ trên, ứng với trường hợp dta>0 máy phải thực hiện cả 5 lệnh trong cặp từ khoá begin...end; sau từ khoá then, còn ứng với trường hợp dta=0 thì máy chỉ phải thực hiện đúng một lệnh, do đó không cần dùng câu lệnh phức hợp.

- Các câu lệnh điều kiện có thể viết lồng nhau. Tức là các lại có thể là câu lệnh điều kiện dạng IF...THEN IF...THEN...ELSE... khi đó cần lưu ý IF nào đi với THEN nào. Chẳng hạn xem đoạn chương trình phân loại kết quả học tập sau:

IF diem>=5 THEN

IF diem>=7 THEN loai:='Kha gioi' ELSE loai:='TB'

ELSE

IF diem>=3 THEN loai:='Yeu' ELSE loai:='Kem';



3.2. Câu lệnh lựa chọn: CASE ... OF...

Câu lệnh điều kiện chỉ cho phép ta thực hiện rẽ 2 nhánh ứng với hai giá trị đúng hay sai của biểu thức điều kiện. Để có thể thực hiện rẽ nhiều nhánh ứng với nhiều giá trị khác nhau của một biểu thức, ta phải sử dụng câu lệnh lựa chọn.

a. Dạng lệnh

Dạng đơn giản: Dạng tổng quát:

CASE OF CASE OF

hằng1: ; hằng1: ;

hằng2: ; hằng2: ;

hằngn: ; hằngn:

END; ELSE ;

END;


Trong đó và các hằng phải có cùng kiểu và phải là các kiểu vô hướng đếm được (các kiểu số nguyên kiểu kí tự, kiểu Boolean đã biết).

ý nghĩa:

Khi gặp câu lệnh rẽ nhánh, đã được nhận một giá trị nào đó, giá trị này là
một hằng (số hoặc kí tự). Nếu nhận giá trị là hằng nào thì tương ứng với
nó sẽ được thực hiện. Còn nếu nhận giá trị không rơi vào hằng nào thì máy sẽ bỏ
qua lệnh đối với dạng đơn giản, máy sẽ thực hiện sau từ khoá ELSE đối với dạng
tổng quát.

Lưu ý: Từ khoá END với dấu chấm phảy (;) ở trong câu lệnh này để chỉ rằng kết thúc câu lệnh lựa chọn chứ không phải kết thúc chương trình con.

b. Ví dụ áp dụng

VD1: Viết chương trình xem thời khoá biểu của một ngày trong tuần. Yêu cầu: máy in ra câu hỏi 'Bạn muốn xem thời khoá biểu của thứ mấy?' ta gõ vào ngày thứ (của tuần) muốn xem và máy sẽ in ra thời khoá biểu của ngày hôm đó.

Chương trình được viết như sau: (giả sử xem thời khoá biểu của một lớp phổ thông, bạn đọc có thể hiệu chỉnh theo ý mình)

Program XEM_TKB;

Uses crt;

Var thu: 2..7; {biến thu để chứa các thứ ngày trong tuần}

Begin

write(' Ban muon xem thoi khoa bieu cua thu may?');



readln(thu);

CASE thu OF

2:writeln('Toan Ly Van');

3:writeln('Sinh Ki Hoa');

4: writeln('Toan Hoa Ly');

5: writeln('Van Sinh The duc');

6: writeln('Su Dia Chinh tri');

7: writeln('Van Toan Sinh hoat');

END;

Readln;


End.

Bạn đọc có thể áp dụng câu lệnh dạng tổng quát để mở rộng chương trình xem thời khoá biểu này sao cho khi gõ vào một số nào đó không phải là thứ trong tuần (2..7) máy sẽ in ra thông báo rằng đó là ngày nghỉ.

Lưu ý:

- Sau mỗi hằng máy chỉ thực hiện đúng một lệnh. Do đó nếu muốn dùng nhiều hơn một lệnh thì ta phải sử dụng câu lệnh phức hợp.



- Các hằng có thể viết gộp lại với nhau. Chẳng hạn nếu thứ 3 và thứ 5 có cùng thời khoá biểu thì thay vì phải viết 2 dòng lệnh, ta có thể viết:

3,5: writeln('Sinh Ki Hoa');

- Các câu lệnh lựa chọn có thể lồng nhau. Tức là trong câu lệnh lựa chọn lại có thể chứa câu lệnh lựa chọn khác.
4. Các lệnh lặp

Trong lập trình giải quyết các bài toán, ta có thể gặp trường hợp chương trình phải thực


hiện lặp đi lặp lại một công việc nào đó. Việc thực hiện lặp phải theo một quy luật nào đó. Số
lần lặp có thể được xác định trước hoặc không xác định. Sau đây ta sẽ lần lượt xét các lệnh
lặp dạng này.
4.1- Lệnh lặp có số lần lặp xác định

Đây là một câu lệnh có cấu trúc cho phép thực hiện lặp đi lặp lại một công việc (đoạn lệnh) nào đó với số lần thực hiện được xác định trước. Để dễ hiểu trước hết ta xét một ví dụ đơn giản sau:

Giả sử ta phải viết ra các số từ 1 đến 10, mỗi số chiếm một dòng trên màn hình. Ta có thể thực hiện công việc này bởi 10 lệnh writeln như sau:

writeln(1);

writeln(2);
writeln(10);

Đây là cách viết dài dòng và đơn điệu trong khi ta có thể thực hiện công việc trên bởi một dòng lệnh ngắn gọn:

FOR I:=1 TO 10 DO writeln(I);

ý nghĩa của câu lệnh này là: cho một biến nhận giá trị nguyên I chạy từ 1 đến n ( biến I lần lượt nhận các giá trị số nguyên từ 1 đến n), với mỗi giá trị của I máy sẽ thực hiện công việc sau từ khoá DO là in ra giá trị của I.

Chi tiết các bước thực hiện của vòng lặp FOR này như sau:

Đầu tiên biến I nhận giá trị khởi đầu là 1 (do lệnh gán I:=1), máy kiểm tra giá trị này không vượt quá giá trị cuối là 10 nên cho thực hiện lệnh writeln(I) viết ra giá trị 1. Sau đó biến I được tăng thêm một đơn vị, tức là I:=I+1. Bây giờ I=2, chưa vượt qua giá trị cuối là 10 nên lệnh writeln(I) lại được thực hiện để in ra giá trị của I là 2 lên màn hình. Rồi I lại được tăng lên... giá trị cuối cùng của I để lệnh writeln(I) được thực hiện là I:=10. Quá trình kết thúc khi I nhận giá trị 11 vượt quá giá trị cuối 10.

Câu lệnh trên là một ví dụ đơn giản của lệnh tổng quát sau:

a. Dạng lệnh lặp tăng (dạng tiến)

FOR Biến_điều_khiển:=Biểu_thức1 TO Biểu_thức2 DO ;

Trong đó Biến_điều_khiển, Biểu_thức1 và Biểu_thức2 phải cùng kiểu dữ liệu và phải là các kiểu vô hướng đếm được (như các kiểu số nguyên, kiểu kí tự...)

ý nghĩa của câu lệnh này như sau: Trước tiên Biến_điều_khiển nhận giá trị khởi tạo là Biểu_thức1, máy kiểm tra nếu giá trị đó không vượt quá Biểu_thức2 thì cho thực hiện . Thực hiện xong lệnh này, Biến_điều_khiển được tăng thêm một đơn vị, máy lại kiểm tra với Biểu_thức2 để thực hiện ... Qúa trình tiếp diễn đến khi Biến_điều_khiển nhận giá trị vượt quá Biểu_thức2 thì dừng.

Số lần thực hiện lặp đi lặp lại được xác định trước bởi giá trị của Biểu_thức1 và Biểu_thức2 nên câu lệnh trên còn được gọi là lệnh lặp có số lần lặp xác định.


Lưu đồ của lệnh lặp FOR:

B¾t ®Çu
BiÕn_®iÒu_khiÓn:=BiÓu_thøc1


§óng


BiÕn_®iÒu_khiÓn>BiÓu_thøc

Sai
DO


BiÕn_®iÒu_khiÓn:=Succ(BiÕn_®iÒu_khiÓn)

* Ví dụ


VD1: Viết chương trình tính tổng của n số tự nhiên đầu tiên S=1+2+...+n theo phương pháp cộng dồn.

Phương pháp cộng dồn được thực hiện như sau: ban đầu ta khởi tạo S:=0, rồi lấy S cộng với 1, rồi cộng với 2,... cộng đến n. Như vậy ta sẽ phải sử dụng một vòng lặp FOR với một biến điều khiển I chạy từ Biểu_thức1 là 1 đến Biểu_thức2 là n. Ta sẽ dùng chính giá trị của biến điều khiển này để tính tổng S.

Chương trình được viết như sau:

Program Tinh_tong;

Uses crt;

Var i,n:integer;


S:real;

Begin


Write('Cho biet gia tri cua n:'); Readln(n);

S:=0;


For I:=1 to n do S:=S+i;

Writeln(' Tong tinh duoc la S:',S:10:2);

Readln;
End.

VD2: Một người gửi tiền tiết kiệm với số tiền ban đầu là A đồng, thời gian gửi t tháng, lãi


suất tháng là p. Hỏi sau t tháng gửi người đó thu được số tiền lãi là bao nhiêu đồng?
Phân tích bài toán: Ta biết rằng gửi tiết kiệm 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 thì ta có:

Ban đầu S0=A

t=1 --> S1=S0 +S0*p (gửi 1 tháng)

t=2 --> S2= S1 +S1*p (gửi 2 tháng)


t=n --> Sn= Sn-1 +Sn-1*p (gửi n tháng)

Đây chính là quy luật để thực hiện vòng lặp tính số tiền thu được. Chương trình được viết như


sau:

Program Tinh_tien_lai;

Uses crt;

Var i,t:integer; A,P,S:real;


Begin

Write('Cho biet so tien gui ban dau: '); Readln(A);


Write('Cho biet so thang gui: '); Readln(t);
Write('Cho biet lai suat theo thang: '); Readln(P);
S:=A;

For I:=1 to t do S:=S+ S*P;

Writeln(' Lai thu duoc la : ',S-A:10:2);
Readln;

End.


b. Dạng lệnh lặp giảm (dạng lùi)

FOR Biến_điều_khiển:=Biểu_thức1 DOWNTO Biểu_thức2 DO ;

ý nghĩa hoàn toàn tương tự như dạng trên, chỉ khác là Biến_điều_khiển nhận giá trị giảm dần
chứ không phải tăng dần, và điều kiện kiểm tra là Biến_điều_khiển không nhỏ quá
Biểu_thức2.

Lưu đồ của lệnh lặp FOR:

B¾t ®Çu
BiÕn_®iÒu_khiÓn:=BiÓu_thøc1

§óng


BiÕn_®iÒu_khiÓnSai KÕt thóc
DO

BiÕn_®iÒu_khiÓn:=Pred(BiÕn_®iÒu_khiÓn)

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.


Trong bài toán này mỗi số đều có 3 chữ số, chữ số hàng trăm 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 <điều kiện> DO ;
ý nghĩa:

Khi gặp câu lệnh này, trước tiên máy sẽ kiểm tra <điều kiện>. Nếu <điều kiện> 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 <điều kiện> để thực hiện ... quá trình tiếp diễn đến khi <điều kiện> sai thì dừng.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%?
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
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;
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 <điều kiện>;

ý 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 <điều kiện> 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 <điều kiện> để thực hiện ... quá trình tiếp diễn đến khi <điều kiện> đúng thì dừng.

Sơ đồ


LÖnh

§óng




tải về 0.58 Mb.

Chia sẻ với bạn bè của bạn:
  1   2   3   4   5   6




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương