WELCOME
Chào mừng quý vị đến với Blog Tin học PT- CNTT&GD.
Quý vị chưa đăng nhập hoặc chưa đăng ký làm thành viên, vì vậy chưa thể tải được các tư liệu của Thư viện về máy tính của mình.
Nếu chưa đăng ký, hãy đăng ký thành viên tại đây hoặc xem phim hướng dẫn tại đây
Nếu đã đăng ký rồi, quý vị có thể đăng nhập ở ngay ô bên phải.
Pascal.ppt

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn: HS
Người gửi: Nguyễn Thái Đức (trang riêng)
Ngày gửi: 10h:43' 16-05-2009
Dung lượng: 1.4 MB
Số lượt tải: 38
Nguồn: HS
Người gửi: Nguyễn Thái Đức (trang riêng)
Ngày gửi: 10h:43' 16-05-2009
Dung lượng: 1.4 MB
Số lượt tải: 38
Số lượt thích:
0 người
Blaise Pascal
I. GIỚI THIỆU VỀ PASCAL
Về ý đồ khi xây dựng Pascal, Wirth viết : “Điểm mới của pascal đưa ra các cấu trúc và kiểu dữ liệu phong phú, cũng giống như ALGOL đưa ra các loại cấu trúc điều khiển. Trong ALGOL chỉ có 3 kiểu dữ liệu cơ sở : các số nguyên và thực, giá trị chân lí, mảng; Pascal đã đưa thêm các kiể dữ liệu cơ sở và còn khả năng xác định những kiểu cơ sở mới (kiểu liệt kê, kiểu miền con), cũng như các dạng cấu trúc dữ liệu mới : bản ghi, tập hợp, tệp, mà một số trong chũng đã có trong COBOL. Và tất nhiên, quan trọng nhất là tính đệ quy trong việc mô tả các cấu trúc ; hệ quả của điều này là khả năng kết hợp và lồng các cấu trúc ”
1
Pascal dựa trên ngôn ngữ lập trình Algol và được đặt tên theo nhà toán học và triết học Blaise Pascal. Wirth đồng thời cũng xây dựng Modula-2 và Oberon, là những ngôn ngữ tương đồng với Pascal. Oberon cũng hỗ trợ kiểu lập trình hướng đối tượng
Ban đầu, Pascal là một ngôn ngữ được hướng để dùng trong giảng dạy về lập trình có cấu trúc, và nhiều thế hệ sinh viên đã "vào đời" thông qua việc học Pascal như ngôn ngữ vỡ lòng trong các chương trình học đại cương. Nhiều biến thể của Pascal
ngày nay vẫn còn được sử dụng khá phổ biến trong giảng dạy. Mặc dù vậy, nếu nghĩ rằng Pascal là ngộ ngữ chỉ dành để giảng dạy, thì sẽ sai lầm. Hãy nghe chính ý kiến của Wirrth vè vấn đề bày (1984)”Có người cho rằng Pascal được thiết kế như một ngôn ngữ để giảng dạy. Mặc dù điều này là đúng, nhưng việc sử dụng nó để giảng dạy không phải là mục đích duy nhất. Thực tế, tôi không tin vào sự thành công của việc áp dụng trong khi học các phương pháp và công cụ mà không thể sử dụng để giải quyết các bài toán thực tế. Theo tiêu chuẩn ngày pascal có những yếu điểm rỏ rằng khi lập trình các hệ thống lớn, nhưng 15 năm trước đó là thảo hiệp hợp lí giữa cái mong muốn và hiệu quả ”
Pascal là một ngôn ngữ có định kiểu mạnh mẽ. Điều có nghĩa là mọi biến và hằng số của một kiểu dử liệu không thể tự đem trộn lẩn với các biến và hằng của một kiêủ dữ liệu khác. Việc định kiểu chặt chẽ như vậy buộc người lập trình luôn luôn phải có các biểu thức tương thích nhau về kiểu dữ liệu.Phần lớn hệ điều hành Macintosh được viết bằng Pascal. Hệ sắp chữ TEX phổ biến được viết bằng một
2
ngôn ngữ tên là Web là ngôn ngữ mà Donald Knuth đã vay mượn khá nhiều yếu tố từ Pascal.
Ngôn ngữ Pascal được dùng hiện nay có nhiều điểm khác biệt với chuẩn Pascal nguyên thủy của Giáo sư Wirth. Tùy theo quốc gia hoặc công ty đã phát triển cho ra đời các chương trình biên dịch ngôn ngữ Pascal như:
· ISO PASCAL (International Standards Organization) của Châu Âu
· ANSI PASCAL (American National Standards Institute) của Mỹ
· TURBO PASCAL của hãng BORLAND (Mỹ)
· IBM PASCAL của hãng Microsoft (Mỹ)
Pascal có tiếp tục tồn tại?!
Để kết luận, xin trích dẫn lời của Dennis Ritch tác giả của ngôn ngữ C : “ Pascal là một ngôn ngữ thanh lịch. Nó vẫn tiếp tục tồn tại.. Nó đã khỡi nguồn cho không ít ngôn ngữ đàn em và có ảnh hưởng sâu sắc đến việc thiết kế các ngôn ngữ lập trình mới chung”.
Ðến nay, ngôn ngữ Pascal đã phát triển đến phiên bản Turbo Pascal. Các diễn giải và ví dụ trong giáo trình này chủ yếu sử dụng chương trình Turbo Pascal 5.5 - 7.0, hiện đang được sử dụng rộng rãi ở Việt Nam vì các ưu điểm của nó : tốc độ dich nhanh, chương trình dịch pascal được viết rất gọn , các phần mở rộng của nó so với pascal chuẩn đã đáp ứng được nhiều yêu cầu của con người sử dụng như quan thiệp sâu vào mấy và không ngừng cải tiến , nâng cao. Vì vậy, Turbo Pascal sản phẩm nổi tiếng thế giới của hảng BORLAND (Mỹ)
3
MỘT SỐ VÍ DỤ VỀ PASCAL
Trình biên dịch P4 là cơ sở cho rất nhiều trình biên dịch Pascal được viết bằng Pascal sau đó, bao gồm cả UCSD p-System
4
Free Pascal được viết bằng Pascal (sao cho nó có thể biên dịch được chính nó), đượcphát triển với mục tiêu là cung cấp một trình biên dịch mạnh mẽ vàthuận tiện, có khả năng biên dịch cả các ứng dụng cũ lẫn phát triển ứngdụng mới. Được phân phối miễn phí dưới giấy phép GNU. Có khả năng trộn lẫn cả mã của Turbo Pascal và mã Delphi, hỗ trợ nhiều nền tảng lẫn nhiều hệ điều hành.
5
Turbo Pascal là trình biên dịch Pascal thống trị cho PC vào thập niên 1980 và đầu thập niên 1990 .Nó phổ biến vì các mở rộng mạnh mẽ và đặc biệt là thời gian biên dịchcực kì ngắn. Trong thời điểm hiện tại, các phiên bản cũ của TurboPascal (tới 5.5) có thể tải xuống miễn phí tại trang web của Borland(tuy nhiên vẫn cần phải đăng ký).
turbo_pascal_60
6
Chrome là thế hệ Object Pascal tiếp theo cho nền tảng .NET và nền tảng Mono, được RemObjects Software cung cấp
chrome_on_white_small
7
GNU Pascal Compiler
8
Delphi là sản phẩm RAD (Rapid Application Development - phát triển ứng dụng tức thời) của Borland. Nó sử dụng Delphi,tiền thân từ Pascal, để tạo các chương trình ứng dụng cho nền Windows.Phiên bản mới nhất còn hỗ trợ cả việc biên dịch cho nền Microsoft.net.
Delphi 7
9
Kylix là một nhánh sản phẩm khác kế thừa từ Pascal của Borland, tiền thân từ Delphi, hỗ trợ hệ điều hành Linux và một thư viện đối tượng đã được bổ sung. Trình biên dịch và môi trường phát triển (IDE)có thể được cung cấp cho việc sử dụng phi lợi nhuận. Trình biên dịch(không bao gồm thư viện hay IDE) được cho là trở thành phần mềm Mã nguồn mở trong thời gian tới.
KylixIDE
10
Virtual Pascal được Vitaly Miryanov sáng tạo như một trình biên dịch dành cho OS/2tương thích với cú pháp của Borland Pascal. Sau đó nó được fPrint pháttriển thành sản phẩm thương mại, hỗ trợ thêm Win32, và đến năm 2000 trởthành phần mềm miễn phí. Ngày nay nó có thể biên dịch cho Win32, OS/2và cả Linux, và gần như hoàn toàn tương thích với Borland Pascal và Delphi.
11
IP Pascal ban đầu là ngôn ngữ Pascal dành cho Z80/CP/M, rồi được chuyển sang vàviết lại cho Intel 80386/PC. IP Pascal có một thư viện khả chuyển (portability library). Ví dụ, một chương trình hiển thị văn bản viết bằng Pascal chuẩn từ thập niên 1970 có thể được biên dịch lại để làm việc trong một cửa sổ và thậm chí cócả việc tạo dựng đồ họa. IP Pascal hỗ trợ chuẩn ISO 7185 và nâng cấpngôn ngữ một cách logic. Ví dụ, Pascal chuẩn hỗ trợ các xâu ký tự được"căn lề phải" và sau đó còn hỗ trợ xâu ký tự động. Mảng tĩnh của Pascalchuẩn được nâng thành mảng động nhưng vẫn hoàn toàn tương thích ngượcvới mảng tĩnh, v.v…
12
Execute IP Pascal services
13
Pocket Studio là một tập nhỏ các trình biên dịch Pascal và RAD hướng tới Palm/MC68xxx với một số mở rộng hỗ trợ giao tiếp với API (Application
Programming Interface - giao tiếp lập trình ứng dụng) của hệ điều hành Palm OS.
DVD Pocket Studio 3.5
14
Lazarus là môi trường phát triển tức thời trực quan đa nền tảng. Lazarus sử dụng trình biên dịch Free pascal
Lazarus
IDE 9.19
15
Super Pascal là một biến thể của Pascal, bổ sung nhãn không có số, trả lại biểu thức hay mệnh đề là tên của kiểu dữ liệu. Super Pascal là một biến thể của Pascal, bổ sung nhãn không có số, trả lại biểu thức hay mệnh đề là tên của kiểu dữ liệu
Super Pascal 128
16
II. CẤU TRÚC CƠ BẢN CỦA CHƯƠNG TRÌNH PASCAL
1. Cấu trúc chung :
Một chương trình máy tính là một dãy lệnh, một dãy chỉ thị hướng dẩn máy tính thực hiện một nhiệm vụ, một xữ lí nào đó trên một tập hợp các dữ liệu, số liệu. Cấu trúc tổng quát một chương trình Pascal gồm ba phần :
PROGRAM Tên_Chương_Trình; ® (*Tiêu đề*)
USES ... ® (*Phần khai báo: đơn vị chương trình
LABEL ... nhãn ...
CONST ... hằng ...
TYPE ... kiểu ...
VAR ... biến ...*)
PROCEDURE ... ® (*Phần mô tả thủ tục/ch. trình con
FUNCTION ... hàm ...*).
BEGIN ® (*Thân chương trình chính*)
... (*Các câu lệnh chương trình*)
END. ® (*Kết thúc chương trình*)
b. Phần khai báo dữ liệu hằng, biến (Const, Var), mô tả kiểu dữ liệu ( Type), khai báo chương trình con ( Procedure, Function)
c. Phần thân chương trình chứa các lệnh để máy tính thực hiện
a. Phần tiêu đề của chương trình (phần tên)
2. Sơ đồ cấu trúc chương trình pascal
17
Œ Phần tiêu đề:Phần này bắt đầu bằng từ khóa Program rồi tiếp đến là tên của chương trình và chấm dứt bằng dấu chấm phẩy đặt theo đúng qui cách của danh hiệu tự đặt ). Phần tiêu đề có hay không cũng được
Phần khai báo dữ liệu:Trước khi sử dụng biến nào phải khai báo biến đó, nghĩa là xác định rõ xem biến đó thuộc kiểu dữ liệu nào. Có thể có một số hoặc tất cả các khai báo dữ liệu sau:
CONST : khai báo hằng
TYPE : định nghĩa kiểu dữ liệu mới
VAR : khai báo các biến
Phần khai báo chương trình con: Phần này mô tả một nhóm lệnh được đặt tên chung là một chương trình con để khi thân chương trình chính gọi đến thì cả nhóm lệnh đó được thi hành. (có thể có hoặc không tùy theo nhu cầu )
Phần thân chương trình là phần quan trọng nhất và bắt buộc phải có, phần này luôn nằm giữa 2 từ khoá là BEGIN và END. Ở giữa là lệnh mà các chương trình chính cần thực hiện. Sau từ khóa END là dấu chấm (.) để báo kết thúc chương trình.
Dấu chấm phẩy dùng để ngăn cách các câu lệnh của Pascal và không thể thiếu được.
Lời chú thích: Lời chú thích dùng để chú giải cho người sử dụng chương trình nhớ nhằm trao đổi thông tin giữa người và người, máy tính sẽ không để ý đến lời chú thích này. Lời chú thích nằm giữa ký hiệu: { } hoặc (* *)
18
PROGRAM Hello; { Dòng tiêu đề }
USES Crt; { Lời gọi sử dụng các đơn vị chương trình }
VAR Name : string; { Khai báo biến }
PROCEDURE Input; { Có thể có nhiều Procedure và Function } Begin
ClrScr; { Lệnh xóa màn hình }
Write( ‘Hello ! What is your name ?... ‘);Readln(Name);
End;
BEGIN { Thân chương trình chính }
Input;
Writeln ( ‘Welcome to you, ‘, Name) ;
Writeln ( ‘Today, we study PASCAL PROGRAMMING ... ‘);
Readln; END.
Ví dụ : Giả sử ta muốn viết ra màn hình các dòng chữ giới thiệu. Sau đây là chương trình viết bằng TP để thực hiện việc đó
19
1. Kiểu logic Bun ( Logic Boolean)
- Từ khóa: BOOLEAN
- Miền giá trị: (TRUE, FALSE).
- Trong Pascal, khi so sánh các giá trị boolean các biến, hằng được khai báo kiểu dữ liệu đúng sai sẽ chỉ nhận 1 trong 2 giá trị True (đúng) và False (sai)
Kiểu dữ liệu đúng sai có từ khóa để khai báo là Boolean. Các phép toán : phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, NOT có thể áp dụng cho các giá trị kiểu Boolean và cho ta kết quả cũng là kiểu Boolean. Quy tắc của các phep stoán cos thể được tóm tắt dưới dạng “ bảng sự thật ”(Truth table)
Phép AND : ( phép “và ” logic)
Phép OR : ( phép “hoặc” logic)
Phép NOT : ( phép “đảo ” hay “ phủ định” logic)
Phép XOR : ( phép “hoặc triệt tiêu ” logic)
Ví dụ : Giả sử A và B là hai giá trị kiểu Boolean.
III. CÁC KIỂU DỮ LIỆU ĐƠN GIẢN CHUẨN
Bảng sự thật của các phép toán logic Boolean
20
2. Kiểu số nguyên (Integer)
2.1. Các kiểu số nguyên:
a. Byte: Chứa các giá trị là số nguyên từ 0 đến 255, và chiếm 1 byte bộ nhớ.
b. Integer: Các số nguyên từ -32768 đến 32767. Chiếm 2 bytes bộ nhớ
c. Shortint: Số nguyên từ -128 đến 127 (1 byte)
d. Word: 0 đến 65535. (2 bytes)
e. Longint: -2.147.483.648 đến 2.147.483.647. (4 bytes)
Từ khoá : INTEGER
Một giá trị kiểu số nguyên là một phần tử của tập các số nguyên mà ta có thể biểu diển được trên máy, ngĩa nó là một ập nhỏ của không gian các số nguyên chứ không phải tất cả mọi số nguyên đều có thể xử lý trên máy tính đực, Thông thường nhất, các số nguyên được biểu diển bằng hai byte (16 bit) nên phạm vi từ -32768 đến 32767
21
2.2. Các phép toán trên kiểu số nguyên
2.2.1. Các phép toán số học:
+, -, *, / (phép chia cho ra kết quả là số thực).
Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6).
Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4).
2.2.2. Các phép toán xử lý bit:
Trên các kiểu ShortInt, Integer, Byte, Word có các phép toán:
NOT, AND, OR, XOR.
Tùy thuộc vào các yêu cầu, mà các bạn sử dụng kiểu dữ liệu thích hợp. Chọn kiểu dử liệu nhỏ sẽ tiết kiệm bộ nhớ, nhưng nếu biến số chứa các giá trị vượt qua kiểu dữ liệu đó sẽ làm cho kết quả bài toán bị sai lệch!
22
Ví dụ:
Đề yêu cầu nhập vào 2 số nguyên có giá trị <1000, sau đó tính tổng 2 số đó! Lúc
này, ta chắc chắn không thể dùng kiểu byte hay shortint cho 2 số đó, và cho
tổng! Mà ta sẽ dùng kiểu integer hoặc word (đều chiếm 2 bytes) Tất cả các kiểu
dữ liệu trên đều là kiểu dữ liệu số nguyên, tức không thể dùng để chứa các giá
trị có phần thập phân. Tùy thuộc vào các yêu cầu, mà các bạn sử dụng KDL
thích hợp. Chọn kiểu dữ liệu nhỏ sẽ tiết kiệm bộ nhớ, nhưng nếu biến số chứa
các giá trị vượt qua kiểu dữ liệu đó sẽ làm cho kết quả bài toán bị sai lệch!
Ví dụ :
+234, - 32767, -1, 23, 123 ….
MaxInt là têngiá trị cực đại cho phép của kiểu nguyên, tức là MaxInt = + 32767
23
3. Kiểu số thực (real)
3.1. Dạng thập phân
Đây là kiểu dữ liệu có chứa các số thập phân, tức là các số có dạng xxx.yyyy
a. Single: Chứa các giá trị từ 1.5E -45 đến 3.4 E38 (1,5 x 10^-45 đến 3,4 x 10^38 ). (4 bytes)
Trong Pascal, biểu diễn số thực mặc định dạng xx.yy E zz, tức là xx.yy x 10 mũ zz
b. Real: 2.9E -39 đến 1.7E 38 (2,9 x10 ^ - 39 đến 1,7 x 10 38 ) (6 bytes).
c. Double: 5.0E -324 đến 1.7E 308 (5,0 x10 ^ - 324 đến 1,7 x 10 ^ 308 ) (8 bytes).
24
3.2. Các phép toán trên kiểu số thực: +, -, *, /
Chú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD.
3.3. Các hàm số học thường sử dụng cho kiểu số nguyên và số thực:
SQR(x): Trả về x2
SQRT(x): Trả về căn bậc hai của x (x≥0)
ABS(x): Trả về |x|
SIN(x): Trả về sin(x) theo radian
COS(x): Trả về cos(x) theo radian
ARCTAN(x): Trả về arctang(x) theo radian
LN(x): Trả về ln(x)
EXP(x): Trả về ex
TRUNC(x): Trả về số nguyên gần với x nhất nhưng bé hơn x.
INT(x): Trả về phần nguyên của x
FRAC(x): Trả về phần thập phân của x
ROUND(x): Làm tròn số nguyên x
PRED(n): Trả về giá trị đứng trước n
SUCC(n): Trả về giá trị đứng sau n
ODD(n): Cho giá trị TRUE nếu n là số lẻ.
INC(n): Tăng n thêm 1 đơn vị (n:=n+1).
DEC(n): Giảm n đi 1 đơn vị (n:=n-1).
25
4. Kiểu ký tự (character)
- Từ khoá: CHAR.
- Kích thước: 1 byte.
- Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau đây:
+ Đặt ký tự trong cặp dấu nháy đơn. Ví dụ `A`, `0`.
+ Dùng hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn).
Ví dụ: CHR(65) biễu diễn ký tự `A`.
- Dùng ký hiệu #n (trong đó n là mã ASCII của ký tự cần biểu diễn).
Ví dụ #65.
- Các phép toán: =, >, >=, <, <=,<>.
- Kiểu ký tự để biểu diễn các ký tự nằm trong bảng mả ASCII (American
Standard Code for Information Interchange). trong đó có chứa các số 0..9, các ký tự thường a..z và ký tự hoa A..Z, và một số ký tự đặc biệt khác!
Bảng mã ASCII gồm 256 ký từ có mã từ 0 đến 255
Mỗi ký tự tươn gứng với 1 mã số!
Ví dụ, ký tự A sẽ tương ứng với mã 64, space (khoảng trắng) tương ứng với 32!
- Kiểu ký tự ngoài việc dùng để chứa các ký tự xuất ra màn hình, còn dùng để điều khiển việc nhận lệnh từ bàn phím. Để thể hiện tất cả các ký tự trong bảng mã ASCII, các bạn dùng chương trình sau :
Program Bang_ma_ASCII;Uses CRT; Var I : Integer; Begin
26
* Các hàm trên kiểu ký tự:
UPCASE(ch): Trả về ký tự in hoa tương ứng với ký tự ch.
Ví dụ: UPCASE(`a`) = `A`.
ORD(ch): Trả về số thứ tự bảng mã ASCII của ký tự ch. Ví dụ ORD(`A`)=65.
CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n.
Ví dụ: CHR(65)=`A`.
PRED(ch): cho ký tự đứng trước ký tự ch. Ví dụ: PRED(`B`)=`A`.
SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: SUCC(`A`)=`B`.
5. Kiểu chuỗi (String)
Kiểu string là 1 KDL gồm tối đa 255 ký tự liên tiếp nhau.
Thích hợp để dùng các biến chứa tên, địa chỉ, email....
Có 2 cách khai báo KDL string
a. Mặc định, tức biến sẽ có độ dài tối đa 255 ký tự
Ta khai báo: Var chuoi1: string;
b. Giới hạn:
Ta giới hạn chiều dài của chuỗi bằng 1 con số cụ thể.
Var: chuoi2: string[độ dài];
Trong đó độ dài là 1 số từ 0 đến 255, khi khai báo theo kiểu này, thì biến sẽ là 1 chuỗi có số ký tự tối đa là độ dài
Ví dụ: Var hoten: string[20];
lop: string[4];
Mã: string[1];.
27
IV. CÁC CÂU LỆNH VÀO RA
28
repeat
statement;
until;
Sau mỗi câu lệnh, phải có dấu chấm phẩy - `;‘
Nếu muốn chú thích trong lúc lập trình để dễ dàng nhớ tới trong 1 lần đọc source, hãy để nó trong dấu `{` và `}` hay `(*` và `*)‘
Nếu muốn xuất dữ liệu cuối cùng ra màn hình, phải có 1 câu lệnh read hay readln để chờ bạn bấm enter mới thoát ra ngoài ; hay bấm Alt+F5 để xem tất cả những gì vừa hiện trên màn hình trong lần chạy chương trình gần nhất.
Nếu muốn xóa trắng màn hình trước khi nhập hay xuất dữ liệu, bạn gõ lệnh clrscr; {Clear Screen} với thư viện sử dụng là crt; {khai báo trong phần uses}
Các trang trong thể loại “Lệnh Pascal”
14 trang sau nằm trong thể loại lệnh pascal, trên tổng số 14 trang.
D : Delay - DosVersion
E : Exec
G : GetDate
G tiếp : GetEnv - GetTime - GotoXY
I : Int
R : Random
R tiếp : Read - Readln
S : SetTime - SwapVectors
W : Writeln
29
1.Các câu lệnh rẽ nhánh:
Trong Pascal, khi có 1 điều kiện đưa ra có nhiều hướng đi, để xử lí thích hợp cho từng điều kiện con, ta cần có các câu lệnh rẽ nhánh để thực hiện nhiệm vụ này.
Có 2 câu lệnh dùng để rẽ nhánh, bao gồm :
a.Câu lệnh rẽ nhánh đơn giản : if
Cú pháp :
if ()
else
Biểu thức điều kiện
Công việc 1 Thoát ĐúngSai
Công việc 2 Giải thích:
Công việc 1, công việc 2 được thể hiện là 1 câu lệnh hay 1 khối lệnh.
Đầu tiên Biểu thức điều kiện được kiểm tra trước.
Nếu điều kiện đúng thì thực hiện công việc 1.
Nếu điều kiện sai thì thực hiện công việc 2.
Các lệnh phía sau công việc 2 không phụ thuộc vào điều kiện.
V. CÂU LỆNH RẼ NHÁNH, CẶP VÀ GHÉP
30
#include
#include
int main ()
{
float a;
printf("Nhap a = "); scanf("%f",&a);
if (a !=0 )
printf("Nghich dao cua %f la %f",a,1/a);
else
printf(“Khong the tim duoc nghich dao cua a”);
getch();
return 0;
}
Giải thích:
- Nếu chúng ta nhập vào a 0 thì câu lệnh printf ("Nghich dao cua %f la %f",a,1/a) được thực hiện, ngược lại câu lệnh printf (“Khong the tim duoc nghich dao cua a”) được thực hiện.
- Lệnh getch () luôn luôn được thực hiện.
Ví dụ 1: Yêu cầu người thực hiện chương trình nhập vào một số thực a. In ra màn hình kết quả nghịch đảo của a khi a 0, khi a =0 in ra thông báo “Khong the tim duoc nghich dao cua a”
31
b. Lệnh CASE .. OF
* Cách viết, ý nghĩa:
CASE OF Xét giá trị của biểu thức chọn
GT1 : Công việc 1 ; Nếu có giá trị 1 (GT1) thì thi hành Công việc 1
....................... ................................... (R)
GTi : Công việc i ; Nếu có giá trị i (GT i) thì thi hành Công việc i
...................... .................................... (R)
ELSE Công việc 0 ; Nếu không có giá trị nào thỏa thì thực hiện
Công việc 0
END;
Ghi chú:
- Lệnh CASE .. OF có thể không có ELSE
- Biểu thức chọn là kiểu rời rạc như Integer, Char, không chọn kiểu Real
- Nếu muốn ứng với nhiều giá trị khác nhau của biểu thức chọn vẫn thi hành một lệnh thì giá trị đó có thể viết trên cùng một hàng cách nhau bởi dấu phẩy (,) : Giá trị k1, k2, ..., kp : Lệnh k ;
Ví dụ : PROGRAM Chon_mau ;
VAR color : char ;
BEGIN
write (` Chọn màu theo một trong 3 ký tự đầu là R / W / B `) ;
readln ( color) ;
CASE color OF
`R` ,`r` : write (` RED = màu đỏ `) ;
`W`, `w` : write (` WHITE = màu trắng `) ;
`B` , `b` : write (` BLUE = màu xanh dương `) ;
END ;
Readln;
END.
32
#include
#include
int main ()
{
int a, b;
printf("Nhap vao gia tri cua 2 so a va b !");
scanf("%d%d",&a,&b);
if (a>b)
{
printf(" a lon hon b”);
printf(" a=%d b=%d ",a,b);
}
else
{
printf(" a nho hon hoac bang b");
printf(" a=%d b=%d",a,b);
}
printf(" Thuc hien xong lenh if");
getch();
return 0;
}
Ví dụ 2: Yêu cầu người chạy chương trình nhập vào giá trị của 2 số a và b, nếu a lớn hơn b thì in ra thông báo “Gia trị của a lớn hơn giá trị của b, giá trị của 2 số”, ngược lại thì in ra màn hình câu thông báo “Giá trị của a nhỏ hơn hoặc bằng giá trị của b, giá trị của 2 số”.
33
Giải thích:
- Nếu chúng ta nhập vào 40 30 thì kết quả hiển ra trên màn hình là
a lon hon b
a=40 b=30
Thuc hien xong lenh if
- Còn nếu chúng ta nhập 40 50 thì kết quả hiển ra trên màn hình là
a nho hon hoac bang b
a=40 b=50
Thuc hien xong lenh if
Lưu ý:
- Ta có thể sử dụng các câu lệnh if…else lồng nhau. Trong trường hợp if…else lồng nhau thì else sẽ kết hợp với if gần nhất chưa có else.
- Trong trường hợp câu lệnh if “bên trong” không có else thì phải viết nó trong cặp dấu {} (coi như là khối lệnh) để tránh sự kết hợp else if sai.
Ví dụ :
if ( so1>0)
if (so2 > so3)
a=so2;
else /*else của if (so2>so3) */
a=so3;
34
2.Cấu trúc vòng lặp:
Cấu trúc vòng lặp cho phép lặp lại nhiều lần 1 công việc (được thể hiện bằng 1 câu lệnh hay 1 khối lệnh) nào đó cho đến khi thỏa mãn 1 điều kiện cụ thể.
a.Vòng lặp for
Lệnh for cho phép lặp lại công việc cho đến khi điều kiện sai.
Cú pháp:
for (Biểu thức 1; biểu thức 2; biểu thức 3)
Lưu đồ:
Tính giá trị Biểu thức 1Biểu thức 2Công việcTính giá trị Biểu thức 3EndBeginĐS
Giải thích:
: được thể hiện là 1 câu lệnh hay 1 khối lệnh. Thứ tự thực hiện của câu lệnh for như sau:
B1: Tính giá trị của biểu thức 1.
B2: Tính giá trị của biểu thức 2.
- Nếu giá trị của biểu thức 2 là sai (=0): thoát khỏi câu lệnh for.
- Nếu giá trị của biểu thức 2 là đúng (!=0): được thực hiện.
B3: Tính giá trị của biểu thức 3 và quay lại B2.
35
Một số lưu ý khi sử dụng câu lệnh for:
- Khi biểu thức 2 vắng mặt thì nó được coi là luôn luôn đúng
- Biểu thức 1: thông thường là một phép gán để khởi tạo giá trị ban đầu cho biến điều kiện.
- Biểu thức 2: là một biểu thức kiểm tra điều kiện đúng sai để dừng vòng lặp.
- Biểu thức 3: thông thường là một phép gán để thay đổi giá trị của biến điều kiện.
- Trong mỗi biểu thức có thể có nhiều biểu thức con. Các biểu thức con được phân biệt bởi dấu phẩy
Ví dụ : Viết đoạn chương trình in dãy số nguyên từ 1 đến 10.
#include
#include
int main ()
{ int i;
clrscr();
printf(" Day so tu 1 den 10 :");
for (i=1; i<=10; i++)
printf("%d ",i);
getch();
return 0;
}
36
b. Vòng lặp while
Vòng lặp while giống như vòng lặp for, dùng để lặp lại một công việc nào đó cho đến khi điều kiện sai.
Cú pháp:
while (Biểu thức điều kiện)
Đ kiệnCông việcThoátĐúngSaiGiải thích:
-: được thể hiện bằng 1 câu lệnh hay 1 khối lệnh.
- Kiểm tra Biểu thức điều kiện trước.
- Nếu điều kiện sai (=0) thì thoát khỏi lệnh while.
- Nếu điều kiện đúng (!=0) thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp.
Lưu ý:
- Lệnh while gồm có biểu thức điều kiện và thân vòng lặp (khối lệnh thực hiện công việc)
- Vòng lặp dừng lại khi nào điều kiện sai.
- Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay đổi điều kiện.
37
#include
#include
int main ()
{ unsigned int n,i,tong;
clrscr();
printf(" Nhap vao so nguyen duong n:"); scanf("%d",&n);
tong=0;
for (i=1; i<=n; i++)
tong+=i;
printf(" Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}
Ví dụ : Viết chương trình nhập vào một số nguyên n. Tính tổng các số nguyên từ 1 đến n.
38
c. Vòng lặp do… while
Vòng lặp do … while giống như vòng lặp for, while, dùng để lặp lại một công việc nào đó khi điều kiện còn đúng.
Cú pháp:
do
while ()
Đ kiệnCông việcThoátĐúngSaiGiải thích:
-: được thể hiện bằng 1 câu lệnh hay 1 khối lệnh.
- Trước tiên công việc được thực hiện trước, sau đó mới kiểm tra Biểu thức điều kiện.
- Nếu điều kiện sai thì thoát khỏi lệnh do …while.
- Nếu điều kiện còn đúng thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp.
Lưu ý:
- Lệnh do…while thực hiện công việc ít nhất 1 lần.
- Vòng lặp dừng lại khi điều kiện sai.
- Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay đổi điều kiện.
39
#include
#include
int main ()
{ int i;
clrscr();
printf(" Day so tu 1 den 10 :");
i=1;
do
printf("%d ",i++);
while (i<=10);
getch();
return 0;
}
Kết quả chương trình như sau:
Ví dụ 1: Viết đoạn chương trình in dãy số nguyên từ 1 đến 10.
40
Ví dụ 2: Viết chương trình nhập vào một số nguyên n. Tính tổng của các số nguyên từ 1 đến n.
#include
#include
int main ()
{ unsigned int n,i,tong;
clrscr();
printf(" Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;
i=1;
do
{
tong+=i;
i++;
} while (i<=n);
printf(" Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}
Nếu chúng ta nhập vào số 9 thì kết quả như sau:
41
3. Lệnh ghép (Compound statement
Một nhóm câu lệnh đơn được đặt giữa 2 chữ BEGIN và END sẽ tạo thành một câu lệnh ghép hay một lệnh hợp thành với mẫu viết như sau
BEGIN
Câu lệnh 1;
Câu lệnh 2;
…………..
Câu lệnh N;
END;
Trong Pascal ta có thể đặt các lệnh ghép con trong các lệnh ghép lớn hơn bao ngoài của nó và có thể hiểu tương tự như cấu trúc ngoặc đơn ( ) trong các biểu thức toán học.
Các nhóm lệnh thành từng khối (block). Một khối lệnh bắt đầu bằng BEGIN và chấm dứt ở END; . Trong một khối lệnh cũng có thể có các khối lệnh con nằm trong nó. Một khối chương trình thường được dùng để nhóm từ 2 lệnh trở lên để tạo thành một của các lệnh có cấu trúc
Mô hình chương trình có câu trúc “ khối lệnh” được xây dựng qua lệnh hợp thành Begin...End;
42
PROGRAM tamgiac
VAR a, b, c, trgian : REAL
BEGIN
WRITE (“Hay cho ba so bat ki”); READLN (a, b, c)
IF a>b THEN BEGIN trgian : = a, a : = b; b : = trgian END
{ Đổi giá trị của a và b cho nhau}
IF a>b THEN BEGIN trgian : = b, b : = c; c : = trgian END
{ Đổi giá trị của b và c cho nhau}
IF a>b THEN BEGIN trgian : = a, a : = b; b : = trgian END
{Đề phòng trường hợp a lớn hơn giá trị mới của b}
IF ( a> 0) AND (c < a + b)
THEN WRITE ( “ Ba so da cho la 3 canh mot tam giac”)
ELSE WRITE ( “ Ba so da cho khong phai la 3 canh mot tam giac”)
READLN
END
Ví dụ : Cho máy nhận vào ba số a, b, c bất kì, xem xét ba số đó có thể là số đo ba cạnh của một tam giác hay không
43
4. CÁC CÂU LỆNH ĐẶC BIỆT
Lệnh break
Cú pháp: break
Dùng để thoát khỏi vòng lặp. Khi gặp câu lệnh này trong vòng lặp, chương trình sẽ thoát ra khỏi vòng lặp và chỉ đến câu lệnh liền sau nó. Nếu nhiều vòng lặp --> break sẽ thoát ra khỏi vòng lặp gần nhất. Ngoài ra, break còn được dùng trong cấu trúc lựa chọn switch.
Lệnh continue
Cú pháp: continue
- Khi gặp lệnh này trong các vòng lặp, chương trình sẽ bỏ qua phần còn lại trong vòng lặp và tiếp tục thực hiện lần lặp tiếp theo.
- Ðối với lệnh for, biểu thức 3 sẽ được tính trị và quay lại bước 2.
Ðối với lệnh while, do while; biểu thức điều kiện sẽ được tính và xét xem có thể tiếp tục thực hiện nữa hay không? (dựa vào kết quả của biểu thức điều kiện).
Nếu muốn xóa trắng màn hình trước khi nhập hay xuất dữ liệu, gõ lệnh clrscr; {Clear Screen} với thư viện sử dụng là crt; {khai báo trong phần uses}
44
VI. KIỂU DỮ LIỆU MẢNG (ARRAY)
A = ARRAY [ Kiểu_chỉ_dẩn ] OF Kiểu_phần _tử
2. Mảng một chiều
Là mảng kiểu cấu trúc được đề cập sớm nhất trong các ngôn ngữ lập trình . Nó được dùng để chỉ định một nhóm đối tượng cùng một tính chất nào đó
VAR, ARRAY và OF là từ khoá. Tên biến mảng là một tên gọi tự đặt. Kiểu thành phần là tên kiểu phần tử mảng
Khai báo tên gọi có kiểu dữ liệu mảng một chiều có dạng :
VAR tên mảng : ARRAY [ Kiểu chỉ dẩn ] OF Kiểu phần tử
Một mảng dữ liệu gồm một số hữu hạn phần tử có cùng kiểu gọi là kiểu cơ bản. Số phần tử của mảng được xác định ngay từ khi định nghĩa ra mảng. Mỗi phần tử của mảng được truy cập trực tiếp thông quatên mnảg cùng với chỉ dẫn truy nhập đựoc để giữa hai ngoặc vuông [ ]. Định nghĩa mảng T có kiểu các phần tử KPT, có kiểu chỉ dẩn KCD để hướng dẫn cách tổ chứcmnãg cũng như cách truy nhập vào các phần tử mảng được viết trong pasacl với từ khoá như sau:
Kiểu dữ liệu có cấu trúc : Mảng (Array)
TYPE : Kiểu_mảng T = ARRAY [ Kiểu_chỉ_dẩn KCC] OF Kiểu_phần _tử KPT;
hay viết tắt thành T = ARRAY [ KCD] OF KTP;
VAR : A: Kiểu_mảngT
Ta có thể khai báo trực tiếp biến A khi không cần định nghĩa kiể trong phần TYPE
45
PROGRAM Thue;
USES CRT;
CONST n = 10;
VAR
tien : ARRAY [ 1…n] OF REAL;
BEGIN
CLRSCR ; s : = 0; so : = O;
WRITELN (‘Vao tien cua tung ho’);
FOR I := 1 TO n DO
BEGIN
WRITE (‘ho[‘,I,’]=‘);
READ(tien[i]);
GOTOXY(where + 11 * I, WhereY - 1);
END;
S;s/n;
FOR i:=1 TO n DO
I tien [i]WRITEN;
WRITEN;
WRITEN(So ho nop thue duoi trung binh ‘ so:9:2);
END.
Ví dụ : Có 10 hộ kinh doanh nộp thuế nhà nước bằng tiền. Hãy lập chương trình tính số hộ nộp thuế dưới mức trung bình khi nạp từ bàn phím số tiền từng hộ?
46
3. Mảng nhiều chiều
Là mảng kiểu phần tử không bị hạn chế nhiều như kiểu chỉ dẩn. Nó còn có thể là các kiể có cấu trúc. Ví dụ sau cho thấy việc khai báo một mảng có các phần tử cũng là mảng.
Việc truy cập đối với mảng có định nghĩa phức tạp như MPT được tiến hành qua hai cách :
Qua hai lần đóng mở ngoặc vuông. Thí dụ : MPT [3] [5] biểu diển phần tử cuối cùng của mảng MPT
Hoặc thường được viết đơn giản trong một ngoặc vuông với các chĩ dẫn cáh nhau bằng dấu phẩy : MPT [ 3, 5 ] , Z[3, ‘B’]; [ Xem hình]
Cách viết MT [I] [J] và MPT [ I, J ] tương đương nhau. Mảng được định nghĩa như trên có thể hiểu là ma trận nhiều chiều. Phần tử MPT [ I, J ] sẽ là phần tử hàng thứ I, cột thứ J của MPT.
Một số phép toán không thể dùng vòng FOR J:= 1 TO N DO ..mà phải ghi trực tiếp các phần tử cần đọc vào thủ tục Readln.
Mảng có thể dùng tham số cho chương trình con và mảng không bao giờ dùng làm cho kết quả của FUNCTION. Tuy nhiên cần lưư ý khai báo kiểu của tham số trong vùng khai báo TYPE chứ không định nghĩa kểu trực tiếp ngay trong phần khai báo tham số của CTC (Xem ví dụ khai báo liểu MT dưới đây).
47
TYPE
MT = ARRAY [ 1…3, 1…5] OF REAL;
VAR
X, Y, Z : MT ;
( * …………………………………………………………………..*)
PROCEDURE CONG_MATRAN (A, B, : ; VAR C : MT);
Var
I, j : integer;
Begin
FOR I : = 1 TO N DO C[i, j] := A[i, j] + B[i, j] ;
End
( * …………………………………………………………………..*)
BEGIN
…
CONG_MATRAN ( X, Y, Z ) ;
…
END.
Ví dụ: Hãy viết đầy đủ chương trình cộng hai ma trận C = A +B
48
VII. MỘT SỐ BÀI TẬP ĐƠN GIẢN
Bài toán 1 : Trên một tuyến đường ở thành phố du lịch nổi tiếng X có ô tô buýt công cộng phục vụ việc đi lại của du khách. Bến xe buýt có ở từng km của tuyến đường. Mỗi lần đi qua bến xe đều đỗ lại cho khách lên xuống. Mỗi bến đều có xe xuất phát từ nó, nhưng mỗi xe chỉ chạy không quá b km kể từ bến xuất phát của nó. Hành khách khi đi xe sẽ phải trả tiền cho độ dài đoạn đường mà họ ngồi trên xe. Cước phí cần trả để đi đoạn đường có độ dài i là ci (i=1...b) Một du khách muốn đi dạo L km trên tuyến đường nói trên. Hỏi ông ta phải lên xuống xe như thế nào để tổng số tiền phải trả cho chuyến dạo chơi bằng xe buýt là nhỏ nhất ?
Dữ liệu: Vào từ file văn bản Bus.inp
* Dòng đầu tiên chứa hai số nguyên dương b, L (b<=20, L<=200);
Dòng thứ hai chứ b số nguyên dương c1, c2...cbđượcghi cách nhau bởi ít nhất một kí tự trắng
Kêt quả: Ghi ra file văn bản Bus.out
* Dòng đầu tiên ghi chi phí tìm được
* Dòng thứ hai ghi số lần lên xuống xe k
* Dòng tiếp theo ghi k số là độ đài đoạn đường của k lần ngồi xe.
49
Gọi f(i) là số tiền ít nhất phải dùng khi cần đi quãng đường i (km)
f[0]:= 0;
f[1]:= c[1];
For i:=2 To L Do
Begin
Min:= Maxint;
For j:=1 To b Do
If i>= j Then
If f[i-j] + c[j]< Min Then
Begin
Min:= f[i-j] + c[j];
End;
f[i]:= Min;
End;
End;
50
Số Palindrom
Program palindrom;
Var N,a,b: integer;
begin
Write (`nhap n`);
Readln (n);
If (n>100) and (n<= 999) then
begin
a:= N mod 10;
b:= N div 100;
If a= b then write (`N la so palindrom`)
Else write (`N khong la so palindrom`);
Readln;
End.
Bài toán 2 : Số tự nhiên N được gọi là số palindrom nếu cách viết dưới dạng hệ thập phân của số đó là đối xứng .Cho số tự nhiên 10051
Số nguyên tố
Program so nguyen to;
var i,j,n: integer;
begin
Write (`nhap n`);
readln (n);
For i:= 2 to n do
begin
j:= 2;
While i mod j <> 0 do j:= j+1;
If i= j then write (i:4);
end;
readln;
end.
Bài toán 3 : Nhập vào số N . Tìm tất cả các số nguyên tố từ 1-->N,biết số nguyên tố là số chỉ chia hết cho 1 và chính nó
52
uses crt;
var n:integer;
f1,f2:text;
BEGIN
clrscr;
assign(f1,`number.inp`);
assign(f2,`number.out`);
reset(f1);
rewrite(f2);
readln(f1,n);
if n mod 2<>0 then writeln(f2,n-1) else writeln(f2,n+1);
readln;
END.
Bài toán 4 : Hãy viết chương trình đọc một số nguyên dương n từ file number.inp. Nếu n là số lẻ thì trừ 1 vào n, ngược lại tăng 1 vào n. Ghi n vào file number.out
53
Procedure ;
var
x,y: real;
begin
write(`Nhap diem TB mon Van :`);readln(x);
write(`Nhap diem TB mon Toan :`);readln(y);
{cho nay hoi chuoi, khong bik co duoc ko ? do de bai ko chat che}
writeln(`Nhap diem TB mon Van :`,y:3:1);
writeln(`Nhap diem TB mon Toan :`,x:3:1);
readln;
end.
Bài toán 5 : Cho v, t lần lượt điểm trung bình của môn văn và môn toán, đọc vào từ bàn phím. Hãy hoán vị v, t cho nhau. Xuất v, t ra màn hình. (yêu cầu không dùng biến trung gian, có nhiều cách rất hay đấy)
54
var l, r, mid, n: integer;
a: char;
begin
l := 0;
r := 10;
repeat
mid := (l + r) div 2;
writeln(`Co phai ban dang nghi so: `, mid);
readln(a);
a := upcase(a);
if a = `C` then
begin
writeln(`So ban dang nghi la : `,mid);
readln;
break;
end
else
if a = `L` then l := mid + 1
else r := mid - 1;
until l >= r;
end.
Bài toán 6 :Viết trò chơi đoán số. Người dùng nghĩ ra một số từ 0 đến 10. Máy được phép đoán 4 lần (với mỗi lần đoán người chơi sẽ gợi ý: lớn quá (bằng cách nhập vào chữ L), nhỏ quá (chữ N), chính xác (chữ C). Hãy giúp máy đoán chính xác
55
program uocso;
uses crt;
var n:integer;
i:byte;
begin
clrscr;
write(`nhap n: `);readln(n);
write(`cac uoc so cua `,n,` la: `);
for i:=2 to trunc(sqrt(n)) do if n mod i =0 then write(i:3);
readln
end
Bài toán 7: Viết công thức nhập số nguyên N và in ra các ước số của chúng ?
56
Nếu gọi hai cạnh của hình chữ nhật là a và b, gọi diện tích và chu vi lần lượt là S và P thì công thức tính S và P là: S = a.b P = 2(a+b)
PROGRAM a và b
{ Tinh dien tich va chu vi hinh chu nhat }
Uses CRT;
Var
a, b, S, P : Real ;
Begin
Clrscr;
Write( ‘Nhap chieu dai : ‘);
Readln(a);
Write( ‘Nhap chieu rong : ‘);
Readln(b);
S:=a*b;
P:=2* (a+b);
Writeln (‘ Dien tich = ‘, S:8:2);
Writeln (‘ Chu vi = ‘, P:8:2);
Readln;
End.
Bài toán 8: Viết chương trình để nhập vào độ dài hai cạnh của một hình chữ nhật, tính và in lên màn hình diện tích và chu vi của hình chữ nhật đó.
57
Program bt1;
Uses crt;
Var S:integer;
Begin
Clrscr;
S:=((1+100)*100) div 2;
Writeln(`Tong la : `,s);
Readln;
End.
Bài toán 9: Viết chương trình in ra màng hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì xuống dòng
program so;
begin
writeln("01 02 03 04 05 06 07 08 09 10");
writeln("11 12 13 14 15 16 17 18 19 20");
writeln("21 22 23 24 25 26 27 28 29 30");
writeln("31 32 33 34 35 36 37 38 39 40");
writeln("41 42 43 44 45 46 47 48 49 50");
writeln("51 52 53 54 55 56 57 58 59 60");
writeln("61 62 63 64 65 66 67 68 69 70");
writeln("71 72 73 74 75 76 77 78 79 80");
writeln("81 82 83 84 85 86 87 88 89 90");
writeln("91 92 93 94 95 96 97 98 99 100");
end.
Bài toán 10: Chỉ dùng một biến số viết chương trình tíng tổng S:=1+2+3+...+100
58
PROGRAM Thue;
USES CRT;
CONST n = 10;
VAR
tien : ARRAY [ 1…n] OF REAL;
BEGIN
CLRSCR ; s : = 0; so : = O;
WRITELN (‘Vao tien cua tung ho’);
FOR I := 1 TO n DO
BEGIN
WRITE (‘ho[‘,I,’]=‘);
READ(tien[i]);
GOTOXY(where + 11 * I, WhereY - 1);
END;
S;s/n;
FOR i:=1 TO n DO
Ì tien [i]WRITEN;
WRITEN;
WRITEN( So ho nop thue duoi trung binh ‘ so:9:2);
END.
Bài toán 11: Viết chương trình Có 10 hộ kinh doanh nộp thuế nhà nước bằng tiền. Hãy lập chương trình tính số hộ nộp thuế dưới mức trung bình khi nạp từ bàn phím số tiền từng hộ?
59
I. GIỚI THIỆU VỀ PASCAL
Về ý đồ khi xây dựng Pascal, Wirth viết : “Điểm mới của pascal đưa ra các cấu trúc và kiểu dữ liệu phong phú, cũng giống như ALGOL đưa ra các loại cấu trúc điều khiển. Trong ALGOL chỉ có 3 kiểu dữ liệu cơ sở : các số nguyên và thực, giá trị chân lí, mảng; Pascal đã đưa thêm các kiể dữ liệu cơ sở và còn khả năng xác định những kiểu cơ sở mới (kiểu liệt kê, kiểu miền con), cũng như các dạng cấu trúc dữ liệu mới : bản ghi, tập hợp, tệp, mà một số trong chũng đã có trong COBOL. Và tất nhiên, quan trọng nhất là tính đệ quy trong việc mô tả các cấu trúc ; hệ quả của điều này là khả năng kết hợp và lồng các cấu trúc ”
1
Pascal dựa trên ngôn ngữ lập trình Algol và được đặt tên theo nhà toán học và triết học Blaise Pascal. Wirth đồng thời cũng xây dựng Modula-2 và Oberon, là những ngôn ngữ tương đồng với Pascal. Oberon cũng hỗ trợ kiểu lập trình hướng đối tượng
Ban đầu, Pascal là một ngôn ngữ được hướng để dùng trong giảng dạy về lập trình có cấu trúc, và nhiều thế hệ sinh viên đã "vào đời" thông qua việc học Pascal như ngôn ngữ vỡ lòng trong các chương trình học đại cương. Nhiều biến thể của Pascal
ngày nay vẫn còn được sử dụng khá phổ biến trong giảng dạy. Mặc dù vậy, nếu nghĩ rằng Pascal là ngộ ngữ chỉ dành để giảng dạy, thì sẽ sai lầm. Hãy nghe chính ý kiến của Wirrth vè vấn đề bày (1984)”Có người cho rằng Pascal được thiết kế như một ngôn ngữ để giảng dạy. Mặc dù điều này là đúng, nhưng việc sử dụng nó để giảng dạy không phải là mục đích duy nhất. Thực tế, tôi không tin vào sự thành công của việc áp dụng trong khi học các phương pháp và công cụ mà không thể sử dụng để giải quyết các bài toán thực tế. Theo tiêu chuẩn ngày pascal có những yếu điểm rỏ rằng khi lập trình các hệ thống lớn, nhưng 15 năm trước đó là thảo hiệp hợp lí giữa cái mong muốn và hiệu quả ”
Pascal là một ngôn ngữ có định kiểu mạnh mẽ. Điều có nghĩa là mọi biến và hằng số của một kiểu dử liệu không thể tự đem trộn lẩn với các biến và hằng của một kiêủ dữ liệu khác. Việc định kiểu chặt chẽ như vậy buộc người lập trình luôn luôn phải có các biểu thức tương thích nhau về kiểu dữ liệu.Phần lớn hệ điều hành Macintosh được viết bằng Pascal. Hệ sắp chữ TEX phổ biến được viết bằng một
2
ngôn ngữ tên là Web là ngôn ngữ mà Donald Knuth đã vay mượn khá nhiều yếu tố từ Pascal.
Ngôn ngữ Pascal được dùng hiện nay có nhiều điểm khác biệt với chuẩn Pascal nguyên thủy của Giáo sư Wirth. Tùy theo quốc gia hoặc công ty đã phát triển cho ra đời các chương trình biên dịch ngôn ngữ Pascal như:
· ISO PASCAL (International Standards Organization) của Châu Âu
· ANSI PASCAL (American National Standards Institute) của Mỹ
· TURBO PASCAL của hãng BORLAND (Mỹ)
· IBM PASCAL của hãng Microsoft (Mỹ)
Pascal có tiếp tục tồn tại?!
Để kết luận, xin trích dẫn lời của Dennis Ritch tác giả của ngôn ngữ C : “ Pascal là một ngôn ngữ thanh lịch. Nó vẫn tiếp tục tồn tại.. Nó đã khỡi nguồn cho không ít ngôn ngữ đàn em và có ảnh hưởng sâu sắc đến việc thiết kế các ngôn ngữ lập trình mới chung”.
Ðến nay, ngôn ngữ Pascal đã phát triển đến phiên bản Turbo Pascal. Các diễn giải và ví dụ trong giáo trình này chủ yếu sử dụng chương trình Turbo Pascal 5.5 - 7.0, hiện đang được sử dụng rộng rãi ở Việt Nam vì các ưu điểm của nó : tốc độ dich nhanh, chương trình dịch pascal được viết rất gọn , các phần mở rộng của nó so với pascal chuẩn đã đáp ứng được nhiều yêu cầu của con người sử dụng như quan thiệp sâu vào mấy và không ngừng cải tiến , nâng cao. Vì vậy, Turbo Pascal sản phẩm nổi tiếng thế giới của hảng BORLAND (Mỹ)
3
MỘT SỐ VÍ DỤ VỀ PASCAL
Trình biên dịch P4 là cơ sở cho rất nhiều trình biên dịch Pascal được viết bằng Pascal sau đó, bao gồm cả UCSD p-System
4
Free Pascal được viết bằng Pascal (sao cho nó có thể biên dịch được chính nó), đượcphát triển với mục tiêu là cung cấp một trình biên dịch mạnh mẽ vàthuận tiện, có khả năng biên dịch cả các ứng dụng cũ lẫn phát triển ứngdụng mới. Được phân phối miễn phí dưới giấy phép GNU. Có khả năng trộn lẫn cả mã của Turbo Pascal và mã Delphi, hỗ trợ nhiều nền tảng lẫn nhiều hệ điều hành.
5
Turbo Pascal là trình biên dịch Pascal thống trị cho PC vào thập niên 1980 và đầu thập niên 1990 .Nó phổ biến vì các mở rộng mạnh mẽ và đặc biệt là thời gian biên dịchcực kì ngắn. Trong thời điểm hiện tại, các phiên bản cũ của TurboPascal (tới 5.5) có thể tải xuống miễn phí tại trang web của Borland(tuy nhiên vẫn cần phải đăng ký).
turbo_pascal_60
6
Chrome là thế hệ Object Pascal tiếp theo cho nền tảng .NET và nền tảng Mono, được RemObjects Software cung cấp
chrome_on_white_small
7
GNU Pascal Compiler
8
Delphi là sản phẩm RAD (Rapid Application Development - phát triển ứng dụng tức thời) của Borland. Nó sử dụng Delphi,tiền thân từ Pascal, để tạo các chương trình ứng dụng cho nền Windows.Phiên bản mới nhất còn hỗ trợ cả việc biên dịch cho nền Microsoft.net.
Delphi 7
9
Kylix là một nhánh sản phẩm khác kế thừa từ Pascal của Borland, tiền thân từ Delphi, hỗ trợ hệ điều hành Linux và một thư viện đối tượng đã được bổ sung. Trình biên dịch và môi trường phát triển (IDE)có thể được cung cấp cho việc sử dụng phi lợi nhuận. Trình biên dịch(không bao gồm thư viện hay IDE) được cho là trở thành phần mềm Mã nguồn mở trong thời gian tới.
KylixIDE
10
Virtual Pascal được Vitaly Miryanov sáng tạo như một trình biên dịch dành cho OS/2tương thích với cú pháp của Borland Pascal. Sau đó nó được fPrint pháttriển thành sản phẩm thương mại, hỗ trợ thêm Win32, và đến năm 2000 trởthành phần mềm miễn phí. Ngày nay nó có thể biên dịch cho Win32, OS/2và cả Linux, và gần như hoàn toàn tương thích với Borland Pascal và Delphi.
11
IP Pascal ban đầu là ngôn ngữ Pascal dành cho Z80/CP/M, rồi được chuyển sang vàviết lại cho Intel 80386/PC. IP Pascal có một thư viện khả chuyển (portability library). Ví dụ, một chương trình hiển thị văn bản viết bằng Pascal chuẩn từ thập niên 1970 có thể được biên dịch lại để làm việc trong một cửa sổ và thậm chí cócả việc tạo dựng đồ họa. IP Pascal hỗ trợ chuẩn ISO 7185 và nâng cấpngôn ngữ một cách logic. Ví dụ, Pascal chuẩn hỗ trợ các xâu ký tự được"căn lề phải" và sau đó còn hỗ trợ xâu ký tự động. Mảng tĩnh của Pascalchuẩn được nâng thành mảng động nhưng vẫn hoàn toàn tương thích ngượcvới mảng tĩnh, v.v…
12
Execute IP Pascal services
13
Pocket Studio là một tập nhỏ các trình biên dịch Pascal và RAD hướng tới Palm/MC68xxx với một số mở rộng hỗ trợ giao tiếp với API (Application
Programming Interface - giao tiếp lập trình ứng dụng) của hệ điều hành Palm OS.
DVD Pocket Studio 3.5
14
Lazarus là môi trường phát triển tức thời trực quan đa nền tảng. Lazarus sử dụng trình biên dịch Free pascal
Lazarus
IDE 9.19
15
Super Pascal là một biến thể của Pascal, bổ sung nhãn không có số, trả lại biểu thức hay mệnh đề là tên của kiểu dữ liệu. Super Pascal là một biến thể của Pascal, bổ sung nhãn không có số, trả lại biểu thức hay mệnh đề là tên của kiểu dữ liệu
Super Pascal 128
16
II. CẤU TRÚC CƠ BẢN CỦA CHƯƠNG TRÌNH PASCAL
1. Cấu trúc chung :
Một chương trình máy tính là một dãy lệnh, một dãy chỉ thị hướng dẩn máy tính thực hiện một nhiệm vụ, một xữ lí nào đó trên một tập hợp các dữ liệu, số liệu. Cấu trúc tổng quát một chương trình Pascal gồm ba phần :
PROGRAM Tên_Chương_Trình; ® (*Tiêu đề*)
USES ... ® (*Phần khai báo: đơn vị chương trình
LABEL ... nhãn ...
CONST ... hằng ...
TYPE ... kiểu ...
VAR ... biến ...*)
PROCEDURE ... ® (*Phần mô tả thủ tục/ch. trình con
FUNCTION ... hàm ...*).
BEGIN ® (*Thân chương trình chính*)
... (*Các câu lệnh chương trình*)
END. ® (*Kết thúc chương trình*)
b. Phần khai báo dữ liệu hằng, biến (Const, Var), mô tả kiểu dữ liệu ( Type), khai báo chương trình con ( Procedure, Function)
c. Phần thân chương trình chứa các lệnh để máy tính thực hiện
a. Phần tiêu đề của chương trình (phần tên)
2. Sơ đồ cấu trúc chương trình pascal
17
Œ Phần tiêu đề:Phần này bắt đầu bằng từ khóa Program rồi tiếp đến là tên của chương trình và chấm dứt bằng dấu chấm phẩy đặt theo đúng qui cách của danh hiệu tự đặt ). Phần tiêu đề có hay không cũng được
Phần khai báo dữ liệu:Trước khi sử dụng biến nào phải khai báo biến đó, nghĩa là xác định rõ xem biến đó thuộc kiểu dữ liệu nào. Có thể có một số hoặc tất cả các khai báo dữ liệu sau:
CONST : khai báo hằng
TYPE : định nghĩa kiểu dữ liệu mới
VAR : khai báo các biến
Phần khai báo chương trình con: Phần này mô tả một nhóm lệnh được đặt tên chung là một chương trình con để khi thân chương trình chính gọi đến thì cả nhóm lệnh đó được thi hành. (có thể có hoặc không tùy theo nhu cầu )
Phần thân chương trình là phần quan trọng nhất và bắt buộc phải có, phần này luôn nằm giữa 2 từ khoá là BEGIN và END. Ở giữa là lệnh mà các chương trình chính cần thực hiện. Sau từ khóa END là dấu chấm (.) để báo kết thúc chương trình.
Dấu chấm phẩy dùng để ngăn cách các câu lệnh của Pascal và không thể thiếu được.
Lời chú thích: Lời chú thích dùng để chú giải cho người sử dụng chương trình nhớ nhằm trao đổi thông tin giữa người và người, máy tính sẽ không để ý đến lời chú thích này. Lời chú thích nằm giữa ký hiệu: { } hoặc (* *)
18
PROGRAM Hello; { Dòng tiêu đề }
USES Crt; { Lời gọi sử dụng các đơn vị chương trình }
VAR Name : string; { Khai báo biến }
PROCEDURE Input; { Có thể có nhiều Procedure và Function } Begin
ClrScr; { Lệnh xóa màn hình }
Write( ‘Hello ! What is your name ?... ‘);Readln(Name);
End;
BEGIN { Thân chương trình chính }
Input;
Writeln ( ‘Welcome to you, ‘, Name) ;
Writeln ( ‘Today, we study PASCAL PROGRAMMING ... ‘);
Readln; END.
Ví dụ : Giả sử ta muốn viết ra màn hình các dòng chữ giới thiệu. Sau đây là chương trình viết bằng TP để thực hiện việc đó
19
1. Kiểu logic Bun ( Logic Boolean)
- Từ khóa: BOOLEAN
- Miền giá trị: (TRUE, FALSE).
- Trong Pascal, khi so sánh các giá trị boolean các biến, hằng được khai báo kiểu dữ liệu đúng sai sẽ chỉ nhận 1 trong 2 giá trị True (đúng) và False (sai)
Kiểu dữ liệu đúng sai có từ khóa để khai báo là Boolean. Các phép toán : phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, NOT có thể áp dụng cho các giá trị kiểu Boolean và cho ta kết quả cũng là kiểu Boolean. Quy tắc của các phep stoán cos thể được tóm tắt dưới dạng “ bảng sự thật ”(Truth table)
Phép AND : ( phép “và ” logic)
Phép OR : ( phép “hoặc” logic)
Phép NOT : ( phép “đảo ” hay “ phủ định” logic)
Phép XOR : ( phép “hoặc triệt tiêu ” logic)
Ví dụ : Giả sử A và B là hai giá trị kiểu Boolean.
III. CÁC KIỂU DỮ LIỆU ĐƠN GIẢN CHUẨN
Bảng sự thật của các phép toán logic Boolean
20
2. Kiểu số nguyên (Integer)
2.1. Các kiểu số nguyên:
a. Byte: Chứa các giá trị là số nguyên từ 0 đến 255, và chiếm 1 byte bộ nhớ.
b. Integer: Các số nguyên từ -32768 đến 32767. Chiếm 2 bytes bộ nhớ
c. Shortint: Số nguyên từ -128 đến 127 (1 byte)
d. Word: 0 đến 65535. (2 bytes)
e. Longint: -2.147.483.648 đến 2.147.483.647. (4 bytes)
Từ khoá : INTEGER
Một giá trị kiểu số nguyên là một phần tử của tập các số nguyên mà ta có thể biểu diển được trên máy, ngĩa nó là một ập nhỏ của không gian các số nguyên chứ không phải tất cả mọi số nguyên đều có thể xử lý trên máy tính đực, Thông thường nhất, các số nguyên được biểu diển bằng hai byte (16 bit) nên phạm vi từ -32768 đến 32767
21
2.2. Các phép toán trên kiểu số nguyên
2.2.1. Các phép toán số học:
+, -, *, / (phép chia cho ra kết quả là số thực).
Phép chia lấy phần nguyên: DIV (Ví dụ : 34 DIV 5 = 6).
Phép chia lấy số dư: MOD (Ví dụ: 34 MOD 5 = 4).
2.2.2. Các phép toán xử lý bit:
Trên các kiểu ShortInt, Integer, Byte, Word có các phép toán:
NOT, AND, OR, XOR.
Tùy thuộc vào các yêu cầu, mà các bạn sử dụng kiểu dữ liệu thích hợp. Chọn kiểu dử liệu nhỏ sẽ tiết kiệm bộ nhớ, nhưng nếu biến số chứa các giá trị vượt qua kiểu dữ liệu đó sẽ làm cho kết quả bài toán bị sai lệch!
22
Ví dụ:
Đề yêu cầu nhập vào 2 số nguyên có giá trị <1000, sau đó tính tổng 2 số đó! Lúc
này, ta chắc chắn không thể dùng kiểu byte hay shortint cho 2 số đó, và cho
tổng! Mà ta sẽ dùng kiểu integer hoặc word (đều chiếm 2 bytes) Tất cả các kiểu
dữ liệu trên đều là kiểu dữ liệu số nguyên, tức không thể dùng để chứa các giá
trị có phần thập phân. Tùy thuộc vào các yêu cầu, mà các bạn sử dụng KDL
thích hợp. Chọn kiểu dữ liệu nhỏ sẽ tiết kiệm bộ nhớ, nhưng nếu biến số chứa
các giá trị vượt qua kiểu dữ liệu đó sẽ làm cho kết quả bài toán bị sai lệch!
Ví dụ :
+234, - 32767, -1, 23, 123 ….
MaxInt là têngiá trị cực đại cho phép của kiểu nguyên, tức là MaxInt = + 32767
23
3. Kiểu số thực (real)
3.1. Dạng thập phân
Đây là kiểu dữ liệu có chứa các số thập phân, tức là các số có dạng xxx.yyyy
a. Single: Chứa các giá trị từ 1.5E -45 đến 3.4 E38 (1,5 x 10^-45 đến 3,4 x 10^38 ). (4 bytes)
Trong Pascal, biểu diễn số thực mặc định dạng xx.yy E zz, tức là xx.yy x 10 mũ zz
b. Real: 2.9E -39 đến 1.7E 38 (2,9 x10 ^ - 39 đến 1,7 x 10 38 ) (6 bytes).
c. Double: 5.0E -324 đến 1.7E 308 (5,0 x10 ^ - 324 đến 1,7 x 10 ^ 308 ) (8 bytes).
24
3.2. Các phép toán trên kiểu số thực: +, -, *, /
Chú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD.
3.3. Các hàm số học thường sử dụng cho kiểu số nguyên và số thực:
SQR(x): Trả về x2
SQRT(x): Trả về căn bậc hai của x (x≥0)
ABS(x): Trả về |x|
SIN(x): Trả về sin(x) theo radian
COS(x): Trả về cos(x) theo radian
ARCTAN(x): Trả về arctang(x) theo radian
LN(x): Trả về ln(x)
EXP(x): Trả về ex
TRUNC(x): Trả về số nguyên gần với x nhất nhưng bé hơn x.
INT(x): Trả về phần nguyên của x
FRAC(x): Trả về phần thập phân của x
ROUND(x): Làm tròn số nguyên x
PRED(n): Trả về giá trị đứng trước n
SUCC(n): Trả về giá trị đứng sau n
ODD(n): Cho giá trị TRUE nếu n là số lẻ.
INC(n): Tăng n thêm 1 đơn vị (n:=n+1).
DEC(n): Giảm n đi 1 đơn vị (n:=n-1).
25
4. Kiểu ký tự (character)
- Từ khoá: CHAR.
- Kích thước: 1 byte.
- Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau đây:
+ Đặt ký tự trong cặp dấu nháy đơn. Ví dụ `A`, `0`.
+ Dùng hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn).
Ví dụ: CHR(65) biễu diễn ký tự `A`.
- Dùng ký hiệu #n (trong đó n là mã ASCII của ký tự cần biểu diễn).
Ví dụ #65.
- Các phép toán: =, >, >=, <, <=,<>.
- Kiểu ký tự để biểu diễn các ký tự nằm trong bảng mả ASCII (American
Standard Code for Information Interchange). trong đó có chứa các số 0..9, các ký tự thường a..z và ký tự hoa A..Z, và một số ký tự đặc biệt khác!
Bảng mã ASCII gồm 256 ký từ có mã từ 0 đến 255
Mỗi ký tự tươn gứng với 1 mã số!
Ví dụ, ký tự A sẽ tương ứng với mã 64, space (khoảng trắng) tương ứng với 32!
- Kiểu ký tự ngoài việc dùng để chứa các ký tự xuất ra màn hình, còn dùng để điều khiển việc nhận lệnh từ bàn phím. Để thể hiện tất cả các ký tự trong bảng mã ASCII, các bạn dùng chương trình sau :
Program Bang_ma_ASCII;Uses CRT; Var I : Integer; Begin
26
* Các hàm trên kiểu ký tự:
UPCASE(ch): Trả về ký tự in hoa tương ứng với ký tự ch.
Ví dụ: UPCASE(`a`) = `A`.
ORD(ch): Trả về số thứ tự bảng mã ASCII của ký tự ch. Ví dụ ORD(`A`)=65.
CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n.
Ví dụ: CHR(65)=`A`.
PRED(ch): cho ký tự đứng trước ký tự ch. Ví dụ: PRED(`B`)=`A`.
SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: SUCC(`A`)=`B`.
5. Kiểu chuỗi (String)
Kiểu string là 1 KDL gồm tối đa 255 ký tự liên tiếp nhau.
Thích hợp để dùng các biến chứa tên, địa chỉ, email....
Có 2 cách khai báo KDL string
a. Mặc định, tức biến sẽ có độ dài tối đa 255 ký tự
Ta khai báo: Var chuoi1: string;
b. Giới hạn:
Ta giới hạn chiều dài của chuỗi bằng 1 con số cụ thể.
Var: chuoi2: string[độ dài];
Trong đó độ dài là 1 số từ 0 đến 255, khi khai báo theo kiểu này, thì biến sẽ là 1 chuỗi có số ký tự tối đa là độ dài
Ví dụ: Var hoten: string[20];
lop: string[4];
Mã: string[1];.
27
IV. CÁC CÂU LỆNH VÀO RA
28
repeat
statement;
until
Sau mỗi câu lệnh, phải có dấu chấm phẩy - `;‘
Nếu muốn chú thích trong lúc lập trình để dễ dàng nhớ tới trong 1 lần đọc source, hãy để nó trong dấu `{` và `}` hay `(*` và `*)‘
Nếu muốn xuất dữ liệu cuối cùng ra màn hình, phải có 1 câu lệnh read hay readln để chờ bạn bấm enter mới thoát ra ngoài ; hay bấm Alt+F5 để xem tất cả những gì vừa hiện trên màn hình trong lần chạy chương trình gần nhất.
Nếu muốn xóa trắng màn hình trước khi nhập hay xuất dữ liệu, bạn gõ lệnh clrscr; {Clear Screen} với thư viện sử dụng là crt; {khai báo trong phần uses}
Các trang trong thể loại “Lệnh Pascal”
14 trang sau nằm trong thể loại lệnh pascal, trên tổng số 14 trang.
D : Delay - DosVersion
E : Exec
G : GetDate
G tiếp : GetEnv - GetTime - GotoXY
I : Int
R : Random
R tiếp : Read - Readln
S : SetTime - SwapVectors
W : Writeln
29
1.Các câu lệnh rẽ nhánh:
Trong Pascal, khi có 1 điều kiện đưa ra có nhiều hướng đi, để xử lí thích hợp cho từng điều kiện con, ta cần có các câu lệnh rẽ nhánh để thực hiện nhiệm vụ này.
Có 2 câu lệnh dùng để rẽ nhánh, bao gồm :
a.Câu lệnh rẽ nhánh đơn giản : if
Cú pháp :
if (
else
Biểu thức điều kiện
Công việc 1 Thoát ĐúngSai
Công việc 2 Giải thích:
Công việc 1, công việc 2 được thể hiện là 1 câu lệnh hay 1 khối lệnh.
Đầu tiên Biểu thức điều kiện được kiểm tra trước.
Nếu điều kiện đúng thì thực hiện công việc 1.
Nếu điều kiện sai thì thực hiện công việc 2.
Các lệnh phía sau công việc 2 không phụ thuộc vào điều kiện.
V. CÂU LỆNH RẼ NHÁNH, CẶP VÀ GHÉP
30
#include
#include
int main ()
{
float a;
printf("Nhap a = "); scanf("%f",&a);
if (a !=0 )
printf("Nghich dao cua %f la %f",a,1/a);
else
printf(“Khong the tim duoc nghich dao cua a”);
getch();
return 0;
}
Giải thích:
- Nếu chúng ta nhập vào a 0 thì câu lệnh printf ("Nghich dao cua %f la %f",a,1/a) được thực hiện, ngược lại câu lệnh printf (“Khong the tim duoc nghich dao cua a”) được thực hiện.
- Lệnh getch () luôn luôn được thực hiện.
Ví dụ 1: Yêu cầu người thực hiện chương trình nhập vào một số thực a. In ra màn hình kết quả nghịch đảo của a khi a 0, khi a =0 in ra thông báo “Khong the tim duoc nghich dao cua a”
31
b. Lệnh CASE .. OF
* Cách viết, ý nghĩa:
CASE
GT1 : Công việc 1 ; Nếu có giá trị 1 (GT1) thì thi hành Công việc 1
....................... ................................... (R)
GTi : Công việc i ; Nếu có giá trị i (GT i) thì thi hành Công việc i
...................... .................................... (R)
ELSE Công việc 0 ; Nếu không có giá trị nào thỏa thì thực hiện
Công việc 0
END;
Ghi chú:
- Lệnh CASE .. OF có thể không có ELSE
- Biểu thức chọn là kiểu rời rạc như Integer, Char, không chọn kiểu Real
- Nếu muốn ứng với nhiều giá trị khác nhau của biểu thức chọn vẫn thi hành một lệnh thì giá trị đó có thể viết trên cùng một hàng cách nhau bởi dấu phẩy (,) : Giá trị k1, k2, ..., kp : Lệnh k ;
Ví dụ : PROGRAM Chon_mau ;
VAR color : char ;
BEGIN
write (` Chọn màu theo một trong 3 ký tự đầu là R / W / B `) ;
readln ( color) ;
CASE color OF
`R` ,`r` : write (` RED = màu đỏ `) ;
`W`, `w` : write (` WHITE = màu trắng `) ;
`B` , `b` : write (` BLUE = màu xanh dương `) ;
END ;
Readln;
END.
32
#include
#include
int main ()
{
int a, b;
printf("Nhap vao gia tri cua 2 so a va b !");
scanf("%d%d",&a,&b);
if (a>b)
{
printf(" a lon hon b”);
printf(" a=%d b=%d ",a,b);
}
else
{
printf(" a nho hon hoac bang b");
printf(" a=%d b=%d",a,b);
}
printf(" Thuc hien xong lenh if");
getch();
return 0;
}
Ví dụ 2: Yêu cầu người chạy chương trình nhập vào giá trị của 2 số a và b, nếu a lớn hơn b thì in ra thông báo “Gia trị của a lớn hơn giá trị của b, giá trị của 2 số”, ngược lại thì in ra màn hình câu thông báo “Giá trị của a nhỏ hơn hoặc bằng giá trị của b, giá trị của 2 số”.
33
Giải thích:
- Nếu chúng ta nhập vào 40 30 thì kết quả hiển ra trên màn hình là
a lon hon b
a=40 b=30
Thuc hien xong lenh if
- Còn nếu chúng ta nhập 40 50 thì kết quả hiển ra trên màn hình là
a nho hon hoac bang b
a=40 b=50
Thuc hien xong lenh if
Lưu ý:
- Ta có thể sử dụng các câu lệnh if…else lồng nhau. Trong trường hợp if…else lồng nhau thì else sẽ kết hợp với if gần nhất chưa có else.
- Trong trường hợp câu lệnh if “bên trong” không có else thì phải viết nó trong cặp dấu {} (coi như là khối lệnh) để tránh sự kết hợp else if sai.
Ví dụ :
if ( so1>0)
if (so2 > so3)
a=so2;
else /*else của if (so2>so3) */
a=so3;
34
2.Cấu trúc vòng lặp:
Cấu trúc vòng lặp cho phép lặp lại nhiều lần 1 công việc (được thể hiện bằng 1 câu lệnh hay 1 khối lệnh) nào đó cho đến khi thỏa mãn 1 điều kiện cụ thể.
a.Vòng lặp for
Lệnh for cho phép lặp lại công việc cho đến khi điều kiện sai.
Cú pháp:
for (Biểu thức 1; biểu thức 2; biểu thức 3)
Lưu đồ:
Tính giá trị Biểu thức 1Biểu thức 2Công việcTính giá trị Biểu thức 3EndBeginĐS
Giải thích:
B1: Tính giá trị của biểu thức 1.
B2: Tính giá trị của biểu thức 2.
- Nếu giá trị của biểu thức 2 là sai (=0): thoát khỏi câu lệnh for.
- Nếu giá trị của biểu thức 2 là đúng (!=0):
B3: Tính giá trị của biểu thức 3 và quay lại B2.
35
Một số lưu ý khi sử dụng câu lệnh for:
- Khi biểu thức 2 vắng mặt thì nó được coi là luôn luôn đúng
- Biểu thức 1: thông thường là một phép gán để khởi tạo giá trị ban đầu cho biến điều kiện.
- Biểu thức 2: là một biểu thức kiểm tra điều kiện đúng sai để dừng vòng lặp.
- Biểu thức 3: thông thường là một phép gán để thay đổi giá trị của biến điều kiện.
- Trong mỗi biểu thức có thể có nhiều biểu thức con. Các biểu thức con được phân biệt bởi dấu phẩy
Ví dụ : Viết đoạn chương trình in dãy số nguyên từ 1 đến 10.
#include
#include
int main ()
{ int i;
clrscr();
printf(" Day so tu 1 den 10 :");
for (i=1; i<=10; i++)
printf("%d ",i);
getch();
return 0;
}
36
b. Vòng lặp while
Vòng lặp while giống như vòng lặp for, dùng để lặp lại một công việc nào đó cho đến khi điều kiện sai.
Cú pháp:
while (Biểu thức điều kiện)
Đ kiệnCông việcThoátĐúngSaiGiải thích:
-
- Kiểm tra Biểu thức điều kiện trước.
- Nếu điều kiện sai (=0) thì thoát khỏi lệnh while.
- Nếu điều kiện đúng (!=0) thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp.
Lưu ý:
- Lệnh while gồm có biểu thức điều kiện và thân vòng lặp (khối lệnh thực hiện công việc)
- Vòng lặp dừng lại khi nào điều kiện sai.
- Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay đổi điều kiện.
37
#include
#include
int main ()
{ unsigned int n,i,tong;
clrscr();
printf(" Nhap vao so nguyen duong n:"); scanf("%d",&n);
tong=0;
for (i=1; i<=n; i++)
tong+=i;
printf(" Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}
Ví dụ : Viết chương trình nhập vào một số nguyên n. Tính tổng các số nguyên từ 1 đến n.
38
c. Vòng lặp do… while
Vòng lặp do … while giống như vòng lặp for, while, dùng để lặp lại một công việc nào đó khi điều kiện còn đúng.
Cú pháp:
do
while (
Đ kiệnCông việcThoátĐúngSaiGiải thích:
-
- Trước tiên công việc được thực hiện trước, sau đó mới kiểm tra Biểu thức điều kiện.
- Nếu điều kiện sai thì thoát khỏi lệnh do …while.
- Nếu điều kiện còn đúng thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp.
Lưu ý:
- Lệnh do…while thực hiện công việc ít nhất 1 lần.
- Vòng lặp dừng lại khi điều kiện sai.
- Khối lệnh thực hiện công việc có thể rỗng, có thể làm thay đổi điều kiện.
39
#include
#include
int main ()
{ int i;
clrscr();
printf(" Day so tu 1 den 10 :");
i=1;
do
printf("%d ",i++);
while (i<=10);
getch();
return 0;
}
Kết quả chương trình như sau:
Ví dụ 1: Viết đoạn chương trình in dãy số nguyên từ 1 đến 10.
40
Ví dụ 2: Viết chương trình nhập vào một số nguyên n. Tính tổng của các số nguyên từ 1 đến n.
#include
#include
int main ()
{ unsigned int n,i,tong;
clrscr();
printf(" Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;
i=1;
do
{
tong+=i;
i++;
} while (i<=n);
printf(" Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}
Nếu chúng ta nhập vào số 9 thì kết quả như sau:
41
3. Lệnh ghép (Compound statement
Một nhóm câu lệnh đơn được đặt giữa 2 chữ BEGIN và END sẽ tạo thành một câu lệnh ghép hay một lệnh hợp thành với mẫu viết như sau
BEGIN
Câu lệnh 1;
Câu lệnh 2;
…………..
Câu lệnh N;
END;
Trong Pascal ta có thể đặt các lệnh ghép con trong các lệnh ghép lớn hơn bao ngoài của nó và có thể hiểu tương tự như cấu trúc ngoặc đơn ( ) trong các biểu thức toán học.
Các nhóm lệnh thành từng khối (block). Một khối lệnh bắt đầu bằng BEGIN và chấm dứt ở END; . Trong một khối lệnh cũng có thể có các khối lệnh con nằm trong nó. Một khối chương trình thường được dùng để nhóm từ 2 lệnh trở lên để tạo thành một
Mô hình chương trình có câu trúc “ khối lệnh” được xây dựng qua lệnh hợp thành Begin...End;
42
PROGRAM tamgiac
VAR a, b, c, trgian : REAL
BEGIN
WRITE (“Hay cho ba so bat ki”); READLN (a, b, c)
IF a>b THEN BEGIN trgian : = a, a : = b; b : = trgian END
{ Đổi giá trị của a và b cho nhau}
IF a>b THEN BEGIN trgian : = b, b : = c; c : = trgian END
{ Đổi giá trị của b và c cho nhau}
IF a>b THEN BEGIN trgian : = a, a : = b; b : = trgian END
{Đề phòng trường hợp a lớn hơn giá trị mới của b}
IF ( a> 0) AND (c < a + b)
THEN WRITE ( “ Ba so da cho la 3 canh mot tam giac”)
ELSE WRITE ( “ Ba so da cho khong phai la 3 canh mot tam giac”)
READLN
END
Ví dụ : Cho máy nhận vào ba số a, b, c bất kì, xem xét ba số đó có thể là số đo ba cạnh của một tam giác hay không
43
4. CÁC CÂU LỆNH ĐẶC BIỆT
Lệnh break
Cú pháp: break
Dùng để thoát khỏi vòng lặp. Khi gặp câu lệnh này trong vòng lặp, chương trình sẽ thoát ra khỏi vòng lặp và chỉ đến câu lệnh liền sau nó. Nếu nhiều vòng lặp --> break sẽ thoát ra khỏi vòng lặp gần nhất. Ngoài ra, break còn được dùng trong cấu trúc lựa chọn switch.
Lệnh continue
Cú pháp: continue
- Khi gặp lệnh này trong các vòng lặp, chương trình sẽ bỏ qua phần còn lại trong vòng lặp và tiếp tục thực hiện lần lặp tiếp theo.
- Ðối với lệnh for, biểu thức 3 sẽ được tính trị và quay lại bước 2.
Ðối với lệnh while, do while; biểu thức điều kiện sẽ được tính và xét xem có thể tiếp tục thực hiện
Nếu muốn xóa trắng màn hình trước khi nhập hay xuất dữ liệu, gõ lệnh clrscr; {Clear Screen} với thư viện sử dụng là crt; {khai báo trong phần uses}
44
VI. KIỂU DỮ LIỆU MẢNG (ARRAY)
A = ARRAY [ Kiểu_chỉ_dẩn ] OF Kiểu_phần _tử
2. Mảng một chiều
Là mảng kiểu cấu trúc được đề cập sớm nhất trong các ngôn ngữ lập trình . Nó được dùng để chỉ định một nhóm đối tượng cùng một tính chất nào đó
VAR, ARRAY và OF là từ khoá. Tên biến mảng là một tên gọi tự đặt. Kiểu thành phần là tên kiểu phần tử mảng
Khai báo tên gọi có kiểu dữ liệu mảng một chiều có dạng :
VAR tên mảng : ARRAY [ Kiểu chỉ dẩn ] OF Kiểu phần tử
Một mảng dữ liệu gồm một số hữu hạn phần tử có cùng kiểu gọi là kiểu cơ bản. Số phần tử của mảng được xác định ngay từ khi định nghĩa ra mảng. Mỗi phần tử của mảng được truy cập trực tiếp thông quatên mnảg cùng với chỉ dẫn truy nhập đựoc để giữa hai ngoặc vuông [ ]. Định nghĩa mảng T có kiểu các phần tử KPT, có kiểu chỉ dẩn KCD để hướng dẫn cách tổ chứcmnãg cũng như cách truy nhập vào các phần tử mảng được viết trong pasacl với từ khoá như sau:
Kiểu dữ liệu có cấu trúc : Mảng (Array)
TYPE : Kiểu_mảng T = ARRAY [ Kiểu_chỉ_dẩn KCC] OF Kiểu_phần _tử KPT;
hay viết tắt thành T = ARRAY [ KCD] OF KTP;
VAR : A: Kiểu_mảngT
Ta có thể khai báo trực tiếp biến A khi không cần định nghĩa kiể trong phần TYPE
45
PROGRAM Thue;
USES CRT;
CONST n = 10;
VAR
tien : ARRAY [ 1…n] OF REAL;
BEGIN
CLRSCR ; s : = 0; so : = O;
WRITELN (‘Vao tien cua tung ho’);
FOR I := 1 TO n DO
BEGIN
WRITE (‘ho[‘,I,’]=‘);
READ(tien[i]);
GOTOXY(where + 11 * I, WhereY - 1);
END;
S;s/n;
FOR i:=1 TO n DO
I tien [i]
WRITEN;
WRITEN(So ho nop thue duoi trung binh ‘ so:9:2);
END.
Ví dụ : Có 10 hộ kinh doanh nộp thuế nhà nước bằng tiền. Hãy lập chương trình tính số hộ nộp thuế dưới mức trung bình khi nạp từ bàn phím số tiền từng hộ?
46
3. Mảng nhiều chiều
Là mảng kiểu phần tử không bị hạn chế nhiều như kiểu chỉ dẩn. Nó còn có thể là các kiể có cấu trúc. Ví dụ sau cho thấy việc khai báo một mảng có các phần tử cũng là mảng.
Việc truy cập đối với mảng có định nghĩa phức tạp như MPT được tiến hành qua hai cách :
Qua hai lần đóng mở ngoặc vuông. Thí dụ : MPT [3] [5] biểu diển phần tử cuối cùng của mảng MPT
Hoặc thường được viết đơn giản trong một ngoặc vuông với các chĩ dẫn cáh nhau bằng dấu phẩy : MPT [ 3, 5 ] , Z[3, ‘B’]; [ Xem hình]
Cách viết MT [I] [J] và MPT [ I, J ] tương đương nhau. Mảng được định nghĩa như trên có thể hiểu là ma trận nhiều chiều. Phần tử MPT [ I, J ] sẽ là phần tử hàng thứ I, cột thứ J của MPT.
Một số phép toán không thể dùng vòng FOR J:= 1 TO N DO ..mà phải ghi trực tiếp các phần tử cần đọc vào thủ tục Readln.
Mảng có thể dùng tham số cho chương trình con và mảng không bao giờ dùng làm cho kết quả của FUNCTION. Tuy nhiên cần lưư ý khai báo kiểu của tham số trong vùng khai báo TYPE chứ không định nghĩa kểu trực tiếp ngay trong phần khai báo tham số của CTC (Xem ví dụ khai báo liểu MT dưới đây).
47
TYPE
MT = ARRAY [ 1…3, 1…5] OF REAL;
VAR
X, Y, Z : MT ;
( * …………………………………………………………………..*)
PROCEDURE CONG_MATRAN (A, B, : ; VAR C : MT);
Var
I, j : integer;
Begin
FOR I : = 1 TO N DO C[i, j] := A[i, j] + B[i, j] ;
End
( * …………………………………………………………………..*)
BEGIN
…
CONG_MATRAN ( X, Y, Z ) ;
…
END.
Ví dụ: Hãy viết đầy đủ chương trình cộng hai ma trận C = A +B
48
VII. MỘT SỐ BÀI TẬP ĐƠN GIẢN
Bài toán 1 : Trên một tuyến đường ở thành phố du lịch nổi tiếng X có ô tô buýt công cộng phục vụ việc đi lại của du khách. Bến xe buýt có ở từng km của tuyến đường. Mỗi lần đi qua bến xe đều đỗ lại cho khách lên xuống. Mỗi bến đều có xe xuất phát từ nó, nhưng mỗi xe chỉ chạy không quá b km kể từ bến xuất phát của nó. Hành khách khi đi xe sẽ phải trả tiền cho độ dài đoạn đường mà họ ngồi trên xe. Cước phí cần trả để đi đoạn đường có độ dài i là ci (i=1...b) Một du khách muốn đi dạo L km trên tuyến đường nói trên. Hỏi ông ta phải lên xuống xe như thế nào để tổng số tiền phải trả cho chuyến dạo chơi bằng xe buýt là nhỏ nhất ?
Dữ liệu: Vào từ file văn bản Bus.inp
* Dòng đầu tiên chứa hai số nguyên dương b, L (b<=20, L<=200);
Dòng thứ hai chứ b số nguyên dương c1, c2...cbđượcghi cách nhau bởi ít nhất một kí tự trắng
Kêt quả: Ghi ra file văn bản Bus.out
* Dòng đầu tiên ghi chi phí tìm được
* Dòng thứ hai ghi số lần lên xuống xe k
* Dòng tiếp theo ghi k số là độ đài đoạn đường của k lần ngồi xe.
49
Gọi f(i) là số tiền ít nhất phải dùng khi cần đi quãng đường i (km)
f[0]:= 0;
f[1]:= c[1];
For i:=2 To L Do
Begin
Min:= Maxint;
For j:=1 To b Do
If i>= j Then
If f[i-j] + c[j]< Min Then
Begin
Min:= f[i-j] + c[j];
End;
f[i]:= Min;
End;
End;
50
Số Palindrom
Program palindrom;
Var N,a,b: integer;
begin
Write (`nhap n`);
Readln (n);
If (n>100) and (n<= 999) then
begin
a:= N mod 10;
b:= N div 100;
If a= b then write (`N la so palindrom`)
Else write (`N khong la so palindrom`);
Readln;
End.
Bài toán 2 : Số tự nhiên N được gọi là số palindrom nếu cách viết dưới dạng hệ thập phân của số đó là đối xứng .Cho số tự nhiên 100
Số nguyên tố
Program so nguyen to;
var i,j,n: integer;
begin
Write (`nhap n`);
readln (n);
For i:= 2 to n do
begin
j:= 2;
While i mod j <> 0 do j:= j+1;
If i= j then write (i:4);
end;
readln;
end.
Bài toán 3 : Nhập vào số N . Tìm tất cả các số nguyên tố từ 1-->N,biết số nguyên tố là số chỉ chia hết cho 1 và chính nó
52
uses crt;
var n:integer;
f1,f2:text;
BEGIN
clrscr;
assign(f1,`number.inp`);
assign(f2,`number.out`);
reset(f1);
rewrite(f2);
readln(f1,n);
if n mod 2<>0 then writeln(f2,n-1) else writeln(f2,n+1);
readln;
END.
Bài toán 4 : Hãy viết chương trình đọc một số nguyên dương n từ file number.inp. Nếu n là số lẻ thì trừ 1 vào n, ngược lại tăng 1 vào n. Ghi n vào file number.out
53
Procedure ;
var
x,y: real;
begin
write(`Nhap diem TB mon Van :`);readln(x);
write(`Nhap diem TB mon Toan :`);readln(y);
{cho nay hoi chuoi, khong bik co duoc ko ? do de bai ko chat che}
writeln(`Nhap diem TB mon Van :`,y:3:1);
writeln(`Nhap diem TB mon Toan :`,x:3:1);
readln;
end.
Bài toán 5 : Cho v, t lần lượt điểm trung bình của môn văn và môn toán, đọc vào từ bàn phím. Hãy hoán vị v, t cho nhau. Xuất v, t ra màn hình. (yêu cầu không dùng biến trung gian, có nhiều cách rất hay đấy)
54
var l, r, mid, n: integer;
a: char;
begin
l := 0;
r := 10;
repeat
mid := (l + r) div 2;
writeln(`Co phai ban dang nghi so: `, mid);
readln(a);
a := upcase(a);
if a = `C` then
begin
writeln(`So ban dang nghi la : `,mid);
readln;
break;
end
else
if a = `L` then l := mid + 1
else r := mid - 1;
until l >= r;
end.
Bài toán 6 :Viết trò chơi đoán số. Người dùng nghĩ ra một số từ 0 đến 10. Máy được phép đoán 4 lần (với mỗi lần đoán người chơi sẽ gợi ý: lớn quá (bằng cách nhập vào chữ L), nhỏ quá (chữ N), chính xác (chữ C). Hãy giúp máy đoán chính xác
55
program uocso;
uses crt;
var n:integer;
i:byte;
begin
clrscr;
write(`nhap n: `);readln(n);
write(`cac uoc so cua `,n,` la: `);
for i:=2 to trunc(sqrt(n)) do if n mod i =0 then write(i:3);
readln
end
Bài toán 7: Viết công thức nhập số nguyên N và in ra các ước số của chúng ?
56
Nếu gọi hai cạnh của hình chữ nhật là a và b, gọi diện tích và chu vi lần lượt là S và P thì công thức tính S và P là: S = a.b P = 2(a+b)
PROGRAM a và b
{ Tinh dien tich va chu vi hinh chu nhat }
Uses CRT;
Var
a, b, S, P : Real ;
Begin
Clrscr;
Write( ‘Nhap chieu dai : ‘);
Readln(a);
Write( ‘Nhap chieu rong : ‘);
Readln(b);
S:=a*b;
P:=2* (a+b);
Writeln (‘ Dien tich = ‘, S:8:2);
Writeln (‘ Chu vi = ‘, P:8:2);
Readln;
End.
Bài toán 8: Viết chương trình để nhập vào độ dài hai cạnh của một hình chữ nhật, tính và in lên màn hình diện tích và chu vi của hình chữ nhật đó.
57
Program bt1;
Uses crt;
Var S:integer;
Begin
Clrscr;
S:=((1+100)*100) div 2;
Writeln(`Tong la : `,s);
Readln;
End.
Bài toán 9: Viết chương trình in ra màng hình các số nguyên từ 1 đến 100 sao cho cứ 10 số thì xuống dòng
program so;
begin
writeln("01 02 03 04 05 06 07 08 09 10");
writeln("11 12 13 14 15 16 17 18 19 20");
writeln("21 22 23 24 25 26 27 28 29 30");
writeln("31 32 33 34 35 36 37 38 39 40");
writeln("41 42 43 44 45 46 47 48 49 50");
writeln("51 52 53 54 55 56 57 58 59 60");
writeln("61 62 63 64 65 66 67 68 69 70");
writeln("71 72 73 74 75 76 77 78 79 80");
writeln("81 82 83 84 85 86 87 88 89 90");
writeln("91 92 93 94 95 96 97 98 99 100");
end.
Bài toán 10: Chỉ dùng một biến số viết chương trình tíng tổng S:=1+2+3+...+100
58
PROGRAM Thue;
USES CRT;
CONST n = 10;
VAR
tien : ARRAY [ 1…n] OF REAL;
BEGIN
CLRSCR ; s : = 0; so : = O;
WRITELN (‘Vao tien cua tung ho’);
FOR I := 1 TO n DO
BEGIN
WRITE (‘ho[‘,I,’]=‘);
READ(tien[i]);
GOTOXY(where + 11 * I, WhereY - 1);
END;
S;s/n;
FOR i:=1 TO n DO
Ì tien [i]
WRITEN;
WRITEN( So ho nop thue duoi trung binh ‘ so:9:2);
END.
Bài toán 11: Viết chương trình Có 10 hộ kinh doanh nộp thuế nhà nước bằng tiền. Hãy lập chương trình tính số hộ nộp thuế dưới mức trung bình khi nạp từ bàn phím số tiền từng hộ?
59
 





















Các ý kiến mới nhất