Bài 2: Cài đặt Code::Blocks, chương trình C++ đầu tiên, nhập xuất và kiểu dữ liệu
Lời mở đầu
Ở bài 1 các bạn đã biết lập trình là gì và vì sao mình chọn C++ làm ngôn ngữ chính. Bài này mình bắt tay vào làm thật: cài phần mềm, gõ chương trình đầu tiên, rồi học 2 thứ mà bài tập nào cũng cần là nhập xuất dữ liệu và kiểu dữ liệu. Bài hơi dài nhưng toàn kiến thức nền, các bạn đọc từ từ và nhớ tự gõ lại code nhé.
Lộ trình bài viết, bấm vào từng phần để nhảy tới:
Phần 1Cài đặt phần mềm Code::Blocks
Để viết code C++ ta cần 2 thứ: một trình soạn thảo để gõ code và một trình biên dịch (compiler) để dịch code ra file chạy được. Code::Blocks là phần mềm miễn phí gộp sẵn cả 2 thứ đó (đi kèm trình biên dịch GCC), nhẹ, dễ dùng, và cũng là phần mềm hay được cài trên máy thi học sinh giỏi, nên mình khuyên các bạn dùng nó để bắt đầu.
Bước 1 – Tải đúng bộ cài
- Vào trang chủ codeblocks.org → Downloads → Binary releases.
- Ở mục Windows, chọn file có chữ mingw-setup:
codeblocks-25.03mingw-setup.exe(bản 64-bit, đã kèm sẵn trình biên dịch GCC 14.2). Bấm vào link tải ở cột bên cạnh (FossHUB hoặc Sourceforge.net). - Máy rất cũ chạy Windows 32-bit thì chọn
codeblocks-25.03mingw-32bit-setup.exe.
codeblocks-25.03-setup.exe (không có chữ mingw) không kèm trình biên dịch. Cài xong bấm chạy sẽ báo lỗi kiểu "can't find compiler executable in your configured search path". Gặp lỗi này thì gỡ ra cài lại bản mingw-setup là xong.Bước 2 – Cài đặt
- Mở file vừa tải, bấm Next → I Agree (đồng ý điều khoản).
- Màn hình Choose Components: để mặc định (Full: All plugins, all tools, just everything) → Next.
- Chọn thư mục cài (để mặc định
C:\Program Files\CodeBlocks) → Install, chờ chạy xong → Finish. - Lần đầu mở Code::Blocks sẽ hiện hộp thoại Compilers auto-detection: chọn dòng GNU GCC Compiler (cột Status ghi Detected) → Set as default → OK. Nếu hiện thêm hộp thoại hỏi liên kết file, chọn "Yes, associate Code::Blocks with C/C++ file types" → OK.
Bước 3 – Tạo file, gõ code và chạy
- Vào File → New → Empty file (hoặc bấm Ctrl + Shift + N).
- Bấm ngay Ctrl + S để lưu, đặt tên có đuôi .cpp, ví dụ
hello.cpp. Nên để trong thư mục có tên không dấu, không khoảng trắng (ví dụD:\LapTrinh) cho đỡ lỗi vặt. Lưu đuôi .cpp xong thì code mới được tô màu. - Gõ code (chương trình ở Phần 2 bên dưới).
- Bấm F9 (Build and run – biên dịch rồi chạy). Một cửa sổ đen (console) hiện lên in kết quả. Dòng
Process returned 0nghĩa là chương trình kết thúc bình thường; bấm phím bất kỳ để đóng.
Gõ code ở cửa sổ chính, bấm F9, kết quả hiện ở cửa sổ console màu đen.
| Hiện tượng | Nguyên nhân thường gặp | Cách sửa |
|---|---|---|
Báo lỗi expected ';' before ... | Quên dấu ; ở cuối lệnh (thường là dòng ngay phía trên dòng báo lỗi) | Thêm dấu ; |
Báo lỗi 'Cout' was not declared | C++ phân biệt chữ hoa, chữ thường | Viết đúng cout, cin, main |
| Code không được tô màu, bấm F9 không chạy | Chưa lưu file, hoặc lưu thiếu đuôi .cpp | Lưu lại với tên ten.cpp |
Permission denied khi build | Cửa sổ kết quả của lần chạy trước vẫn đang mở | Đóng cửa sổ đen cũ rồi bấm F9 lại |
| In chữ tiếng Việt có dấu bị lỗi font | Cửa sổ console của Windows hiển thị Unicode không tốt | Khi luyện tập in chữ không dấu; đề thi cũng không bao giờ yêu cầu in tiếng Việt |
.py rồi bấm F5 để chạy. Còn nếu chưa muốn cài gì cả, các bạn có thể dùng trang Chạy code online ngay trên web mình để chạy thử cả C++ và Python.Phần 2Chương trình C++ đầu tiên
Truyền thống của dân lập trình là chương trình đầu tiên chỉ in ra một câu chào. Các bạn gõ lại y chang code dưới đây vào Code::Blocks, bấm F9 xem kết quả, rồi bấm Tiếp ▶ trong khung chạy tay để hiểu từng dòng:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
// In ra màn hình 2 dòng chữ
cout << "Xin chao cac ban!" << endl;
cout << "Minh dang hoc C++";
return 0;
}
# In ra màn hình 2 dòng chữ
print("Xin chao cac ban!")
print("Minh dang hoc C++")
{ } của main:
#include <iostream>
using namespace std;
int main(){
// viết các lệnh ở đây
return 0;
}
Trong các lời giải trên web, mình hay viết #include <bits/stdc++.h> thay cho #include <iostream>: dòng này nạp tất cả thư viện chuẩn một lần (iostream, iomanip, cmath, algorithm…) nên đỡ phải nhớ từng thư viện. Trình biên dịch GCC trong Code::Blocks và các trang chấm bài đều dùng được.- Mỗi lệnh kết thúc bằng dấu chấm phẩy
;. Python thì không cần dấu;nhưng mỗi lệnh phải nằm trên một dòng. - C++ dùng cặp ngoặc
{ }để gom nhóm lệnh, còn Python dùng thụt lề (4 dấu cách). Tuy C++ không bắt buộc thụt lề nhưng các bạn vẫn nên thụt cho code dễ đọc. - Chú thích (comment) để ghi chú cho người đọc, máy bỏ qua: C++ dùng
//, Python dùng#.
Phần 3Biến và các kiểu dữ liệu cơ bản
Biến là một "chiếc hộp" có tên, nằm trong bộ nhớ máy tính, dùng để chứa dữ liệu. Trong C++, trước khi dùng biến phải khai báo: cho biết tên hộp và kiểu dữ liệu (hộp đựng loại gì: số nguyên, số thực, chữ…). Kiểu dữ liệu quyết định hộp to bao nhiêu và chứa được giá trị trong khoảng nào.
| Kiểu C++ | Chứa gì | Kích thước / phạm vi | Ví dụ | Python tương ứng |
|---|---|---|---|---|
| int | Số nguyên | 4 byte, từ $-2^{31}$ đến $2^{31}-1$ (khoảng ±2,1 tỷ) | int n = 100; | int |
| long long | Số nguyên lớn | 8 byte, khoảng ±9,2 · 1018 | long long s = 1e18; | int (không giới hạn) |
| double | Số thực | 8 byte, chính xác khoảng 15 chữ số | double x = 3.14; | float |
| char | 1 ký tự | 1 byte, viết trong nháy đơn | char c = 'A'; | str độ dài 1 |
| bool | Đúng / sai | true hoặc false | bool ok = true; | bool (True/False) |
| string | Xâu ký tự | Viết trong nháy kép, cần #include <string> | string s = "abc"; | str |
Một vài quy tắc đặt tên biến: chỉ gồm chữ cái tiếng Anh, chữ số và dấu gạch dưới _; không bắt đầu bằng chữ số; không trùng từ khoá (int, for, if…); phân biệt hoa thường (tong và Tong là 2 biến khác nhau). Nên đặt tên có ý nghĩa như tong, dem, chieuDai thay vì a1, xyz.
Python thì không cần khai báo kiểu: gán giá trị gì thì biến tự mang kiểu đó (x = 5 là int, x = 5.0 là float). Tiện, nhưng cũng vì vậy mà Python chạy chậm hơn.
Tràn số – lỗi hay gặp nhất của người mới học C++
Hộp int chỉ chứa được tới khoảng 2,1 tỷ. Nếu kết quả phép tính vượt quá thì nó không báo lỗi mà ra một số sai bét, thậm chí ra số âm. Đề bài cho $a, b \le 10^5$ mà hỏi $a \times b$ là phải nghĩ ngay tới long long. Thử bấm mẫu "Tràn số" bên dưới:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
int x = a * b;
long long y = 1LL * a * b;
cout << x << endl;
cout << y;
return 0;
}
a, b = map(int, input().split())
x = a * b # Python: số nguyên không giới hạn, không bao giờ tràn
y = a * b
print(x)
print(y)
long long. Rất nhiều bạn mất điểm oan ở các test lớn chỉ vì quên điều này. Python không bị tràn số nên không lo chuyện này.Mô phỏng trực quan. “Biến là chiếc hộp” nghe thì dễ, nhưng nhiều bạn mới học vẫn hiểu sai dòng a = a * 2. Em bấm Tiếp để xem từng dòng lệnh làm gì với các hộp trong bộ nhớ, rồi thử đổi giá trị a, b:
Vì sao số int quá lớn lại biến thành số âm? Em hình dung các giá trị int xếp thành một vòng tròn: đi quá điểm lớn nhất là vòng sang điểm nhỏ nhất. Mô phỏng dưới đây cộng dần một số vào x để em thấy kim “quay vòng”:
Phần 4Nhập xuất dữ liệu và các phép toán
- Nhập:
cin >> a >> b;đọc lần lượt từng số, các số cách nhau dấu cách hay xuống dòng đều được. - Xuất:
cout << a << " " << b << endl;nối nhiều thứ bằng<<, tự thêm dấu cách" ",endlđể xuống dòng. - Số thực:
cout << fixed << setprecision(2) << x;(cần#include <iomanip>).
- Nhập:
input()đọc cả một dòng thành xâu. Muốn 1 số:n = int(input()). Nhiều số trên 1 dòng:a, b = map(int, input().split()). - Xuất:
print(a, b)tự thêm dấu cách giữa các giá trị và tự xuống dòng ở cuối. - Số thực:
print(f"{x:.2f}").
| Phép toán | C++ | Python | Ví dụ với a = 17, b = 5 |
|---|---|---|---|
| Cộng, trừ, nhân | + - * | + - * | 22, 12, 85 |
| Chia lấy phần nguyên | a / b (khi a, b đều là số nguyên) | a // b | 3 |
| Chia lấy dư | a % b | a % b | 2 |
| Chia ra số thực | (double)a / b hoặc a / 5.0 | a / b | 3.4 |
| Luỹ thừa | pow(a, b) (thư viện cmath, trả về số thực) | a ** b | 1419857 |
Chạy tay chương trình tính đủ các phép toán để thấy rõ sự khác nhau giữa chia nguyên, chia dư và chia số thực:
Code C++ và Python
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
cout << a + b << endl;
cout << a - b << endl;
cout << a * b << endl;
cout << a / b << endl;
cout << a % b << endl;
double c = (double)a / b;
cout << fixed << setprecision(2) << c << endl;
return 0;
}
a, b = map(int, input().split())
print(a + b)
print(a - b)
print(a * b)
print(a // b) # chia lấy phần nguyên
print(a % b) # chia lấy dư
c = a / b # trong Python, dấu / luôn cho số thực
print(f"{c:.2f}")
cout << 7 / 2; in ra 3 chứ không phải 3.5, vì 7 và 2 đều là số nguyên nên C++ chia lấy phần nguyên. Muốn ra 3.5 phải có ít nhất 1 số là số thực: 7.0 / 2 hoặc (double)7 / 2. Ngoài ra với số âm, C++ và Python cũng khác nhau: C++ cho -7 / 2 = -3 và -7 % 2 = -1, còn Python cho -7 // 2 = -4 và -7 % 2 = 1.Một ứng dụng rất hay của / và %: đổi đơn vị. Ví dụ đổi $n$ giây ra giờ, phút, giây:
Code C++ và Python
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int gio = n / 3600;
int du = n % 3600;
int phut = du / 60;
int giay = du % 60;
cout << gio << " gio " << phut << " phut " << giay << " giay";
return 0;
}
n = int(input())
gio = n // 3600
du = n % 3600
phut = du // 60
giay = du % 60
print(gio, "gio", phut, "phut", giay, "giay")
Phép / và % với số nguyên là chỗ các bạn mới học hay nhầm nhất. Em xem mô phỏng chia kẹo dưới đây: chia đều cho mỗi bạn b viên, số bạn nhận được chính là a / b, số kẹo thừa là a % b:
Bài tậpLuyện nhập xuất và kiểu dữ liệu
Mỗi bài các bạn tự code bằng C++ (và Python nếu muốn), chạy với ví dụ xem có đúng output không. Bí thì mở gợi ý, vẫn bí mới xem code tham khảo nhé.
Nhập vào tên của bạn (một từ, không dấu, không có dấu cách). In ra Xin chao <tên>!.
NamXin chao Nam!💡 Gợi ý
string (nhớ #include <string>), đọc bằng cin >> ten; rồi in: cout << "Xin chao " << ten << "!";. Chú ý dấu cách sau chữ "chao".Xem code tham khảo (C++ / Python)
#include <iostream>
#include <string>
using namespace std;
int main(){
string ten;
cin >> ten;
cout << "Xin chao " << ten << "!";
return 0;
}
ten = input()
print("Xin chao " + ten + "!")
Nhập 2 số nguyên dương $a, b$ ($a, b \le 10^9$) là chiều dài và chiều rộng. In ra chu vi và diện tích, cách nhau một dấu cách.
3 414 12💡 Gợi ý
long long a, b;. Đây đúng là cái bẫy tràn số ở phần 3.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
long long a, b; // a * b có thể tới 10^18 nên dùng long long
cin >> a >> b;
cout << 2 * (a + b) << " " << a * b;
return 0;
}
a, b = map(int, input().split())
print(2 * (a + b), a * b)
Nhập bán kính $r$ (số thực). In ra diện tích hình tròn với đúng 2 chữ số thập phân, lấy $\pi = 3.14159265358979$.
2.519.63💡 Gợi ý
double cho cả $r$ và kết quả $S = \pi r^2$, in bằng fixed << setprecision(2). Hằng số $\pi$ nên khai báo const double PI = 3.14159265358979; (const nghĩa là hằng, không cho đổi giá trị). Python đọc số thực bằng float(input()).Xem code tham khảo (C++ / Python)
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
const double PI = 3.14159265358979;
double r;
cin >> r;
cout << fixed << setprecision(2) << PI * r * r;
return 0;
}
PI = 3.14159265358979
r = float(input())
print(f"{PI * r * r:.2f}")
Nhập nhiệt độ $C$ (độ C). In ra nhiệt độ tương ứng theo độ F với 1 chữ số thập phân, biết $F = C \times \dfrac{9}{5} + 32$.
3798.6💡 Gợi ý
int thì C * 9 / 5 là phép chia nguyên: $37 \times 9 = 333$, $333 / 5 = 66$ (mất phần lẻ 0.6) → in ra 98 thay vì 98.6. Cách an toàn là khai báo double c; từ đầu.Xem code tham khảo (C++ / Python)
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
double c;
cin >> c;
double f = c * 9 / 5 + 32;
cout << fixed << setprecision(1) << f;
return 0;
}
c = float(input())
f = c * 9 / 5 + 32
print(f"{f:.1f}")
Nhập số nguyên $n$ có đúng 3 chữ số. In ra tổng các chữ số của nó.
1236💡 Gợi ý
n / 100, hàng chục là n / 10 % 10, hàng đơn vị là n % 10. Ví dụ $123$: $123/100 = 1$, $123/10 = 12$ rồi $12 \% 10 = 2$, $123 \% 10 = 3$. Kỹ thuật "tách chữ số" này bài 4 (vòng lặp) sẽ dùng lại cho số có bao nhiêu chữ số cũng được.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int tram = n / 100; // chữ số hàng trăm
int chuc = n / 10 % 10; // chữ số hàng chục
int dv = n % 10; // chữ số hàng đơn vị
cout << tram + chuc + dv;
return 0;
}
n = int(input())
tram = n // 100 # chữ số hàng trăm
chuc = n // 10 % 10 # chữ số hàng chục
dv = n % 10 # chữ số hàng đơn vị
print(tram + chuc + dv)
Nhập 3 số nguyên $a, b, c$. In ra trung bình cộng của chúng với 2 chữ số thập phân.
1 2 42.33💡 Gợi ý
(a + b + c) / 3 sẽ ra 2 (chia nguyên)! Phải chia cho 3.0 để ra số thực rồi mới in với setprecision(2).Xem code tham khảo (C++ / Python)
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b >> c;
double tb = (a + b + c) / 3.0; // chia cho 3.0 để ra số thực
cout << fixed << setprecision(2) << tb;
return 0;
}
a, b, c = map(int, input().split())
tb = (a + b + c) / 3
print(f"{tb:.2f}")
Nhập 2 số nguyên $a, b$. Hoán đổi giá trị của 2 biến rồi in ra $a$ và $b$.
3 55 3💡 Gợi ý
t: t = a; a = b; b = t;. Đề yêu cầu đổi giá trị của biến, nên đừng "ăn gian" bằng cách in b trước a nhé 😄.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int a, b;
cin >> a >> b;
int t = a; // cốc thứ 3
a = b;
b = t;
cout << a << " " << b;
return 0;
}
a, b = map(int, input().split())
a, b = b, a
print(a, b)
Có $n$ cái kẹo chia đều cho $k$ bạn. Hỏi mỗi bạn được bao nhiêu cái và còn dư bao nhiêu cái?
17 53 2💡 Gợi ý
n / k cái, còn dư n % k cái. Python dùng n // k và n % k.Xem code tham khảo (C++ / Python)
#include <iostream>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
cout << n / k << " " << n % k;
return 0;
}
n, k = map(int, input().split())
print(n // k, n % k)
Bài tiếp theo (bài 3) mình sẽ học câu lệnh điều kiện rẽ nhánh if – else: dạy cho máy tính biết "nếu… thì… còn không thì…".
- Không biết học gì trước, học gì sau, học lan man nên kiến thức bị hổng.
- Bí bài không ai gỡ, ngồi cả buổi vẫn không ra rồi bỏ cuộc.
- Code chạy được nhưng không đủ điểm, không biết sai ở đâu, chậm ở đâu.
- Không có đề thi thử và người chấm, nên không biết mình đang ở mức nào.
- Dễ nản giữa chừng khi không có ai theo sát.
- Lộ trình 111 buổi video sắp sẵn từ dòng code đầu tiên đến đề HSG thật của các tỉnh.
- Thầy trực tiếp gỡ bí, chữa bài cho từng em qua nhóm Zalo riêng.
- Hệ thống chấm bài tự động 24/7 và thi thử HSG hằng tuần để biết chính xác mình đang ở đâu.
- Đóng học phí một lần, thầy kèm lâu dài: từ thi chuyên Tin đến HSG quốc gia và cả khi lên đại học.

Nhận xét
Đăng nhận xét