v1.0 — 30 ngày
0 / 30
Bắt đầu

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

1
Đọc lý thuyếtMỗi ngày có phần giải thích ngắn gọn và ví dụ code có chú thích.
2
Gõ lại code tayĐừng copy-paste. Gõ từng dòng để tay quen với cú pháp.
3
Làm bài tậpMỗi bài học có bài tập nhỏ ở cuối. Tự làm trước khi xem gợi ý.
4
Hoàn thành mini projectProject cuối tuần là bắt buộc — đây là lúc kiến thức thực sự ngấm.
💡 Dành ít nhất 45 phút mỗi ngày. Đều đặn 45 phút hiệu quả hơn nhiều so với học dồn 5 tiếng vào cuối tuần.
Bắt đầu

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:

🟦 Free Pascal (FPC)
Trình biên dịch mã nguồn mở, hỗ trợ Windows / macOS / Linux. Dùng kết hợp với VS Code hoặc Notepad++.
Khuyến nghị
🟧 Lazarus IDE
IDE đầy đủ tích hợp FPC. Tương tự Delphi. Dễ dùng hơn cho người mới, có debugger tích hợp.
Dễ bắt đầu

Cài đặt Lazarus (khuyến nghị)

1
Tải LazarusTruy cập lazarus-ide.org → Downloads → chọn bản phù hợp hệ điều hành.
2
Cài đặtChạy installer, giữ nguyên các tùy chọn mặc định. Lazarus sẽ tự cài FPC đi kèm.
3
Tạo project đầu tiênFile → New → Project → Console Application → OK.
4
Chạy thửNhấn F9 hoặc Run → Run để biên dịch và chạy.
ℹ️ Nếu dùng VS Code, cài extension OmniPascal để có syntax highlighting và autocomplete.
Tuần 1 · Ngày 1

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.

Pascal
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

1
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.
2
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.
3
Writeln(...)In ra màn hình và xuống dòng. Write(...) in ra nhưng không xuống dòng.
⚠️ Pascal không phân biệt hoa thường với từ khóa: 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.

Tuần 1 · Ngày 2

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 đủ

Pascal
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:

Pascal
{ Đâ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 }
💡 Quy tắc đặt tên: bắt đầu bằng chữ cái hoặc gạch dưới, không chứa khoảng trắng, không trùng từ khóa. Ví dụ hợp lệ: soHocSinh, _tam, diem1.
Tuần 1 · Ngày 3

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ểuMô tảVí dụPhạm vi
IntegerSố nguyên42, -7-32768 đến 32767
LongIntSố nguyên lớn1000000±2.1 tỷ
RealSố thực3.14, -0.5±1.5E-45..3.4E38
CharKý tự đơn'A', '9'1 ký tự
StringChuỗi ký tự'Xin chào'Tối đa 255 ký tự
BooleanLogicTrue, False2 giá trị

Khai báo và gán biến

