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ài liệu của
Thư viện về máy tính của mình.
Nếu chưa đăng ký, hãy nhấn vào chữ ĐK thành viên ở phía bên trái, 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 phía bên trái.
Nếu chưa đăng ký, hãy nhấn vào chữ ĐK thành viên ở phía bên trái, 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 phía bên trái.
Tự học Pascal1

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Nguyễn Thơ Văn (trang riêng)
Ngày gửi: 11h:10' 22-11-2011
Dung lượng: 462.3 KB
Số lượt tải: 17
Nguồn:
Người gửi: Nguyễn Thơ Văn (trang riêng)
Ngày gửi: 11h:10' 22-11-2011
Dung lượng: 462.3 KB
Số lượt tải: 17
Số lượt thích:
0 người
Ngành: TC Tin học
Số tiết lý thuyết: 20 tiết
Số tiết tự nghiên cứu: 20 tiết
Số tiết thực hành: 20 tiết
Học phần: Kỹ thuật lập trình Pascal
LẬP TRÌNH
PASCAL
Cung cấp cho học viên các kiến thức về NNLT Pascal để có thể vận dụng giải quyết vấn đề, bài toán thực tế.
Rèn luyện cho học viên tư duy giải thuật, có thể diễn đạt giải thuật thành chương trình máy tính trên nền ngôn ngữ lập trình Pascal.
Môn học sẽ là nền tảng cho học viên học các ngôn ngữ lập trình khác và các môn chuyên ngành: Cấu trúc dữ liệu và giải thuật, lập trình Visual Basic…
Mục tiêu môn học
Tài liệu tham khảo
Giáo trình Lập trình Pascal – Bộ GDĐT biên soạn
Giáo trình Tin học đại cương – Khoa CNTT Trường ĐH Cần Thơ
Lập trình Pascal – NXB Giáo dục
Ngôn ngữ lập trình Pascal – Quách Tuấn Ngọc – NXB Giáo dục
http://ebook.moet.gov.vn
http://www.vietgreat.com
http://www.diendantinhoc.com/
Lập trình Pascal
MỘT SỐ KHÁI NIỆM CƠ BẢN
(LT:2, TH: 0)
Chương 1
Mục tiêu chính của chương
Phân tích các khái niệm về bài toán và thuật toán, khái niệm về chương trình dịch và ngôn ngữ lập trình, quy trình giải một bài toán bằng máy tính…
Nội dung chính
Bài toán và thuật toán (giải thuật)
Chương trình, ngôn ngữ lập trình và chương trình dịch
Phân loại các chương trình
Quy trình dùng máy tính để giải một bài toán
Bài toán
Tập hợp các mô tả thực tế của người dùng.
Bao gồm 2 thông tin cơ bản
Input: Dữ liệu cần nhập vào
Output: Kết quả cần lấy
Ví dụ:
Viết chương trình cần tính: ax + b = 0
Input: a, b
Output: Kết quả x=-b/a, vsn, vn.
Thuật toán (algorithm)
Thuật toán để giải một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho khi thực hiện dãy thao tác này, từ Input của bài toán ta nhận được Output cần tìm.
Thuật toán có thể diễn giải một cách trực quan bằng lưu đồ (flowchart).
Lưu đồ là việc trình bày các bước cần thiết để giải quyết vấn đề qua các hình khối khác nhau và dòng dữ liệu giữa các bước được chỉ định đi theo các đường mũi tên
Ký hiệu
Bắt đầu / Kết thúc
Thực hiện công việc
Điều kiện
Chương trình con
Nút
Khối nhập xuất
Đường đi thuật toán
Ví dụ lưu đồ giải pt bậc 1
NNLT là một phần mềm dùng để diễn đạt thuật toán thành một chương trình giúp cho máy tính hiểu được thuật toán đó.
Có ba loại ngôn ngữ lập trình:
Ngôn ngữ máy;
Hợp ngữ;
Ngôn ngữ bậc cao.
Khái niệm Ngôn ngữ lập trình
12
Khái niệm chương trình dịch
Chương trình dịch là chương trình có chức năng chuyển đổi chương trình được viết bằng ngôn ngữ bậc cao thành chương trình thực hiện được trên máy tính.
Có 2 loại chương trình dịch: (Thông dịch – Biên dịch)
Thông dịch: là lần lược dịch và thực hiện từng câu lệnh.
Biên dịch: là quá trình kiểm tra, phát hiện lỗi và dịch toàn bộ chương trình nguồn thành chương trình đích.
Câu hỏi thảo luận cuối chương
Thuật toán là gì? Có bao nhiêu cách để trình bài thuật toán?
Các ký hiệu dùng trong lưu đồ thuật toán là gì? Nêu ý nghĩa của từng ký hiệu!
Hãy trình bài giải thuật (bằng ngôn ngữ giả và lưu đồ) để giải các bài toán sau:
Giải phương trình bậc nhất, phương trình bậc hai.
Kiểm tra số nguyên tố.
Tính giai thừa của một số n.
NGÔN NGỮ LẬP TRÌNH
PASCAL
(LT:2, TH: 0)
Chương 2
Lập trình Pascal
Mục tiêu chính của chương
Phân tích các thành phần của ngôn ngữ lập trình TP, môi trường làm việc TP, vận dụng kỹ năng lập trình và chạy chương trình.
Nội dung chính của chương
Những nét chung về NNLT Pascal
Bộ chữ cái trong NNLT Pascal
Khái niệm tên, hằng, biến và biểu thức
Cấu trúc tổng quát của một chương trình Pascal
Bộ chữ cái
Các chữ cái: A -> Z, a -> z
Chữ số: 0 -> 9
Dấu gạch nối: _ (khác với dấu trừ “-”)
Các ký hiệu toán học: +, -, *, /, =, >, <, ()
Các ký tự đặc biệt: . , ; : [] ? @ | ! & # $ {}
Dấu cách hay khoảng trống (Space)
Tên, hằng, biến và biểu thức
Tên:Dùng để đặt cho chương trình, hằng, biến, chương trình con….
Tên có 2 loại:
Tên chuẩn do Pascal định nghĩa (từ khoá)
Tên do người lập trình đặt
Quy ước đặt tên:
Bắt đầu bằng chữ cái, theo sau là chữ cái hoặc số
Không có khoảng trống giữa tên
Không được trùng với từ khoá
Độ dài tối đa cuả tên là 127 ký tự
19
Từ khóa
Từ khóa chung: PROGRAM, BEGIN, END, PROCEDURE, FUNCTION
Từ khóa khai báo: CONST, VAR, LABEL, TYPE, ARRAY, STRING, RECORD, SET, FILE OF
Từ khóa lệnh lặp:IF..THEN…ELSE, CASE..OF
Từ khóa lệnh lặp: FOR..TO..DO và FOR..DOWNTO..DO
WHILE..DO, REPEAT..UNTIL
Từ khóa điều khiển: WITH, GOTO
Từ khóa toán tử:AND, OR, NOT, IN, DIV, MOD
Từ khóa NULL: NULL
19
Hằng (constant): Là một đại lượng không thể thay đổi trong quá trình thực hiện chương trình. Có hai loại:
Hằng chuẩn: do Pascal định nghĩa
Hằng do người dùng định nghĩa
Khai báo hằng:
Const = ;
Ví dụ:
Const a= 100; b= TRUE;
Tên, hằng, biến và biểu thức
Biến (variable): Là một đại lượng có thể thay đổi trong quá trình thực hiện chương trình
Khai báo
Var[,,…]: ;
Ví dụ:
Var cd, cr: Real;
so_tu_nhien: Integer;
Tên, hằng, biến và biểu thức
Biến (variable): Là một đại lượng có thể thay đổi trong quá trình thực hiện chương trình
Khai báo
Var[,,…]: ;
Ví dụ:
Var cd, cr: Real; {Khai báo 2 biến chiều dài và chiều rộng của hình chữ nhật}
so_tu_nhien: Integer;
Tên, hằng, biến và biểu thức
Tên, hằng, biến và biểu thức
Biểu thức: Một biểu thức gồm: hằng, biến, hàm được kết hợp với nhau bằng các phép toán: +, -, *, /, …, các dấu ()
Ví dụ:
Const A = 50;
Var x, y: Ingteger;
tc: real;
tc:=(5 + x)/y + A * SQRT(25);
Cấu trúc chung của một chương trình Pascal
Một chương trình pascal thường có 3 phần:
Phần tên: Dùng để đặt tên cho chương trình. Phần này có thể có hoặc không
Phần khai báo: Khai báo sử dụng Unit, nhãn, hằng, kiểu, biến, chương trình con.
Phần thân chương trình: bắt đầu bằng từ khoá “Begin” và kết thúc bằng từ khoá “End” và dấu “.”
Giữa Begin và End là các câu lệnh.
Các chương trình con (nếu có)
Ví dụ: Chương trình thực hiện việc xoá màn hình và in ra dòng chữ: “Hello pascal !!!”
Cấu trúc chương trình Pascal
Program …; {Tên chương trình – Có thể bỏ qua}
Uses …; {Khai báo các unit sử dụng}
Const …; {Khai báo các hằng dùng chung}
Var …; {Khai báo các biến dùng chung}
Procedure …;
Begin
End;
Function …;
Begin
End;
BEGIN
{Thân chương trình chính}
END.
{Các chương trình con}
Các thao tác cơ bản trên môi trường Pascal
Chạy chương trình: Ctrl + F9
Xem lại màn hình hiển thị kết quả: Alt + F5
Home: về đầu dòng
End: về cuối dòng
Shift + Delete: Cut
Shift + Insert: Paste
Alt + X: Thoát khỏi Pascal
F2: Lưu file Pascal
F3: Mở file Pascal đang lưu
Ctrl + Y: Xóa dòng hiện tại (dòng có con trỏ đang nằm)
Câu hỏi thảo luận cuối chương
Cách đặt tên trong NNLT Pascal như thế nào? Cho ví dụ minh họa!
Khi nào sử dụng hằng? Khi nào sử dụng biến?
Cấu trúc của một chương trình viết bằng NNLT Pascal?
Để kết thúc một chương trình Pascal ta dùng lệnh gì?
Ký hiệu kết thúc mỗi câu lệnh trong NNLT pascal là gì?
Khi viết chương trình Pascal có thể bỏ qua từ khoá PROGRAM ở đầu chương trình không?
CÁC KIỂU DỮ LIỆU CƠ SỞ
(LT:4, TH:4)
Chương 3
Lập trình Pascal
Mục tiêu chương
Giải thích các khái niệm nguyên tắc về các kiểu dữ liệu vô hướng chuẩn trong TP.
Nội dung chính
Kiểu số và các phép toán
Kiểu logic và các phép toán trên kiểu logic
Kiểu ký tự, chuỗi ký tự
Một sô hàm và thủ tục trên chuỗi ký tự
Kiểu dữ liệu cơ sở
Các toán tử logic: AND, OR, XOR, NOT
Toán tử NOT:
Các kiểu dữ liệu cơ sở
Các phép toán so sánh
I: Integer đại diện số nguyên; R: Real đại diện cho số thực
Các phép toán trên số
Một số hàm thường dùng
Ví dụ:
ROUND(35.56) = 36;
ROUND(35.321) = 35
ROUND(-35.567) = -36
Hàm CHR(x): Trả về ký tự có mã ASCII là x
Ví dụ: CHR(65) = ‘A’
Hàm ORD(x): Trả về mã ASCII của ký tự x
Ví dụ: ORD(‘A’) = 65
Hàm ODD(x): Trả về T nếu x lẻ, ngược lại trả về F
Ví dụ: ODD(9) = True
ODD(10) = False
Dữ liệu kiểu chuỗi (String Type Data)
Một chuỗi dữ liệu là một loạt các ký tự được định nghĩa bằng từ khoá STRING theo sau là số ký tự cực đại có thể có của chuỗi ký tự.
Khai báo
TYPE
= STRING [hằng nguyên] ;
VAR
: ;
Khai báo trực tiếp
VAR
: STRING [hằng nguyên] ;
Ví dụ khai báo biến kiểu string
- Cách 1
Type
tensv = String [25] ;
diachi = String; {mặc nhiên có độ dài tối đa là 255}
VAR
hoten : TenSV ;
- Cách 2
VAR
hoten: STRING [25] ;
diachi: STRING;
Truy xuất tự của chuỗi
Chuỗi s
Cú pháp:[vị trí]
Lưu ý: Chuỗi được tính bắt đầu tại vị trí 1
Ví dụ: Muốn lầy ký tự thứ 4 của chuỗi s ta ghi: s[4];
S[0] là ký tự đặc biệt.
Ord(s[0])=chiều dài chuỗi.
Duyệt qua tất cả các ký tự của chuỗi
Chuỗi s
Var
i: Byte;
s: String;
BEGIN
s:=‘DHSPDT’;
For i:=1 to Ord(s[0]) do Write(s[i]);
END.
DHSPDT
Các phép toán trên chuỗi
Phép gán
:= ;
Phép cộng
Nối các chuỗi lại với nhau bằng dấu cộng (+).
Các phép so sánh
>= (Lớn hơn hoặc bằng)
= (Bằng)
<= (Nhỏ hơn hoặc bằng)
<> (Khác)
Một vài ví dụ
Thủ tục và hàm chuẩn về chuỗi ký tự
Thủ tục xóa Delete (S, n, k)
Xóa chuỗi s tại vị trí n k ký tự
Ví dụ:
s=‘123456’;
Writeln(s);
Delete(s, 2, 3);
Write(s);
123456
1456
Thủ tục Insert (sb, s, n)
Chèn chuỗi sb vào chuỗi s tại vị trí n
Ví dụ:
s=‘123456’;
Writeln(s);
Insert(789, s, 2);
Write(s);
123456
178923456
Thủ tục và hàm chuẩn về chuỗi ký tự
Hàm Length(s): Trả về chiều dài của chuỗi s
Ví dụ:
s:=‘123456’;
Writeln(Length(s));
Writeln(Length(s)=ord(s[0]));
Thủ tục và hàm chuẩn về chuỗi ký tự
6
True
Hàm Str(Value, s): Chuyển số Value(nguyên hoặc thực) thành chuỗi số (nguyên hoặc thực) lưu trong s
Ví dụ:
Var n: Real; s:string;
BEGIN
n:=192.6;
Str(n, s);
Write(s=‘192.6’);
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
True
Hàm Val(s, vlue, code): Chuyển chuỗi số s (nguyên hoặc thực) thành số (nguyên hoặc thực) lưu trong vlue. Nếu chuyển thành công thì code=0, ngược lại code=vị trí ký tự xảy ra lỗi trong s;
Khi xảy ra lỗi thì vlue sẽ nhận giá trị của nó trước khi gọi thủ tục.
Ví dụ:
Var n: Real; s: string; cod: integer;
BEGIN
s:=‘1a92.6’;
Val(s, n, cod);
Write(cod);
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
2
Hàm pos(sb, s): Trả về vị trí xuất hiện đầu tiên của chuỗi sb trong chuỗi s;
Nếu sb không thấy trong s thì hàm trả về giá trị 0;
Ví dụ:
Var s, s2: string;
BEGIN
s:=‘123456’;
s2:=‘34’;
Write(Pos(s2, s));
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
3
Hàm Copy(s, n, m): Trả về chuỗi con của s, tại vị trí n m ký tự.
Ví dụ:
Var s, s2 : string;
BEGIN
s:=‘123456’;
s2:=copy(s, 2, 3);
Write(s2);
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
234
Hàm Concat(s, s1, s2…): Trả về chuỗi kết hợp của các chuỗi con s, s1, s2…
Ví dụ:
Var s, s1, s2 : string;
BEGIN
s:=‘12’;
s1:=‘34’;
s2:=‘56’;
Write(concat(s, s1, s2));
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
123456
Viết chương trình nhập vào một chuỗi và in ra chuỗi ngược lại của chuỗi vừa nhập.
Bài làm:
Var s:string; i:byte;
BEGIN
readln(s);
for i:=ord(s[0]) downto 1 do
write(s[i]);
END.
Bài tập (làm tại lớp):
Kể tên và miền giá trị của các kiểu dữ liệu trong NNLT Pascal?
Các phép toán trên kiểu logic là gì? Ý nghĩa của các phép toán đó?
Kể tên hàm và thủ tục trên chuỗi ký tự, cho biết ý nghĩa của nó?
Hàm chr và ord có ý nghĩa gì?
Ký tự a và A có mã Asscii là bao nhiêu?
Có bao nhiêu cách để biết được chiều dài chuỗi?
Ký tự và chuỗi ký tự nằm trong cặp nháy kép (“) hay nháy đơn (‘)?
Để truy xuất đến một ký tự bất kỳ trong chuỗi ta viết ra sao?
Câu hỏi thảo luận cuối chương
CÂU LỆNH ĐƠN VÀ LỆNH CÓ CẤU TRÚC
(LT: 4, TH: 4)
Chương 4
Lập trình Pascal
Mục tiêu chương
Giải thích nguyên lý và cách sử dụng các lệnh đơn các lệnh có cấu trúc: xuất nhập, lệnh rẽ nhánh, lệnh lặp…
Nội dung chính
Các lệnh đơn
Lệnh nhập xuất, lệnh gán
Lệnh hợp thành
Các lệnh có cấu trúc
Câu lệnh IF … ELSE
Câu lệnh CASE … OF
Câu lệnh FOR
Câu lệnh WHILE
Câu lệnh REPEAT … UNTIL
Lập trình lồng nhau nhiều cấu trúc điều khiển
Các lệnh đơn
Lệnh nhập xuất
Lệnh gán
Lệnh hợp thành
Lệnh nhập
Lệnh nhập: Read
Cú pháp: Readln(mục 1, mục 2, …, mục n);
Nhập dữ liệu vào các mục 1, 2,…, n
Lệnh nhập: Readln
Cú pháp: Readln(Mục 1, mục 2, …, mục N);
Nhập vào các mục 1, 2, …, N.
Sau khi nhập xong sẽ dời con trỏ sang dòng mới. Lệnh readlnln không có tham số chỉ đơn giản là đợi người dùng ấn pím Enter
Chú ý: các mục 1, 2, …, n là biến
Lệnh xuất
Xuất ra màn hình: Write
Cú pháp: Write(Mục 1, mục 2, …, mục N);
In ra màn hình các mục 1, 2,…, N
Xuất ra màn hình: Writeln
Cú pháp: Writeln(Mục 1, mục 2, …, mục N);
In ra màn hình các mục 1, 2, …, N.
Sau khi in xong sẽ dời con trỏ sang dòng mới. Lệnh writeln không có tham số chỉ đơn giản là đặt con trỏ xuống dòng.
Chú ý: các mục 1, 2, …, n có thể là: biến, biểu thức, hằng…
Lệnh xuất (có qui tắc)
Kiểu số nguyên:
Write(x:n): Viết số nguyên x ra màn hình tính từ trái qua phải n ký tự. (Canh phải)
Ví dụ:
Writeln(12345678);
Write(123:8);
Kết quả:
Lệnh xuất (có qui tắc)
Kiểu số thực:
Write(x:n1:n2): Giống như đối với số nguyên nhưng: n1 là số chữ số (kể cả phần nguyên và thập phân), n2 là số số lẻ (có làm tròn).
Ví dụ:
Writeln(123456789);
Writeln(123.4556:9:2);
Kết quả:
Lệnh gán
Cú pháp: := |
Ví dụ:
a := 5; {Gán giá trị cho biến a là 5}
b = 10+15;
Chú ý: Kiểu dữ liệu trả về của biểu thức gán cho biến phải cùng kiểu với biến.
Lệnh có cấu trúc
Câu lệnh IF … ELSE
Câu lệnh CASE … OF
Câu lệnh FOR
Câu lệnh WHILE
Câu lệnh REPEAT … UNTIL
Lập trình lồng nhau nhiều cấu trúc điều khiển
Cấu trúc if .. then .. else
Cú pháp:
IF <Điều kiện 1> THEN
[ELSE IF <Điều kiện 2> THEN
ELSE
]
Công việc 1..n: có thể là lệnh hoặc khối lệnh
Lưu ý: Khối lệnh gồm nhiều hơn 1 lệnh phải nằm trong cặp từ khoá “Begin” và “End”
Trước “ELSE” không có dấu chấm phẩy (;)
Lưu đồ (cấu trúc if .. then .. Else)
CASE (biến or biểuthức) OF
h11, h12,….: công việc 1;
h21, h22,….: công việc 2;
h31, h32,….: công việc 3;
…
hn1,hn2,….: công việc n;
ELSE
Công việc n+1;
END;
h11, h12… lần lượt là các hằng
Cấu trúc case ..of
Cấu trúc lặp For… To… Do
FOR := TO DO
Begin
End;
Trong đó:
GT1 <= GT2 và phải là giá trị nguyên đếm được
Sau mỗi lần thực hiện giá trị biến tăng lên 1
Vòng lặp sẽ kết thúc khi biến > GT2
Lưu đồ
Cấu trúc lặp For… Downto … Do
FOR := DOWNTO DO
Begin
End;
Trong đó:
GT1 <= GT2 và phải là giá trị kiểu đếm được
Giá trị biến ban đầu là GT2
Sau mỗi lần lặp giá trị của biến giảm xuống 1
Vòng lặp sẽ kết thúc khi biến < GT1
Lưu đồ
Cấu trúc lặp While … do
WHILE <ĐK> DO
Begin
End;
Hoạt động:
Trong khi ĐK còn đúng thì vẫn còn thực hiện
While là vòng lặp không xác định
Lưu đồ
Cấu trúc lặp Repeat.. until
Cú pháp:
REPEAT
UNTIL <ĐK>;
Hoạt động:
Tập công việc sẽ thực hiện đến khi điều kiện (ĐK) đúng thì dừng.
Công việc sẽ thực hiện ít nhất 1 lần
Tập công việc phải nắm trong “Begin” và “End”
Lưu đồ
Câu hỏi thảo luận cuối chương
Lệnh nào dùng để nhập và xuất dữ liệu ra màn hình?
Ký hiệu của lệnh gán là gì?
Có bao nhiêu loại vòng lặp?
Khi nào dùng vòng xác định, khi nào dùng vòng lặp không xác định?
Trước ELSE của câu lệnh IF có dấu chấm chấm phẩy (;) không?
Lệnh write khác lệnh writeln ở điểm nào?
Vòng lặp REPEAT…UNTIL kết thúc khi nào?
Vòng lặp WHILE kết thúc khi nào?
Khối lệnh nằm trong từ khoá gì?
CHƯƠNG TRÌNH CON
(LT:6, TH:6)
Chương 5
Lập trình Pascal
Mục tiêu chương
Phân tích kỹ thuật lập trình chia nhỏ vấn đề thành các chương trình con, nguyên lý của hàm và thủ tục trong chương trình TP, cơ chế đóng gói các chương trình con là Unit. Vận dụng kỹ thuật chương trình con để xây dựng chương trình ứng dụng ban đầu
Nội dung chính
Chương trình con là gì?
Tại sao dùng chương trình con?
Gọi chương trình con và truyền tham số
Các vấn đề lưu ý khi viết chương trình con.
Chương trình con đệ quy
Khái niệm Unit – Xây dựng Unit
Chương trình con là gì?
Chương trình con là một dãy lệnh được xây dựng nhằm thực hiện một công việc nào đó.
Lợi ít của việc sử dụng chương trình con?
Làm cho chương trình dể đọc, dể hiểu, dể kiểm tra lỗi.
Nâng cao tính độc lập khi thiết kế cho phép chương trình lớn có nhiều người tham gia. Mỗi người viết một chương trình con rồi ghép lại.
Mỗi NNLT có cách xây dựng chương trình con khác nhau, tuy nhiên về mặt ý nghĩa cũng như cách dùng lại giống nhau.
Chương trình con bao gồm: Hàm và thủ tục
Thủ tục (Procedure)
Thủ tục là một đoạn cấu trúc chương trình được chứa bên trong chương trình Pascal như là một chương trình con.
Có 2 loại thủ tục:
Thủ tục không tham số
Và thủ tục có tham số.
Cấu trúc thủ tục không tham số
PROCEDURE < Tên thủ tục >;
{Khai báo: hằng, biến, kiểu cục bộ... }
BEGIN
{Tập lệnh trong nội bộ thủ tục}
END;
Viết thủ tục xóa màn hình
PROCEDURE xoamanhinh;
Uses crt;
VAR i,j:integer ;
BEGIN
For i:=1 to 25 do
For j:=1 to 80 do
Begin
Gotoxy(i, j);
Write(‘ ‘);
End;
Gotoxy(1, 1)
END ;
80 cột
25 dòng
(1, 1)
(25, 80)
Cấu trúc của thủ tục có tham số
Tham số là gì?
Tham số là các biến (hoặc giá trị) được sử dụng khi viết chương trình con, hoặc được dùng khi gọi chương trình con.
Có 2 loại tham số:
Tham số hình thức: Được dùng khi thiết kế chương trình con.
Tham số thực sự: Được dùng để gửi giá trị vào chương trình con khi nó được gọi.
Cấu trúc của thủ tục có tham số (tt)
PROCEDURE();
{Các khai báo hằng, biến, kiểu cục bộ ...}
BEGIN
{
Danh sách các lệnh trong chương trình con.
}
END;
Ví dụ: Thủ tục in ra tổng 2 số a và b
PROCEDURE InTong(a, b: integer);
Var t: integer;
BEGIN
t=a+b;
write(‘Tong 2 so là ’, t);
END;
{-----------------------}
BEGIN
InTong(5, 8);
Readln;
END.
Tong 2 so la 13
Hàm (Function)
Hàm là chương trình con có giá trị trả về
Cấu trúc một hàm gồm:
FUNCTION () : ;
{Khai báo biến, hằng cục bộ}
BEGIN
{Các lệnh trong hàm}
:=
END;
Ví dụ: hàm tính tổng 2 số a và b
FUNCTION Tong2So(a, b: integer): Integer;
Var t: integer;
BEGIN
t:=a+b;
Tong2So:=t;
END;
{----------------}
BEGIN
Write(‘Tong 5 va 3 la ’, Tong2So(5, 3));
END.
Tong 2 so la 13
Các vấn đề cần lưu ý khi viết CTC
Địa phương (cục bộ) và toàn cục
Cách truyền tham số:
Tham biến
Tham trị
Hiệu ứng lề
Thoát khỏi chương trình con.
Địa phương (cục bộ) và toàn cục
Toàn cục
Những đối tượng như: Hằng, biến, hàm, thủ tục được khai báo trong chương trình chính sẽ được sử dụng trong toàn bộ khối chương trình chính và các khối chương trình con khác.
Ta gọi các đối tượng này là toàn cục.
Địa phương
Cũng chính các đối tượng trên nếu được khai báo trong chương trình con, thì chúng chỉ được sử dụng trong nội bộ khối chương trình con đó mà thôi
Ta gọi các đối tượng này là địa phương
Truyền tham số cho chương trình con
Khi gọi chương trình con. Nếu chương trình con được gọi có tham số hình thức thì chúng ta phải truyền tham số thực sự vào.
Trong Pascal việc truyền tham số đòi hỏi phải có sự tương ứng về tên của kiểu dữ liệu giữa 2 tham số hình thức và số thực.
Tham số hình thức đứng sau từ khóa VAR gọi là tham số hình thức biến
Tham số hình thức không đứng sau từ khóa VAR gọi tham số hình thức trị
Truyền tham số
Nếu tham số hình thức đứng sau từ khóa VAR thì tham số thực sự phải được truyền bằng biến.
Khi truyền dưới dạng biến thì giá trị của tham số thực sự sẽ bị thay đổi theo tham số hình thức trong chương trình con ngay sau khi chương trình con kết thúc.
Xem ví dụ sau:
Ví dụ (truyền dưới dạng biến)
Var x, y: byte;
Procedure HoanChuyen(var a, b: byte)
Var t:byte;
Begin
t:=a; a:=b; b:=t;
End;
BEGIN
x:=5; y:=10;
Writeln(x, ‘ ‘, y);
HoanChuyen(x, y);
Writeln(x, ‘ ‘, y);
END.
5 10
10 5
|
Ví dụ (truyền dưới dạng trị)
Program ThamTri;
Var x, y: byte;
Procedure HoanChuyen(a, b: byte)
Var t:byte;
Begin
t:=a; a:=b; b:=t;
End;
BEGIN
x:=5; y:=10;
Writeln(x, ‘ ‘, y);
HoanChuyen(x, y);
Writeln(x, ‘ ‘, y);
END.
5 10
5 10
|
Hiệu ứng lề (Xem đoạn chương trình sau)
Program HieuUngLe;
Var t: byte;
Function F(var x:byte):Byte;
Begin
x:=x+1; F:=x;
End;
BEGIN
t:=5;
Writeln(t+F(t));
END.
12
|
Thoát chương trình con (Xem đoạn ctrình sau)
Program ExitCTC;
Procedure InDaySo(n: byte): Byte;
Var i: byte;
Begin
for i:=1 to 10 do
begin
Write(i, ‘ ‘);
if i>5 then exit;
End;
End;
BEGIN
InDaySo(100)
END.
1 2 3 4 5 6
Thoát chương trình chính (Xem đoạn ctrình sau)
Program ExitCTC;
Procedure InDaySo(n: byte): Byte;
Var i: byte;
Begin
for i:=1 to 10 do
begin
Write(i, ‘ ‘);
if i>3 then halt;
End;
End;
BEGIN
InDaySo(5)
Writeln;
InDaySo(100)
END.
1 2 3
Câu hỏi
Khi nào dùng hàm (Function) và khi nào dùng thủ tục (Procedure)????
Chương trình con đệ qui
Chương trình con đệ qui là gì?
Một chương trình con được gọi là đệ qui nếu trong bản thân nó gọi lại chính nó.
Xem ví dụ:
Function GiaiThua(n: byte): Longint;
Begin
if (n=1)or(n=0) then
GiaiThua:=1
else
GiaiThua:=n*GiaiThua(n-1);
End;
Cấu trúc chương trình con đệ qui
Proce [Func][(Tham số hình thức)];
Begin
Điểm dừng;
Gọi lại hàm [Hoặc gọi lại thủ tục];
End;
Bài tập (Viết hàm hoặc thủ tục bằng đệ qui)
Viết hàm tính x mũ n
Viết thủ tục in chuỗi đảo ngược
Viết hàm kiểm tra số tự nhiên
Kiểm tra chuỗi đối xứng
Khái niệm Unit – Xây dựng Unit
Báo cáo chuyên đề của sinh viên
(Phần tự nghiên cứu)
Nội dung báo cáo
Unit là gì?
Nó dùng để làm gì?
Cấu trúc unit ra sao?
Xây dựng unit như thế nào?
Làm sao để có thể sử dụng nó?
Chương trình demo
Câu hỏi thảo luận cuối chương
Chương trình con là gì?
Có bao nhiêu loại CTC trong Pascal?
Gọi CTC như thế nào?
Tham số hình thức là gì? Tham số thực sự là gì?
Truyền tham biến và truyền bằng tham trị khác nhau ra sao?
Hiệu ứng lề là gì? Cho ví dụ?
Khi nào viết CTC bằng hàm, khi nào viết bằng thủ tục?
CÁC KIỂU DỮ LIỆU PHỨC TẠP
(LT:6, TH:6)
Chương 6
Lập trình Pascal
Mục tiêu chương
Phân tích cấu trúc dữ liệu có cấu trúc trong TP, hướng tới sử dụng các cấu trúc dữ liệu này để giải quyết một số bài toán phức tạp và xây dựng các kiểu dữ liệu phức tạp.
Nội dung chính
Kiểu liệt kê
Kiểu miền con
Kiểu mảng
Kiểu chuỗi
Kiểu tập hợp
Kiểu Record
Kiểu liệt kê (Khai báo)
Khai báo gián tiếp:
TYPE
= () ;
VAR
: ;
Khai báo trực tiếp:
VAR
: ;
Ví dụ
TYPE
Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;
Colors =(Red, Yellow, Green, White, Blue, Black) ;
Subjects = (Mathematics, Physics, Chemistry, Biology) ;
VAR
Ngay: Days ;
MauVe: Colors ;
Khai báo trực tiếp
VAR
Ngay: (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;
MauVe: (Red, Yellow, Green, White) ;
Kiểu miền con (Sub-range type)
Cú pháp khai báo:
Type
= .. ;
Var
: < Tên kiểu> ;
{Trong đó m>=n}
Ví dụ: TYPE
Tuoi= 0 .. 150;
VAR
n: Tuoi;
Kiểu miền con (Sub-range type) (tt)
Cách 2:
Var
: .. ;
{Trong đó m>=n}
Ví dụ
Var
Nam : 1998 .. 2100 ;
Kiểu mảng
Mảng 1 chiều
Mảng 2 chiều
Mảng n chiều
Cấu trúc mảng 1 chiều
Tên mảng
Giá trị phần tử ở vị trí 1
Vị trí của phần tử
Cấu trúc mảng 2 chiều
Tên mảng
Dòng
Cột
Phần tử tại vị trí [2, 3]
Phần tử tại vị trí [m, n]
Mảng 1 chiều (One-Dimensional Array)
Khai báo:
- Cách 1:
TYPE
= ARRAY [n..m] OF ;
VAR
: ;
- Cách 2:
VAR
Danh sách biến > : ARRAY [n..m] OF;
Trong đó
n: Vị trí phần tử đầu tiên, m: Vị trí phần tử cuối
Ví dụ khai báo mảng 1 chiều
Type:
tuoihs=Array[1..10] of 1..150;
{mảng chứa 10 phần tử kiểu miền con 1..150}
namsinh=Array[1..100] of integer;
{mảng chứa 100 phần tử kiểu số}
Var
tuoi: tuoihs;
nams: namsinh;
Mô tả mảng 1 chiều
tuoi
nams
Giá trị phần tử ở vị trí 1
Vị trí của phần tử
Truy xuất phần tử của mảng 1 chiều
Cú pháp: tenmang[vitri]
Trong đó:
- tenmang: Tên mảng đã khai báo
- vitri: Vị trí phần tử cần truy xuất
Ví dụ: Muốn truy xuất phần tử thứ 5 của mảng ta viết như sau: nams[5]
Ví dụ 1
Nhập vào 5 phần tử của mảng nams ta viết như sau:
For i:=1 to 5 do
Begin
write(‘Nhap phan tu thu ’, i);
readln(nams[i]);
End;
Ví dụ 2
Xuất ra tất cả các phần tử vừa nhập vào mảng nams ta viết như sau:
For i:=1 to 5 do
Begin
write(nams[i],’ ‘);
End;
Bài tập (mảng 1 chiều)
Viết chương trình nhập vào n số nguyên. Thực hiện các yêu cầu sau:
Tìm phần tử lớn nhất, nhỏ nhất trong mảng.
Phần tử nhỏ nhất xuất hiện đầu tiên tại vị trí nào.
Phần tử lớn nhất xuất hiện cuối cùng tại vị trí nào.
In ra màn hình số lượng phần tử nhỏ nhất và lớn nhất.
Dãy có tạo cấp số cộng không?
Dãy có tạo cấp số nhân không?
Dãy tăng dần hay giảm dần?
Sắp xếp dãy số tăng dần, in ra kết quả sau sắp xếp
Mô tả mảng 2 chiều
matran
Dòng
Cột
matran[2, 3]
Mảng 2 chiều
Khai báo:
- Cách 1:
TYPE
= ARRAY [n..m, h..k] OF ;
VAR
: ;
- Cách 2:
VAR
: ARRAY [n..m, h..k] OF ;
Trong đó
n: dòng đầu tiên, m dòng cuối
h: Cột đầu tiên, k: cột cuối
Truy xuất phần tử của mảng 2 chiều
Cú pháp: tenmang[i, j]
Trong đó:
- tenmang: Tên mảng đã khai báo
i: phần tử nằm tại dòng i
j: phần tử nằm tại cột j
- Ví dụ: Muốn truy xuất phần tử tại dòng 3 cột 5 của mảng matran ta viết như sau: nams[3, 5]
Ví dụ khai báo mảng 2 chiều
Type:
matran=Array[1..10, 1..15] of Integer;
{mảng 2 chiều có 10 dòng và 15 cột}
Var
m: matran;
Ví dụ 1
Nhập phần tử vào mảng m ta viết như sau:
For i:=1 to 4 do
For j:=1 to 5 do
Begin
write(‘Nhap phan tu thu ’, i, ‘ ‘,j);
readln(m[i, j]);
End;
Ví dụ 2
Xuất các phần tử của mảng m ta viết như sau:
For i:=1 to 4 do
begin
For j:=1 to 5 do write([i, j], ‘ ‘);
Writeln;
End;
Xuất ra các phần tử trên đường chéo chính
ma
For i:=1 to m do write (ma[i, i], ‘ ‘);
Chỉ thực hiện khi m=n
Xuất ra các phần tử trên đường chéo phụ
ma
For i:=1 to 4 do write (ma[m-i+1, i], ‘ ‘);
Chỉ thực hiện khi m=n
Xuất ra các phần tử trên nửa mảng vuông
ma
For i:=1 to m do
For j:=i to n do write (ma[i, j], ‘ ‘);
Chỉ thực hiện khi m=n
Bài tập (mảng 2 chiều)
Viết chương trình nhập vào ma trận m, n số nguyên. Yêu cầu:
Tìm phần tử lớn nhất, nhỏ nhất trong dãy.
Phần tử nhỏ nhất xuất hiện đầu tiên tại vị trí nào.
Phần tử lớn nhất xuất hiện cuối cùng tại vị trí nào.
In ra màn hình số lượng phần tử nhỏ nhất và lớn nhất.
Dãy có tạo cấp số cộng không?
Dãy có tạo cấp số nhân không?
Dãy tăng dần hay giảm dần?
Sắp xếp dãy số tăng dần, in ra kết quả sau sắp xếp
Mảng n chiều
Khai báo:
- Cách 1:
TYPE
= ARRAY [n..m, h..k, …] OF ;
VAR
: ;
- Cách 2:
VAR
: ARRAY [n..m, h..k, …] OF ;
Trong đó
n: dòng đầu tiên, m dòng cuối
h: Cột đầu tiên, k: cột cuối
Khai báo
- Cách 1:
TYPE
= SET OF ;
VAR
: ;
- Cách 2:
VAR
: SET OF ;
Kiểu tập hợp (SET OF)
Ví dụ
- Cách 1
TYPE
tuoi = SET OF Byte ;
VAR
t1, t2: tuoi;
- Cách 2
VAR
t1, t2: set of Byte;
Mô tả một tập hợp
Một tập hợp được mô tả bằng cách liệt kê các phần tử của tập hợp, chúng cách nhau bằng một dấu phẩy (,) và được đặt giữa hai dấu móc vuông [ ]
Ví dụ :
[] {tập hợp rỗng, không có các phầnt tử }
[5 .. 15] {tập hợp các chữ số nguyên từ 5 đến 15}
[1, 3, 5] {tập hợp 3 số 1, 3 và 5 }
Các phép toán trên tập hợp
Phép gán
Phép hợp
Phép giao
Phép hiệu
Phép thuộc IN
Các phép so sánh =, <>, <= và >=
Phép gán
- Cú pháp:
:=
- Ví dụ:
Var
tuoi: Set OF byte;
BEGIN
tuoi:= [15, 26, 30];
END.
Phép hợp
A
B
B
A
+
=
Hợp của 2 tập hợp A và B là một tập hợp chứa tất cả các phần tử của tập A hoặc B hoặc cả A và B.
Ký hiệu của phép hợp là dấu cộng (+). Phép hợp có tính giao hoán:
A+B = B+A
Xem hình:
Ví dụ
Var
A, B, C: Set of Byte;
BEGIN
A := [0,1,3] ;
B := [3,4,6] ;
C := A + B ;
END.
Phép giao
A
B
B
A
*
=
Giao của 2 tập hợp A và B là một tập chứa các phần tử của cả A và cả B.
ký hiệu A * B. Phép giao cũng có tính giao hoán, nghĩa là A * B = B * A
Nếu hai tập hợp không có phần tử giống nhau thì phép giao sẽ cho tập rỗng.
Xem hình:
Ví dụ
Var
A, B, C: Set of Byte;
BEGIN
A := [0,1,3] ;
B := [3,4,6] ;
C := A * B ;
END.
A
B
B
A
-
=
Phép hiệu
Hiệu của 2 tập hợp A và B, ký hiệu là A - B, là một tập hợp chứa các phần tử chỉ thuộc A mà không thuộc B.
Lưu ý : A - B thì khác B - A.
Xem hình
Ví dụ
Var
A, B, C: Set of Byte;
BEGIN
A := [0,1,3] ;
B := [3,4,6] ;
C := A - B ;
END.
Phép thuộc (IN)
Cho phép thử xem một giá trị nào đó thuộc về một tập hay không?
Phép thuộc IN cho kết quả có kiểu Boolean.
Nếu đúng nó sẽ cho kết quả là TRUE, ngược lại là FALSE.
Ví dụ
Var
A: Set of Byte;
ch: Byte;
BEGIN
A := [0,1,3] ;
ch:=1;
Write(ch in A);
END.
True
So sánh
Hai tập hợp muốn so sánh với nhau trước hết phải cùng kiểu phần tử
Kết quả phép so sánh là giá trị kiểu Boolean
Cho 2 tập hợp A và B
A <= B khi tất cả các phần tử của tập A thuộc tập B
A = B Khi tất cả các phần tử của A và B là như nhau. Ngược lại là khác nhau.
Bản ghi (record)
Mô tả:
Record là kiểu dữ liệu bao gồm nhiều thành phần có thể khác nhau về kiểu dữ liệu, mỗi thành phần được gọi là trường (Field).
Khai báo
Khai báo trực tiếp
Khai báo gián tiếp
Khai báo
Cách 1:
TYPE
= RECORD
field1, field2:
field3, field4:
…..
END;
VAR
:
Khai báo
Cách 2:
VAR
: RECORD
field1, field2:
field3, field4:
…..
END;
Ví dụ
TYPE
nhanvien=record
hoten: string;
tuoi: integer;
end;
VAR
nv: nhanvien;
Tuy xuất biến kiểu Record
Nguyên tắc:
Việc truy xuất đến biến kiểu Record là truy xuất từng trường
Ðể truy xuất vào một trường của kiểu Record, ta cần dùng tên biến kiểu Record, sau đó là dấu chấm (.) rồi đến tên trường. Dạng tổng quát sau:
.
Ví dụ:
nv.hoten;
Một số lưu ý khi sử dụng biến kiểu record
Các biến Record có thể gán cho nhau không?
nv1, nv2 là 2 biến thuộc kiểu nhanvien, ta không thể viết xâu lệnh sau: nv1:=nv2;
Không được viết ra màn hình hoặc đọc từ bàn phím một biến record như :
Writeln(nv1);
Readln(nv2);
Không thể so sánh các record bằng các phép toán quan hệ <, >, <=, >=,=,<>
Không được dùng các toán số học và logic với kiểu record.
Record là một field của một record khác
TYPE
date = Record
dd:1..31;
mm:1..12;
yyyy:1900..2100;
end;
hocsinh = Record
mahs: string[7];
ngsinh: date;
diem: real;
end;
VAR
hs: hocsinh;
Lúc này để lấy năm sinh của học sinh hs ta viết như sau:
nam:=hs.date.yyyy;
Để nhập ngày sinh của học sinh hs ta viết như sau:
hs.date.dd=20;
Record là một field của một record khác
Phép gán giữa 2 biến kiểu Record
Ta có 2 biến nv1, nv2 là 2 biến kiểu nhanvien.
Nhân viên có 2 field là: hoten và tuoi
Thực hiện phép gán giữa 2 biến kiểu record là việc thực hiện phép gán trên từng field của 2 biến đó.
Ví dụ:
nv1.hoten:=nv2.hoten;
nv1.tuoi:=nv2.tuoi;
Câu lệnh With
Ví dụ: Xuất ra màn hình thông tin của nhân viên nv1.
TYPE
nhanvien=record
hoten: string[30];
tuoi: 1..100;
end;
VAR
nv1: nhanvien;
{Nếu không dùng With}
BEGIN
Write(‘Ho ten ‘,nv1.hoten);
Write(‘Tuoi ‘,nv1.tuoi);
END.
{Nếu dùng With}
BEGIN
With nv1 Do
begin
Write(‘Ho ten ‘, .hoten);
Write(‘Tuoi ‘, .tuoi);
end;
END.
Câu lệnh With
Procedure Gan(var bien1:, bien2: );
Begin
bien1.:=bien2.;
bien1.:=bien2.;
bien1.:=bien2.;
….
bien1.:=bien2.;
End;
{
Trong chương trình chính ta muốn gán biến nv1 = nv2 thuộc kiểu record ta gọi thủ thục Gan bằng lệnh sau:
Gan(nv1, nv3);
}
Thủ tục thực hiện phép gán giữa 2 biến record
Type
nhanvien=record
maso: string[5]; hoten: string[20];
tuoi: 1..150;
end;
Var nv1, nv2: nhanvien;
Procedure Gan(var n1: nhanvien, n2: nhanvien);
Begin
n1.maso:=n2.maso;
n1.hoten:=n2.hoten;
n1.tuoi:=n2.tuoi;
End;
Ví dụ
BEGIN
{Nhập nv1, nv2}
Gan(nv1, nv2);
END.
Bài tập
Nhập vào danh sách sinh viên bao gồm các thông tin: maso, hoten, ngaysinh, quequan
In ra danh sách sinh viên trên theo mẫu
-------------------------------------------------------------
DANH SACH SINH VIEN
TT Ma so Ho ten Sinh Que quan
1 0001 Nguyen Van A 1984 CL – Dong Thap
2 …
3 …
Danh sách có: 3 sinh vien.
-------------------------------------------------------------
Chuyên đề (học viên báo cáo)
THAO TÁC VỚI FILE
(2 TIẾT)
Nội dung chính
Mở file (mở để đọc, mở để ghi)
Các lệnh cơ bản để đọc và ghi file
Viết chương trình demo
Số tiết lý thuyết: 20 tiết
Số tiết tự nghiên cứu: 20 tiết
Số tiết thực hành: 20 tiết
Học phần: Kỹ thuật lập trình Pascal
LẬP TRÌNH
PASCAL
Cung cấp cho học viên các kiến thức về NNLT Pascal để có thể vận dụng giải quyết vấn đề, bài toán thực tế.
Rèn luyện cho học viên tư duy giải thuật, có thể diễn đạt giải thuật thành chương trình máy tính trên nền ngôn ngữ lập trình Pascal.
Môn học sẽ là nền tảng cho học viên học các ngôn ngữ lập trình khác và các môn chuyên ngành: Cấu trúc dữ liệu và giải thuật, lập trình Visual Basic…
Mục tiêu môn học
Tài liệu tham khảo
Giáo trình Lập trình Pascal – Bộ GDĐT biên soạn
Giáo trình Tin học đại cương – Khoa CNTT Trường ĐH Cần Thơ
Lập trình Pascal – NXB Giáo dục
Ngôn ngữ lập trình Pascal – Quách Tuấn Ngọc – NXB Giáo dục
http://ebook.moet.gov.vn
http://www.vietgreat.com
http://www.diendantinhoc.com/
Lập trình Pascal
MỘT SỐ KHÁI NIỆM CƠ BẢN
(LT:2, TH: 0)
Chương 1
Mục tiêu chính của chương
Phân tích các khái niệm về bài toán và thuật toán, khái niệm về chương trình dịch và ngôn ngữ lập trình, quy trình giải một bài toán bằng máy tính…
Nội dung chính
Bài toán và thuật toán (giải thuật)
Chương trình, ngôn ngữ lập trình và chương trình dịch
Phân loại các chương trình
Quy trình dùng máy tính để giải một bài toán
Bài toán
Tập hợp các mô tả thực tế của người dùng.
Bao gồm 2 thông tin cơ bản
Input: Dữ liệu cần nhập vào
Output: Kết quả cần lấy
Ví dụ:
Viết chương trình cần tính: ax + b = 0
Input: a, b
Output: Kết quả x=-b/a, vsn, vn.
Thuật toán (algorithm)
Thuật toán để giải một bài toán là một dãy hữu hạn các thao tác được sắp xếp theo một trình tự xác định sao cho khi thực hiện dãy thao tác này, từ Input của bài toán ta nhận được Output cần tìm.
Thuật toán có thể diễn giải một cách trực quan bằng lưu đồ (flowchart).
Lưu đồ là việc trình bày các bước cần thiết để giải quyết vấn đề qua các hình khối khác nhau và dòng dữ liệu giữa các bước được chỉ định đi theo các đường mũi tên
Ký hiệu
Bắt đầu / Kết thúc
Thực hiện công việc
Điều kiện
Chương trình con
Nút
Khối nhập xuất
Đường đi thuật toán
Ví dụ lưu đồ giải pt bậc 1
NNLT là một phần mềm dùng để diễn đạt thuật toán thành một chương trình giúp cho máy tính hiểu được thuật toán đó.
Có ba loại ngôn ngữ lập trình:
Ngôn ngữ máy;
Hợp ngữ;
Ngôn ngữ bậc cao.
Khái niệm Ngôn ngữ lập trình
12
Khái niệm chương trình dịch
Chương trình dịch là chương trình có chức năng chuyển đổi chương trình được viết bằng ngôn ngữ bậc cao thành chương trình thực hiện được trên máy tính.
Có 2 loại chương trình dịch: (Thông dịch – Biên dịch)
Thông dịch: là lần lược dịch và thực hiện từng câu lệnh.
Biên dịch: là quá trình kiểm tra, phát hiện lỗi và dịch toàn bộ chương trình nguồn thành chương trình đích.
Câu hỏi thảo luận cuối chương
Thuật toán là gì? Có bao nhiêu cách để trình bài thuật toán?
Các ký hiệu dùng trong lưu đồ thuật toán là gì? Nêu ý nghĩa của từng ký hiệu!
Hãy trình bài giải thuật (bằng ngôn ngữ giả và lưu đồ) để giải các bài toán sau:
Giải phương trình bậc nhất, phương trình bậc hai.
Kiểm tra số nguyên tố.
Tính giai thừa của một số n.
NGÔN NGỮ LẬP TRÌNH
PASCAL
(LT:2, TH: 0)
Chương 2
Lập trình Pascal
Mục tiêu chính của chương
Phân tích các thành phần của ngôn ngữ lập trình TP, môi trường làm việc TP, vận dụng kỹ năng lập trình và chạy chương trình.
Nội dung chính của chương
Những nét chung về NNLT Pascal
Bộ chữ cái trong NNLT Pascal
Khái niệm tên, hằng, biến và biểu thức
Cấu trúc tổng quát của một chương trình Pascal
Bộ chữ cái
Các chữ cái: A -> Z, a -> z
Chữ số: 0 -> 9
Dấu gạch nối: _ (khác với dấu trừ “-”)
Các ký hiệu toán học: +, -, *, /, =, >, <, ()
Các ký tự đặc biệt: . , ; : [] ? @ | ! & # $ {}
Dấu cách hay khoảng trống (Space)
Tên, hằng, biến và biểu thức
Tên:Dùng để đặt cho chương trình, hằng, biến, chương trình con….
Tên có 2 loại:
Tên chuẩn do Pascal định nghĩa (từ khoá)
Tên do người lập trình đặt
Quy ước đặt tên:
Bắt đầu bằng chữ cái, theo sau là chữ cái hoặc số
Không có khoảng trống giữa tên
Không được trùng với từ khoá
Độ dài tối đa cuả tên là 127 ký tự
19
Từ khóa
Từ khóa chung: PROGRAM, BEGIN, END, PROCEDURE, FUNCTION
Từ khóa khai báo: CONST, VAR, LABEL, TYPE, ARRAY, STRING, RECORD, SET, FILE OF
Từ khóa lệnh lặp:IF..THEN…ELSE, CASE..OF
Từ khóa lệnh lặp: FOR..TO..DO và FOR..DOWNTO..DO
WHILE..DO, REPEAT..UNTIL
Từ khóa điều khiển: WITH, GOTO
Từ khóa toán tử:AND, OR, NOT, IN, DIV, MOD
Từ khóa NULL: NULL
19
Hằng (constant): Là một đại lượng không thể thay đổi trong quá trình thực hiện chương trình. Có hai loại:
Hằng chuẩn: do Pascal định nghĩa
Hằng do người dùng định nghĩa
Khai báo hằng:
Const
Ví dụ:
Const a= 100; b= TRUE;
Tên, hằng, biến và biểu thức
Biến (variable): Là một đại lượng có thể thay đổi trong quá trình thực hiện chương trình
Khai báo
Var
Ví dụ:
Var cd, cr: Real;
so_tu_nhien: Integer;
Tên, hằng, biến và biểu thức
Biến (variable): Là một đại lượng có thể thay đổi trong quá trình thực hiện chương trình
Khai báo
Var
Ví dụ:
Var cd, cr: Real; {Khai báo 2 biến chiều dài và chiều rộng của hình chữ nhật}
so_tu_nhien: Integer;
Tên, hằng, biến và biểu thức
Tên, hằng, biến và biểu thức
Biểu thức: Một biểu thức gồm: hằng, biến, hàm được kết hợp với nhau bằng các phép toán: +, -, *, /, …, các dấu ()
Ví dụ:
Const A = 50;
Var x, y: Ingteger;
tc: real;
tc:=(5 + x)/y + A * SQRT(25);
Cấu trúc chung của một chương trình Pascal
Một chương trình pascal thường có 3 phần:
Phần tên: Dùng để đặt tên cho chương trình. Phần này có thể có hoặc không
Phần khai báo: Khai báo sử dụng Unit, nhãn, hằng, kiểu, biến, chương trình con.
Phần thân chương trình: bắt đầu bằng từ khoá “Begin” và kết thúc bằng từ khoá “End” và dấu “.”
Giữa Begin và End là các câu lệnh.
Các chương trình con (nếu có)
Ví dụ: Chương trình thực hiện việc xoá màn hình và in ra dòng chữ: “Hello pascal !!!”
Cấu trúc chương trình Pascal
Program …; {Tên chương trình – Có thể bỏ qua}
Uses …; {Khai báo các unit sử dụng}
Const …; {Khai báo các hằng dùng chung}
Var …; {Khai báo các biến dùng chung}
Procedure …;
Begin
End;
Function …;
Begin
End;
BEGIN
{Thân chương trình chính}
END.
{Các chương trình con}
Các thao tác cơ bản trên môi trường Pascal
Chạy chương trình: Ctrl + F9
Xem lại màn hình hiển thị kết quả: Alt + F5
Home: về đầu dòng
End: về cuối dòng
Shift + Delete: Cut
Shift + Insert: Paste
Alt + X: Thoát khỏi Pascal
F2: Lưu file Pascal
F3: Mở file Pascal đang lưu
Ctrl + Y: Xóa dòng hiện tại (dòng có con trỏ đang nằm)
Câu hỏi thảo luận cuối chương
Cách đặt tên trong NNLT Pascal như thế nào? Cho ví dụ minh họa!
Khi nào sử dụng hằng? Khi nào sử dụng biến?
Cấu trúc của một chương trình viết bằng NNLT Pascal?
Để kết thúc một chương trình Pascal ta dùng lệnh gì?
Ký hiệu kết thúc mỗi câu lệnh trong NNLT pascal là gì?
Khi viết chương trình Pascal có thể bỏ qua từ khoá PROGRAM ở đầu chương trình không?
CÁC KIỂU DỮ LIỆU CƠ SỞ
(LT:4, TH:4)
Chương 3
Lập trình Pascal
Mục tiêu chương
Giải thích các khái niệm nguyên tắc về các kiểu dữ liệu vô hướng chuẩn trong TP.
Nội dung chính
Kiểu số và các phép toán
Kiểu logic và các phép toán trên kiểu logic
Kiểu ký tự, chuỗi ký tự
Một sô hàm và thủ tục trên chuỗi ký tự
Kiểu dữ liệu cơ sở
Các toán tử logic: AND, OR, XOR, NOT
Toán tử NOT:
Các kiểu dữ liệu cơ sở
Các phép toán so sánh
I: Integer đại diện số nguyên; R: Real đại diện cho số thực
Các phép toán trên số
Một số hàm thường dùng
Ví dụ:
ROUND(35.56) = 36;
ROUND(35.321) = 35
ROUND(-35.567) = -36
Hàm CHR(x): Trả về ký tự có mã ASCII là x
Ví dụ: CHR(65) = ‘A’
Hàm ORD(x): Trả về mã ASCII của ký tự x
Ví dụ: ORD(‘A’) = 65
Hàm ODD(x): Trả về T nếu x lẻ, ngược lại trả về F
Ví dụ: ODD(9) = True
ODD(10) = False
Dữ liệu kiểu chuỗi (String Type Data)
Một chuỗi dữ liệu là một loạt các ký tự được định nghĩa bằng từ khoá STRING theo sau là số ký tự cực đại có thể có của chuỗi ký tự.
Khai báo
TYPE
VAR
Khai báo trực tiếp
VAR
Ví dụ khai báo biến kiểu string
- Cách 1
Type
tensv = String [25] ;
diachi = String; {mặc nhiên có độ dài tối đa là 255}
VAR
hoten : TenSV ;
- Cách 2
VAR
hoten: STRING [25] ;
diachi: STRING;
Truy xuất tự của chuỗi
Chuỗi s
Cú pháp:
Lưu ý: Chuỗi được tính bắt đầu tại vị trí 1
Ví dụ: Muốn lầy ký tự thứ 4 của chuỗi s ta ghi: s[4];
S[0] là ký tự đặc biệt.
Ord(s[0])=chiều dài chuỗi.
Duyệt qua tất cả các ký tự của chuỗi
Chuỗi s
Var
i: Byte;
s: String;
BEGIN
s:=‘DHSPDT’;
For i:=1 to Ord(s[0]) do Write(s[i]);
END.
DHSPDT
Các phép toán trên chuỗi
Phép gán
Phép cộng
Nối các chuỗi lại với nhau bằng dấu cộng (+).
Các phép so sánh
>= (Lớn hơn hoặc bằng)
= (Bằng)
<= (Nhỏ hơn hoặc bằng)
<> (Khác)
Một vài ví dụ
Thủ tục và hàm chuẩn về chuỗi ký tự
Thủ tục xóa Delete (S, n, k)
Xóa chuỗi s tại vị trí n k ký tự
Ví dụ:
s=‘123456’;
Writeln(s);
Delete(s, 2, 3);
Write(s);
123456
1456
Thủ tục Insert (sb, s, n)
Chèn chuỗi sb vào chuỗi s tại vị trí n
Ví dụ:
s=‘123456’;
Writeln(s);
Insert(789, s, 2);
Write(s);
123456
178923456
Thủ tục và hàm chuẩn về chuỗi ký tự
Hàm Length(s): Trả về chiều dài của chuỗi s
Ví dụ:
s:=‘123456’;
Writeln(Length(s));
Writeln(Length(s)=ord(s[0]));
Thủ tục và hàm chuẩn về chuỗi ký tự
6
True
Hàm Str(Value, s): Chuyển số Value(nguyên hoặc thực) thành chuỗi số (nguyên hoặc thực) lưu trong s
Ví dụ:
Var n: Real; s:string;
BEGIN
n:=192.6;
Str(n, s);
Write(s=‘192.6’);
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
True
Hàm Val(s, vlue, code): Chuyển chuỗi số s (nguyên hoặc thực) thành số (nguyên hoặc thực) lưu trong vlue. Nếu chuyển thành công thì code=0, ngược lại code=vị trí ký tự xảy ra lỗi trong s;
Khi xảy ra lỗi thì vlue sẽ nhận giá trị của nó trước khi gọi thủ tục.
Ví dụ:
Var n: Real; s: string; cod: integer;
BEGIN
s:=‘1a92.6’;
Val(s, n, cod);
Write(cod);
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
2
Hàm pos(sb, s): Trả về vị trí xuất hiện đầu tiên của chuỗi sb trong chuỗi s;
Nếu sb không thấy trong s thì hàm trả về giá trị 0;
Ví dụ:
Var s, s2: string;
BEGIN
s:=‘123456’;
s2:=‘34’;
Write(Pos(s2, s));
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
3
Hàm Copy(s, n, m): Trả về chuỗi con của s, tại vị trí n m ký tự.
Ví dụ:
Var s, s2 : string;
BEGIN
s:=‘123456’;
s2:=copy(s, 2, 3);
Write(s2);
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
234
Hàm Concat(s, s1, s2…): Trả về chuỗi kết hợp của các chuỗi con s, s1, s2…
Ví dụ:
Var s, s1, s2 : string;
BEGIN
s:=‘12’;
s1:=‘34’;
s2:=‘56’;
Write(concat(s, s1, s2));
END.
Thủ tục và hàm chuẩn về chuỗi ký tự
123456
Viết chương trình nhập vào một chuỗi và in ra chuỗi ngược lại của chuỗi vừa nhập.
Bài làm:
Var s:string; i:byte;
BEGIN
readln(s);
for i:=ord(s[0]) downto 1 do
write(s[i]);
END.
Bài tập (làm tại lớp):
Kể tên và miền giá trị của các kiểu dữ liệu trong NNLT Pascal?
Các phép toán trên kiểu logic là gì? Ý nghĩa của các phép toán đó?
Kể tên hàm và thủ tục trên chuỗi ký tự, cho biết ý nghĩa của nó?
Hàm chr và ord có ý nghĩa gì?
Ký tự a và A có mã Asscii là bao nhiêu?
Có bao nhiêu cách để biết được chiều dài chuỗi?
Ký tự và chuỗi ký tự nằm trong cặp nháy kép (“) hay nháy đơn (‘)?
Để truy xuất đến một ký tự bất kỳ trong chuỗi ta viết ra sao?
Câu hỏi thảo luận cuối chương
CÂU LỆNH ĐƠN VÀ LỆNH CÓ CẤU TRÚC
(LT: 4, TH: 4)
Chương 4
Lập trình Pascal
Mục tiêu chương
Giải thích nguyên lý và cách sử dụng các lệnh đơn các lệnh có cấu trúc: xuất nhập, lệnh rẽ nhánh, lệnh lặp…
Nội dung chính
Các lệnh đơn
Lệnh nhập xuất, lệnh gán
Lệnh hợp thành
Các lệnh có cấu trúc
Câu lệnh IF … ELSE
Câu lệnh CASE … OF
Câu lệnh FOR
Câu lệnh WHILE
Câu lệnh REPEAT … UNTIL
Lập trình lồng nhau nhiều cấu trúc điều khiển
Các lệnh đơn
Lệnh nhập xuất
Lệnh gán
Lệnh hợp thành
Lệnh nhập
Lệnh nhập: Read
Cú pháp: Readln(mục 1, mục 2, …, mục n);
Nhập dữ liệu vào các mục 1, 2,…, n
Lệnh nhập: Readln
Cú pháp: Readln(Mục 1, mục 2, …, mục N);
Nhập vào các mục 1, 2, …, N.
Sau khi nhập xong sẽ dời con trỏ sang dòng mới. Lệnh readlnln không có tham số chỉ đơn giản là đợi người dùng ấn pím Enter
Chú ý: các mục 1, 2, …, n là biến
Lệnh xuất
Xuất ra màn hình: Write
Cú pháp: Write(Mục 1, mục 2, …, mục N);
In ra màn hình các mục 1, 2,…, N
Xuất ra màn hình: Writeln
Cú pháp: Writeln(Mục 1, mục 2, …, mục N);
In ra màn hình các mục 1, 2, …, N.
Sau khi in xong sẽ dời con trỏ sang dòng mới. Lệnh writeln không có tham số chỉ đơn giản là đặt con trỏ xuống dòng.
Chú ý: các mục 1, 2, …, n có thể là: biến, biểu thức, hằng…
Lệnh xuất (có qui tắc)
Kiểu số nguyên:
Write(x:n): Viết số nguyên x ra màn hình tính từ trái qua phải n ký tự. (Canh phải)
Ví dụ:
Writeln(12345678);
Write(123:8);
Kết quả:
Lệnh xuất (có qui tắc)
Kiểu số thực:
Write(x:n1:n2): Giống như đối với số nguyên nhưng: n1 là số chữ số (kể cả phần nguyên và thập phân), n2 là số số lẻ (có làm tròn).
Ví dụ:
Writeln(123456789);
Writeln(123.4556:9:2);
Kết quả:
Lệnh gán
Cú pháp:
Ví dụ:
a := 5; {Gán giá trị cho biến a là 5}
b = 10+15;
Chú ý: Kiểu dữ liệu trả về của biểu thức gán cho biến phải cùng kiểu với biến.
Lệnh có cấu trúc
Câu lệnh IF … ELSE
Câu lệnh CASE … OF
Câu lệnh FOR
Câu lệnh WHILE
Câu lệnh REPEAT … UNTIL
Lập trình lồng nhau nhiều cấu trúc điều khiển
Cấu trúc if .. then .. else
Cú pháp:
IF <Điều kiện 1> THEN
[ELSE IF <Điều kiện 2> THEN
ELSE
Công việc 1..n: có thể là lệnh hoặc khối lệnh
Lưu ý: Khối lệnh gồm nhiều hơn 1 lệnh phải nằm trong cặp từ khoá “Begin” và “End”
Trước “ELSE” không có dấu chấm phẩy (;)
Lưu đồ (cấu trúc if .. then .. Else)
CASE (biến or biểuthức) OF
h11, h12,….: công việc 1;
h21, h22,….: công việc 2;
h31, h32,….: công việc 3;
…
hn1,hn2,….: công việc n;
ELSE
Công việc n+1;
END;
h11, h12… lần lượt là các hằng
Cấu trúc case ..of
Cấu trúc lặp For… To… Do
FOR
Begin
End;
Trong đó:
GT1 <= GT2 và phải là giá trị nguyên đếm được
Sau mỗi lần thực hiện giá trị biến tăng lên 1
Vòng lặp sẽ kết thúc khi biến > GT2
Lưu đồ
Cấu trúc lặp For… Downto … Do
FOR
Begin
End;
Trong đó:
GT1 <= GT2 và phải là giá trị kiểu đếm được
Giá trị biến ban đầu là GT2
Sau mỗi lần lặp giá trị của biến giảm xuống 1
Vòng lặp sẽ kết thúc khi biến < GT1
Lưu đồ
Cấu trúc lặp While … do
WHILE <ĐK> DO
Begin
End;
Hoạt động:
Trong khi ĐK còn đúng thì
While là vòng lặp không xác định
Lưu đồ
Cấu trúc lặp Repeat.. until
Cú pháp:
REPEAT
UNTIL <ĐK>;
Hoạt động:
Tập công việc sẽ thực hiện đến khi điều kiện (ĐK) đúng thì dừng.
Công việc sẽ thực hiện ít nhất 1 lần
Tập công việc phải nắm trong “Begin” và “End”
Lưu đồ
Câu hỏi thảo luận cuối chương
Lệnh nào dùng để nhập và xuất dữ liệu ra màn hình?
Ký hiệu của lệnh gán là gì?
Có bao nhiêu loại vòng lặp?
Khi nào dùng vòng xác định, khi nào dùng vòng lặp không xác định?
Trước ELSE của câu lệnh IF có dấu chấm chấm phẩy (;) không?
Lệnh write khác lệnh writeln ở điểm nào?
Vòng lặp REPEAT…UNTIL kết thúc khi nào?
Vòng lặp WHILE kết thúc khi nào?
Khối lệnh nằm trong từ khoá gì?
CHƯƠNG TRÌNH CON
(LT:6, TH:6)
Chương 5
Lập trình Pascal
Mục tiêu chương
Phân tích kỹ thuật lập trình chia nhỏ vấn đề thành các chương trình con, nguyên lý của hàm và thủ tục trong chương trình TP, cơ chế đóng gói các chương trình con là Unit. Vận dụng kỹ thuật chương trình con để xây dựng chương trình ứng dụng ban đầu
Nội dung chính
Chương trình con là gì?
Tại sao dùng chương trình con?
Gọi chương trình con và truyền tham số
Các vấn đề lưu ý khi viết chương trình con.
Chương trình con đệ quy
Khái niệm Unit – Xây dựng Unit
Chương trình con là gì?
Chương trình con là một dãy lệnh được xây dựng nhằm thực hiện một công việc nào đó.
Lợi ít của việc sử dụng chương trình con?
Làm cho chương trình dể đọc, dể hiểu, dể kiểm tra lỗi.
Nâng cao tính độc lập khi thiết kế cho phép chương trình lớn có nhiều người tham gia. Mỗi người viết một chương trình con rồi ghép lại.
Mỗi NNLT có cách xây dựng chương trình con khác nhau, tuy nhiên về mặt ý nghĩa cũng như cách dùng lại giống nhau.
Chương trình con bao gồm: Hàm và thủ tục
Thủ tục (Procedure)
Thủ tục là một đoạn cấu trúc chương trình được chứa bên trong chương trình Pascal như là một chương trình con.
Có 2 loại thủ tục:
Thủ tục không tham số
Và thủ tục có tham số.
Cấu trúc thủ tục không tham số
PROCEDURE < Tên thủ tục >;
{Khai báo: hằng, biến, kiểu cục bộ... }
BEGIN
{Tập lệnh trong nội bộ thủ tục}
END;
Viết thủ tục xóa màn hình
PROCEDURE xoamanhinh;
Uses crt;
VAR i,j:integer ;
BEGIN
For i:=1 to 25 do
For j:=1 to 80 do
Begin
Gotoxy(i, j);
Write(‘ ‘);
End;
Gotoxy(1, 1)
END ;
80 cột
25 dòng
(1, 1)
(25, 80)
Cấu trúc của thủ tục có tham số
Tham số là gì?
Tham số là các biến (hoặc giá trị) được sử dụng khi viết chương trình con, hoặc được dùng khi gọi chương trình con.
Có 2 loại tham số:
Tham số hình thức: Được dùng khi thiết kế chương trình con.
Tham số thực sự: Được dùng để gửi giá trị vào chương trình con khi nó được gọi.
Cấu trúc của thủ tục có tham số (tt)
PROCEDURE
{Các khai báo hằng, biến, kiểu cục bộ ...}
BEGIN
{
Danh sách các lệnh trong chương trình con.
}
END;
Ví dụ: Thủ tục in ra tổng 2 số a và b
PROCEDURE InTong(a, b: integer);
Var t: integer;
BEGIN
t=a+b;
write(‘Tong 2 so là ’, t);
END;
{-----------------------}
BEGIN
InTong(5, 8);
Readln;
END.
Tong 2 so la 13
Hàm (Function)
Hàm là chương trình con có giá trị trả về
Cấu trúc một hàm gồm:
FUNCTION
{Khai báo biến, hằng cục bộ}
BEGIN
{Các lệnh trong hàm}
END;
Ví dụ: hàm tính tổng 2 số a và b
FUNCTION Tong2So(a, b: integer): Integer;
Var t: integer;
BEGIN
t:=a+b;
Tong2So:=t;
END;
{----------------}
BEGIN
Write(‘Tong 5 va 3 la ’, Tong2So(5, 3));
END.
Tong 2 so la 13
Các vấn đề cần lưu ý khi viết CTC
Địa phương (cục bộ) và toàn cục
Cách truyền tham số:
Tham biến
Tham trị
Hiệu ứng lề
Thoát khỏi chương trình con.
Địa phương (cục bộ) và toàn cục
Toàn cục
Những đối tượng như: Hằng, biến, hàm, thủ tục được khai báo trong chương trình chính sẽ được sử dụng trong toàn bộ khối chương trình chính và các khối chương trình con khác.
Ta gọi các đối tượng này là toàn cục.
Địa phương
Cũng chính các đối tượng trên nếu được khai báo trong chương trình con, thì chúng chỉ được sử dụng trong nội bộ khối chương trình con đó mà thôi
Ta gọi các đối tượng này là địa phương
Truyền tham số cho chương trình con
Khi gọi chương trình con. Nếu chương trình con được gọi có tham số hình thức thì chúng ta phải truyền tham số thực sự vào.
Trong Pascal việc truyền tham số đòi hỏi phải có sự tương ứng về tên của kiểu dữ liệu giữa 2 tham số hình thức và số thực.
Tham số hình thức đứng sau từ khóa VAR gọi là tham số hình thức biến
Tham số hình thức không đứng sau từ khóa VAR gọi tham số hình thức trị
Truyền tham số
Nếu tham số hình thức đứng sau từ khóa VAR thì tham số thực sự phải được truyền bằng biến.
Khi truyền dưới dạng biến thì giá trị của tham số thực sự sẽ bị thay đổi theo tham số hình thức trong chương trình con ngay sau khi chương trình con kết thúc.
Xem ví dụ sau:
Ví dụ (truyền dưới dạng biến)
Var x, y: byte;
Procedure HoanChuyen(var a, b: byte)
Var t:byte;
Begin
t:=a; a:=b; b:=t;
End;
BEGIN
x:=5; y:=10;
Writeln(x, ‘ ‘, y);
HoanChuyen(x, y);
Writeln(x, ‘ ‘, y);
END.
5 10
10 5
|
Ví dụ (truyền dưới dạng trị)
Program ThamTri;
Var x, y: byte;
Procedure HoanChuyen(a, b: byte)
Var t:byte;
Begin
t:=a; a:=b; b:=t;
End;
BEGIN
x:=5; y:=10;
Writeln(x, ‘ ‘, y);
HoanChuyen(x, y);
Writeln(x, ‘ ‘, y);
END.
5 10
5 10
|
Hiệu ứng lề (Xem đoạn chương trình sau)
Program HieuUngLe;
Var t: byte;
Function F(var x:byte):Byte;
Begin
x:=x+1; F:=x;
End;
BEGIN
t:=5;
Writeln(t+F(t));
END.
12
|
Thoát chương trình con (Xem đoạn ctrình sau)
Program ExitCTC;
Procedure InDaySo(n: byte): Byte;
Var i: byte;
Begin
for i:=1 to 10 do
begin
Write(i, ‘ ‘);
if i>5 then exit;
End;
End;
BEGIN
InDaySo(100)
END.
1 2 3 4 5 6
Thoát chương trình chính (Xem đoạn ctrình sau)
Program ExitCTC;
Procedure InDaySo(n: byte): Byte;
Var i: byte;
Begin
for i:=1 to 10 do
begin
Write(i, ‘ ‘);
if i>3 then halt;
End;
End;
BEGIN
InDaySo(5)
Writeln;
InDaySo(100)
END.
1 2 3
Câu hỏi
Khi nào dùng hàm (Function) và khi nào dùng thủ tục (Procedure)????
Chương trình con đệ qui
Chương trình con đệ qui là gì?
Một chương trình con được gọi là đệ qui nếu trong bản thân nó gọi lại chính nó.
Xem ví dụ:
Function GiaiThua(n: byte): Longint;
Begin
if (n=1)or(n=0) then
GiaiThua:=1
else
GiaiThua:=n*GiaiThua(n-1);
End;
Cấu trúc chương trình con đệ qui
Proce [Func]
Begin
Điểm dừng;
Gọi lại hàm [Hoặc gọi lại thủ tục];
End;
Bài tập (Viết hàm hoặc thủ tục bằng đệ qui)
Viết hàm tính x mũ n
Viết thủ tục in chuỗi đảo ngược
Viết hàm kiểm tra số tự nhiên
Kiểm tra chuỗi đối xứng
Khái niệm Unit – Xây dựng Unit
Báo cáo chuyên đề của sinh viên
(Phần tự nghiên cứu)
Nội dung báo cáo
Unit là gì?
Nó dùng để làm gì?
Cấu trúc unit ra sao?
Xây dựng unit như thế nào?
Làm sao để có thể sử dụng nó?
Chương trình demo
Câu hỏi thảo luận cuối chương
Chương trình con là gì?
Có bao nhiêu loại CTC trong Pascal?
Gọi CTC như thế nào?
Tham số hình thức là gì? Tham số thực sự là gì?
Truyền tham biến và truyền bằng tham trị khác nhau ra sao?
Hiệu ứng lề là gì? Cho ví dụ?
Khi nào viết CTC bằng hàm, khi nào viết bằng thủ tục?
CÁC KIỂU DỮ LIỆU PHỨC TẠP
(LT:6, TH:6)
Chương 6
Lập trình Pascal
Mục tiêu chương
Phân tích cấu trúc dữ liệu có cấu trúc trong TP, hướng tới sử dụng các cấu trúc dữ liệu này để giải quyết một số bài toán phức tạp và xây dựng các kiểu dữ liệu phức tạp.
Nội dung chính
Kiểu liệt kê
Kiểu miền con
Kiểu mảng
Kiểu chuỗi
Kiểu tập hợp
Kiểu Record
Kiểu liệt kê (Khai báo)
Khai báo gián tiếp:
TYPE
VAR
Khai báo trực tiếp:
VAR
Ví dụ
TYPE
Days = (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;
Colors =(Red, Yellow, Green, White, Blue, Black) ;
Subjects = (Mathematics, Physics, Chemistry, Biology) ;
VAR
Ngay: Days ;
MauVe: Colors ;
Khai báo trực tiếp
VAR
Ngay: (Sun, Mon, Tue, Wed, Thu, Fri, Sat) ;
MauVe: (Red, Yellow, Green, White) ;
Kiểu miền con (Sub-range type)
Cú pháp khai báo:
Type
Var
{Trong đó m>=n}
Ví dụ: TYPE
Tuoi= 0 .. 150;
VAR
n: Tuoi;
Kiểu miền con (Sub-range type) (tt)
Cách 2:
Var
{Trong đó m>=n}
Ví dụ
Var
Nam : 1998 .. 2100 ;
Kiểu mảng
Mảng 1 chiều
Mảng 2 chiều
Mảng n chiều
Cấu trúc mảng 1 chiều
Tên mảng
Giá trị phần tử ở vị trí 1
Vị trí của phần tử
Cấu trúc mảng 2 chiều
Tên mảng
Dòng
Cột
Phần tử tại vị trí [2, 3]
Phần tử tại vị trí [m, n]
Mảng 1 chiều (One-Dimensional Array)
Khai báo:
- Cách 1:
TYPE
VAR
- Cách 2:
VAR
Danh sách biến > : ARRAY [n..m] OF
Trong đó
n: Vị trí phần tử đầu tiên, m: Vị trí phần tử cuối
Ví dụ khai báo mảng 1 chiều
Type:
tuoihs=Array[1..10] of 1..150;
{mảng chứa 10 phần tử kiểu miền con 1..150}
namsinh=Array[1..100] of integer;
{mảng chứa 100 phần tử kiểu số}
Var
tuoi: tuoihs;
nams: namsinh;
Mô tả mảng 1 chiều
tuoi
nams
Giá trị phần tử ở vị trí 1
Vị trí của phần tử
Truy xuất phần tử của mảng 1 chiều
Cú pháp: tenmang[vitri]
Trong đó:
- tenmang: Tên mảng đã khai báo
- vitri: Vị trí phần tử cần truy xuất
Ví dụ: Muốn truy xuất phần tử thứ 5 của mảng ta viết như sau: nams[5]
Ví dụ 1
Nhập vào 5 phần tử của mảng nams ta viết như sau:
For i:=1 to 5 do
Begin
write(‘Nhap phan tu thu ’, i);
readln(nams[i]);
End;
Ví dụ 2
Xuất ra tất cả các phần tử vừa nhập vào mảng nams ta viết như sau:
For i:=1 to 5 do
Begin
write(nams[i],’ ‘);
End;
Bài tập (mảng 1 chiều)
Viết chương trình nhập vào n số nguyên. Thực hiện các yêu cầu sau:
Tìm phần tử lớn nhất, nhỏ nhất trong mảng.
Phần tử nhỏ nhất xuất hiện đầu tiên tại vị trí nào.
Phần tử lớn nhất xuất hiện cuối cùng tại vị trí nào.
In ra màn hình số lượng phần tử nhỏ nhất và lớn nhất.
Dãy có tạo cấp số cộng không?
Dãy có tạo cấp số nhân không?
Dãy tăng dần hay giảm dần?
Sắp xếp dãy số tăng dần, in ra kết quả sau sắp xếp
Mô tả mảng 2 chiều
matran
Dòng
Cột
matran[2, 3]
Mảng 2 chiều
Khai báo:
- Cách 1:
TYPE
VAR
- Cách 2:
VAR
Trong đó
n: dòng đầu tiên, m dòng cuối
h: Cột đầu tiên, k: cột cuối
Truy xuất phần tử của mảng 2 chiều
Cú pháp: tenmang[i, j]
Trong đó:
- tenmang: Tên mảng đã khai báo
i: phần tử nằm tại dòng i
j: phần tử nằm tại cột j
- Ví dụ: Muốn truy xuất phần tử tại dòng 3 cột 5 của mảng matran ta viết như sau: nams[3, 5]
Ví dụ khai báo mảng 2 chiều
Type:
matran=Array[1..10, 1..15] of Integer;
{mảng 2 chiều có 10 dòng và 15 cột}
Var
m: matran;
Ví dụ 1
Nhập phần tử vào mảng m ta viết như sau:
For i:=1 to 4 do
For j:=1 to 5 do
Begin
write(‘Nhap phan tu thu ’, i, ‘ ‘,j);
readln(m[i, j]);
End;
Ví dụ 2
Xuất các phần tử của mảng m ta viết như sau:
For i:=1 to 4 do
begin
For j:=1 to 5 do write([i, j], ‘ ‘);
Writeln;
End;
Xuất ra các phần tử trên đường chéo chính
ma
For i:=1 to m do write (ma[i, i], ‘ ‘);
Chỉ thực hiện khi m=n
Xuất ra các phần tử trên đường chéo phụ
ma
For i:=1 to 4 do write (ma[m-i+1, i], ‘ ‘);
Chỉ thực hiện khi m=n
Xuất ra các phần tử trên nửa mảng vuông
ma
For i:=1 to m do
For j:=i to n do write (ma[i, j], ‘ ‘);
Chỉ thực hiện khi m=n
Bài tập (mảng 2 chiều)
Viết chương trình nhập vào ma trận m, n số nguyên. Yêu cầu:
Tìm phần tử lớn nhất, nhỏ nhất trong dãy.
Phần tử nhỏ nhất xuất hiện đầu tiên tại vị trí nào.
Phần tử lớn nhất xuất hiện cuối cùng tại vị trí nào.
In ra màn hình số lượng phần tử nhỏ nhất và lớn nhất.
Dãy có tạo cấp số cộng không?
Dãy có tạo cấp số nhân không?
Dãy tăng dần hay giảm dần?
Sắp xếp dãy số tăng dần, in ra kết quả sau sắp xếp
Mảng n chiều
Khai báo:
- Cách 1:
TYPE
VAR
- Cách 2:
VAR
Trong đó
n: dòng đầu tiên, m dòng cuối
h: Cột đầu tiên, k: cột cuối
Khai báo
- Cách 1:
TYPE
VAR
- Cách 2:
VAR
Kiểu tập hợp (SET OF)
Ví dụ
- Cách 1
TYPE
tuoi = SET OF Byte ;
VAR
t1, t2: tuoi;
- Cách 2
VAR
t1, t2: set of Byte;
Mô tả một tập hợp
Một tập hợp được mô tả bằng cách liệt kê các phần tử của tập hợp, chúng cách nhau bằng một dấu phẩy (,) và được đặt giữa hai dấu móc vuông [ ]
Ví dụ :
[] {tập hợp rỗng, không có các phầnt tử }
[5 .. 15] {tập hợp các chữ số nguyên từ 5 đến 15}
[1, 3, 5] {tập hợp 3 số 1, 3 và 5 }
Các phép toán trên tập hợp
Phép gán
Phép hợp
Phép giao
Phép hiệu
Phép thuộc IN
Các phép so sánh =, <>, <= và >=
Phép gán
- Cú pháp:
- Ví dụ:
Var
tuoi: Set OF byte;
BEGIN
tuoi:= [15, 26, 30];
END.
Phép hợp
A
B
B
A
+
=
Hợp của 2 tập hợp A và B là một tập hợp chứa tất cả các phần tử của tập A hoặc B hoặc cả A và B.
Ký hiệu của phép hợp là dấu cộng (+). Phép hợp có tính giao hoán:
A+B = B+A
Xem hình:
Ví dụ
Var
A, B, C: Set of Byte;
BEGIN
A := [0,1,3] ;
B := [3,4,6] ;
C := A + B ;
END.
Phép giao
A
B
B
A
*
=
Giao của 2 tập hợp A và B là một tập chứa các phần tử của cả A và cả B.
ký hiệu A * B. Phép giao cũng có tính giao hoán, nghĩa là A * B = B * A
Nếu hai tập hợp không có phần tử giống nhau thì phép giao sẽ cho tập rỗng.
Xem hình:
Ví dụ
Var
A, B, C: Set of Byte;
BEGIN
A := [0,1,3] ;
B := [3,4,6] ;
C := A * B ;
END.
A
B
B
A
-
=
Phép hiệu
Hiệu của 2 tập hợp A và B, ký hiệu là A - B, là một tập hợp chứa các phần tử chỉ thuộc A mà không thuộc B.
Lưu ý : A - B thì khác B - A.
Xem hình
Ví dụ
Var
A, B, C: Set of Byte;
BEGIN
A := [0,1,3] ;
B := [3,4,6] ;
C := A - B ;
END.
Phép thuộc (IN)
Cho phép thử xem một giá trị nào đó thuộc về một tập hay không?
Phép thuộc IN cho kết quả có kiểu Boolean.
Nếu đúng nó sẽ cho kết quả là TRUE, ngược lại là FALSE.
Ví dụ
Var
A: Set of Byte;
ch: Byte;
BEGIN
A := [0,1,3] ;
ch:=1;
Write(ch in A);
END.
True
So sánh
Hai tập hợp muốn so sánh với nhau trước hết phải cùng kiểu phần tử
Kết quả phép so sánh là giá trị kiểu Boolean
Cho 2 tập hợp A và B
A <= B khi tất cả các phần tử của tập A thuộc tập B
A = B Khi tất cả các phần tử của A và B là như nhau. Ngược lại là khác nhau.
Bản ghi (record)
Mô tả:
Record là kiểu dữ liệu bao gồm nhiều thành phần có thể khác nhau về kiểu dữ liệu, mỗi thành phần được gọi là trường (Field).
Khai báo
Khai báo trực tiếp
Khai báo gián tiếp
Khai báo
Cách 1:
TYPE
field1, field2:
field3, field4:
…..
END;
VAR
Khai báo
Cách 2:
VAR
field1, field2:
field3, field4:
…..
END;
Ví dụ
TYPE
nhanvien=record
hoten: string;
tuoi: integer;
end;
VAR
nv: nhanvien;
Tuy xuất biến kiểu Record
Nguyên tắc:
Việc truy xuất đến biến kiểu Record là truy xuất từng trường
Ðể truy xuất vào một trường của kiểu Record, ta cần dùng tên biến kiểu Record, sau đó là dấu chấm (.) rồi đến tên trường. Dạng tổng quát sau:
Ví dụ:
nv.hoten;
Một số lưu ý khi sử dụng biến kiểu record
Các biến Record có thể gán cho nhau không?
nv1, nv2 là 2 biến thuộc kiểu nhanvien, ta không thể viết xâu lệnh sau: nv1:=nv2;
Không được viết ra màn hình hoặc đọc từ bàn phím một biến record như :
Writeln(nv1);
Readln(nv2);
Không thể so sánh các record bằng các phép toán quan hệ <, >, <=, >=,=,<>
Không được dùng các toán số học và logic với kiểu record.
Record là một field của một record khác
TYPE
date = Record
dd:1..31;
mm:1..12;
yyyy:1900..2100;
end;
hocsinh = Record
mahs: string[7];
ngsinh: date;
diem: real;
end;
VAR
hs: hocsinh;
Lúc này để lấy năm sinh của học sinh hs ta viết như sau:
nam:=hs.date.yyyy;
Để nhập ngày sinh của học sinh hs ta viết như sau:
hs.date.dd=20;
Record là một field của một record khác
Phép gán giữa 2 biến kiểu Record
Ta có 2 biến nv1, nv2 là 2 biến kiểu nhanvien.
Nhân viên có 2 field là: hoten và tuoi
Thực hiện phép gán giữa 2 biến kiểu record là việc thực hiện phép gán trên từng field của 2 biến đó.
Ví dụ:
nv1.hoten:=nv2.hoten;
nv1.tuoi:=nv2.tuoi;
Câu lệnh With
Ví dụ: Xuất ra màn hình thông tin của nhân viên nv1.
TYPE
nhanvien=record
hoten: string[30];
tuoi: 1..100;
end;
VAR
nv1: nhanvien;
{Nếu không dùng With}
BEGIN
Write(‘Ho ten ‘,nv1.hoten);
Write(‘Tuoi ‘,nv1.tuoi);
END.
{Nếu dùng With}
BEGIN
With nv1 Do
begin
Write(‘Ho ten ‘, .hoten);
Write(‘Tuoi ‘, .tuoi);
end;
END.
Câu lệnh With
Procedure Gan(var bien1:
Begin
bien1.
bien1.
bien1.
….
bien1.
End;
{
Trong chương trình chính ta muốn gán biến nv1 = nv2 thuộc kiểu record ta gọi thủ thục Gan bằng lệnh sau:
Gan(nv1, nv3);
}
Thủ tục thực hiện phép gán giữa 2 biến record
Type
nhanvien=record
maso: string[5]; hoten: string[20];
tuoi: 1..150;
end;
Var nv1, nv2: nhanvien;
Procedure Gan(var n1: nhanvien, n2: nhanvien);
Begin
n1.maso:=n2.maso;
n1.hoten:=n2.hoten;
n1.tuoi:=n2.tuoi;
End;
Ví dụ
BEGIN
{Nhập nv1, nv2}
Gan(nv1, nv2);
END.
Bài tập
Nhập vào danh sách sinh viên bao gồm các thông tin: maso, hoten, ngaysinh, quequan
In ra danh sách sinh viên trên theo mẫu
-------------------------------------------------------------
DANH SACH SINH VIEN
TT Ma so Ho ten Sinh Que quan
1 0001 Nguyen Van A 1984 CL – Dong Thap
2 …
3 …
Danh sách có: 3 sinh vien.
-------------------------------------------------------------
Chuyên đề (học viên báo cáo)
THAO TÁC VỚI FILE
(2 TIẾT)
Nội dung chính
Mở file (mở để đọc, mở để ghi)
Các lệnh cơ bản để đọc và ghi file
Viết chương trình demo
 
↓ CHÚ Ý: Bài giảng này được nén lại dưới dạng RAR và có thể chứa nhiều file. Hệ thống chỉ hiển thị 1 file trong số đó, đề nghị các thầy cô KIỂM TRA KỸ TRƯỚC KHI NHẬN XÉT ↓
Thư giản
Www.nhaccuatui.com/m/Ay98fPw2ic" allowscriptaccess="always"
quality="high" wmode="transparent" type=
"application/x-shockwave-flash" width="300" height="300">"
showstatusbar=1 autostart="1"






Lời hay ý đẹp