Giáo trình Ngôn ngữ lập trình Pascal - Lê Mạnh Thạnh (Phần 1)

pdf 51 trang hapham 1140
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Ngôn ngữ lập trình Pascal - Lê Mạnh Thạnh (Phần 1)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_ngon_ngu_lap_trinh_pascal_le_manh_thanh.pdf

Nội dung text: Giáo trình Ngôn ngữ lập trình Pascal - Lê Mạnh Thạnh (Phần 1)

  1. đại học huế trung tâm đào tạo từ xa lê mạnh thạnh (Chủ biên) – võ văn tuấn dũng giáo trình ngôn ngữ lập trình pascal (Sách dùng cho hệ đào tạo từ xa) Huế – 2007 1
  2. mục lục Ch−ơng 1 6 Giới thiệu chung 6 1.1. Mở đầu 6 1.2. Các khái niệm cơ bản của Turbo Pascal 9 1.3. Các b−ớc để chạy một ch−ơng trình Turbo Pascal 11 Ch−ơng 2 15 Các kiểu dữ liệu đơn giản 15 2.1. Kiểu dữ liệu trong ngôn ngữ lập trình 15 2.2. Các kiểu dữ liệu đơn giản 15 Ch−ơng 3 21 Hằng, biến, kiểu, biểu thức, câu lệnh, lệnh gán 21 3.1. Định nghĩa hằng 21 3.2. Biến và khai báo biến 22 3.3. Định nghĩa kiểu dữ liệu 22 3.4. Biểu thức 23 3.5. Câu lệnh (Statement) 24 3.6 Lệnh gán (Assignment statement) 24 2
  3. Ch−ơng 4 27 Xuất nhập dữ liệu 27 4.1. Xuất dữ liệu 27 4.2. Nhập dữ liệu từ bàn phím 31 Ch−ơng 5 36 Lệnh có cấu trúc 36 5.1. Câu lệnh ghép (Compound Statement) 36 5.2. Câu lệnh lựa chọn 36 5.3. Câu lệnh lặp 41 Ch−ơng 6 52 Kiểu tập hợp và kiểu mảng 52 6.1. Kiểu tập hợp (Set Type) 52 6.2. Kiểu mảng (Array Type) 54 Ch−ơng 7 59 Ch−ơng trình con 59 7.1. Khái niệm về ch−ơng trình con 59 7.2. Một số hàm và thủ tục của Turbo Pascal 62 Ch−ơng 8 68 Kiểu chuỗi kí tự 68 3
  4. 8.1. Khai báo kiểu chuỗi 68 8.2. Các phép toán trên chuỗi kí tự 69 8.3. Các thủ tục trên chuỗi kí tự 70 8.4. Các hàm trên chuỗi 71 Ch−ơng 9 75 Kiểu bản ghi và kiểu tập tin 75 9.1. Kiểu bản ghi (Record type) 75 9.2. Kiểu tập tin (File type) 83 Ch−ơng 10 100 Kiểu con trỏ và biến động 100 10.1. Biến con trỏ 100 10.2. Biến động (Dynamic Variable) 101 10.3. Danh sách liên kết (Linhked List) 104 4
  5. lời mở đầu Ngày nay ở n−ớc ta, các thành quả của Công nghệ Thông tin đã và đang đ−ợc đ−a vào ứng dụng trong mọi cơ quan xí nghiệp và do đó nhiệm vụ đào tạo nhân lực Công nghệ Thông tin đã trở thành cấp thiết đối với ngành Giáo dục và Đào tạo. Chúng ta phải đồng thời tiến hành 3 mục tiêu: mở mang dân trí, đào tạo nhân lực và phát triển nhân tài. Vấn đề đặt ra là cần phải xây dựng ch−ơng trình thích hợp theo từng mục tiêu, cho từng loại hình, từng đối t−ợng. Trong nhiều môn học thuộc chuyên ngành Công nghệ Thông tin, Ngôn ngữ lập trình Pascal là môn học đ−ợc dùng cho nhiều đối t−ợng và nhiều cấp học với lí do: đây là một ngôn ngữ giải thuật có tính chặt chẽ vừa có thể sử dụng nh− là một ngôn ngữ giải thuật toán, vừa là ngôn ngữ phổ biến, thích hợp với nhiều ứng dụng khoa học, kĩ thuật, quản lí. Giáo trình này đ−ợc soạn thảo dựa trên cơ sở Turbo Pascal phiên bản 5.0 và chủ yếu dành cho các sinh viên Đại học Từ xa. Tuy nhiên, nó cũng có thể dùng làm tài liệu tham khảo và giảng dạy cho sinh viên của các tr−ờng Đại học, Trung học chuyên nghiệp, kể cả các tr−ờng Phổ thông trung học và các Trung tâm đào tạo khác. Tác giả rất mong sự góp ý của các độc giả về nội dung, hình thức và sai sót trong giáo trình. Xin chân thành cảm ơn. Các tác giả 5
  6. Ch−ơng 1 Giới thiệu chung 1.1. Mở đầu 1.1.1. Cấu tạo chính của máy tính điện tử Các máy tính điện tử nói chung có các bộ phận sau đây: – Bộ điều khiển trung tâm CPU (Central Processing Unit) là bộ phận thực hiện các phép tính số học và logic bằng việc phân tích chức năng của các lệnh. – Bộ nhớ trong (Main Memory) là nơi chứa các ch−ơng trình và số liệu. – Thiết bị vào (Input Device) là bộ phận đ−a ch−ơng trình và dữ liệu vào máy. – Thiết bị ra (Output Device) là bộ phận đ−a kết quả từ bộ nhớ ra ngoài. – Bộ nhớ phụ (Auxiliary Memory) đ−ợc dùng để l−u trữ ch−ơng trình và số liệu nh− bộ nhớ chính song dung l−ợng nhớ lớn hơn và truy cập chậm hơn. Đối với máy PC (Personal Computer), các bộ phận chính là: – Bộ xử lí trung tâm CPU bao gồm 3 khối : Khối số học và logic ALU (Arithmetic Logic Unit) có chức năng thực hiện các phép toán số học, so sánh, dịch chuyển. Khối điều khiển CU (Control Unit) có chức năng phân tích lệnh và điều khiển hoạt động của CPU. Các thanh ghi (Register) l−u trữ thông tin phục vụ trực tiếp cho tính toán và điều khiển. Bộ nhớ trong bao gồm 2 phần chính: ROM (Read Only Memory) là bộ nhớ có cài sẵn ch−ơng trình phục vụ cho việc vào ra – gọi là BIOS (Basic Input – Output System). RAM là bộ nhớ cho phép truy cập tức thời, Ch−ơng trình và số liệu đ−ợc l−u trữ tạm thời trong RAM trong quá trình thực hiện, khi tắt máy ch−ơng trình và số liệu trong RAM cũng biến mất. – Bộ nhớ phụ của máy PC là các ổ đĩa (Disk Driver). Có 3 loại chính: đĩa cứng HDD (Hard Disk Driver – thông th−ờng chỉ có một (hoặc hai) đĩa với dung l−ợng lớn và th−ờng đ−ợc cố định trong máy, đ−ợc kí hiệu là C (hoặc C, D nếu có hai ổ đĩa); đĩa mềm FDD (Floppy Disk Driver) là loại ổ đĩa dùng cho đĩa mềm có dung l−ợng nhỏ và có thể thay đổi th−ờng xuyên; ổ đĩa chỉ đọc CD – ROM (Compact Disk ROM) đ−ợc cài đặt máy để đọc các đĩa CD. – Thiết bị vào đối với máy PC rất đa dạng, thông dụng nhất là bàn phím. Ngoài ra còn có các loại khác nh− con chuột (Mouse) để đ−a vào các tín hiệu điều khiển, máy quét (scanner) để nhập vào máy các hình ảnh. – Thiết bị ra chủ yếu là màn hình (monitor), máy in (printer). 6
  7. 1.1.2. Thuật toán và ch−ơng trình a. Ngôn ngữ lập trình Ngôn ngữ cơ sở để lập ch−ơng trình cho máy là ngôn ngữ máy, đó là một bộ lệnh, mỗi lệnh đ−ợc biểu diễn trong máy bằng một dãy các chữ số nhị phân chỉ cho máy các công việc cần thực hiện. Các lệnh đ−ợc thể hiện ra bên ngoài bằng các số hệ cơ số 8 hoặc cơ số 16. Để tiện cho ng−ời sử dụng, ng−ời ta xây dựng các ngôn ngữ trung gian giao tiếp giữa ng−ời và máy nh− Assembler, Basic, Angol, Fortran, Pascal, C, Để máy hiểu đ−ợc các ngôn ngữ trên, cần phải có các ch−ơng trình dịch để dịch các ngôn ngữ lập trình cấp cao ra ngôn ngữ máy. Ch−ơng trình dịch có hai loại: Biên dịch (Compiler) và thông dịch (Interpreter). b. Thuật toán Thuật toán là sự phân tích bài toán thành một số hữu hạn b−ớc giải mà theo thứ tự đó ta có thể lập trình cho máy. Ví dụ 1. Để xây dựng ch−ơng trình giải ph−ơng trình bậc 2: ax2 + bx + c = 0 (a, b, c ≠ 0) ta phân tích nh− sau: B−ớc 1. Đọc các hệ số a, b, c. B−ớc 2. Tính ∆ = b2 – 4ac. B−ớc 3. Nếu ∆ < 0 thì trả lời : “ph−ơng trình không có nghiệm thực” chuyển sang B−ớc 5, nếu ng−ợc lại chuyển sang B−ớc 4. B−ớc 4. Nếu ∆ = 0 thì trả lời: “ph−ơng trình có nghiệm kép X1 = X2 = – b/2a”, nếu ng−ợc lại thì trả lời: “Ph−ơng trình có hai nghiệm thực là X1 = (–b + SQRT(∆))/2a, X2 = (–b – SQRT(∆))/2a”, chuyển sang B−ớc 5. B−ớc 5. Dừng máy. c. Ch−ơng trình Ch−ơng trình là một dãy hữu hạn các lệnh hoặc các chỉ thị của một ngôn ngữ lập trình nào đó đ−ợc viết theo một trật tự nhất định nhằm giải quyết một lớp bài toán đã cho. Ví dụ 2. Ch−ơng trình viết bằng ngôn ngữ Pascal sau đây giải ph−ơng trình bậc 2 với thuật toán đã chỉ ra ở trên. Program GPTB2; Var a, b, c, x1, x2, delta: Read; Begin Readln(a, b, c); delta:=b^2-4*a*c; If delta < 0 then Writeln(“Phuong trinh khong co nghiem thuc”) else 7
  8. If delta = 0 then Wrieln(“Phuong trinh co nghiem kep x1 = x2 =”,-b/2a) else x1 := (-b+sqrt(delta))/2 a; x2 := (-b-sqrt(delta))/2 a; Writeln(“Phuong trinh co 2 nghiem x1=”,x1, “x2=”,x2) End End. Ch−ơng trình đ−ợc viết sẵn để giải quyết một loạt bài toán gọi là ch−ơng trình mẫu mà mỗi lần sử dụng nó chỉ việc đ−a vào các giá trị thay cho các tham số. Chẳng hạn, trong ngôn ngữ lập trình Pascal hàm mẫu SQRT(x) là ch−ơng trình tính căn bậc 2 của x, hàm EXP(x) là ch−ơng trình con tính ex, LN(x) tính ln(x), 1.1.3. Giới thiệu về Pascal và Turbo Pascal Pascal là ngôn ngữ lập trình cấp cao do Niklaus Wirth, giáo s− điện toán tr−ờng Đại học Kĩ thuật Zurich (Thuỵ Sĩ) đề xuất vào năm 1970. Lúc đầu mục đích của Wirth thiết kế Pascal là để giảng dạy lập trình. Nh−ng trong quá trình phát triển, Pascal đã phát huy đ−ợc −u điểm của mình và tỏ ra hơn hẳn nhiều ngôn ngữ cấp cao khác, Pascal đã trở thành một ngôn ngữ mạnh đ−ợc ứng dụng trong nhiều lĩnh vực khác nhau. Các tổ chức và công ty chuyên về máy tính dựa trên Pascal chuẩn đã phát triển thêm và tạo ra các ch−ơng trình dịch ngôn ngữ Pascal với nhiều phần thêm bớt khác nhau. Chẳng hạn nh−: – Turbo Pascal của hãng Borland – Quick Pascal của hãng Microsoft. – UCSD Pascal (University of California at San Diego), của tr−ờng Đại học California. – Ansi Pascal (American National Standard Institute), của Viện các tiêu chuẩn Quốc gia Mỹ. Trong nhiều ch−ơng trình dịch Pascal, Turbo Pascal đã tỏ ra có nhiều −u điểm và hiện nay đ−ợc xem nh− là một trong những ngôn ngữ lập trình cấp cao phổ biến trên thế giới đ−ợc sử dụng rộng rãi trong lĩnh vực giảng dạy và lập trình chuyên nghiệp. Chỉ trong vòng mấy năm, Turbo Pascal đ−ợc cải tiến qua nhiều phiên bản: 1.0, 2.0, 3.0, 4.0, 5.0, 5.5, (1989), 6.0 (1990), 7.0 (1992). Hiện nay Turbo Pascal 7.0 có rất nhiều bổ sung, cải tiến so với các phiên bản tr−ớc, song mới bắt đầu tiếp cận với Turbo Pascal, bạn nên sử dụng Turbo Pascal 5.5 vì nó t−ơng đối đơn giản, dễ sử dụng và không đòi hỏi máy có cấu hình mạnh. 1.1.4. Các tập tin chính của Turbo Pascal Để chạy đ−ợc ch−ơng trình Pascal thông th−ờng cần sử dụng các tập tin chủ yếu sau: Turbo.exe : Soạn thảo, dịch và liên kết ch−ơng trình. 8
  9. Turbo.tpl : Tập tin th− viện, l−u trữ các đơn vị chuẩn để chạy với Turbo.exe (TPL : Turbo Pascal Library). Với 2 tập tin trên chúng ta có thể bắt đầu viết đ−ợc ch−ơng trình. Sau đó nếu muốn sử dụng đồ hoạ thì thêm các tập tin sau: Graph.tpu: Đơn vị ch−ơng trình chứa các ch−ơng trình con đồ hoạ. Các tập tin có phần mở rộng CHR (Sans.chr, Trip.chr, ) chứa các font chữ trong chế độ đồ hoạ. Các tập tin có phần mở rộng BGI (Ega.bgi, Vga.bgi, ) để điều khiển các loại màn hình t−ơng ứng khi dùng đồ hoạ. 1.2. Các khái niệm cơ bản của Turbo Pascal 1.2.1. Bộ kí tự của Turbo Pascal Ngôn ngữ lập trình Pascal dựa vào bộ kí tự sau: – Các chữ cái: 26 chữ hoa (A, B, C, D, , Z) và 26 chữ th−ờng (a, b, c, d, , z). – Các chữ số thập phân: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. – Các dấu toán học thông dụng: + – * / = ( ) . – Dấu gạch nối _ (khác với dấu trừ (–)). – Các kí hiệu đặc biệt: . , ; ! ? : ‘ “ { } [ ] % @ & # $ ^. 1.2.2. Từ khoá (Key word) Trong Turbo Pascal có một từ cho sẵn, có ngữ nghĩa đã đ−ợc xác định và tuân theo một cấu trúc ngữ pháp nhất định gọi là từ khoá. Sau đây là một số từ khoá quen thuộc, th−ờng gặp trong Turbo Pascal: BEGIN, END, PROGRAM, CASE, OF, FOR, TO, DOWNTO, DO, WHILE, REPEAT, UNTIL, WITH, EXIT, GOTO, AND, OR, NOT, IN, DIV, MOD. Chú ý. Turbo Pascal không phân biệt kí tự in th−ờng (lower case char) hay in hoa (upper case char). Chẳng hạn, các cách viết sau có ý nghĩa hoàn toàn nh− nhau: BEGIN, begin, Begin, beGIN 1.2.3. Tên chuẩn Tên chuẩn là tên đã đ−ợc định nghĩa sẵn trong Turbo Pascal, nh−ng ng−ời lập trình có thể định nghĩa lại nếu muốn. Sau đây là một số tên chuẩn: – Tên hằng chuẩn: False, True, MaxInt, – Tên kiểu chuẩn: Boolean, Char, Integer, Word, Read, Byte, Text – Tên hàm chuẩn: Abs, Arctan, Chr, Cos, Sin, Exp, Ln, Sqr, Sqrt – Tên thủ tục chuẩn: Read, Readln, Write, Writeth, 9
  10. 1.2.4. Tên (identifier) Tên là một dãy các chữ cái, chữ số và dấu nối ( _ ) bắt đầu không phải là chữ số và đ−ợc dùng để đặt cho các đại l−ợng trong ch−ơng trình nh− tên hằng, tên kiểu dữ liệu, tên biến, tên mảng, tên hàm, tên ch−ơng trình Số kí tự của tên gọi bị hạn chế trong Pascal chuẩn là 8 còn trong Turbo Pascal số kí tự của tên tối đa là 127. Tên không đ−ợc đặt trùng với từ khoá. Các ví dụ đúng về tên: PT_Bac_2, Delta, a_1. Các ví dụ sai về tên: PT Bac 2 (có kí tự trống), 3ABC (kí tự đầu tiên là chữ số), g(x) (sử dụng dấu ()), Label (Trùng với từ khoá). Chú ý. Khi viết ch−ơng trình ta nên đặt các tên sao cho chúng nói lên đ−ợc ý nghĩa của đối t−ợng mà chúng biểu thị để giúp cho ch−ơng trình đ−ợc sáng sủa và dễ hiểu. 1.2.5. Cấu trúc tổng quát của một ch−ơng trình Turbo Pascal Một ch−ơng trình Turbo Pascal đầy đủ gồm ba phần sau: Phần 1. Phần tiêu đề của ch−ơng trình. Phần này đ−ợc bắt đầu bằng từ khoá PROGRAM, tiếp theo là tên ch−ơng trình do ng−ời lập trình đặt ra và kết thúc bởi dấu chấm phẩy (;) Phần 2. Phần khai báo bao gồm các khai báo theo thứ tự sau – Khai báo nhãn: Label ; – Khai báo sử dụng Unit: Uses ; – Khai báo các hằng: Const ; – Khai báo kiểu dữ liệu: Type ; – Khai báo các biến: Var ; – Khai báo các ch−ơng trình con thủ tục hay hàm: Procedure ; Function ; Phần 3. Thân ch−ơng trình, bao gồm một dãy các lệnh thực hiện (có thể là lệnh đơn hoặc ghép) đ−ợc viết cách nhau bởi dấu chấm phẩy, và bắt đầu bởi Begin và kết thúc bởi End. BEGIN { Các lệnh của ch−ơng trình } END. Dấu chấm báo kết thúc ch−ơng trình. Chú ý. – Phần 1 chiếm 1 dòng và có thể có hay không. 10
  11. – Phần 2 tuỳ theo ch−ơng trình cụ thể mà các khai báo có thể có hay không và có thể lặp lại một số lần. – Phần 3 bắt buộc phải có đối với mọi ch−ơng trình. – Lời giải thích: Turbo Pascal cho phép ng−ời lập trình có thể đ−a vào văn bản ch−ơng trình các lời giải thích, ghi chú để làm cho ch−ơng trình dễ đọc, dễ hiểu hơn nh−ng không ảnh h−ởng đến sự thực hiện của ch−ơng trình. Các lời giải thích đ−ợc đặt giữa hai dấu { } hoặc giữa 2 cụm dấu (* *) và có thể viết trên 1 dòng hay nhiều dòng. – Dấu chấm phẩy (;) dùng để ngăn cách các câu lệnh của Turbo Pascal (không phải là dấu kết thúc lệnh). Tuy nhiên, nếu dấu chấm phẩy đứng ngay tr−ớc từ khoá END có thể bỏ. 1.3. Các b−ớc để chạy một ch−ơng trình Turbo Pascal 1.3.1. Các b−ớc thực hiện • B−ớc 1. Khởi động Turbo Pascal bằng lệnh TURBO (↵). Khi đó màn hình làm việc của Turbo Pascal xuất hiện. Dòng trên cùng màn hình là bảng chọn chính. File Edit Run Compile Opion Debug Break/Watch • B−ớc 2. Đặt tên tập tin ch−ơng trình. Chọn mục File trong bảng chọn chính, khi đó Load F3 sẽ xuất hiện bảng chọn dọc. Trong bảng này chọn Pick Alt – F3 Load, tiếp theo màn hình xuất hiện dòng: New Save Load file name (*.PAS) : Write to Directory _ Change Dir Đ−a vào tên tập tin ch−ơng trình cần soạn Dos shell thảo rồi ấn Enter, có 3 khả năng xảy ra: Quit Alt - X – Tập tin đã có trên đĩa : Tập tin ch−ơng trình này đ−ợc nạp vào RAM và văn bản ch−ơng trình hiện lên màn hình. – Tập tin ch−a có trên đĩa : màn hình trống hiện ra để soạn thảo ch−ơng trình mới. – Trong tên tập tin có dùng kí tự * hay ? : Tên các tập tin t−ơng tự tên đã cho (bằng cách dùng các phím mũi tên và gõ Enter). Chú ý. – Để chọn mục File có thể ấn Alt – F hoặc đ−a điểm sáng đến tên File trên bảng chọn chính rồi gõ Enter. – Để chọn Load trên bảng chọn dọc ta có thể đ−a điểm sáng về từ Load rồi gõ Enter. • B−ớc 3. Soạn thảo văn bản ch−ơng trình. 11
  12. Một số thao tác cần thiết khi soạn thảo ch−ơng trình: * Các phím dịch chuyển con trỏ – 4 mũi tên : chuyển sang trái, chuyển sang phải một kí tự, chuyển lên chuyển xuống một dòng theo h−ớng mũi tên. – Enter thực hiện việc chuyển sang dòng mới. – Home và End chuyển con trỏ về đầu dòng và cuối dòng. – Ins : chuyển chế độ ghi chèn và ghi đè. – Backspace: xoá kí tự tr−ớc con trỏ. – Del: xoá kí tự sau con trỏ. – Ctr + Y: xoá một dòng. * Các thao tác khối : – Chọn khối: Dùng mũi tên đ−a con trỏ về vị trí đầu khối, giữ phím shift và dùng các mũi tên để chuyển đến vị trí cuối khối, thả phím shift. Khối đ−ợc chọn có màu sáng hơn vùng không đ−ợc chọn. – Xoá khối đã chọn : ấn phím Delete. – Xoá khối đã chọn và đ−a nội dung khối vào vùng đệm: ấn Shift + Del hoặc chọn thực đơn Edit/Cut. – Sao chép nội dung của khối đã chọn vào vùng đệm: ấn Ctrl + Ins. – Sao chép nội dung vùng đệm vào vùng bắt đầu từ vị trí con trỏ : ấn Shift + Ins. • B−ớc 4. L−u văn bản. Khi văn bản đã đánh xong cần l−u vào trong đĩa ta làm nh− sau: – ấn Alt + F để mở thực đơn File hoặc ấn phím F3. – Dùng mũi tên đ−a dòng sáng về Save as và ấn Enter (hoặc ấn phím A) để mở hộp thoại Save As. – Đặt tên tập tin với đầy đủ đ−ờng dẫn hoặc dùng phím Tab chuyển điểm nháy đến hộp Dir/Drive để chọn ổ đĩa, th− mục (nếu cần). – Ghi tên tập tin vào hộp File name. – ấn phím Enter. Nếu tập tin văn bản đã đ−ợc đặt tên thì chỉ cần ấn Alt + F và chọn Save hoặc phím S. Muốn ghi văn bản ch−ơng trình vào tập tin đang mở có thể ấn phím F2. • B−ớc 5. Biên dịch và thực hiện ch−ơng trình : gõ phím Ctrl – F9. Khi biên dịch, máy sẽ kiểm tra ngữ pháp của từng lệnh, gặp lệnh sai hay nhập sai máy dừng lại, trên màn hình có thông báo nguyên nhân sai của lỗi, tiến hành sửa lỗi và gõ lại Ctrl – F9 để chạy tiếp. Lặp lại quá trình này đến khi sửa hết lỗi. 12
  13. Sau khi biên dịch và thực hiện ch−ơng trình xong mà không thấy kết quả ch−ơng trình trên màn hình thì gõ Alt – F5 để xem kết quả, xem xong gõ phím bất kì để trở lại màn hình ban đầu. Khi ch−ơng trình đã chạy thông suốt, muốn dịch ch−ơng trình ra tập tin trên đĩa có mở rộng EXE để sau này có thể chạy độc lập trong môi tr−ờng DOS thì thực hiện b−ớc 6 và b−ớc 7. • B−ớc 6. Gõ Alt – C (chọn mục Compile), trên màn hình xuất hiện bảng chọn dọc Compile, trong bảng chọn này chọn Destination là Disk để kết quả dịch ch−ơng trình đ−ợc ghi ra đĩa, rồi gõ Alt – F9 để dịch ch−ơng trình. Khi xuất hiện thông báo “Success: Press any key” thì dịch xong. Nếu có lỗi máy cũng dừng lại và thông báo nguyên nhân lỗi trên màn hình. • B−ớc 7. Thoát tạm thời khỏi Turbos Pascal trở về DOS để chạy ch−ơng trình đã dịch thành công: Gõ Alt – F để mở menu File. Trong menu File chọn Dos Shell. Sau đó từ DOS cho chạy tập tin ch−ơng trình có đuôi EXE đã dịch. Chạy xong ch−ơng trình, trở lại Turbo Pascal bằng lệnh Exit. • B−ớc 8. Thoát khỏi hẳn Turbo Pascal: Gõ Alt – X hoặc chọn Quit trên bảng chọn dọc File. 1.3.2. Ví dụ một ch−ơng trình hoàn chỉnh Sau đây là một ch−ơng trình hoàn chỉnh thực hiện việc tính chu vi, diện tích hình tròn với bán kính r nhập vào từ bàn phím. Program HINH_TRON; Uses Ctr; Var r, P, S: Read; Begin CrlScr; {xoá màn hình} Write(‘Nhap ban kinh r= ‘);Readln(r); Writeln(‘Dien tich S= ‘, pi*r*r:2:4); Writeln(‘Chu vi P= ‘,2*pi*r:2:4); Readln; End. Kết quả thực hiện ch−ơng trình: Nhap ban kinh r= 3.5 Dien tich S= 38.4845 Chu vi P= 21.9911 13
  14. Câu hỏi – Bài tập ch−ơng 1 1. Trình bày các phần tử cơ bản của ngôn ngữ Turbo Pascal. 2. Từ khoá là gì? Tại sao nên học thuộc các từ khoá của Turbo Pascal? 3. Phân biệt sự khác nhau giữa từ khoá và tên chuẩn. 4. Tên là gì? 5. Các tên sau đây tên nào không đúng trong Turbo Pascal? Tại sao? Alpha1, Nghiem – nguyên, 15A, $I. 6. Trình bày cấu trúc đầy đủ của một ch−ơng trình viết bằng Turbo Pascal. Trong cấu trúc đó phần nào bắt buộc phải có, phần nào không bắt buộc phải có? 7. Sắp xếp các từ sau đây thành 3 cột theo các nội dung : Tên chuẩn, Từ khoá, Tên thông th−ờng : Label, pascal, alpha, logic, boolean, real, with, exit, Lamda, Turbo, compiler, record. 8. Xây dựng thuật toán giải hệ ph−ơng trình bậc nhất hai ẩn số sau : ⎧ax + by =c ⎨ ⎩dx + hy = g trong đó x, y là các ẩn số còn a, b, c, d, h, g là hệ số cần đ−ợc nhập vào từ bàn phím. 9. Xây dựng thuật toán tìm −ớc số chung lớn nhất của hai số tự nhiên a và b. 10. Cho hai dãy số thực a1, a2, , an và b1, b2, , bn. Hãy xây dựng thuật toán đọc các số liệu vào và tính biểu thức : a1b1 + a2b2 + + anbn 14
  15. Ch−ơng 2 Các kiểu dữ liệu đơn giản 2.1. Kiểu dữ liệu trong ngôn ngữ lập trình Một kiểu dữ liệu (Data type) là một sự quy định về cấu trúc, miền trị của dữ liệu và tập các phép toán tác động lên miền giá trị đó. Một ngôn ngữ lập trình chỉ chấp nhận và xử lí những dữ liệu tuân theo sự quy định về kiểu của ngôn ngữ lập trình đó. Trong một ngôn ngữ lập trình, một dữ liệu bao giờ cũng thuộc về một kiểu dữ liệu nhất định. Dữ liệu trong Turbo Pascal đ−ợc chia thành 2 loại chính: – Kiểu dữ liệu đơn giản (simple type). – Kiểu dữ liệu có cấu trúc (structure type). Tổng quan phân loại các kiểu dữ liệu trong Turbo pascal Kiểu logic (*) Kiểu số nguyên (*) Kiểu Chuẩn Kiểu số thực đơn Kiểu ký tự (*) giản Kiểu xâu ký tự Kiểu dữ Do ng−ời lập Kiểu đoạn con liệu trình định nghĩa Kiểu liệt kê (Data type) Kiểu mảng Kiểu Chú ý: Các kiểu có có Kiểu tập hợp dấu(*) gọi là kiểu vô h−ớng đếm đ−ợc Kiểu bản ghi cấu trúc hay có thứ tự Kiểu tập tin 2.2. Các kiểu dữ liệu đơn giản 2.2.1. Kiểu Logic (Boolean type) Dữ liệu kiểu logic chỉ có 2 giá trị True (đúng) và False (sai). Một giá trị Logic đ−ợc l−u trữ trong 1 byte. Quy −ớc : False < True Các phép toán tác động đ−ợc lên các đại l−ợng kiểu logic là : AND, OR, XOR, NOT. Kết quả của các phép toán này đ−ợc thể hiện qua bảng sau 15
  16. X Y X AND Y X OR Y X XOR Y NOT X FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE (X và Y là giá trị kiểu Boolean) Chẳng hạn, kết quả của các tính toán sau sẽ cho giá trị logic : Delta > 0 ; A 0 AND (A <>0). 2.2.2. Kiểu số nguyên (Integer type) a. Kiểu số nguyên Có 5 kiểu số nguyên mà từ khoá, phạm vi số và số byte cần thiết đ−ợc xác định bởi bảng sau: Từ khoá Phạm vi Yêu cầu bộ nhớ Shortint –128 đến 127 1 byte Integer –32768 đến 32767 2 byte Longint –2147483648 đến 2147483647 4 byte Byte 0 đến 255 1 byte Word 0 đến 65535 1 byte b. Các phép tính số học đối với số nguyên Đối với các đại l−ợng kiểu số nguyên chúng ta có thể sử dụng các phép tính sau : + (cộng), – (trừ), * (nhân), / (phép chia lấy kết quả là số thực read), DIV (phép chia lấy số nguyên) MOD (phép chia lấy số d− của hai số nguyên). Chú ý. 1. Khi viết các số nguyên phải tuân theo các quy định: – Không có khoảng trống giữa các số. – Dấu + hay – (nếu có) phải đặt ngay tr−ớc chữ số đầu tiên. – Không đ−ợc sử dụng dấu chấm thập phân. 16
  17. 2. Khi thực hiện các phép tính trên số nguyên, cần hết sức thận trọng xem phép toán đó có cho kết quả v−ợt quá phạm vi biểu diễn của số nguyên không. Ví dụ 1. Khai báo a, b là dữ liệu Integer. Khi đó 2 câu lệnh sau: a:=80; b:=(a*1245) div 200 cho kết quả sai vì a*1245=99600 v−ợt quá phạm vi của Integer. 2.2.3. Kiểu số thực (Real type) a. Kiểu số thực Kiểu só thực đ−ợc định nghĩa bằng một trong các từ khoá REAL, SINGLE, DOUBLE tuỳ theo yêu cầu về độ chính xác cần đến. Cụ thể chúng ta có bảng (xem trang sau) : Từ khoá Phạm vi Yêu cầu bộ nhớ Real 2.9ì1099 đến 1.7ì1038 6 byte Single 1.5E-45 3.4E+38 4 byte Double 5.0E-324 1.7E+308 8 byte Extended 1.9E-4951 1.1E+4932 10 byte b. Cách viết một số thực Các giá trị thực đ−ợc biểu diễn theo 2 cách : Cách 1. Số thực dấu phẩy tĩnh đ−ợc biểu diễn nh− một số thực thông th−ờng trong Toán học chỉ khác dấu chấm thay cho dấu phẩy trong cách viết của tiếng Việt Nam. Chẳng hạn: 25.3456789; 0.0000007; –2.12; +4.0. Cách 2. Số trong biểu diễn d−ới dạng dấu phẩy động đ−ợc tách thành 2 phần: phần định trị và phần mũ. – Phần định trị là một số nguyên hay số thực viết theo kí pháp tự nhiên. – Phần mũ là một số nguyên. – 2 phần cách nhau bởi chữ E hay e. 17
  18. Ví dụ 2. 123.456E-4 biểu diễn số 0.0123456 0.12E+5 biểu diễn số 12000.0 2E8 biểu diễn số 200000000.0 -52.4e2 biểu diễn số 5240.0 Phần định trị ↑ ↑Phần mũ c. Các phép toán số học đối với số thực + (cộng), – (trừ), * (nhân), / (chia) d. Các hàm số học dùng cho số nguyên và số thực Tên hàm Kiểu của Kiểu của ý nghĩa đối số kết quả Sqr Nguyên giống Sqr(x) = x2 Abs hay Thực đối số Abs(x)= ⎮x⎮ : trị tuyệt đối của x Sqrt, Sqrt(x)= x ; Sin(x), Cos(x) Nguyên Sin, Cos, Arctan(x), Ln(x) : tính giá trị hay Thực Arctan sin(x), cos(x), arctan(x), ln(x) Thực Ln, Exp Exp(x)=ex Trunc Nguyên Trunc(x) : cắt bỏ phần lẻ thập phân của x nếu có hay Nguyên Round(x) : cho số nguyên gần Round thực x nhất Succ Succ(n) = n + 1 Nguyên Nguyên Pred Pred(n) = n-1 Odd(n) cho kết quả true nếu n lẻ, Odd Nguyên Kí tự False nếu ng−ợc lại. 2.2.4. Kiểu kí tự (Charater type) a. Kiểu dữ liệu Các kiểu dữ liệu có dạng chữ viết (kí tự) đ−ợc khai báo bởi từ khoá Char. Một giá trị kiểu Char chiếm 1 byte và biểu diễn đ−ợc một kí tự thông qua bảng mã ASCII. Mã của 1 kí tự chính là số thứ tự của nó trong bảng mã. Có tất cả 256 giá trị có thể đ−ợc biểu diễn trong một byte (đánh số từ 0 đến 255) nên có thể mã hoá 256 giá trị kiểu Char. 18
  19. Trong bảng mã ASCII, các kí tự từ 0 đến 31 là các kí tự điều khiển không in ra đ−ợc và dùng để điều khiển quá trình vào ra trên các thiết bị ngoại vi. Chẳng hạn, khi máy nhận đ−ợc kí tự có mã là 7 (Bell) nó sẽ phát ra một tiếng chuông. Để biểu diễn một kí tự có thể dùng 1 trong 3 cách : – Đặt kí tự trong 2 dấu nháy đơn. – Dùng hàm Char (sẽ trình bày bài sau). – Dùng #n (trong đó n là mã của kí tự cần biểu diễn). Chẳng hạn, để biểu diễn kí tự A ta có thể viết: ‘A’, hoặc Char(65), hoặc #65. Sau đây là một phần của bảng mã ASCII Mã (số thứ tự) Kí tự 7 Bell 32 Space 43 + 48 0 49 1 65 A 66 B 97 a 98 b 134 ∑ b. Phép toán Chỉ có phép toán so sánh theo giá trị mã kí tự. Chẳng hạn, ‘A’< ‘a’ (vì mã ASCII của A là 65, còn của a là 97). c. Các hàm chuẩn liên quan đến kiểu kí tự – Hàm UPCASE(ch) cho ra kí tự hoa t−ơng ứng với kí tự ch. Chẳng hạn, Upcase(‘a’)=‘A’; Upcase(‘b’)=‘B’ – Hàm ORD(x) cho số thứ tự (mã ASCII) của kí tự x trong bảng mã. Chẳng hạn, ord( ‘A’ )=65, ord( ‘1’ )=49. – Hàm PRED(x) cho kí tự đứng tr−ớc kí tự x trong bảng mã ASCII. Chẳng hạn, Pred( ‘b’ )=‘a’. – Hàm SUCC(x) cho kí tự đứng sau kí tự x trong bảng mã ASCII. Chẳng hạn, Succ( ‘c’ )=‘d’. 2.2.5. Kiểu chuỗi kí tự (String type) Một giá trị kiểu String là một dãy kí tự bất kì. Số kí tự của dãy không quá 255. Chuỗi không có kí tự nào cả gọi là chuỗi rỗng. Hằng chuỗi kí tự đ−ợc đặt trong cặp nháy đơn. 19
  20. Ví dụ 3. Sau đây là các hằng chuỗi kí tự: ‘Họ và tên’ là một chuỗi gồm 9 kí tự “ là một chuỗi rỗng. Dữ liệu kiểu String sẽ đ−ợc trình bày chi tiết hơn ở các ch−ơng sau. Câu hỏi – Bài tập Ch−ơng 2 1. Kiểu dữ liệu là gì? 2. Trình bày các kiểu dữ liệu đơn giản của Turbo Pascal. 3. Trong Turbo Pascal có thể biểu diễn đ−ợc bao nhiêu kí tự khác nhau? 4. Khi cần tính các số có giá trị từ 0 đến 245 ta nên dùng dữ liệu kiểu gì? 5. Các giá trị sau thuộc kiểu dữ liệu đơn giản chuẩn nào? a) 15.0 b) 1996 c) ‘I ’ d) Sqrt(4) e) Int(12.5) f) 4>= 5 g) –1e10 h) 15/6 6. Nếu sử dụng 3 byte để l−u trữ một số nguyên không âm thì giá trị của số nằm trong khoảng nào? 7. Bạn hãy giải thích tại sao để l−u trữ số thực trong Pascal lại có đến 4 kiểu dữ liệu : Real, Single, Double, Extended? 8. Trong tr−ờng hợp nào thì cần sử dụng dạng số thực dấu phẩy động? 9. Trong các phép toán d−ới đây phép nào có thể thực hiện đ−ợc trong Turbo Pascal và là kết quả của phép toán thuộc kiểu dữ liệu nào? Trong tr−ờng hợp không thực hiện đ−ợc hãy giải thích tại sao? a) 14/10 + ord( ‘a’ ) b) sin(0.5) + 12 c) abs(a) + 25.7 d) odd(12) + ord(12) 20
  21. Ch−ơng 3 Hằng, biến, kiểu, biểu thức, câu lệnh, lệnh gán 3.1. Định nghĩa hằng 3.1.1. Khái niệm về hằng (constant) Hằng là đại l−ợng có giá trị không thay đổi trong suốt quá trình thực hiện ch−ơng trình. Hằng có thể xuất hiện trong ch−ơng trình bằng giá trị cụ thể hoặc bằng tên hằng đ−ợc định nghĩa tr−ớc ở phần khai báo hằng. Chẳng hạn, ta có thể sử dụng số Pi là 3.1416 trong ch−ơng trình hoặc dùng tên hằng là Pi với điều kiện giá trị của Pi đ−ợc định nghĩa trong phần khai báo hằng. 3.1.2. Cách khai báo hằng Hằng đ−ợc khai báo bằng từ khoá CONST. Hình thức khai báo nh− sau: CONST = ; trong đó là một tên còn có thể là một hằng hoặc một biểu thức mà các toán hạng đều là hằng. Chú ý. Nhiều khai báo hằng có thể dùng chung một từ khoá CONST. Ví dụ 1. Sau đây là các định nghĩa hằng: Const max=150; {hằng nguyên} i=false; {hằng logic} a=(5*7)/4; {hằng thực} ch=‘Y’; {hằng kí tự} Ho=‘Le van’; {hằng chuỗi} Chúng ta sử dụng các tên hằng để ch−ơng trình rõ ràng và dễ sửa đổi. 21
  22. 3.2. Biến và khai báo biến 3.2.1. Khái niệm về biến (variable) Biến là đại l−ợng mà giá trị của nó có thể thay đổi trong quá trình thực hiện ch−ơng trình. Chẳng hạn, biến nguyên X lúc đầu đ−ợc gán giá trị 1 (X:=1) sau quá trình tính toán nếu gặp lệnh X:=X+1 thì giá trị cũ đ−ợc thay bằng giá trị mới (X=2). Mỗi biến phải thuộc về một kiểu dữ liệu nhất định cần đ−ợc khai báo tr−ớc trong phần khai báo biến. Ch−ơng trình dịch sẽ báo lỗi mỗi khi gặp một biến nào đó ch−a đ−ợc khai báo. Khai báo biến là báo cho ch−ơng trình dịch biết đ−ợc kiểu dữ liệu của biến, tức là, số byte cần thiết để l−u trữ một phần tử dữ liệu, cách mã hoá dữ liệu. 3.2.2. Cách khai báo biến Biến đ−ợc khai báo bằng từ khoá VAR. Hình thức khái báo nh− sau: VAR : ; trong đó là một dãy tên biến đ−ợc đặt cách nhau bởi dấu phẩy, là tên hoặc là định nghĩa của một kiểu dữ liệu nào đó. Chú ý. Nhiều khai báo biến có thể dùng chung một từ khoá Var. Ví dụ 2. Sau đây là các chỉ thị khai báo biến VAR x,y,z: Real; chon: Char; thoat: Boolean; i, j: Integer; ten: String[7]; 3.3. Định nghĩa kiểu dữ liệu Ngoài các kiểu dữ liệu đ−ợc định nghĩa tr−ớc nh−: Real, Integer, Byte, Char, Boolean Turbo Pascal còn cho phép ta định nghĩa các kiểu dữ liệu khác từ các kiểu căn bản theo quy tắc xây dựng của Turbo Pascal. Kiểu dữ liệu mới đ−ợc định nghĩa bởi từ khoá TYPE. Dạng định nghĩa này nh− sau: TYPE = ; 22
  23. trong đó là một tên còn là một trong những hình thức mô tả kiểu mới. Sau khi kiểu mới đã đ−ợc định nghĩa ta có thể khai báo các biến thuộc kiểu dữ liệu mới này. Chú ý. Nhiều khai báo kiểu dữ liệu có thể đặt chung trong một từ khoá TYPE. Ví dụ 3. Sau đây là một số định nghĩa kiểu dữ liệu: TYPE songuyen = Integer; tuoi_tho=1 100 color =(red, blue, green, white); Với những định nghĩa kiểu trên ta có quyền sử dụng để khai báo: VAR i, j: songuyen; tuoi_tho; mau: color; 3.4. Biểu thức 3.4.1. Định nghĩa Một biểu thức là một công thức tính toán bao gồm một dãy các hằng, hàm, biến, đ−ợc nối với nhau bằng dấu các phép toán và có thể đ−a vào các cặp ngoặc đơn để xác định thêm thứ tự thực hiện các phép toán. Kiểu của biểu thức là kiểu của kết quả sau khi tính biểu thức. Ví dụ 4. Với các khai báo: CONST Max=20 VAR x: Integer; A, B, C: Boolean; ta có thể viết một số biểu thức nh− sau: 5 + max*Exp(x), (A AND B) OR C. Chú ý. Một biến, một hằng, một hàm, một biểu thức đặt trong cặp ngoặc đơn cũng đ−ợc xem là các biểu thức, đó là biểu thức đơn giản. 3.4.2. Thứ tự −u tiên Khi tính giá trị của một biểu thức, Turbo Pascal quy định thứ tự −u tiên của các phép toán từ cao đến thấp nh− sau: 1. Lời gọi hàm 2. Not và - (phép trừ một ngôi) 3. * / DIV MOD AND 4. + - OR XOR 5. = = IN 23
  24. Khi tính một biểu thức có 3 quy tắc thứ tự −u tiên nh− sau: Quy tắc 1. Các phép toán nào có −u tiên cao hơn sẽ đ−ợc tính tr−ớc. Quy tắc 2. Trong các phép toán có cùng thứ tự −u tiên thì sự tính toán sẽ đ−ợc thực hiện từ trái sang phải. Quy tắc 3. Phần trong ngoặc từ trong ra ngoài đ−ợc tính toán để trở thành một giá trị đơn. Ví dụ 5. Sau đây là các biểu thức đúng và định giá kết quả của chúng. 3+5*3 là biểu thức số học cho kết quả là 18, (3+5)*3 là biểu thức số học cho kết quả là 24, 5/2*3 là biểu thức số học cho kết quả là 7.5 (5+2>4)and not(true or(5–3=8)) là biểu thức logic, cho kết quả false. 3.5. Câu lệnh (Statement) Trong một ch−ơng trình Turbo Pascal, sau phần khai báo dữ liệu là phần lệnh của ch−ơng trình. Phần này xác định các công việc mà ch−ơng trình phải thực hiện để xử lí các dữ liệu đã đ−ợc khai báo. Câu lệnh đ−ợc chia ra làm hai loại: câu lệnh đơn giản và câu lệnh có cấu trúc. Sơ đồ quan trọng phân loại các câu lệnh trong Turbo Pascal Phép gán (:=) Lệnh Lệnh nhập dữ liệu (Read; Readln) đơn Lệnh xuất dữ liệu (Write; Writeln) giản Câu Lời gọi ch−ơng trình con lệnh Xử lí tập tin (Reset; Rewrite; Assign ) Lệnh Lệnh ghép (Begin End) có cấu Lệnh lựa chọn (If ;Case ) trúc Lệnh lặp (For ;Repeat) Các câu lệnh phải đ−ợc ngăn cách nhau bởi dấu chấm phẩy (;) và không bắt buộc phải viết mỗi câu lệnh trên một dòng. Vấn đề là chúng ta phải trình bày ch−ơng trình sao cho đẹp, rõ ràng, thể hiện đ−ợc thuật toán. 3.6 Lệnh gán (Assignment statement) Lệnh gán dùng để gán giá trị của một biểu thức cho một biến đã khai báo. Cách viết: := là một tên chỉ một tên biến đơn, biến có chỉ số (phần tử của mảng) hoặc một tên hàm, còn là một biểu thức nh− đã định nghĩa ở mục 3.4. 24
  25. Sự thực hiện: Đầu tiên máy tính trị của vế phải, sau đó nó gán giá trị tính đ−ợc cho ở vế trái. Chú ý. Kiểu của biểu thức phải phù hợp với kiểu của biến, trừ tr−ờng hợp một biến thực có thể nhận giá trị nguyên. Ví dụ 6. Sau khi đã khai báo: Var c1, c2 : Char; i, j : Integer; x, y : Real; thì có thể thực hiện các phép toán sau: c1 :=‘B’; c2:=chr(7); i:=(23+6)*2 mod 3; j:= Round(20/3); x:=0.5; y:=i; Câu hỏi – Bài tập Ch−ơng 3 1. Hằng, biến là gì? Viết các khai báo hằng và biến sau: a) hằng số c=100. b) x, y là các biến thực. c) i là biến nhận các giá trị nguyên trong khoảng từ 32768 đến 32767. d) kt, traloi là các biến kí tự. e) Hoten là biến chuỗi kí tự. 2. Biểu thức là gì? Hãy trình bày thứ tự −u tiên của các phép toán trong Turbo Pascal. Nếu trong một biểu thức có các phép toán cùng một thứ tự −u tiên thì phép tính nào đ−ợc thực hiện tr−ớc. 3. Hãy viết các biểu thức sau ra Turbo Pascal: a) x + y; x – y/2. b) (a + 2)(2x2 – 5x + 6); 9a(a – 1). c) 2sin(x) – cos2(x). d) x3 – log(x2 + 2) – ex . 4. Viết các biểu thức quan hệ và logic sau theo Turbo Pascal: a) a < x < b. b) b2 – 4ac. c) y < a – c hoặc y < c + b. d) D=0 và D1≠0. 25
  26. 5. Chuyển các biểu thức viết theo Turbo Pascal sau đây thành các biểu thức toán học thông th−ờng: a) Exp(x*ln(y)) b) Sqrt(a + Sqrt(Sqrt(b)+Sqrt(c))). 6. Có bao nhiêu loại câu lệnh trong Turbo Pascal? Phép gán là loại câu lệnh nào và dùng để làm gì? 7. Hãy xem các giá trị sau đây có thể gán cho các biến nào? a) 12.45 b) –5 c) 1e–5 d) 65532 e) ‘1996’ f) ‘&’ g) Sqrt(4) h) Sqrt(15) i) 32770 k) ‘CINTA’ 8. Hãy xác định giá trị của các biến sau khi thực hiện các phép gán sau: a) alpha:=round(12.45)+ord(‘a’); b) chuvi:=2.*3.1416; c) Logic:=(12>13) and (13<15); d) Beta2:=(13 mod4) +(13 div 4); 26
  27. Ch−ơng 4 Xuất nhập dữ liệu 4.1. Xuất dữ liệu 4.1.1. Xuất dữ liệu ra màn hình Các thủ tục xuất dữ liệu cho phép ch−ơng trình xuất lên màn hình hoặc máy in các dữ liệu, kết quả hay các thông báo cần thiết. Thông th−ờng màn hình của máy vi tính đ−ợc chia thành 25 dòng, mỗi dòng viết đ−ợc 80 kí tự. Khi hoạt động, trên màn hình có một vệt sáng nhấp nháy gọi là con trỏ (cursor). Trong Turbo Pascal để xuất dữ liệu ra màn hình, ta dùng thủ tục Write, Writeln. • Cú pháp: WRITE( , , ); (1) WRITELN( , , ); (2) WRITELN; (3) trong đó là một biểu thức đ−ợc định nghĩa nh− trong mục 3.4. • Tác dụng: Dạng 1: Đ−a ra màn hình giá trị các (i=1,2, n) bắt đầu từ vị trí hiện hành của cursor theo thứ tự viết trong biểu thức, và sau câu lệnh này cursor ở vị trí ngay sau kí hiệu cuối cùng của giá trị của . Dạng 2: Đ−a ra màn hình giá trị các (i=1,2, ,n) bắt đầu từ vị trí hiện hành của cursor theo thứ tự viết trong biểu thức và sau đó cursor về đầu dòng mới. Dạng 3: Chỉ có tác dụng đ−a cursor về đầu dòng mới Ví dụ 1. Sau khi chạy ch−ơng trình: Program VIDU; Uses Crt; Var a, b: Byte; Begin ClrScr; a:=2; b:=4; Write(‘Day la ket qua cua phep nhan a voi b: ’, a*b); Writeln(‘ * * *’); 27
  28. Write(‘ ’); End. Kết quả đ−ợc trình bày trên màn hình nh− sau: Day la ket qua cua phep nhan a voi b: 8 * * * Mỗi biểu thức trong chỉ thị WRITE (WRITELN) có thể kèm thêm 1 hoặc 2 số tự nhiên, có dấu hai chấm (:) ở tr−ớc để chỉ quy cách in ra của kết quả. Số đứng tr−ớc chỉ số vị trí dành cho giá trị cần in ra, số đứng sau chỉ số vị trí cần có sau dấu chấm thập phân. Ví dụ 2. Với ch−ơng trình Program VIDU2; Uses Crt; Var i: Integer; r: Real; ch: Char; b: Boolean; Begin ClrScr; i := 123; r := 123.456; ch := ‘D’; b := 2 < 5; Writeln(i); Writeln(r); Writeln(3.14); Writeln(20*2.5); Writeln; Writeln(ch); Writeln(b); Writeln(‘20’,#248); {in ra 20} Writeln(#7); End. 28
  29. Kết quả trên màn hình sau khi thực hiện sẽ là: 123 {Số nguyên đ−ợc viết ra với số chỗ đúng bằng số chữ số gắn vào, kể từ vị trí bên phải} 1.2345600000E+02 {Số thực đ−ợc viết ra với trình tự sau: 1 dấu cách, một số phần nguyên, dấu chấm, 10 chỗ phần thập 3.1400000000E+00 phân, chữ E, dấu của phần mũ, 2 số biểu diễn giá trị phần mũ} 5.0000000000E+01 D {Các kí tự in bình th−ờng, 1 kí tự chiếm 1 vị trí} TRUE {Kiểu Boolean đ−ợc viết ra chữ TRUE hay FALSE} 20 Vậy cách viết không quy tắc sẽ căn lề theo bên trái. Ví dụ 3. Với ch−ơng trình Program VIDU3; Uses Crt; Var i: Integer; r: Real; ch: Char; b: Boolean; Begin Clrscr; i:= 123; r = 123.456; ch :=”D”; b:=2<5; Writeln(i:8); Writeln(–23564:8); Writeln(r:12:6); Writeln(35.123456789:12:6); Writeln(r:12); Writeln(ch:4); Writeln(‘ABC’:5); Writeln(b:7); End. 29
  30. Kết quả trên màn hình sau khi chạy ch−ơng trình là: 123 –23564 123.456000 35.123456 1.23456E+02 D ABC TRUE Vậy cách viết quy cách sẽ căn lề theo bên phải. 4.1.2. Xuất dữ liệu ra máy in Để xuất dữ liệu ra máy in ta dùng các lệnh WRITE, WRITELN với tham số LST đ−ợc vào tr−ớc danh sách các tham số. Vì tham số LST đ−ợc khai báo trong Unit PRINTER cho nên cần khai báo Unit này ở đầu ch−ơng trình sau từ khoá USES. Ví dụ 4. Sau khi thực hiện ch−ơng trình: Program VIDU4; Uses Printer; Begin Writeln(lst,’X:=’,12,’Y:=’,3.55:3:1); End. Kết quả sẽ in ra giấy nội dung sau : X:=12 Y:=3.6 4.1.3. Một số hàm, thủ tục trình bày màn hình trong Turbo Pascal – Thủ tục GOTOXY(X,Y) có tác dụng di chuyển con trỏ đến vị trí dòng Y cột X. – Thủ tục CLRSCR có tác dụng xoá toàn bộ màn hình và đ−a con trỏ về vị trí dòng 1 và cột 1 của màn hình. – Thủ tục CLREOL có tác dụng xoá các kí tự từ vị trí con trỏ đến hết dòng. Sau khi thực hiện xong con trỏ đứng ngay vị trí tr−ớc khi thực hiện thủ tục. – Thủ tục DELLINE có tác dụng xoá dòng con trỏ đang đứng và dịch các dòng d−ới lên một dòng. – Thủ tục Window (x1, y1, x2, y2) thiết lập một cửa sổ hoạt động giới hạn từ điểm (x1, y1) đến (x2, y2). Các toạ độ phải tính lại theo quy tắc: 30
  31. Hoành độ mới = Hoành độ cũ –x1 + 1. Tung độ mới = Tung độ cũ –y1 + 1. Chẳng hạn, nếu muốn di chuyển con trỏ đến dòng số 8 cột 10 trên màn hình sau khi thực hiện lệnh Window (5, 7, 15, 75) ; ta phải viết Gotoxy (6, 2); – Hàm WHEREX đ−a ra giá trị có kiểu byte cho biết con trỏ đang ở cột nào. – Hàm WHEREY đ−a giá trị có kiểu byte cho biết con trỏ đang ở dòng nào. Chú ý. Muốn sử dụng các hàm và thủ tục trên phải khai báo: USES CRT; Ví dụ 5. Sau khi thực hiện ch−ơng trình: Program VIDU5; Uses Crt; Var x, y:byte; Begin Clrscr; x: = 20; y: = 3; Gotoxy(x+2,y); Write(‘PASCAL’); Gotoxy(x-2,y+2); Write(‘BAN HAY DEN VOI’); Gotoxy(x,y+3); Write(‘TURBO PASCAL’); Gotoxy(Where x+2, Where y); Write(‘7.0’); Window(60,2,75,4); Writeln(‘BM TIN HOC’); Writeln(‘ ’); End. Kết quả đ−ợc cho trên màn hình nh− sau: 18 22 60 1 2 BM TIN HOC 3 PASCAL 4 5 BAN HAY DEN VOI TURBO PASCAL7.0 4.2. Nhập dữ liệu từ bàn phím 31
  32. Trong Turbo Pascal để đ−a dữ liệu từ bàn phím vào các biến ta dùng thủ tục READ hoặc READLN. Cú pháp: READ( , , , ); (1) READLN( , , , (I=1,2, ,n) là tên của biến cần đ−ợc nhập dữ liệu từ bên ngoài. Dạng (1) và dạng (2) dùng để nhập n giá trị từ bàn phím và gán cho các , , . Các giá trị gõ từ bàn phím có thể là số nguyên, số thực hoặc dãy kí tự. Khi gõ phím cần theo đúng quy tắc sau: – Sau khi đ−a vào mỗi một giá trị cần phải gõ thêm ít nhất một dấu cách hoặc Enter tr−ớc khi đ−a giá trị tiếp theo. – Sau khi đ−a vào giá trị cuối cùng phải gõ thêm phím Enter. Tác động của lệnh: Khi gặp câu lệnh trên, máy sẽ dừng để đợi nhập số liệu từ bàn phím. Khi đã nhập đủ n giá trị và gõ thêm Enter thì các giá trị này sẽ gán lần l−ợt cho , , , . Sau đó máy tiếp tục thực hiện câu lệnh tiếp theo nếu có. Dạng (3) dùng để tạm dừng ch−ơng trình, muốn chạy tiếp thì gõ Enter. Chú ý. – Các biến ở đây thuộc kiểu nguyên, thực, kí tự hay chuỗi. Do đó chỉ có thể nhập từ bàn phím các giá trị số và kí tự. – Dữ liệu gõ vào từ bàn phím phải t−ơng ứng về kiểu dữ liệu với các , , , . – Dạng (1) và dạng (2) có khác nhau chút ít tuỳ theo từng phiên bản của Turbo Pascal. Đọc giả cần thử lại trên màn hình để xác định thêm sự sai khác đó. Ví dụ 6. Với a, b là 2 biến nguyên, x là biến thực, xét đoạn ch−ơng trình: Readln(a,b); Readln(x); Nếu gõ các phím : 2 24 65 14 , thì a nhận giá trị 2, b nhận giá trị 24 và các kí tự còn lại bị bỏ qua và không đ−ợc xét trong thủ tục Readln(x) tiếp theo. Nh− vậy máy dừng lại ở câu lệnh Readln(x) để đợi nhập số liệu. Với mô tả biến: Var s1, s2, s3: String[5]; Xét câu lệnh: Readln(s1, s2, s3); – Nếu gõ : , thì cả 3 biến s1, s2, s3 đều là chuỗi rỗng. – Nếu gõ ABCDE1234567 , thì s1= ’ABCDE’, s2=’12345’, s3=’67’ 32
  33. Ví dụ 7. Ch−ơng trình sau tính diện tích S của hình thang với đáy dài a, đáy ngắn b, chiều cao h nhập từ bàn phím. Program Dien_Tich_Hinh_Thang; Uses Crt; Var a, b, h, S:real; Begin Clrscr; Write(‘Nhập giá trị của a,b,h:’); Readln(a, b, h); S:=(a+b)*h/2; Write(‘Diện tích S=’ ,S:1:5); Readln End. Màn hình khi chạy ch−ơng trình : ít nhất 1 dấu cách ↓ ↓ Nhập giá trị của a, b, h: 5 3 4 Diện tích S=16.00000 Ta có thể nhập a,b,h bằng các lệnh sau: Readln(a) ; Readln(b) ; Readln(h); Ví dụ 8. Tính điểm trung bình cộng kết quả kiểm tra 3 học phần của lớp Tin học căn bản, trong đó: DOS hệ số 2, WINDOWS hệ số 1 và ngôn ngữ lập trình PASCAL hệ số 3. Thuật giải : – Nhập điểm môn DOS, WINDOWS, PASCAL lần l−ợt vào 3 biến DOS, WIN, PAS. – Nhập điểm trung bình vào biến TB. – Xuất nội dung biến TB. Văn bản ch−ơng trình : Program Tinh_Diem; Uses Crt; Var DOS,WIN,PAS:Byte; TB: Real; Begin Clrscr; Write(‘Diem mon DOS : ’); Readln(DOS); 33
  34. Write(‘Diem mon WINDOWS : ’); Readln(WIN); Write(‘Diem mon PAS: ’); Readln(PAS); TB:=(DOS*2+WIN+PAS*3)/6; Writeln(‘Trung bình cộng 3 môn : ‘,TB:1:1); Readln End. Câu hỏi – Bài tập ch−ơng 4 1. Giải thích sự khác nhau giữa hai lệnh sau : write(15+20); và write(‘15+20’); 2. Ch−ơng trình sau cho kết quả gì? Begin Writeln(false>true:6); Writeln(‘1’>’2’); End. 3. Cho biết kết quả và kiểu dữ liệu của các biểu thức sau: a) 3+5.0. b) 6/3+2 div 3. c) (10*((45mod3)+12))/6. d) (5 0, a≠1, x>0). 5. Cho a, b, c là độ dài các cạnh của một tam giác đ−ợc nhập từ bàn phím. Tính chu vi, diện tích, độ dài 3 đ−ờng cao, độ dài đ−ờng trung tuyến, các bán kính đ−ờng tròn ngoại tiếp và nội tiếp của tam giác. 6. Viết ch−ơng trình tính diện tích mặt cầu và thể tích của hình cầu, Biết bán kính H nhập vào từ bàn phím. 7. Viết ch−ơng trình in ra giá trị các hàm l−ợng giác của một góc từ 0 đến 360 độ đ−ợc nhập vào từ bàn phím (góc có số đo theo số độ, số phút, số giây). 8. Viết ch−ơng trình tính tổng các chữ số của 1 số có 2 chữ số. 9. Viết ch−ơng trình tính tổng các chữ số của 1 số có 3 chữ số. 34
  35. 10. Viết ch−ơng trình nhập vào tên, đơn giá, số l−ợng của 2 mặt hàng và in ra hoá đơn tính tiền theo mẫu sau: HOA DON BAN HANG STT Ten mat hang So luong Don gia Thanh tien Tong cong : Hue, ngay thang nam Nguoi lap phieu Nguoi nhan 11. Bài toán vay trả góp. Một khách hàng đến ngân hàng vay một số tiền A và muốn đ−ợc trả món nợ trên trong thời gian Y năm. Mỗi năm trả N lần. Biết rằng lãi suất mỗi năm là Rate. Viết ch−ơng trình cho biết mỗi lần khách hàng trên phải trả bao nhiêu tiền. Trong đó A, Rate, N và Y nhập vào từ bàn phím H−ớng dẫn : Đặt R=Rate/N. Số tiền khách hàng phải trả cho ngân hàng mỗi kì là: A.R P= 1-(1 + R)NY 35
  36. Ch−ơng 5 Lệnh có cấu trúc 5.1. Câu lệnh ghép (Compound Statement) Lệnh ghép là một dãy câu lệnh đơn hoặc lệnh ghép khác đ−ợc đặt giữa hai từ khoá BEGIN và END. Lệnh ghép đ−ợc thực hiện bằng cách thực hiện tuần tự các câu lệnh nằm giữa BEGIN và END. Dạng tổng quát : BEGIN ; ; ; END trong đó (i=1,2, ,n) là các lệnh thực hiện – có thể là lệnh đơn và cũng có thể là một lệnh ghép khác. Ví dụ 1. Sau đây là một lệnh ghép Begin t:= x; x:= y; y:= t; End; Câu lệnh ghép này trao đổi giá trị hai biến x và y, dùng biến t nh− một chỗ cất trung gian. 5.2. Câu lệnh lựa chọn 5.2.1 Câu lệnh IF (Rẽ nhánh theo điều kiện) Có hai dạng. a. Dạng 1. IF THEN ELSE ; trong đó là biểu thức mà giá trị của nó thuộc kiểu Boolean, còn , là các lệnh tuỳ ý có thể là đơn hoặc ghép. 36
  37. Tác dụng của lệnh : Khi gặp lệnh này tuỳ theo kết quả của mà máy có thể thực hiện hoặc . Nếu có giá trị True thì máy thực hiện , nếu không thì máy thực hiện . Ví dụ 2. Ch−ơng trình sau đây thực hiện việc đọc vào một giá trị x và cho in ra kết quả của hàm : ⎧x+1 nếu x THEN ; trong đó là biểu thức mà giá trị của nó thuộc kiểu Boolean, còn là lệnh tuỳ ý có thể là đơn hoặc ghép. Khi gặp lệnh này nếu có giá trị True thì đ−ợc thực hiện nếu không thì câu lệnh này đ−ợc bỏ qua để thực hiện lệnh tiếp theo. Ví dụ 3. Ch−ơng trình sau đây nhập vào 3 số thực và cho in ra giá trị lớn nhất giữa chúng. Program max3; Var a,b,c:Real; Begin Writeln(‘ ’); Write(‘nhap vao 3 so :’); Readln(a,b,c); max:=a; if max < b then max:= b; if max < c then max:=c; Writeln(‘so lon nhat là :’ , max); 37
  38. Readln End. Chú ý . Trong câu lệnh if này có thể chứa câu lệnh if khác. Phát biểu if then if then else t−ơng đ−ơng với phát biểu sau : if then begin if then else end; Có nghĩa là else thuộc về câu lệnh if gần nó nhất. Ví dụ 4. Ch−ơng trình sau đây thực hiện việc giải ph−ơng trình bậc nhất dạng ax + b = 0. Program Pt_dang_bac_1; Uses Crt; Var a,b: Real; Begin Clrscr; Writeln(‘Giai phuong trinh dang : ax + b = 0’); Writeln(‘ ’); Write(‘cho biet gia tri cac he so a, b:’) Readln(a,b); If a <> 0 then Writeln(‘pt co nghiem duy nhat : x = ‘,(–b/a):8:2); else if b = 0 then Writeln(‘moi gia tri cua x deu la nghiem’); else write(‘ptrinh vo nghiem’); Readln End. Ví dụ 5. Tính tiền thực lĩnh cho một nhân viên trong xí nghiệp theo công thức: (L−ơng chính ì Số ngày công) Thực lĩnh = + (Phụ cấp) – (Tạm ứng) 26 Với quy định : – Nghỉ quá 5 ngày sẽ bị trừ 20% tổng thực lĩnh. – Làm thêm quá 3 ngày đ−ợc tăng 10% tổng thực lĩnh. Giải thuật : 38
  39. – Nhập thông tin về l−ơng chính, ngày công, phụ cấp, tạm ứng vào các biến LC, NC, PC, TU. – Tính thực lĩnh vào biến TL theo công thức: TL = (LC * NC)/26 + PC – TU. + Nếu NC 29 thì TL:= TL *1.1 Văn bản ch−ơng trình: Program Luong; Uses Crt; Var NC:Byte; PC,LC,TU,TL: Real; Begin Clrscr; Write(‘luong chinh : ‘); Readln(LC); Write(‘ngay cong : ‘); Readln(NC); Write(‘phu cap : ‘); Readln(PC); Write(‘tam ung : ‘); readln(TU); Writeln(‘ ’); TL:= (LC*NC)/26 + PC – TU If NC 29 then TL:=TL* 1.1; Writeln(‘tien thuc linh : ”, TL:10:2); Readln; End. 5.2.2. Câu lệnh CASE (Rẽ nhánh theo giá trị) Câu lệnh IF ở trên chỉ rẽ theo một trong hai nhánh t−ơng ứng với giá trị của biểu thức logic. Còn câu lệnh CASE sau đây cho phép lựa chọn để thực hiện một trong nhiều công việc. 39
  40. a. Dạng câu lệnh Dạng 1 Dạng 2 CASE OF CASE OF : ; : ; : ; : ; : ; : ; ELSE END; END; trong đó là một biểu thức mà giá trị của nó thuộc kiểu dữ liệu vô h−ớng đếm đ−ợc (i=1,2, , n) là một tập hữu hạn các hằng có cùng kiểu với kiểu của . Sự thực hiện của lệnh CASE OF phụ thuộc vào giá trị của . Nếu là một tập đầu tiên chứa giá trị trùng với giá trị của thì máy thực hiện , sau đó thoát khỏi CASE OF. Trong tr−ờng hợp không có nào chứa giá trị của thì : – Nếu ở dạng 2 (không có ELSE) thì máy thoát ngay ra khỏi lệnh CASE OF. – Nếu ở dạng 1 (có ELSE) thì máy thực hiện rồi mới thoát khỏi CASE OF. Ví dụ 6. Ch−ơng trình sau đây thực hiện việc nhập vào 1 điểm kiểm tra từ bàn phím và xuất kết quả xếp loại ra màn hình theo quy định: – Các điểm <5 : Xếp loại yếu. – Các điểm 5,6 : Xếp loại trung bình. – Các điểm 7,8 : Xếp loại khá – Các điểm 9,10 : Xếp loại giỏi Văn bản ch−ơng trình: Program Xep_Loai; Uses Crt; Var Diem:Byte; Begin Clrscr; Write(‘Cho biet diem : ‘); Readln(Diem); Case Diem Of 0,1,2,3,4 : Writeln(‘Xep loai yeu’); 40
  41. 5,6 : Writeln(‘Xep loai trung binh’); 7,8 : Writeln(‘Xep loai kha’); 9,10 : Writeln(‘Xep loai gioi’); Else Writeln(‘Diem Nhap Vao Sai’); End; End. Ví dụ 7. Viết ch−ơng trình cho biết số ngày của một tháng. Program So_Ngay_Cua_Thang; Uses Crt; Var So_Ngay,Thang:Byte; Nam:Integer; Begin Clrscr; Write(‘Dua vao thang (dang so) ‘); Readln(Thang); Case Thang Of 4,6,9,11 : So_Ngay:=30 2 : Begin Write(‘Cho biet nam:’); Readln(Nam); If Nam Mod 4=0 then So_ngay:=29 else So_Ngay:=28; End; Else So_Ngay:=31 ; End; (Case) Writeln(‘ ‘); Write(‘Thang’,Thang,’nam’,Nam,’co’,So_Ngay,’ngay’) Readln End. 5.3. Câu lệnh lặp Chúng ta th−ờng gặp nhiều tr−ờng hợp cần phải thực hiện một công việc lặp đi lặp lại theo một quy luật nào đó. Số lần lặp có thể đã đ−ợc xác định ngay hoặc ch−a xác định. Trong Pascal có ba câu lệnh lặp là FOR, REPEAT và WHILE. 41
  42. FOR : là vòng lặp có số b−ớc lặp xác định. REPEAT, WHILE : vòng lặp có số lần lặp không xác định. 5.3.1. Câu lệnh FOR Có hai dạng lệnh : * Dạng 1 : FOR := TO DO ; * Dạng 2 : FOR := DOWNTO DO ; trong đó là tên biến thuộc loại vô h−ớng đếm đ−ợc, gọi là biến điều khiển. , là các biểu thức cùng kiểu giá trị với . * Sự hoạt động của FOR dạng 1 theo các b−ớc sau : 1. Đầu tiên nhận giá trị là . 2. Máy kiểm tra điều kiện ≤ ? 3. Nếu điều kiện trên là sai thì máy ra khỏi vòng lặp FOR để thực hiện lệnh ngay sau lệnh FOR. Nếu điều kiện trên là đúng thì thực hiện sau đó biến đ−ợc tăng một giá trị ( =Succ( )) và trở lại b−ớc 2. * Sự hoạt động của FOR dạng 2 theo các b−ớc sau: 1. Đầu tiên lấy giá trị là . 2. Máy kiểm tra điều kiện ≥ ? 3. Nếu điều kiện trên là sai thì máy ra khỏi vòng lặp FOR để thực hiện lệnh ngay sau lệnh FOR. Nếu điều kiện trên là đúng thì thực hiện sau đó biến đ−ợc giảm một giá trị ( =Pred( )) và trở lại b−ớc 2. Chú ý. Khi dùng câu lệnh FOR – Không đ−ợc thay đổi trị của biến điều khiển bằng một lệnh trong vòng lặp vì ta sẽ không còn chủ động kiểm soát đ−ợc biến điều khiển. – Giá trị của biến điều khiển là không xác định khi thoát khỏi vòng lặp. – Các vòng FOR có thể lồng nhau và nói chung sau từ khoá DO có thể là một câu lệnh bất kì (có thể đơn hoặc ghép). Ví dụ 8. Ch−ơng trình sau viết ra trên màn hình 20 lần dòng chữ: ‘World Cup 98’ Uses Crt; Var I:Byte; 42
  43. Begin Clrscr; For I:=1 To 20 Do Writeln(‘World Cup 98’); Readln; End. Ví dụ 9. Viết ch−ơng trình xuất lên màn hình 256 kí tự của bảng mã ASCII. Program Ascii; Use Crt; Var I:Byte; Begin Clrscr; For I:=0 To 255 Do Begin Writeln(I:3,’-’,Chr(I)); If (I+1) Mod 22=0 then Begin Write(‘Nhan de tiep tuc ’) Readln; Clrscr; End; End; Readln End. Ví dụ 10. Viết ch−ơng trình kiểm tra công thức sau : 1 + 2 + 3 + + N = N(N+1)/2. Program Tong; Uses Crt; Var I, N: Integer; S1, S2:Word; Begin Clrscr; Write(‘nhap so N : ’); Readln(N); Writeln; 43
  44. S1:=N*(N+1) Div 2; S2:=0; For I:=1 To N Do S2:=S2+I; Writeln(‘Tinh bang chuoi s=’, s2); Writeln(‘Tinh bang chuoi s=’, s1); End. Ví dụ 11. Viết ch−ơng trình nhập chiều dài, chiều rộng của hình chữ nhật và in hình chữ nhật đó ra màn hình bằng các dấu * có dạng nh− sau: * * * * * * * * * * * * Program KHUNG_HCN; Uses crt; Const c= ‘*’; Var i,dai,rong:byte; Begin Clrscr; Write(‘nhap chieu dai:’); Readln(dai); Write(‘nhap chieu rong:’); readln(rong); Clrscr; For i:=1 To dai Do write(c:3); Writeln; For i:=1 To rong –2 Do Writeln(c:3,c:(dai-1)) For i:=1 To dai Do Write(c:3); Readln; End. 5.3.2. Câu lệnh REPEAT Lệnh lặp repeat dùng để lặp đi lặp lại một công việc cho đến khi một điều kiện đã cho đ−ợc thoả mãn. Dạng lệnh tổng quát. REPEAT 44
  45. ; ; ; UNTIL ; trong đó là biểu thức mà giá trị của nó thuộc kiểu Boolean còn (i=1,2, ,n) là một câu lệnh thực hiện của Pascal (có thể lệnh đơn hoặc lệnh ghép). Khi gặp lệnh này máy thực hiện dãy các lệnh , , , sau đó kiểm tra biểu thức . Nếu có giá trị False thì lặp lại thực hiện dãy lệnh trên. Nếu có giá trị True thì kết thúc thực hiện lệnh này để thực hiện lệnh tiếp theo. Ví dụ 12. Viết ch−ơng trình nhập một số nguyên d−ơng từ bàn phím và xuất ra màn hình số chữ số của số vừa nhập. Ví dụ, nhập số 1562 và cho hiển thị câu “số vừa nhập có 4 chữ số”. Program dem_ki_so; Uses Crt; Var n:longint; dem:byte; Begin Clrscr; Write(‘nhap mot so nguyen duong :’); Readln(n); dem:=0; Repeat n:=n div 10; dem:=dem+1 ; Until n=0; Write (‘so vua nhap co ’, dem , ‘ky tu.’); Readln End. Ví dụ 13. Viết ch−ơng trình làm các việc sau: a. Tính diện tích hình chữ nhật. b. Tính diện tích hình tam giác. c. Tính thể tích hình cầu. 45
  46. Lựa chọn công việc đ−ợc thực hiện theo menu. Uses Crt; Var a, b, h, r: Real; chon : Byte; thoat : Boolean; Begin thoat:=false; Repeat Clrscr; Writeln(‘* * * Tinh dien tich va the tich * * *;); Writeln(‘1. Tinh dien tich hinh chu nhat’); Writeln(‘2. Tinh dien tich hinh tam giac’); Writeln(‘3. Tinh the tich hinh cau’); Writeln(‘4. Ket thuc chuong trinh’); Writeln; Write(‘ban chon cong viec nao? (1 – 4): ’); readln(chon); Writeln; Case chon Of 1: Begin Write(‘nhap do dai 2 canh a, b cua hinh chu nhat: ’); Readln(a,b); Writeln(‘dien tich hinh chu nhat la: ‘,a*b:8:2); Readln; End; 2: Begin Writeln(‘nhap do dai a cua day va chieu cao cua tam giac: ’); Readln(a,h); Writeln(‘dien tich tam giac la: ’,a*h/2:8:2); readln; 46
  47. End; 3: Begin Write(‘nhap ban kinh của hinh cau: ’); Readln(r); Writeln(‘the tich hinh cau la: ’,4*pi*r*r*r/3:10:2); Readln; End; 4: thoat:=True; Else Begin Write(‘vao sai, de nghi nhap lai!’); Readln; End; End; {case} Until thoat; End. Chú ý. 1. Vòng lặp REPEAT có thể sử dụng khi muốn thực hiện ch−ơng trình nhiều lần theo ý muốn. Chẳng hạn, ta có thể thiết kế việc kết thúc ch−ơng trình bằng đối thoại nh− trong đoạn ch−ơng trình sau: Var tieptuc: Char; Begin Repeat {các lệnh của ch−ơng trình} Write(‘co tiep tuc hay khong (c/k)? ’); Readln(tieptuc); Until Upcase(tieptuc)=‘K’ End. 47
  48. 2. Để buộc ng−ời sử dụng đ−a vào một số nguyên đúng quy cách ta có thể sử dụng vòng lặp Repeat nh− sau: Uses Crt; Var i: integer; b: boolean; Begin Clrscr; Write(‘nhap mot so nguyen: ‘); Repeat {$1-} Readln(i); {$1+} b:=(ioresult=0); If (not b) then write(‘ xin nhap lai’); Until b; Writeln(‘gia tri so vua nhap la: ‘,i); Readln; End. 5.3.3. Câu lệnh While Dùng để lặp đi lặp lại một công việc trong khi một điều kiện còn đ−ợc thoả mãn. Dạng lệnh: WHILE DO ; trong đó là biểu thức mà giá trị của nó thuộc kiểu Boolean còn là một lệnh thực hiện của Pascal (có thể lệnh đơn hoặc lệnh ghép). Khi gặp lệnh này máy lặp lại việc thực hiện nếu có giá trị true hoặc kết thúc việc thực hiện nếu biểu thức logic có giá trị False. Ví dụ 14. Viết ch−ơng trình tìm −ớc số chung lớn nhất của 2 số tự nhiên. Uses Crt; Var a,b: integer; tieptuc: char; Begin Repeat 48
  49. Write(‘nhap hai so nguyen can tim uscln: ‘); Readln(a,b); While a b Then a:=a-b Else b:=b-a; Writeln(‘ket qua uscln la: ‘,a); Write(‘thuc hien tiep khong? (c/k): ‘); Readln(tieptuc); Until upcase(tieptuc)=‘K’; End. Câu hỏi – Bài tập Ch−ơng 5 1. Viết ch−ơng trình nhập vào từ bàn phím giờ, phút, giây. Cộng thêm một số giây cũng đ−ợc nhập vào từ bàn phím. Hãy in ra kết quả sau khi cộng xong. 2. Viết ch−ơng trình tìm Max, Min của 4 số : a, b, c, d. 3. Viết ch−ơng trình nhập vào ngày, tháng, năm. Máy sẽ hiện lên ngày, tháng, năm của ngày hôm sau. 4. Viết ch−ơng trình nhập vào 2 số a, b sau đó hoán đổi giá trị của 2 số đó: a) Cho phép dùng biến trung gian. b) Không đ−ợc phép dùng biến trung gian. 5. Một thí sinh tham gia dự tuyển có điểm của 3 môn thi : điểm môn 1 (D1), điểm môn 2 (D2) và điểm môn thi trắc nghiệm tổng hợp (D3). Điểm kết quả đ−ợc tính theo công thức sau MAX(D1/3+D2/3+D3/3, D3). Điểm tối đa mỗi môn là 10. Viết ch−ơng trình xác định xem thí sinh có trúng tuyển không. Biết rằng điều kiện đ−ợc tuyển là điểm kết quả ≥ 5. 6. Viết ch−ơng trình nhập từ bàn phím 3 số nguyên d−ơng a, b, c. Xác định xem a, b, c có thể là độ dài 3 cạnh của tam giác không? Nếu phải thì kiểm tra xem đó là tam giác gì (vuông, cân hay đều) và tính diện tích của tam giác đó. 7. Viết ch−ơng trình tính tiền tiêu thụ điện cho khách hàng với chỉ số mới và chỉ số cũ của công tơ đ−ợc nhập từ bàn phím. Biết rằng : 150 số đầu tiên tính theo giá 450 đồng/KW, từ 151 đến 250 số tính theo giá 600 đồng/KW, từ số 251 trở lên tính theo giá 800 đồng/KW. 8. Viết ch−ơng trình giải ph−ơng trình bậc 2: ax2 + bx + c = 0 (a≠0). 9. Viết ch−ơng trình giải ph−ơng trình bậc 2 trên tr−ờng số phức: ax2 + bx + c = 0 49
  50. 10. Viết ch−ơng trình giải hệ ph−ơng trình: ⎧ax + by = c ⎨ ⎩px+qy =r với a, b, c, p, q, r đ−ợc nhập từ bàn phím. 11. Viết ch−ơng trình cho biết 1 ngày nào đó trong thế kỉ 20 này là ngày thứ mấy trong tuần. Giải thuật. B−ớc 1: Nhập ngày, tháng, năm vào các biến d,m,y. B−ớc 2: Tính a = d + 2*m + 3*(m+1) div 5 + y + y div 4 + 1 Chú ý rằng : Tháng 1 năm này là tháng 13 năm cũ, tháng 2 năm này là tháng 14 năm cũ còn các tháng khác hiểu nh− bình th−ờng. Chẳng hạn, 14/01/1965 phải đổi là 14/13/1964. B−ớc 3: Lấy a chia cho 7 – D− 0 → in ra : Thứ bảy – D− 1 → in ra : Chủ nhật – D− 2 → in ra : Thứ hai – 12. Viết ch−ơng trình nhập vào 3 số nguyên d−ơng từ bàn phím và xuất ra màn hình 3 số d−ơng đó theo thứ tự tăng dần. 13. Viết ch−ơng trình nhập 1 ký tự từ bàn phím và xuất ra màn hình. – số nếu nó là số. – chữ hoa nếu nó là chữ th−ờng. – chữ th−ờng nếu nó là chữ hoa. – câu “Chào tạm biệt!’ nếu nó không phải là chữ hay số. (Biết rằng mã ASCII của chữ th−ờng bằng mã chữ hoa t−ơng ứng cộng thêm 32). 14. Viết ch−ơng trình quyết định kiểu hợp đồng bảo hiểm mà khách hàng nên chọn. Ch−ơng trình này sẽ hỏi một số chi tiết về khách hàng rồi tuỳ theo trả lời mà quyết định. Các câu hỏi cần đặt ra cho khách hàng là nh− sau: – Bạn có nhỏ hơn 30 tuổi không? – Bạn có sức khoẻ tốt không? – Bạn đã gặp tai nạn lần nào ch−a? Logic là nh− sau: Nếu trả lời “không” thì cho 0 điểm, nếu trả lời “có” thì tuỳ theo từng câu mà cho điểm: câu thứ nhất 1 điểm, câu thứ hai 2 điểm, câu thứ ba 3 điểm. Dựa trên tổng số điểm sẽ có các quyết định t−ơng ứng nh− sau : 0, 1, 4 : nghiên cứu lại 2 : hợp đồng loại B 50
  51. 3 : hợp đồng loại A 5, 6 : từ chối. 15. Viết ch−ơng trình hiển thị lên màn hình các thông tin sau: a) Các số có 2 chữ số trong đó chữ số hàng chục nhận giá trị từ 3 đến 8, chữ số hàng đơn vị nhận giá trị 2 đến 9. b) Tổng các số có 2 chữ số. c) Tích các số chẵn có 1 chữ số. 16. Viết ch−ơng trình nhập số tự nhiên N từ bàn phím và tính: e = 1 + 1/1! + 1/2! + + 1/N! 17. Viết ch−ơng trình nhập chiều cao và xuất ra màn hình tam giác bởi các dấu * có dạng nh− sau: * * * * * * * * * * * * 18. Viết ch−ơng trình nhập 1 số thực a từ bàn phím và tìm số tự nhiên n nhỏ nhất sao cho: 111 1 A = 1 + + + + + > a 234 n Với số n tìm đ−ợc hãy tính tổng vế trái. 19. Viết ch−ơng trình in ra bảng tính căn bậc 2, căn bậc 3, căn bậc 4 của 100 số nguyên d−ơng đầu tiên. 20. Viết ch−ơng trình nhập vào một số tự nhiên từ bàn phím và xuất ra màn hình số các chữ số là lẻ có mặt trong số đó. Chẳng hạn, nếu nhập vào số 3625 thì trả lời “ có 2 chữ số lẻ”. 21. Viết ch−ơng trình liệt kê và đếm các số nguyên tố từ 2 đến n, với n nhập từ bàn phím. 22. Viết ch−ơng trình nhập vào từ bàn phím lần l−ợt các số trong một dãy các số nguyên khác 0, dấu hiệu chấm dứt là số 0. Tính giá trị trung bình của các số này. 23. Viết ch−ơng trình tính giá trị hàm ex theo công thức xấp xỉ : ex= 1 + x/1! + x2/2! + + xn/n!. Tổng trên chỉ giữ lại các số hạng thoả mãn ⎜xn/n! ⎜ > esp. Với x, esp nhập từ bàn phím và 0 < esp < 1. 51