Pascal
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.
ℹ️ Pascal dùng := (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.
Tuần 1 · Ngày 4

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

Pascal
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

Pascal
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.
Tuần 1 · Ngày 5

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ĩaVí dụKết quả
+Cộng5 + 38
-Trừ10 - 46
*Nhân3 * 412
/Chia (kết quả thực)7 / 23.5
divChia lấy phần nguyên7 div 23
modChia lấy phần dư7 mod 21

Toán tử so sánh & logic

Pascal
{ 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 }
⚠️ Khi kết hợp 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.
Tuần 1 · Ngày 6

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

Pascal
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

Pascal
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.
Tuần 1 · Ngày 7 · Mini Project

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.

💡 Hãy tự viết trước khi xem code mẫu dưới đây. Đây là cách duy nhất để thực sự học được.

Code mẫu

Pascal
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.

Tuần 2 · Ngày 8

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

Pascal
{ Dạng đơn giản }
if dieu_kien then
  cau_lenh;

{ Dạng if-else }
if dieu_kien then
  cau_lenh_1
else
  cau_lenh_2;

{ Nhiều lệnh dùng begin-end }
if dieu_kien then
begin
  lenh_a;
  lenh_b;
end
else
begin
  lenh_c;
end;

Ví dụ thực tế — Phân loại học sinh

Pascal
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.
⚠️ Dòng lệnh trước 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.
Tuần 2 · Ngày 9

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ể.

Pascal
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.
Tuần 2 · Ngày 10

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.

Pascal
{ 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);
Tuần 2 · Ngày 11

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.

Pascal
{ 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;
Tuần 2 · Ngày 12

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.

Pascal
{ 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.
Tuần 2 · Ngày 13

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.

Pascal
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.
Tuần 2 · Ngày 14 · Mini Project

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.

💡Dùng Random(100) + 1 để sinh số ngẫu nhiên từ 1-100. Cần gọi Randomize trước đó.
Pascal
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.
Tuần 3 · Ngày 15

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ố.

Pascal
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.
Tuần 3 · Ngày 16

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.

ℹ️Cả hai đều có độ phức tạp O(n²). Với mảng nhỏ (dưới vài trăm phần tử) thì đủ dùng.
Tuần 3 · Ngày 17

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.

Pascal
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.
Tuần 3 · Ngày 18

Xử lý chuỗi

Pascal có nhiều hàm tích hợp để xử lý chuỗi ký tự.

HàmMô tảVí dụ
Length(s)Độ dài chuỗiLength('abc') = 3
Copy(s,p,n)Lấy n ký tự từ vị trí pCopy('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í pThay đổi trực tiếp s
Insert(t,s,p)Chèn chuỗi t vào s tại vị trí pThay đổi trực tiếp s
Tuần 3 · Ngày 19

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.

Pascal
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.
Tuần 3 · Ngày 20

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.

Pascal
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.
Tuần 3 · Ngày 21 · Mini Project

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.

💡Đây là project phức tạp nhất từ trước đến nay. Hãy chia nhỏ: viết phần thêm mới trước, rồi đến hiển thị, rồi đến lưu/đọc file.
Tuần 4 · Ngày 22

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.

Pascal
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.
Tuần 4 · Ngày 23

Đệ 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.

Pascal
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;
Tuần 4 · Ngày 24

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.

Pascal — MyMath.pas
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.
Tuần 4 · Ngày 25

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.

1
BreakpointClick vào số dòng trong Lazarus để đặt breakpoint (dấu đỏ). Chương trình dừng tại đây.
2
WatchThêm biến vào Watch list (Ctrl+W) để theo dõi giá trị thay đổi khi chạy từng bước.
3
Step Over / IntoF8 để qua từng lệnh, F7 để bước vào trong function/procedure.
Tuần 4 · Ngày 26 · Dự án cuối

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.

ℹ️Dự án đề xuất: Hệ thống quản lý thư viện — quản lý sách, cho mượn, trả sách, tìm kiếm, thống kê.
Tuần 4 · Ngày 27 · Dự án cuối

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.

Tuần 4 · Ngày 28 · Dự án cuố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.

Tuần 4 · Ngày 29

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 testVí dụ
Bình thườngNhập dữ liệu hợp lệ, kiểm tra output đúng
BiênMảng rỗng, 1 phần tử, đầy phần tử
Lỗi người dùngNhập chữ thay vì số, chọn ID không tồn tại
Tuần 4 · Ngày 30 · Kết thúc

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.

🖼️ Lazarus GUI
Xây dựng ứng dụng desktop có giao diện đồ họa với Form, Button, ListBox…
Tiếp theo gần
⚡ Delphi / RAD
Phiên bản thương mại của Object Pascal, dùng nhiều trong doanh nghiệp.
Nâng cao
🏆 OOP Pascal
Class, object, kế thừa, đa hình — lập trình hướng đối tượng với Pascal.
Tiếp theo gần
🐍 Python / Go
Ngôn ngữ hiện đại — nền tảng Pascal giúp bạn học nhanh hơn nhiều.
Dài hạn
🎉Bạn đã xây dựng được nền tảng lập trình vững chắc. Tư duy thuật toán, cấu trúc dữ liệu, và kỹ thuật debug bạn học được sẽ theo bạn suốt sự nghiệp.