Tập hợp các mệnh lệnh, chỉ thị cho MTĐT đợc con ngời soạn thảo ra bằng một ngôn ngữ mà máy hiểu đợc gọi là Chơng trình Program và đợc lu trữ trong bộ nhớ của máy.. Khi lập trình giải quy
Trang 1Ngôn ngữ lập trình Turbo Pascal
(Ver 7.0)01010101010101010101010101010101010101010100101010101010101010101010101010101010101010010101010101010
1010101010101010101Phần 1: Giới thiệu TURBO PASCAL 7.0.
Tập hợp các mệnh lệnh, chỉ thị cho MTĐT đợc con ngời soạn
thảo ra (bằng một ngôn ngữ mà máy hiểu đợc) gọi là Chơng trình (Program) và đợc lu trữ trong bộ nhớ của máy Ngôn ngữ để
soạn thảo ra những mệnh lệnh đó gọi là Ngôn ngữ lập trình.
Các chơng trình sẽ thay con ngời điều khiển MTĐT làm việc Các
Trang 2Thuật giải + Cấu trúc dữ liệu = Chơng
trình
Thuật ngữ ALGORITHMS không chỉ hiểu theo nghĩa hẹp là
Thuật toán, (Hiểu nôm na là Thuật giải quyết một bài Toán), mà
hiểu rộng hơn là thuật giải
Ta hiểu Thuật giải là một tập hợp hữu hạn các thao tác (các phép toán, các thao tác, các công việc ) có thể đặt tên đợc và chúng đợc thực hienẹ theo một trình tự thích hợp đối với một
số đối tợng nào đó để đạt đợc điều mong muốn “Hữu hạn”
đ-ợc hiểu là cả về mặt thời gian lẫn công cụ thực hiện
Khi lập trình giải quyết một vấn đề, ta nên làm và tập thànhthói quen theo trình tự sau:
Vấn đề, bài toán -> Tìm và xây dựng thuật giải -> Viết chơng trình.
Cách làm trên giúp giải quyết vấn đề, bài toán một cách bài bản,triệt để, tránh đợc nhiều lỗi
Không nên làm theo trình tự :
Vấn đề, bài toán -> Viết chơng trình.
Cách làm này thờng xảy ra với ngời mới học hoặc khi giải quyết mộtbài toán đơn giản
Chơng trình là tập hợp một dãy các lệnh điều khiển máy tính
thực hiện thuật giải Có thể nói Chơng trình là một cách diễn tảthuật giải bằng một ngôn ngữ mà máy tính hiểu đợc (Ngôn ngữ lậptrình)
Có nhiều cách để diễn tả thuật giải
Bằng lời:
Trang 3Sai
Ví dụ : Thuật giải công việc nấu cơm có thể viết nh sau:
Bắt đầu:
Bớc 1: Lấy gạo theo định lợng cần thiết.
Bớc 2: Vo gạo, đổ gạo và nớc vừa đủ vào nồi.
Bớc 3: Đun sôi cho cạn nớc.
Bớc 4: Giữ lửa nhỏ để cơm chín.
Bớc 5: Cách 10 phút, nếm cơm xem chín cha Nếu cha chín,
quay về bớc 5 Nếu cơm chín, chuyển qua bớc 6
Bớc 6: Tắt lửa, bắc nồi cơm ra.
Kết thúc.
Bằng lu đồ:
Các hình cơ bản để xây dựng lu đồ thuật giải là:
Ví dụ : Tìm số lớn nhất trong ba số gõ vào từ bàn phím.
Giải thích sự hoạt động của thuật toán theo sơ đồ khối :
Sai Nếu a>=b Gán Max: = b Đúng
Gán Max: = a
Bắt
Thực hiện công việc
Vào ra dữ
liệu
Thử điều kiện
Nhập a,
b, cBắt
đầu
Trang 4SaiNếu Max>c Gán Max:=c
Đúng
Bằng ngôn ngữ lập trình:
PASCAL là ngôn ngữ thuật giải, nghĩa là tự nó đã diễn tả thuậtgiải cần tiến hành Đó là u điểm của PASCAL giúp ngời lập trình cóngay t duy xây dựng thuật giải, có thể không cần đến lu đồ
PASCAL là ngôn ngữ lập trình cấp cao do giáo s Niklaus Wirth
(Trờng Đại học kỹ thuật Zurich – Thuỵ Sĩ) sáng tác và công bố đầuthập kỷ 70 Tên PASCAL đợc chọn để kỷ niệm nhà toán học ngời Pháp
Blaise Pascal (thế kỷ 17)
Lúc đầu, PASCAL chỉ phục vụ mục đích dạy học, nhằm giúpcho sinh viên và những ngời mới học lập trình có đợc thói quen viết
đợc chơng trình có cấu trúc sáng sủa, rõ ràng, dễ hiểu, dễ đọc
Trong quá trình phát triển, PASCAL dần dần phát huy u điểm
và trở thành một ngôn ngữ lập trình mạnh Có rất nhiều hãng đã
phát triển thêm, trong đó TURBO PASCAL của hãng Borland đợc sử
dụng rất rộng rãi
1 Khởi động TURBO PASCAL:
1.1 Nếu bạn thờng xuyên làm việc với TURBO PASCAL thì bạn
nên tạo một Shorcut trên màn hình nền của máy tính (Cách tạo xin
xem phần “Hệ điều hành
WINDOWS”)
In ra Kết
thúc
Trang 5Muốn cho TP chạy trong một cửa sổ ứng dụng nh các ứng dụng kháctrong WINDOWS, ta làm nh sau:
Nhắp phải chuột vào Shorcut , chọn Properties -> Xuất hiện cửa sổ Properties -> chọn nhãn Screen -> Chọn mục Window -> kết thúc nhắp Enter
Sau khi khởi động thành công, màn hình soạn thảo của TURBOPASCAL xuất hiện nh sau:
TURBO PASCAL khi mới khởi động sẽ đặt tên File đầu tiên mặc định
là Noname00 PAS Sau khi soạn thảo chơng trình, nếu cần lu lại, bạn hãy kích hoạt lệnh File -> Save -> chọn th mục và đặt tên cho
File cần lu Nếu bạn không chọn th mục, TURBO PASCAL sẽ lu vào thmục mặc định là TP\BIN
Thanh enu
Tên do TP đặt sẵn
Thanh trạng thái và h ớng dẫn
Trang 6Để kích hoạt Menu, bạn hãy bấm - giữ phím Alt và nhấn phím ký tự có màu đỏ trên thanh Menu Ví dụ : để kích hoạt
menu File, bạn nhấn-giữ phím Alt và nhấp phím F
2 Thoát khỏi TURBO PASCAL:
2.1 Chọn lệnh File > Exit.
2.2 Phím tắt : Alt + X.
Nếu bạn cha lu chơng trình, TURBO PASCAL sẽ hỏi bạn có muốn
lu không, nếu muốn lu chọn Yes, ngợc lại: chọn No.
Các lệnh trên thanh Menu cũng tơng tự nh trong các cửa sổ ứngdụng khác
Lu ý :
*Bạn nên sử dụng phím tắt trong soạn thảo để hạn chế việc
phải gõ phím nhiều Các phím tắt đợc liệt kê bên phải các lệnh tơng ứng trên thanh Menu.
* Bạn có thể tham khảo các đoạn chơng trình, các thủ tục, hàm
mẫu trong Menu Help > Standard Units nh hình vẽ trên
Chúc bạn có nhiều chơng trình hay!
Trang 7Phần 2: Ngôn ngữ TURBO PASCAL.
các phần tử cơ bản của ngôn ngữ lập trình pascal
1 Bộ chữ viết, từ khoá, tên.
Một ngôn ngữ lập trình bất kỳ nào cũng đợc xây dựng trên một bộchữ viết (ký tự), sau đó là một tập hợp các từ (gọi là từ vựng) Tiếptheo là phải có quy tắc viết các từ thành câu để diễn tả các hành
vi, sự việc, nhĩa là phải tuân thủ theo cú pháp (Syntax) và ngữ pháp(Grammar) của ngôn ngữ đó
* Ngôn ngữ Pascal đợc xây dựng trên bộ chữ viết (ký tự) sau:
- 26 chữ cái La tinh in thờng : a, b, , z.
- 26 chữ cái La tinh in Hoa : A, B, , Z.
- Ký tự gạch nối _ (Khác với dấu trừ).
Trang 8* Dấu cách (Space) Đợc dùng để ngăn cách các từ Vì khi viết, dấu
cách không hiẹn ra nên trong một số trờng hợp, để tiện nhận biếtdấu cách, ngời ta thờng dùng dấu gạch dới _ để chỉ dấu cách
* Từ vựng của Pascal gồm một số từ riêng đợc gọi là từ khoá
(KeyWord) Các từ khoá này phải đợc dùng đúng với cú pháp, không
đ-ợc dùng nó vào việc khác hoặc đặt tên mới trùng với tên các từ khoá
Có các loại từ khoá sau:
Từ khoá chung : Gồm các từ PROGRAM, BEGIN END,
Từ khoá điều khiển : WITH, GOTO.
Từ khoá toán tử : AND, OR, NOT, IN, DIV, MOD.
Từ khoá Nul : NUL.
Các từ khoá có thể đợc viết bằng chữ in hay chữ thờng đều đợc:
BEGIN <=> begin <=> Begin <=> beGin.
Tuy nhiên, nên viết sao cho đẹp mắt, dễ nhìn, dễ kiểm tra
* Tên hay định danh (Identifier):
+ Tên do ngời sử dụng đặt: Là một dãy ký tự đợc dùng để chỉ
tên hằng số, tên biến, ten kiểu do ngời lập trình tự đặt Tên đợctạo thành từ bộ ký tự của Pascal song phải tuân thủ các quy tắc sau:
- Bắt buộc ký tự đầu là chữ cái.
- Không đợc dùng chữ số (1ANC là sai)
- Không đợc dùng ký tự đặc biệt (#DEL là sai)
- Không đợc đặt tên trùng với từ khoá (ARRAY là sai)
- Không đợc dùng dấu cách (DEL TA là sai)
Trang 9- Khi đặt tên chơng trình, nếu dùng viết liền nhau thì sẽ rất khó
đọc Dùng dấu gạch dới sẽ dễ đọc, dễ hiểu hơn Ví dụ:
PROGRAM GIAI_PHUONG_TRINH_BAC_HAI;
Nhớ phân biệt dấu gạch dới _với dấu trừ -.
+ Tên chuẩn của Pascal:
Một số tên của một số hàm, thủ tục đợc Pascal đặt tên sẵn gọi là
Tên chuẩn Tên chuẩn khác với Từ khoá : Tên chuẩn có thể đợc ngời
sử dụng định nghĩa lại (mặc dù không nên làm việc này), còn từkhoá thì không thể dùng vào việc khác ngoài quy định của bảnthân nó
2 Dấu chấm phẩy.
Dùng để ngăn cách các câu lệnh Không nên hiểu dấu chấm phảy là
“Kết thúc lệnh”
3 Lời giải thích (Comment).
Để chơng trình dễ đọc, dễ hiệu chỉnh, trong chơng trình ta thờng
đa vào các lời chú thích, giải thích mà không ảnh hởng đến cáclệnh của Pascal
Pascal cho phép ghi lời giải thích ở bất kỳ nơi nào trong chơngtrình, chỉ với yêu cầu là : Lời giải thích phải đợc đặt trong cặp dấu{ } hoặc (* *)
Trong một chơng trình, cần (Và luôn luôn cần, nhất là những chơngtrình dài và phức tạp) những dòng giải thích để chơng trình dễ
đọc, dễ hiểu, dễ hiệu chỉnh
Ví dụ : FOR i:=1 TO N DO {Duyệt lần lợt từng phần tử i từ 1
1 Tìm hiểu kỹ bài toán.
Một bài toán nói chung cũng nh một bài toán giải bằng máy tính
đều có thể biểu diễn dới dạng sơ đồ : A > B
Trong đó :
Trang 10A Là giả thiết, điều kiện ban đầu, hoặc là cái đã cho, đã có
khi bắt đầu giải bài toán
B là mục tiêu cần đạt hoặc là cái phải tìm, phải làm ra khi kết
thúc bài toán
> là những suy luận, giải pháp hoặc chuỗi các thao tác cần
thực hiện để có đợc B từ A
Nh vậy : Tìm hiểu kỹ bài toán nghĩa là phải xác định rõ ràng,
tờng minh các yếu tố A, B và >
Lu ý rằng : Đa số các thông tin về A, B và > đều tiềm ẩn trong kinh nghiệm và vốn kiến thức của ngời giải (Nghĩa là nằm sẵn trong đầu ngời giải)
2 Xác định cấu trúc dữ liệu cho bài toán:
Công việc này là phải xác định hợp lý nhất các kiểu dữ liệu chotừng đại lợng tham gia trong bài toán Nếu xác định hợp lý thì ta mới
có kết quả đúng và cách giải ngắn gọn, chính xác
Ví dụ : Khi làm việc với nhiều số nguyên thì nên chọn kiểuMảng còn khi làm việc với 1 số thực có nhiều chữ số (hàng trăm,thậm chí hàng nghìn chữ số) thì nên chọn kiểu String
Khi lựa chọn cấu trúc dữ liệu, cần chú ý các điểm sau:
+ Cấu trúc dữ liệu phải biểu diễn đợc đầy đủ thông tin nhập,xuất
+ Cấu trúc dữ liệu phải phù hợp với các thao tác của thuật toán
mà ta lựa chọn để giải quyết bài toán
+ Cấu trúc dữ liệu phải phù hợp với ngôn ngữ lập trình đợc chọn
và phù hợp với cấu hình của máy tính
3 Viết thuật giải:
Thuật giải là một dãy các thao tác sao cho sau một số hữu hạn
b-ớc thực hiện các thao tác, ta đạt đợc mục tiêu của bài toán
Để xác định thuật giải cho ngắn gọn, đầy đủ, chính xác, nênlàm theo các bớc sau:
3.1 Viết thuật giải bằng ngôn ngữ thông thờng : Thực chất là
liệt kê ra những việc cần làm để đi đợc từ A đến B
3.2 Tinh chế thuật giải: Thay những ngôn ngữ thông thờng ở
bớc trên bằng những ngôn ngữ gần gũi với với ngôn ngữ lập trìnhhoặc bằng ngôn ngữ lập trình
3.3 Vẽ lu đồ thuật giải
4 Viết chơng trình:
Căn cứ vào bớc 3, bắt đầu viết chơng trình
Trang 11Nên viết từng đoạn chơng trình một, sau đó chạy thử, kiểm tra luôn Nếu chạy tốt thì mới tiếp tục viết phần tiếp theo.
Trong khi viết chơng trình, để giảm thời gian gõ phím, cần tận dụng tối đa các thao tác Copy, cắt, dán.
các phím tắt hay dùng Trong TurboPascal 7.0
Đánh dấu đoạn chơng trình: Kết hợp việc nhấn và giữ phím Shiftvới các phím di chuyển con trỏ
Thoát khỏi TP:Alt + X
Nạp tập tin mới: F3
Lu chơng trình: F2
Xoá cả dòng chứa con trỏ: Ctrl+Y
Xoá từ vị trí con trỏ đến cuối dòng: Ctrl+Q+Y
Copy : Ctrl + Insert
Cắt: Shift _ Delete
Dán : Shift + Insert
5 Chạy và thử chơng trình:
5.1 Chạy chơng trình: Sau khi viết xong chơng trình, chạy
ch-ơng trình để sửa lỗi cú pháp Một chch-ơng trình chạy đợc, không cònlỗi cú pháp cha chắc cho ta kết quả đúng Vì vậy ta phải thử chơngtrình
5.2 Thử chơng trình: Xây dựng một bộ dữ liệu để thử (Test).
Có nghĩa là xây dựng một bộ dữ liệu vào, kiểm tra lại dữ liệu ra có
đúng không, có đẹp không, nếu không phải sửa lại Khi xây dựng bộTest, lu ý các trờng hợp : giá trị đặc biệt (số 0, số âm, ký tựtrắng ), những giá trị quá lớn hoặc quá nhỏ
Trang 12USES <Danh s¸ch c¸c Unit>;
LABEL <Danh s¸ch c¸c nh·n>; {Dïng cho lÖnh GOTOM:}
CONST <Danh s¸ch c¸c h»ng sè>;
TYPE Khai c¸c kiÓu d÷ liÖu míi;
VAR <C¸c biÕn sè var1, var2, var n : KiÓu cña biÕn sè>;
FUNCTION Khai b¸o c¸c hµm;
PROCEDURE Khai b¸o c¸c thñ tôc;
BEGIN {B¾t ®Çu}
{ NhËp d÷ liÖu, tÝnh to¸n, in kÕt qu¶}
Bªn trong cÊu tróc ®iÒu khiÓn, nÕu cã tõ 2 c©u lÖnh trë lªn th× ph¶i
dïng c©u lÖnh ghÐp (bao bëi cÆp Begin end;) Ngo¹i trõ cÊu tróc
liÖu cña Pascal.
Trang 13* Dữ liệu là gì: Hiểu một cách đơn giản thì dữ liệu là tất cả
những thông tin mà máy tính có thể xử lý Dữ liệu đợc khái quát hoáthành các kiểu dữ liệu Mỗi một kiểu dữ liệu bao gồm các thông tin
có cùng một tính chất
Có thể định nghĩa một kiểu dữ liệu là:
+ Tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận đợc.+ Trên đó xác định một số phép toán
Chú ý: Một biến chỉ gắn với một kiểu dữ liệu và chỉ một kiểu
mà thôi Không thể gắn một biến với 2, 3, kiểu dữ liệu khác
nhau.
Ví dụ : Các chữ cái trong bảng chữ cái là cùng một kiểu CHAR, Các sốnguyên là cùng một kiểu là kiểu số nguyên Integer
*Các kiểu dữ liệu thờng dùng: Byte, integer, word, longint, real,
double, boolean(True, False), char, string
1 byte
Kiểu do NSD
cuối
Trang 14Miền con (là miền con của một
đợc)Thứ tự theo thứ tự liệt
* Vai trò : Kiểu dữ liệu sử dụng để khai báo các hằng, biến, biểu
thức, hàm Từ những kiểu đã biết chúng đợc liên kết theo một cấutrúc nào đó để tạo nên chơng trình cho máy tính Mô tả dữ liệucủa bài toán qua các kiểu dữ liệu là công việc phải làm ngay từ
đầu chơng trình
Kích thớc (số byte) của mỗi kiểu nhận đợc qua hàm SizeOf(biến)với biến có kiểu đó
* Khai báo hằng : CONST = giá trị hằng hay biểu thức hằng.
* Khai báo biến : VAR <Tên các biến : kiểu dữ liệu>
{ Tên biến gồm một dãy ký tự, số và dấu gạch chân, không chứa
Trang 15Tồn tại các phép so sánh : = > < <> >= <= giữa 2phần tử có cùng kiểu mà trên đó đã xác định một quan hệ thứ tự.Kết quả trả về kiểu Boolean Với kiểu do nhiều kiểu thành phần hợpthành (Record) thì chỉ so sánh theo một trờng khoá nào đó.
* Các phép toán và một số hàm, thủ tục chuẩn của Turbo Pascal 7.0thờng dùng cho mỗi kiểu là:
+ Kiểu số nguyên (Integer):
Các phép toán số học : + - * cho kết quả nguyên
Chia: / Kết quả là số thực
DIV: Lấy phần nguyên VD: 5 DIV 2 = 2;
MOD: Lấy phần d VD : 5 MOD 2 = 1;
Các phép toán Logic: Not, or, and
Random(n) Lấy ngẫu nhiên trong khoảng n
sqrt(x) : Căn bậc hai của x sin(x) , cos(x): hàm lợng giác.abs(x) : Trị tuyệt đối của x int(x) : Hàm phần nguyêncủa x
ln(x) : Logarit cơ số e exp(x) : e mũ x
succ(x): = x+1 inc(i) : Tăng i lên 1
pred(x): = x-1 dec(i) : Giảm i đi 1
+ Kiểu số thực (Real):
Các phép toán số học : + - * / Các phép toán áp dụng cho
số thực đều áp dụng đợc cho số nguyên
Một số hàm: Pi (trả về số 3,14142 )
Trunc(x) Lấy phần nguyên(cắt bỏ phần thập
Trang 16SQR(x) = x2.SQRT(x) (x>=0) Căn bậc hai của xHàm lợng giác: Sin(x)
Cos(x)Arctan(x)Exp(x) Hàm ex.Ln(x) Hàm Logarit cơ số e
Ví dụ : #13 = xuống dòng #10 = về đầu dòng
Kiểu Char chỉ có phép so sánh, sự so sánh dựa trên mã ASCII của
lý tự
Chẳng hạn : ‘B’ < ‘a’ vì 88 < 97 (Xem phụ lục)
Một số hàm:
Upcase(c) : Đổi c ra chữ hoa.
ReadKey : Đọc phím vừa gõ vào.
KeyPressed : Chờ ấn phím Enter.
Succ(ch) : Cho ký tự đứng liền trớc ch.
Pred(ch): Cho ký tự liền sau ch.
Trang 17 Xâu phải đợc bao trong cặp nháy đơn : ‘String’ Trong xâu
có phân biệt chữ hoa, chữ thờng
Phép cộng 2 xâu : Nối xâu đứng trớc với xâu đứng sau (Kểcả dấu cách)
Ví dụ : st1 = Hoa
st2 = Hồngst1 + st2 = HoaHồng
* Các chú thích: Có thể ở bất kỳ chỗ nào trong chơng trình
nh-ng phải đợc bao giữa cặp dấu { } Nên viết chú thích ở chỗ thíchhợp để tiện theo dõi khi kiểm tra hoặc sửa chữa chơng trình
Read(x); : Nhập giá trị x gõ từ bàn phím vào
biến x Nhập xong con trỏ không xuống dòng.
Readln(x); : Nhập giá trị x gõ từ bàn phím
vào biến x Nhập xong con trỏ xuống dòng.
Readln; : Dừng chơng trình đến khi ấn
phím Enter.
* Các câu lệnh in dữ liệu ra màn hình :
Trang 18Write(x); In giá trị của biểu thức x ra màn hình, con
Writeln(số thực x:1:b); Dành vừa đủ chỗ để in giá
trị số thực x với b chữ số thập phân.
Bài tập
1 Lập chơng trình tính diện tích hình thang, với số đo các
đáy, chiều cao nhập từ bàn phím Ghi vào đĩa với tên
“DT_Hinh_Thang”
2 Lập chơng trình tính các hàm lợng giác của một góc với số đo
gõ vào từ bàn phím Ghi vào đĩa với tên “Ham_Luong_Giac”
3 Lập chơng trình tính diện tích, chu vi của một hình tamgiác với số đo ba cạnh gõ vào từ bàn phím Ghi vào đĩa với tên
“DT_TamGiac”
4 Một ngời gửi A đồng tiết kiệm với lãi xuất S % Tính số tiền cảgốc lẫn lãi sau T tháng (Lãi không cộng vào gốc, A, S, T gõ vào từ bànphím)
Pinet = Chiều cao – (TB vòng ngực + trọng lợng)
8 Cho các số thực x, y(Nhập vào từ bàn phím) Tính và in ra giátrị các biểu thức : a, b, a+b Biết : a = 1 + x2/y2 b = 1/x + 1/y
9 Tính và in ra trung bình cộng, trung bình nhân của 3 sốnguyên a, b, c nhập vào từ bàn phím
Trang 1910 Tính diện tích S, thể tích V của hình cầu bán kính R nhập
* Ví dụ : Tìm số lớn nhất trong ba số gõ vào từ bàn phím.
Giải thích sự hoạt động của thuật toán theo sơ đồ khối :
Sai Nếu a>=b Gán Max: = b Đúng
Gán Max: = a
SaiNếu Max>c Gán Max:=c
Trang 20Write('So thu hai :');Readln(b);
Write('So thu ba :');Readln(c);
if a>b then max:=a else max:=b;
if max<c then max:=c;
Writeln('So lon nhat trong 3 so da cho la :',max:8:2);
hình vẽ để đợc: a'b'c' = 2* abc và a''b''c'' = 3* abc.
(Bài toán có 4 nghiệm : (192, 384, 576) ; (219, 438, 657),
(273, 546, 819) ,(327, 654, 981)
7* Thay các dấu ? bằng dấu các phép tính để có đợc biểu thức đúng:
((((1 ? 2) ? 3) ? 4) ? 5) ?6 = 35.
3 Cấu trúc rẽ nhánh với lệnh CASE OF.
* Kiểu đoạn con:
Khai báo nh sau : TYPE <Tênmiềncon> : Hằng dới Hằng trên
Ví dụ : TYPE Chu_Hoa = ’A’ ’Z’; Thang = 1 12;
a b ca' b' c'a'' b'' c''
Trang 21VAR t1: Chu_Hoa; t2:Thang;
* CÊu tróc rÏ nh¸nh víi lÖnh CASE OF:
CASE <BiÓu thøc Boolean> OF
Writeln('Chuong trinh nhan dang phim');
Writeln('hay go mot phim ky tu hay phim so :');Readln(phim);
CASE phim OF
'0' '9' : Writeln('La so');
'a' 'z' : Writeln('La ky tu');
ELSE Writeln('Khong phai la so hay ky tu');
END;
END
Bµi tËp
1 LËp tr×nh tÝnh tiÒn ®iÖn cho kh¸ch hµng theo chØ sè cò
vµ chØ sè míi trªn c«ng t¬ ®iÖn BiÕt r»ng : NÕu dïng díi 100
sè tÝnh gi¸ 500/1 sè; NÕu dïng díi 150 sè tÝnh gi¸ 650 ®/1sè; NÕu dïng díi 250 sè tÝnh gi¸ 900®/1sè NÕu dïng díi 350 sè tÝnh gi¸ 1000®/1 sè Tõ 351 sè trë lªn tÝnh gi¸ 1250®/1sè.
Híng dÉn
Var cu, moi, chiso : longint;
BEGIN
Trang 22Writeln('Chuong trinh tinh tien dien');
Write('Nhap chi so cu :') ;Readln(cu);
Write('Nhap chi so moi :') ;Readln(moi);
chiso := moi - cu ;
CASE chiso OF
1 100 : Writeln('Tien phai tra la: ' ,chiso * 500, 'dong');
101 150 : Writeln('Tien phai tra la: ',chiso * 650, 'dong');
151 250 : Writeln('Tien phai tra la: ',chiso * 900, 'dong');
251 350 : Writeln('Tien phai tra la: ',chiso * 1000,'dong');
351 10000 : Writeln('Tien phai tra la: ',chiso * 1250,'dong');
END;
END
2 Gõ vào số năm và số tháng, Lập trình tính xem tháng đó
có bao nhiêu ngày?
4 Cấu trúc lặp với lệnh FOR
4.1 Lặp với số lần biết trớc:
FOR i:= gt1 TO gt2 DO <Công việc>;
FOR i:= gt1 DOWNTO gt2 DO <Công việc>;
Trong đó : i là biến đếm, gt1, gt2 là các biểu thức , cả ba có cùng kiểu giá trị (byte, integer, char, boolean) <Công việc> là lệnh
đơn hoặc lệnh ghép.
Trong cấu trúc này, <Công việc> sẽ đợc thực hiện 1 lần với mỗi giá trị của biến i Biến i gọi là biến điều khiển (biến chạy) <Công việc> có thể là lệnh đơn, có thể là lệnh ghép hay là một đoạn chơng trình hay một cấu trúc điều khiển khác.
Trang 234.2 Lệnh GOTO M :
- Phải có khai báo nhãn LABEL M ở đầu chơng trình
- Lệnh này cho phép nhảy khỏi vòng lặp đến vị trí nhãn M:
Lệnh BREAK : cho phép thoát ra khỏi các vòng lặp
Lệnh HALT : Dừng hẳng chơng trình
Bài tập
4.1 Viết ra màn hình các dãy ký tự từ a đến z ; z đến a; A đến Z; Z đến A.
4.2 Viết ra mà hình n số tự nhiên đầu tiên với n nhập vào từ bàn phím Ví dụ : Nhập vào n = 100; Viết ra màn hình 0, 1, 2 , 99, 100; (có dấu phảy ngăn cách các số);
4.3 Viết ra màn hình tổng của n số tự nhiên đầu tiên với n nhập vào từ bàn phím Ví dụ : Nhập vào 5 Viết ra màn hình tổng S = 15 (=1 + 2 + 3 + 4 + 5).
4.4 Viết tất cả các số chia hết cho 13 trong khoảng từ 0
đến 200? Trong khoảng từ 0 đến n với n nhập vào từ bàn phím.
4.5 Viết tất cả các số tự nhiên lẻ từ 1 đến n với n nhập vào từ bàn phím (Số lẻ đợc viết bằng công thức : 2n+1 với n
Trang 24Write('Hay cho so tu nhien N = ');read(n);
Writeln('Uoc thu 1 cua N la : 1 '); dem :=1;
* Dùng phép toán AND , OR ta viết :
(Biểu thức 1) AND (Biểu thức 2) AND (Biểu thức n).
(Biểu thức 1) OR (Biểu thức 2) OR (Biểu thức n).
4.9 Giải bài toán : “Trăm trâu, trăm cỏ, Trâu đứng ăn 5, Trâu
nằm ăn 3, Lụ khụ trâu già, 3 con 1 bó Tìm số trâu mỗi loại”
Trang 25Writeln('Trau dung :',dung);
Writeln('Trau nam:', nam);
Writeln('Trau gia:', gia);
đó?
4.11 Tìm tất cả các bộ số Pitago bậc 2 trong phạm vi 100 (a 2 =b 2 +c 2 ).
4.12 Giải bài toán vui:
“Kìa trông giặc Mỹ chạy đầy đồng,Quân ta bắt đợc thật là đông
7 thằng 1 xích, d 3 xích,
3 thằng 1 xích, 7 thằng không”
Tính số xích, số giặc Mỹ?
4.13 Tìm tất cả các số có 3 chữ số sao cho chữ số hàng
đơn vị bằng tích của chữ số hàng chục với chữ số hàng trăm? Ví dụ : 122, 236
5 Cấu trúc lặp với lệnh WHILE và REPEAT.
Lặp với số lần không biết trớc:
WHILE <Biểu thức Logic> DO <công việc> :
Nếu <Biểu thức Logic> đúng, máy sẽ thi hành <công việc>,
sau đó quay lại kiểm tra , nếu <Biểu thức Logic> còn đúng thì lạithi hành <công việc> cho đến khi <Biểu thức Logic> sai thìdừng lại
* Chú ý : Kiểm tra biểu thức trớc, thi hành công việc sau.
Trang 26Ví dụ1: Tìm ớc số chung lớn nhất của hai số nguyên dơng m, n.
Sơ đồ thuật toán nh sau:
+
Write('Cho biet so thu nhat: '); Readln(m);
Write('Cho biet so thu hai: '); Readln(n);
REPEAT <công việc> UNTIL <Biểu thức Logic>;
Máy thực hiện <công việc> cho đến khi <Biểu thức Logic> đúngthì dừng lại
* Chú ý: Máy thực hiện công việc trớc, kiểm tra biểu thức sau.
? Hãy sửa lại chơng trình trên với lệnh REPEAT (Vẽ sơ đồ thuật
Trang 27VAR m,n,ucln:integer;
BEGIN
Write('Cho biet so thu nhat: '); Readln(m);
Write('Cho biet so thu hai: '); Readln(n);
*Yêu cầu : Vẽ sơ đồ thuật giải trớc khi viết chơng trình
+ Với vòng lặp WHILE DO ta có chơng trình sau :
var N,I: integer; A:Real;
+ Với vòng lặp REPEAT UNTIL ta có chơng trình sau :
var N,I: integer; A:Real;
Trang 28+ T×m UCLN cña tö vµ mÉu.
+ Chia tö vµ mÉu cho UCLN
+ ViÕt ph©n sè sau khi rót gän
{Tim UCLN cua tu va mau}
tu := tu1; mau := mau1;
WHILE tu <> mau DO
IF tu > mau THEN tu := tu - mau ELSE mau := mau - tu;
{Viet ra ket qua}
Writeln(tu1,'/',mau1,' = ',tu1/tu:2:0,'/',mau1/tu:2:0);
END.
6 M¶ng
Trang 29Số <miền chỉ số> gọi là số chiều của mảng
Ví dụ : Var A : ARRAY[1 100] OF Integer;
Diễn giải : A là tên biến kiểu mảng gồm có 100 phần tử, mỗi phần
tử là một số nguyên:
Vị trí 1 2 3 97 98 99 100
Giá trị 12 7 0 45 125 4 7
* Lu ý : <Miền chỉ số> là số phần tử tối đa của mảng Khi nhập giá
trị cho các phần tử, có thể một số phần tử không có giá trị, khi đócác phần tử đó có giá trị mặc định bằng 0
* Truy nhập các phần tử của mảng:
Để truy nhập đến một phần tử của mảng, ta viết : Tên mảng[chỉ số] Trong mảng trên: để truy nhập đến phần tử ở vị
trí số 98, ta viết A[98] (có giá trị bằng 125)
* Cách dùng : Mảng đợc dùng khi làm việc với một dãy giá trị cùng kiểu Các giá trị này đợc đặt cùng tên (là tên mảng) và phân biệt với
nhau bởi chỉ số (vị trí) Do đó ta có khái niệm Biến chỉ số
* Một số thao tác thờng gặp khi làm việc với mảng:
Trang 30VÝ dô : NhËp vµo d·y 5 phÇn tö (N = 5) : 1, 5, 10, 15, 20.
2 G¸n gi¸ trÞ ngÉu nhiªn cho tõng phÇn tö víi hµm Random(n)
C¸ch 1: NhËp gi¸ trÞ tõ bµn phÝm cho tõng phÇn tö cña m¶ng.
VAR A: ARRAY[1 100] OF Integer; i, n : Integer;
C¸ch 2: G¸n gi¸ trÞ ngÉu nhiªn cho tõng phÇn tö cña m¶ng:
VAR A: ARRAY[1 100] OF Integer; i, n : Integer;
BEGIN
write('Cho so phan tu cua mang = '); Readln(n);
FOR i:=1 TO n DO A[i] := Random(100);
Trang 311 Nhập số phần tử của mảng (n).
2 Nhập giá trị cho từng phần tử của mảng A[i]
3 Duyệt từng phần tử a[i] i=1 -> n của mảng : Nếu a[i] >0 thì :
FOR i:=1 TO n DO Begin
Write('Phan tu thu ',i,' : ');
Read(M[i]);
End;
Write('Mang da cho la: ');
FOR i:=1 TO n DO Write(M[i]:4:0);
Writeln('Co tat ca ',dem,' so duong');
Writeln('Tong cac phan tu duong la: ', tong : 10 : 2);
END
* Nâng cấp : Nhập vào một dãy số nguyên bất kỳ cho đến khi gặp số 0 thì dừng lại Tính và in ra tổng các số dơng và trung bình cộng các số âm.
LABEL M;
CONST max = 100;
VAR a: array[1 max] of integer; i, dem: integer;
{ Nhập các số nguyên vào mảng a cho đến khi gặp số O }
BEGIN
writeln('Hay nhap cac so nguyen:');
dem:=0;
Trang 32FOR i:=1 TO max DO {Số phần tử không quá 100}
Write('Day so ban dau la: ');
FOR i:=1 TO dem-1 DO Write(a[i]:4);
3 In dãy sau khi xắp xếp
VAR A: ARRAY[1 100] OF integer; i,n, tg : integer;
BEGIN
Writeln('Xap xep lai day : A[1]<->A[n]; A[2]<->A[n-1] ');
Write('Hay cho so phan tu cua mang: '); Readln(n);
FOR i:= 1 To n DO Begin Write('A[',i,'] = '); Readln(A[i]); End;
Write(' Day ban dau la: ');
FOR i:=1 TO n DO Write(A[i]:4);
Writeln;
{Xắp xếp lại dãy đã cho}
FOR i:=1 TO n DIV 2 DO
Write('Day sau khi xap xep la : ');
FOR i:= 1 To n DO Write(A[i]:4);
Trang 33{Nhap so phan tu cua mang}
Write('So phan tu cua mang la: '); Readln(n);
{Nhap cac phan tu cho mang}
FOR i:= 1 TO n DO A[i]:= Random(100);
Writeln(' Mang ban dau la: ');
FOR i:= 1 TO n DO Write(A[i]:4);
{Viet cac phan tu chia cho 3 lan luot du 1, 2, 3}
writeln('Xap xep tang dan day cho truoc ');
Write('Hay cho so phan tu: '); Readln(n);
FOR i:=1 TO n DO m[i]:= (1 + random(100));
Write('Day da cho la:');
FOR i:=1 TO n DO Write(m[i]:4);
Trang 34IF m[i] > m[i+1] THEN
Write('Day sau khi xap xep la:');
FOR i:=1 TO n DO Write(m[i]:4);
END.
-6.6 Cho d·y sè thùc a1, a2, a3, an vµ mét sè thùc k
a KiÓm tra xem sè k cã trong d·y kh«ng? NÕu cã th× chØ
ra vÞ trÝ cña nã.
b Xo¸ tÊt c¶ c¸c sè lín h¬n k trong d·y.
Var j,i,n,dem, so, test : Integer; A:ARRAY[1 100] OF integer;
BEGIN
write('Cho so phan tu = '); Read(n);
FOR i:=1 TO n DO A[i]:=Random(100);
writeln('Day da cho la: ');
FOR i:=1 TO n DO Write(A[i]:4);
writeln;
write('Cho so can tim: '); Read(so);
FOR i:=1 TO n DO IF A[i]=so THEN
m[i+1] nÕu m[i]>m[i+1]
Trang 35Thuật giải: Duyệt lần lợt từng phần tử của mảng Nếu phần tử đó
write('Cho so phan tu '); Readln(n);
FOR i:= 1 TO n DO begin write('A[',i,']='); readln(A[i]); end;
write('Cho so can chen vao day: '); readln(x);
Write('Day sau khi chen la:');
FOR i:= 1 TO n DO IF A[i] < x THEN
b Duyệt từng phần tử của mảng Nếu phần tử nào không thuộc
đoạn trên thì xếp sang một mảng phụ Cuối cùng in lần lợt các phần
tử của mảng phụ ra
CONST max = 200;
VAR A,B: ARRAY[0 max] of integer; i,j,n, dem: integer; ch: char;
BEGIN
clrscr;
Writeln('Sinh ngau nhien day N so nguyen ');
Writeln(' a) Xoa cac so nho hon 20 ');
Writeln(' b) Xoa cac so thuoc [100,200] ');
Trang 36REPEAT
Write('Chon so phan tu cua mang (nho hon 200)= '); Readln(n); UNTIL (n>0) and (n<= max);
FOR i:=1 TO n DO A[i]:= random(300);
Writeln(' Day ban dau la: ');
FOR i:=1 TO n DO Write(A[i]:5);
Trang 37-6.9 Sinh ngẫu nhiên dãy n số nguyên (n<=200) Có (và Không) dùng mảng phụ, hãy chuyển các số âm về đầu dãy, các
số dơng về cuối dãy mà không làm thay đổi thứ tự trớc sau.
Ví dụ : Cho dãy -2, -1, 0, 1, 7, 3, -4; Xắp lại là : -2, -1, -4, 0, 1,
7, 3.
Thuật giải :
- Không dùng mảng phụ: Duyệt lần lợt các phần tử của mảng Lần 1 : nếu gặp phần tử âm thì in ra Lần 2 : in phần tử 0 nếu có Lần 3: nếu gặp phần tử dơng thì in ra.
- Dùng mảng phụ : Dùng 2 mảng phụ 1 mảng chứa các số âm, một mảng chứa số dơng
Var j,i,n,dem, so, test : Integer; A:ARRAY[1 100] OF integer;
BEGIN
write('Cho so phan tu = '); Read(n);
FOR i:=1 TO n DO Begin write('A[',i,'] = '); Readln(A[i]); End;
writeln('Day da cho la: ');
FOR i:=1 TO n DO Write(A[i]:4);
writeln;
writeln('Day sau khi xap xep la: ');
FOR i:=1 TO n DO IF A[i]<0 THEN Write(A[i]:4) ;
FOR i:=1 TO n DO IF A[i]=0 THEN Write(A[i]:4) ;
FOR i:=1 TO n DO IF A[i]>0 THEN Write(A[i]:4) ;
writeln('Tinh Trung binh cong va Trung binh nhan');
Write('Nhap vao n =' ); Readln(n);
Tong:=0; Tich:=1;
FOR i:=1 TO n DO Begin Write('So thu ',i,'='); Read(A[i]); End;
FOR i:=1 TO n DO Begin Tong:=Tong+A[i]; Tich:=Tich*A[i]; End;
Writeln('Trung binh cong cua ',n, ' so da cho la : ', Tong/n:10:2); Writeln('Trung binh nhan cua ',n, ' so da cho la : ', Tich/n:10:2);
Trang 38
-6.11 “Mặt bằng lớn nhất” : Trong một dãy số, các phần tử bằng nhau liên tiếp đợc gọi là một mặt bằng của dãy Mặt bằng lớn nhất là mặt bằng có số phần tử nhiều nhất trong số các mặt bằng của dãy.
Cho một dãy số nguyên N phần tử Hãy tìm mặt bằng lớn nhất của nó.
{Nhap va in day cho truoc}
Write('Cho so phan tu = '); readln(n);
for i:=1 to n do begin write('So thu ',i,' ='); readln(a[i]); end;
IF a[i] = a[i+1] THEN d:=d+1 ELSE d:=1;
IF max < d THEN max:=d;
End;
{In ra mat bang lon nhat}
Write('Mat bang lon nhat la: ');
Trang 39-6.12 Cho một dãy số nguyên N phần tử Tìm dãy con đơn
điệu tăng lớn nhất của dãy
Ví dụ cho dãy : 9 13 1 2 3 4 5 3 5 2 3 4 1
In ra: Dãy con đơn điệu tăng lớn nhất có 5 phần tử là 1 2 3 4 5
Kết quả sau vòng lặp ta đợc max là số phần tử của dãy đơn
điệu tăng lớn nhất
2 In ra số max: Nếu max >1 thì in ra : “Số phần tử của dãy đơn
điệu tăng lớn nhất là max” , ngợc lại thì in ra “Không có dãy đơn
điệu tăng”
3 Tìm ra vị trí bắt đầu của dãy đơn điệu tăng lớn nhất:
(ở trên ta đã có số phần tử của dãy đơn điệu tăng lớn nhất là max Vì vậy: chỉ cần xác định đợc vị trí bắt đầu của dãy đó thì
có thể in ra đợc từng phần tử của dãy).
- Gán kiểm tra (kt)=0 và vị trí bắt đầu (bd)=0;
- Ta xét từng đoạn gồm max phần tử, bắt đầu từ vị trí a[i]
Lặp với j:=1 đến n – max:
Lặp với i từ j đến j + max-1 :Nếu a[i] < a[i+1] thì tăng kt lên 1, ngợc lại gán kt = 0;
Sau khi lặp xong, so sánh kt với max: nếu kt=max thì gán
bd = i và nhảy khỏi vòng lặp (Goto M)
Ví dụ ta có dãy 10 phần tử nh sau:
Trang 40Dãy con lớn nhất gồm 5 (max=5)phần tử, từ vị trí số 4 đến vị trí số
8
Ta so sánh đoạn 5 phần tử , bắt đầu từ vị trí 1 Nếu gặp đoạn cótất cả các phần tử giống nhau thì biến kt sẽ tăng đúng bằng 5 Khi
đó ta sẽ đánh dấu vị trí bắt đầu của dãy con
4 In ra vị trí bắt đầu, kết thúc và các phần tử của dãy con.
CONST han = 1000; {Giới hạn số phần tử của mảng}
Var n, i, j, d, max, kt, bd: integer; a: array[1 han] of integer;
BEGIN
{Nhập và in dãy }
Write('Cho so phan tu = '); readln(n);
FOR i:=1 TO n DO begin write('So thu ',i,' ='); readln(a[i]); end;
IF a[i] < a[i+1] THEN inc(d) ELSE d:=1;
IF max < d THEN max:=d;