Mục lục 0.1 Nhập xuất và tính công thức đơn giản. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 0.2 Rẽ nhánh if...else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 0.3 switch...case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 0.4 Vòng lặp for - tính tổng, tích, đếm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 0.4.1 Tính tổng từ 1 đến n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0.4.2 Tính tổng số chẵn từ 1 đến n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0.4.3 Tính giai thừa n ! = 1 · 2 · 3 · ... · n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0.4.4 Đếm số ước của n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 0.4.5 Kiểm tra số nguyên tố . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 0.5 Vòng lặp while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 0.6 do...while kiểm tra nhập liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 0.7 break và continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 0.8 Hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 0.8.1 Hàm có trả về giá trị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 0.8.2 Hàm không trả về giá trị void . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 0.8.3 Truyền tham trị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 0.8.4 Truyền tham chiếu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 0.8.5 Hàm hoán vị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 0.8.6 Hàm kiểm tra số nguyên tố . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 0.8.7 Hàm đệ quy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 0.9 Bài tập củng cố . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 0.10 Các lỗi sai cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Dấu hiệu trong đề Nên dùng Nếu... thì... if...else Xét nhiều trường hợp if...else if hoặc switch Tính tổng/tích/đếm từ 1 đến n for Nhập đến khi hợp lệ do...while Không biết trước số lần lặp while Viết hàm tính... hàm có return Viết hàm nhập/xuất/hoán vị hàm truyền tham chiếu & Tính giai thừa, Fibonacci, tổng đệ quy hàm đệ quy 0.1 Nhập xuất và tính công thức đơn giản Bài 1. Tính chu vi, diện tích hình chữ nhật Tư duy: 1 { } Programming Notes MỤC LỤC • Input: chiều dài, chiều rộng • Process: S = dai × rong ; P = 2( dai + rong ) • Output: diện tích, chu vi cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 float dai, rong, S, P; 6 cout << "Nhap chieu dai: "; cin >> dai; 7 cout << "Nhap chieu rong: "; cin >> rong; 8 S = dai * rong; P = 2 * (dai + rong); 9 cout << "Dien tich = " << S << endl; 10 cout << "Chu vi = " << P << endl; 11 return 0; 12 } Các bài toán thông dụng: Tính diện tích hình tròn; Tính chu vi hình chữ nhật; Tính trung bình cộng 3 số; Đổi độ C sang độ F; Tính tiền điện, tiền lương, tiền mua hàng. 0.2 Rẽ nhánh if...else Bài 2. Kiểm tra số chẵn lẻ. Tư duy: Nếu n % 2 == 0 thì chẵn. Ngược lại là lẻ. cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 int n; 6 cout << "Nhap n: "; cin >> n; 7 if (n % 2 == 0) cout << "So chan"; 8 else cout << "So le"; 9 return 0; 10 } Bài 3. Tìm số lớn nhất trong 3 số. 2 { } Programming Notes MỤC LỤC cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 int a, b, c, max; 6 cout << "Nhap cac so a, b, c: "; 7 cin >> a >> b >> c; 8 max = a; 9 if (b > max) max = b; 10 if (c > max) max = c; 11 cout << "So lon nhat la: " << max; 12 return 0; 13 } Bài 4. Nhập hai số nguyên a, b . Giải phương trình bậc nhất ax + b = 0 Tư duy: Nếu a == 0 : • Nếu b == 0 : vô số nghiệm. • Nếu b != 0 : vô nghiệm. Nếu a != 0 : có nghiệm x = − b a cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 float a, b, x; 6 cout << "Nhap cac he so a, b: "; cin >> a >> b; 7 if (a == 0) { 8 if (b == 0) cout << "Phuong trinh vo so nghiem"; 9 else cout << "Phuong trinh vo nghiem"; 10 } else { 11 x = -b / a; 12 cout << "Nghiem x = " << x; 13 } 14 return 0; 3 { } Programming Notes MỤC LỤC 15 } 0.3 switch...case Bài 5. Nhập hai số và một phép toán cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 float a, b; char op; 6 cin >> a >> b; cin >> op; 7 switch (op) { 8 case ’+’: 9 cout << a + b; break ; 10 case ’-’: 11 cout << a - b; break ; 12 case ’*’: 13 cout << a * b; break ; 14 case ’/’: 15 if (b != 0) cout << a / b; 16 else cout << "Khong chia duoc cho 0"; 17 break ; 18 default : 19 cout << "Phep toan khong hop le"; 20 } 21 return 0; 22 } o Note Mỗi case nên có break . Nếu quên break , chương trình sẽ chạy tiếp xuống case bên dưới. 0.4 Vòng lặp for - tính tổng, tích, đếm Cấu trúc vòng for được quy định như sau: 4 { } Programming Notes MỤC LỤC cpp 1 for (khoi_tao; dieu_kien; cap_nhat) { 2 than_vong_lap; 3 } 0.4.1. Tính tổng từ 1 đến n cpp 1 int s = 0; 2 for ( int i = 1; i <= n; i++) { 3 s = s + i; 4 } 0.4.2. Tính tổng số chẵn từ 1 đến n cpp 1 int s = 0; 2 for ( int i = 1; i <= n; i++) { 3 if (i % 2 == 0) 4 s = s + i; 5 } 0.4.3. Tính giai thừa n ! = 1 · 2 · 3 · ... · n cpp 1 int p = 1; 2 for ( int i = 1; i <= n; i++) { 3 p = p * i; 4 } 0.4.4. Đếm số ước của n cpp 1 int dem = 0; 2 for ( int i = 1; i <= n; i++) { 3 if (n % i == 0) dem++; 4 } 5 { } Programming Notes MỤC LỤC 0.4.5. Kiểm tra số nguyên tố Một số nguyên tố là số lớn hơn 1 và chỉ có 2 ước là 1 và chính nó. cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 int n, dem = 0; 6 cout << "Nhap so tu nhien n: "; cin >> n; 7 for ( int i = 1; i <= n; i++) { 8 if (n % i == 0) dem++; 9 } 10 11 if (dem == 2) cout << "La so nguyen to"; 12 else cout << "Khong la so nguyen to"; 13 return 0; 14 } Cách này không tối ưu nhưng dễ nhớ, ít sai. Cách trên chưa tối ưu vì nó kiểm tra từ 1 đến n . Ví dụ n = 1000000 thì vòng lặp chạy tới 1 triệu lần. cpp 1 #include <iostream> 2 using namespace std; 3 4 int main() { 5 int n; 6 cout << "Nhap n: "; cin >> n; 7 int kt = 1; 8 if (n < 2) kt = 0; 9 else { 10 for ( int i = 2; i * i <= n; i++) { 11 if (n % i == 0) { 12 kt = 0; 13 break ; 14 } 15 } 16 } 17 if (kt == 1) cout << n << " La so nguyen to"; 6 { } Programming Notes MỤC LỤC 18 else cout << n << " Khong la so nguyen to"; 19 return 0; 20 } Ví dụ chạy thử với n = 7 Ban đầu kt=1 . Vòng lặp: i=2 , 2*2<=7 đúng nên xét 7 % 2 != 0 (không chia hết). Tiếp theo i=3 , 3*3<=7 sai → dừng vòng lặp. kt=1 nên in La so nguyen to . 0.5 Vòng lặp while Dùng khi chưa biết trước số lần lặp. Bài 6. Nhập số nguyên dương. Nếu nhập sai thì nhập lại. cpp 1 int n; 2 cout << "Nhap n: "; cin >> n; 3 while (n <= 0) { 4 cout << "Nhap lai n: "; 5 cin >> n; 6 } 0.6 do...while kiểm tra nhập liệu cpp 1 int n; 2 do { 3 cout << "Nhap so nguyen duong n: "; cin >> n; 4 } while (n <= 0); Khác biệt quan trọng: • while : kiểm tra trước rồi mới làm. • do...while : làm ít nhất 1 lần rồi mới kiểm tra. Bài nhập liệu hợp lệ nên dùng do...while . 0.7 break và continue break : Thoát khỏi vòng lặp. Bài 7. Tìm số đầu tiên chia hết cho 7 từ 1 đến n 7 { } Programming Notes MỤC LỤC cpp 1 for ( int i = 1; i <= n; i++) { 2 if (i % 7 == 0) { 3 cout << i; 4 break ; 5 } 6 } continue : Bỏ qua lần lặp hiện tại. Bài 8. Viết chương trình in các số từ 1 đến n , bỏ qua số chia hết cho 3. cpp 1 for ( int i = 1; i <= n; i++) { 2 if (i % 3 == 0) continue ; 3 cout << i << " "; 4 } 0.8 Hàm 0.8.1. Hàm có trả về giá trị Dùng khi bài yêu cầu tính Bài 9. Viết hàm tính tổng từ 1 đến n cpp 1 int tong( int n) { 2 int s = 0; 3 for ( int i = 1; i <= n; i++) { 4 s = s + i; 5 } 6 return s; 7 } Dùng trong main : cpp 1 int main() { 2 int n; cin >> n; 3 cout << tong(n); 4 return 0; 8 { } Programming Notes MỤC LỤC 5 } Đoạn code hoàn chỉnh cpp 1 #include <iostream> 2 using namespace std; 3 4 int tinhTong( int n) { 5 int s = 0; 6 for ( int i = 1; i <= n; i++) { 7 s = s + i; 8 } 9 return s; 10 } 11 12 int main() { 13 int n; 14 cout << "Nhap n: "; cin >> n; 15 cout << "Tong tu 1 den " << n << " la: " << tinhTong(n); 16 return 0; 17 } 0.8.2. Hàm không trả về giá trị void Dùng khi bài yêu cầu nhập, xuất, hoán vị, xử lý trực tiếp. Bài 10. Hàm xuất các số từ 1 đến n cpp 1 void xuat( int n) { 2 for ( int i = 1; i <= n; i++) { 3 cout << i << " "; 4 } 5 } 0.8.3. Truyền tham trị Hàm nhận bản sao, không làm thay đổi biến gốc. 9 { } Programming Notes MỤC LỤC cpp 1 void tang( int x) { 2 x = x + 1; 3 } Nếu gọi: cpp 1 int a = 5; tang(a); cout << a; Kết quả vẫn là 5. 0.8.4. Truyền tham chiếu Dùng dấu & . Hàm làm thay đổi biến gốc. cpp 1 void tang( int &x) { 2 x = x + 1; 3 } Nếu gọi: cpp 1 int a = 5; tang(a); cout << a; Kết quả là 6. 0.8.5. Hàm hoán vị cpp 1 void hoanVi( int &a, int &b) { 2 int tam = a; 3 a = b; 4 b = tam; 5 } Dùng trong main : cpp 1 int main() { 2 int x, y; 3 cin >> x >> y; 10 { } Programming Notes MỤC LỤC 4 hoanVi(x, y); 5 cout << x << " " << y; 6 return 0; 7 } o Note Nếu không có & , hàm hoán vị sẽ không làm thay đổi x, y trong main. 0.8.6. Hàm kiểm tra số nguyên tố cpp 1 int laNguyenTo( int n) { 2 int dem = 0; 3 for ( int i = 1; i <= n; i++) { 4 if (n % i == 0) dem++; 5 } 6 if (dem == 2) return 1; 7 else return 0; 8 } Dùng trong main : cpp 1 int main() { 2 int n; 3 cout << "Nhap n: "; cin >> n; 4 if (laNguyenTo(n) == 1) cout << "La so nguyen to"; 5 else cout << "Khong la so nguyen to"; 6 return 0; 7 } 0.8.7. Hàm đệ quy Thường dùng cho các bài toán: Tính giai thừa; Tính tổng 1 + 2 + ... + n ; Tính Fibonacci; Bài 11. Giai thừa bằng đệ quy n ! = n · ( n − 1)! . Điểm dừng: 0! = 1 hoặc 1! = 1 cpp 1 int giaiThua( int n) { 2 if (n == 0 || n == 1) return 1; 11 { } Programming Notes MỤC LỤC 3 else return n * giaiThua(n - 1); 4 } Bài 12. Tổng từ 1 đến n bằng đệ quy cpp 1 int tong( int n) { 2 if (n == 1) return 1; 3 else return n + tong(n - 1); 4 } 0.9 Bài tập củng cố Bài 1. Nhập số nguyên dương n , tính tổng a) S = 1 + 2 + ... + n b) S = 2 + 4 + 6 + ... + n c) S = 1 + 3 + 5 + ... + n d) S = 1 2 + 2 2 + ... + n 2 e) S = 1 + 1 2 + ... + 1 n Bài 2. Viết chương trình kiểm tra n có là số: Chẵn/lẻ; Âm/dương/bằng 0; Số nguyên tố; Số chính phương; Số hoàn hảo; Số chia hết cho 3, 5, 7. Bài 3. Viết chương trình a) Tìm số lớn nhất trong 3 số. b) Tìm số nhỏ nhất trong 3 số. c) Tìm max trong dãy từ 1 đến n nhập từ bàn phím. n so cpp 1 int n, x, max; 2 cin >> n; cin >> x; 3 max = x; 4 for ( int i = 2; i <= n; i++) { 5 cin >> x; 12 { } Programming Notes MỤC LỤC 6 if (x > max) max = x; 7 } 8 cout << max; Bài 4. Viết hàm: tổng; giai thừa; kiểm tra số nguyên tố; hoán vị; ƯCLN Bài 5. Viết chương trình Tính ước chung lớn nhất, Tính bội chung nhỏ nhất. cpp 1 int UCLN( int a, int b) { 2 int ucln = 1; 3 for ( int i = 1; i <= a && i <= b; i++) { 4 if (a % i == 0 && b % i == 0) ucln = i; 5 } 6 return ucln; 7 } 8 int BCNN( int a, int b) { 9 return a * b / UCLN(a, b); 10 } Bài 6. Viết chương trình nhập số nguyên dương n , tính tổng các chữ số. cpp 1 int n, s = 0; cin >> n; 2 while (n > 0) { 3 s = s + n % 10; 4 n = n / 10; 5 } 6 cout << s; Bài 7. Đảo ngược số: nhập 1234, xuất 4321. cpp 1 int n, dao = 0; cin >> n; 2 while (n > 0) { 3 dao = dao * 10 + n % 10; 4 n = n / 10; 5 } 6 cout << dao; 13 { } Programming Notes MỤC LỤC 0.10 Các lỗi sai cơ bản 1. Thiếu dấu ; 2. Nhầm = và == : = là gán. == là so sánh. 3. Quên ngoặc nhọn { } 4. Quên khởi tạo tổng, tích, đếm: tong = 0 , tich = 1 , dem = 0 5. Sai điều kiện vòng lặp 6. Quên break trong switch 7. Sai truyền tham chiếu 14 { } Programming Notes