Lộ trình học Pascal — 30 ngày
Hướng dẫn toàn diện từ cú pháp cơ bản đến dự án hoàn chỉnh. Phù hợp cho người hoàn toàn mới bắt đầu với lập trình hoặc muốn học thêm Pascal sau khi đã biết ngôn ngữ khác.
Tổng quan lộ trình
Lộ trình được chia thành 4 tuần, mỗi tuần tập trung vào một nhóm kỹ năng cụ thể. Cuối mỗi tuần có một mini project để củng cố kiến thức.
| Giai đoạn | Ngày | Chủ đề chính | Mục tiêu |
|---|---|---|---|
Tuần 1 |
1 – 7 | Nền tảng cú pháp | Viết được chương trình tính toán đơn giản |
Tuần 2 |
8 – 14 | Điều khiển luồng | Xây dựng logic rẽ nhánh và vòng lặp |
Tuần 3 |
15 – 21 | Cấu trúc dữ liệu | Quản lý dữ liệu, đọc/ghi file |
Tuần 4 |
22 – 30 | Nâng cao & dự án | Hoàn thành dự án quản lý hoàn chỉnh |
Cách sử dụng tài liệu này
Cài đặt môi trường
Trước khi bắt đầu, bạn cần cài đặt trình biên dịch và IDE để viết và chạy code Pascal.
Chọn công cụ
Có hai lựa chọn phổ biến:
Cài đặt Lazarus (khuyến nghị)
lazarus-ide.org → Downloads → chọn bản phù hợp hệ điều hành.F9 hoặc Run → Run để biên dịch và chạy.OmniPascal để có syntax highlighting và autocomplete.
Hello World
Chương trình Pascal đầu tiên. Mục tiêu: hiểu cấu trúc tổng thể và chạy được code thành công.
Chương trình đầu tiên
Mọi chương trình Pascal đều bắt đầu bằng từ khóa program và có cặp begin/end. bao quanh phần thân.
program HelloWorld; begin Writeln('Xin chào, thế giới!'); Writeln('Tôi đang học Pascal.'); end.
Giải thích từng dòng
program HelloWorld;Khai báo tên chương trình. Tên tùy ý, không có khoảng trắng, kết thúc bằng dấu chấm phẩy.begin / end.Cặp từ khóa đánh dấu phần thân chương trình. Lưu ý: end cuối cùng có dấu chấm, không phải chấm phẩy.Writeln(...)In ra màn hình và xuống dòng. Write(...) in ra nhưng không xuống dòng.BEGIN, Begin, begin đều hợp lệ. Thông thường ta dùng chữ thường.
Bài tập ngày 1
Viết chương trình in ra thông tin của bản thân: họ tên, tuổi, thành phố đang sống. Mỗi thông tin trên một dòng riêng.
Cấu trúc chương trình Pascal
Hiểu sâu hơn về cấu trúc tổng thể: phần khai báo, phần uses, comment và quy tắc đặt tên.
Cấu trúc đầy đủ
program TenChuongTrinh; { Dòng 1: tên chương trình } uses CRT; { Thư viện console (tùy chọn) } const { Khai báo hằng số } PI = 3.14159; var { Khai báo biến } ten: String; tuoi: Integer; begin { Bắt đầu phần thân } Writeln('Hello!'); end. { Kết thúc chương trình }
Comment trong Pascal
Pascal hỗ trợ hai loại comment:
{ Đây là comment dạng ngoặc nhọn } (* Đây là comment dạng ngoặc sao Có thể viết nhiều dòng *) tuoi := 20; { Comment cuối dòng }
soHocSinh, _tam, diem1.
Kiểu dữ liệu cơ bản
Pascal là ngôn ngữ kiểu tĩnh — mỗi biến phải được khai báo kiểu trước khi sử dụng.
Các kiểu dữ liệu chính
| Kiểu | Mô tả | Ví dụ | Phạm vi |
|---|---|---|---|
Integer | Số nguyên | 42, -7 | -32768 đến 32767 |
LongInt | Số nguyên lớn | 1000000 | ±2.1 tỷ |
Real | Số thực | 3.14, -0.5 | ±1.5E-45..3.4E38 |
Char | Ký tự đơn | 'A', '9' | 1 ký tự |
String | Chuỗi ký tự | 'Xin chào' | Tối đa 255 ký tự |
Boolean | Logic | True, False | 2 giá trị |
Khai báo và gán biến
var tuoi: Integer; chieu_cao: Real; ten: String; gioi_tinh: Char; da_tot_nghiep: Boolean; begin tuoi := 22; chieu_cao := 1.72; ten := 'Nguyễn Văn An'; gioi_tinh := 'M'; da_tot_nghiep := False; end.
:= (dấu hai chấm bằng) để gán giá trị, và = để so sánh bằng. Đây là điểm dễ nhầm lẫn nhất với người mới.
Vào / Ra dữ liệu
Nhận dữ liệu từ người dùng và hiển thị kết quả ra màn hình — kỹ năng nền tảng cho mọi chương trình tương tác.
Read và Readln
var a, b: Integer; ten: String; begin Write('Nhập tên của bạn: '); Readln(ten); { Đọc chuỗi, dừng khi Enter } Write('Nhập hai số: '); Read(a); { Đọc số, không xuống dòng } Readln(b); { Đọc số, xóa phần còn lại của dòng } Writeln('Tổng: ', a + b); Writeln('Xin chào, ', ten, '!'); end.
Định dạng số thực khi in
var x: Real; begin x := 3.14159; Writeln(x); { In dạng khoa học: 3.14159000E+00 } Writeln(x:8:2); { Rộng 8 ký tự, 2 chữ số thập phân: " 3.14" } Writeln(x:0:4); { Tự động rộng, 4 thập phân: "3.1416" } end.
Toán tử & Biểu thức
Pascal có đầy đủ các toán tử số học, so sánh và logic cần thiết.
Toán tử số học
| Toán tử | Ý nghĩa | Ví dụ | Kết quả |
|---|---|---|---|
+ | Cộng | 5 + 3 | 8 |
- | Trừ | 10 - 4 | 6 |
* | Nhân | 3 * 4 | 12 |
/ | Chia (kết quả thực) | 7 / 2 | 3.5 |
div | Chia lấy phần nguyên | 7 div 2 | 3 |
mod | Chia lấy phần dư | 7 mod 2 | 1 |
Toán tử so sánh & logic
{ So sánh: = <> < > <= >= } a = b { bằng } a <> b { khác nhau } a <= b { nhỏ hơn hoặc bằng } { Logic: and or not } (a > 0) and (a < 100) { a trong khoảng 1..99 } (x = 0) or (y = 0) { ít nhất một trong hai bằng 0 } not (done) { phủ định }
and/or với toán tử so sánh, luôn dùng dấu ngoặc đơn bao từng điều kiện: (a > 0) and (b > 0). Không có ngoặc sẽ gây lỗi biên dịch.
Thực hành tổng hợp — Tuần 1
Vận dụng tất cả kiến thức từ ngày 1-5 vào các bài tập thực tế.
Bài 1 — Tính diện tích hình tròn
program DienTichHinhTron; const PI = 3.14159265; var r, dien_tich: Real; begin Write('Nhập bán kính: '); Readln(r); dien_tich := PI * r * r; Writeln('Diện tích = ', dien_tich:0:2); end.
Bài 2 — Tính BMI
program TinhBMI; var can_nang, chieu_cao, bmi: Real; begin Write('Cân nặng (kg): '); Readln(can_nang); Write('Chiều cao (m): '); Readln(chieu_cao); bmi := can_nang / (chieu_cao * chieu_cao); Writeln('BMI của bạn = ', bmi:0:1); end.
Mini Project — Máy tính đơn giản
Project cuối tuần 1: xây dựng máy tính cộng/trừ/nhân/chia hai số nguyên.
Code mẫu
program MayTinh; var a, b: Integer; phep_tinh: Char; begin Write('Nhập số thứ nhất: '); Readln(a); Write('Phép tính (+, -, *, /): '); Readln(phep_tinh); Write('Nhập số thứ hai: '); Readln(b); Write(a, ' ', phep_tinh, ' ', b, ' = '); case phep_tinh of '+': Writeln(a + b); '-': Writeln(a - b); '*': Writeln(a * b); '/': if b <> 0 then Writeln(a / b:0:2) else Writeln('Lỗi: chia cho 0!'); else Writeln('Phép tính không hợp lệ!'); end; end.
Thử thách nâng cao
Thêm vòng lặp để người dùng có thể tính nhiều phép tính liên tiếp mà không cần chạy lại chương trình. Gợi ý: dùng vòng lặp repeat...until với điều kiện thoát khi người dùng nhập Q.
Câu lệnh if-then-else
Rẽ nhánh là nền tảng của mọi logic chương trình. Pascal cung cấp cú pháp rõ ràng và dễ đọc.
Cú pháp cơ bản
{ Dạng đơn giản } ifdieu_kien thencau_lenh ; { Dạng if-else } ifdieu_kien thencau_lenh_1 elsecau_lenh_2 ; { Nhiều lệnh dùng begin-end } ifdieu_kien then beginlenh_a ;lenh_b ; end else beginlenh_c ; end;
Ví dụ thực tế — Phân loại học sinh
var diem: Real; begin Write('Nhập điểm (0-10): '); Readln(diem); if diem >= 8.5 then Writeln('Giỏi') else if diem >= 7.0 then Writeln('Khá') else if diem >= 5.0 then Writeln('Trung bình') else Writeln('Yếu'); end.
else không có dấu chấm phẩy. Đây là lỗi cú pháp phổ biến nhất khi mới học Pascal.
Câu lệnh case-of
Thay thế cho chuỗi if-else khi kiểm tra một biến với nhiều giá trị cụ thể.
var lua_chon: Integer; begin Writeln('1. Xem danh sách'); Writeln('2. Thêm mới'); Writeln('3. Thoát'); Write('Chọn: '); Readln(lua_chon); case lua_chon of 1: Writeln('Xem danh sách...'); 2: Writeln('Thêm mới...'); 3: Writeln('Tạm biệt!'); else Writeln('Lựa chọn không hợp lệ!'); end; end.
Vòng lặp for
Lặp một số lần xác định trước — thích hợp khi bạn biết chính xác cần lặp bao nhiêu lần.
{ Tăng dần } for i := 1 to 10 do Writeln(i); { Giảm dần } for i := 10 downto 1 do Write(i, ' '); { Bảng cửu chương 5 } for i := 1 to 10 do Writeln('5 x ', i, ' = ', 5 * i);
Vòng lặp while & repeat
Lặp khi chưa biết trước số lần — điều kiện kiểm tra ở đầu (while) hoặc cuối (repeat) vòng lặp.
{ while: kiểm tra trước - có thể không chạy lần nào } i := 1; while i <= 5 do begin Writeln(i); i := i + 1; end; { repeat: kiểm tra sau - luôn chạy ít nhất 1 lần } repeat Write('Nhập số dương: '); Readln(n); until n > 0;
Procedure
Đóng gói nhóm lệnh có liên quan thành một đơn vị có tên — giúp code có cấu trúc và tái sử dụng được.
{ Khai báo procedure } procedure InDuongKe(so_lan: Integer); var i: Integer; begin for i := 1 to so_lan do Write('-'); Writeln; end; { Gọi procedure } begin InDuongKe(30); Writeln('Tiêu đề'); InDuongKe(30); end.
Function
Function giống procedure nhưng trả về một giá trị. Dùng khi bạn cần kết quả của một phép tính phức tạp.
function LuyThua(co_so, so_mu: Integer): LongInt; var i: Integer; ket_qua: LongInt; begin ket_qua := 1; for i := 1 to so_mu do ket_qua := ket_qua * co_so; LuyThua := ket_qua; { gán kết quả = tên function } end; begin Writeln('2^10 = ', LuyThua(2, 10)); end.
Mini Project — Game đoán số
Kết hợp vòng lặp, rẽ nhánh và function để xây dựng game đoán số hoàn chỉnh.
Random(100) + 1 để sinh số ngẫu nhiên từ 1-100. Cần gọi Randomize trước đó.program GameDoanSo; var bi_mat, doan, lan_thu: Integer; begin Randomize; bi_mat := Random(100) + 1; lan_thu := 0; Writeln('Đoán số từ 1 đến 100!'); repeat Write('Dự đoán: '); Readln(doan); lan_thu := lan_thu + 1; if doan < bi_mat then Writeln('Quá nhỏ!') else if doan > bi_mat then Writeln('Quá lớn!') else Writeln('Chính xác! ', lan_thu, ' lần thử.'); until doan = bi_mat; end.
Mảng 1 chiều
Lưu trữ nhiều giá trị cùng kiểu trong một biến duy nhất, truy xuất qua chỉ số.
const N = 5; var diem: array[1..N] of Real; i: Integer; tong: Real; begin tong := 0; for i := 1 to N do begin Write('Điểm ', i, ': '); Readln(diem[i]); tong := tong + diem[i]; end; Writeln('Trung bình: ', tong / N:0:2); end.
Sắp xếp mảng
Bubble Sort và Selection Sort — hai thuật toán sắp xếp cơ bản nhất.
Mảng 2 chiều
Ma trận — mảng có 2 chỉ số (hàng và cột). Thích hợp cho bảng dữ liệu, bàn cờ, lưới điểm.
var a: array[1..3, 1..3] of Integer; begin { Duyệt ma trận bằng for lồng nhau } for i := 1 to 3 do for j := 1 to 3 do Read(a[i,j]); end.
Xử lý chuỗi
Pascal có nhiều hàm tích hợp để xử lý chuỗi ký tự.
| Hàm | Mô tả | Ví dụ |
|---|---|---|
Length(s) | Độ dài chuỗi | Length('abc') = 3 |
Copy(s,p,n) | Lấy n ký tự từ vị trí p | Copy('Hello',2,3) = 'ell' |
Pos(sub,s) | Vị trí chuỗi con (0 nếu không có) | Pos('lo','Hello') = 4 |
Delete(s,p,n) | Xóa n ký tự từ vị trí p | Thay đổi trực tiếp s |
Insert(t,s,p) | Chèn chuỗi t vào s tại vị trí p | Thay đổi trực tiếp s |
Record — Bản ghi
Nhóm nhiều trường dữ liệu liên quan thành một kiểu duy nhất — tương tự struct trong C.
type THocSinh = record ho_ten: String; tuoi: Integer; diem_tb: Real; end; var hs: THocSinh; ds: array[1..50] of THocSinh; begin hs.ho_ten := 'Trần Thị B'; hs.tuoi := 18; hs.diem_tb := 8.5; end.
Làm việc với File
Đọc và ghi dữ liệu ra file text — để dữ liệu tồn tại sau khi chương trình kết thúc.
var f: TextFile; dong: String; begin { Ghi file } Assign(f, 'data.txt'); Rewrite(f); Writeln(f, 'Dòng đầu tiên'); Close(f); { Đọc file } Reset(f); while not EOF(f) do begin Readln(f, dong); Writeln(dong); end; Close(f); end.
Mini Project — Quản lý sinh viên
Kết hợp mảng, record và file để xây dựng hệ thống quản lý danh sách sinh viên đơn giản.
Con trỏ & Bộ nhớ động
Quản lý bộ nhớ trực tiếp — cấp phát và giải phóng trong thời gian chạy.
type PNode = ^TNode; TNode = record gia_tri: Integer; tiep: PNode; end; var p: PNode; begin New(p); { Cấp phát bộ nhớ } p^.gia_tri := 42; p^.tiep := nil; Writeln(p^.gia_tri); Dispose(p); { Giải phóng bộ nhớ } end.
Đệ quy
Hàm gọi lại chính nó — công cụ mạnh mẽ cho các bài toán có cấu trúc tự lặp lại.
function GiaiThua(n: Integer): LongInt; begin if n <= 1 then GiaiThua := 1 { Trường hợp cơ sở } else GiaiThua := n * GiaiThua(n - 1); { Đệ quy } end; function Fibonacci(n: Integer): Integer; begin if n <= 1 then Fibonacci := n else Fibonacci := Fibonacci(n-1) + Fibonacci(n-2); end;
Unit tự định nghĩa
Tách code thành các module riêng biệt — nền tảng của lập trình có cấu trúc tốt.
unit MyMath; interface { Phần công khai } function Max(a, b: Integer): Integer; implementation { Phần cài đặt } function Max(a, b: Integer): Integer; begin if a > b then Max := a else Max := b; end; end.
Kỹ thuật Debug
Tìm và sửa lỗi hiệu quả với debugger tích hợp của Lazarus IDE.
Thiết kế dự án cuối
Lên kế hoạch chi tiết trước khi viết code — bước quan trọng nhất của bất kỳ dự án nào.
Lập trình dự án — Phần 1
Xây dựng phần nền tảng: khai báo dữ liệu, menu chính, chức năng thêm mới.
Lập trình dự án — Phần 2
Thêm tìm kiếm, thống kê và xuất báo cáo ra file text.
Kiểm thử & Chỉnh sửa
Test đầy đủ: trường hợp bình thường, biên (boundary), và lỗi người dùng.
| Loại test | Ví dụ |
|---|---|
| Bình thường | Nhập dữ liệu hợp lệ, kiểm tra output đúng |
| Biên | Mảng rỗng, 1 phần tử, đầy phần tử |
| Lỗi người dùng | Nhập chữ thay vì số, chọn ID không tồn tại |
Tổng kết & Bước tiếp theo
Chúc mừng! Bạn đã hoàn thành 30 ngày học Pascal. Đây là những hướng phát triển tiếp theo.