CHƯƠNG 1 – CÁC KHÁI NIỆM CƠ BẢN CỦA C++ A. KIẾN THỨC GHI NHỚ 1. Khung chương trình của C++ Một chương trình C++ có cấu trúc chung như sau: #include <bits/stdc++.h>//Khai báo thư viện using namespace std; //Các loại khai báo khác như chương trình con, biến…. int main() { //Các lệnh chính; } 2.
Câu lệnh, khoảng trắng, comment - Mỗi chương trình bao gồm nhiều câu lệnh hợp thành; câu lệnh là một đơn vị cơ bản của ngôn ngữ lập trình, nó là một tập hợp các chỉ thị được sắp xếp theo trình tự xác định và nhằm mục đích ra lệnh cho CPU tiến hành một thao tác cố định có ý nghĩa; - Ta có thể phân câu lệnh thành nhiều loại như: câu lệnh khai báo, câu lệnh định nghĩa, câu lệnh tính toán, câu lệnh gán, câu lệnh gọi,… - Câu lệnh đứng một mình riêng lẻ được gọi là câu lệnh đơn, các câu lệnh được gộp lại với nhau trong dấu {} thì ta gọi là câu lệnh ghép; - Trong C++ định nghĩa khoảng trắng là các ký tự cách trống và dấu enter; - Trong chương trình, để giải thích cho các câu lệnh ta thường sử dụng comment được đặt sau hai dấu gạch chéo // , chú ý rằng các comment sẽ bị trình biên dịch bỏ qua khi biên dịch thành mã máy; khi viết chương trình chúng ta cần có comment để giải thích chương trình rõ ràng hơn. Các kiểu dữ liệu chuẩn Ngôn ngữ C++ cung cấp một số kiểu dữ liệu chuẩn thường dùng sau đây. Chú ý rằng miền giá trị của các kiểu dữ liệu sẽ phụ thuộc vào hệ điều hành và cấu trúc của máy tính. Trong bảng sau miền giá trị xét trên hệ điều hành Windows 32 – bit.
Loại dữ liệu Tên kiểu Số ô nhớ Miền giá trị Kí tự char 1 byte − 128. 127 unsigned char 1 byte 0. 255 Số nguyên int 4 byte − 215. 215 – 1 unsigned int 4 byte 0.
216 – 1 long long 8 byte − 231. 231 – 1 unsigned long 8 byte 0. 232 − 1 long Nguyễn Đức Toàn, tmathcoding Algorithm with C++ Số thực float 4 byte Chính xác đến 7 chữ số double 8 byte Chính xác đến 15 chữ số long double 16 byte Chính xác đến 18 chữ số Logic bool 1 byte false – true (false là 0, true là 1) 4. Biến, hằng số, biểu thức và các lệnh vào ra Biến, hằng số, biểu thức: - Biến là vùng trống trong bộ nhớ máy tính dành cho một kiểu dữ liệu nào đó và phải có đặt tên; - Các biến trong bộ nhớ ở các thời điểm khác nhau có thể cất giữ các giá trị khác nhau; - Trước khi sử dụng một biến nào đó phải khai báo biến đó; - Cú pháp khai báo biến như sau: <kiểu dữ liệu> <danh sách biến>; int a, b; float x,y,z; - Hằng số là một vùng nhớ trong bộ nhớ máy tính có chứa một giá trị cố định nào đó không thay đổi trong suốt quá trình thực hiện chương trình; khai báo hằng như sau: const int a = 100; const double pi = 3.14; - Các giá trị biến, hằng tác động với nhau bằng các phép toán tạo nên các biểu thức.
S = a+b+c; double P = sqrt(b*b-4*a*c); Phép toán, lệnh gán: - Phép toán trên số nguyên: Phép cộng A+B Phép trừ A-B Phép nhân A*B Phép chia nguyên A/B Phép chia dư A%B - Phép toán trên số thực: Phép cộng A+B Phép trừ A-B Phép nhân A*B Phép chia A/B - Lệnh gán: lệnh gán là lệnh có dạng <biến> = <biểu thức>; có ý nghĩa tính toán giá trị của biểu thức rồi đổ dữ liệu đó vào trong biến. Ví dụ: Nguyễn Đức Toàn, tmathcoding Algorithm with C++ int a = 1, b = 2, S; S = a+b; Lệnh vào ra dữ liệu: - Với C++, ta có hai câu lệnh vào ra dữ liệu cơ bản là cin và cout. - Cú pháp của lệnh vào dữ liệu như sau: cin >> (biến 1) >> (biến 2) >> (biến 3); Ví dụ: cin >> a; cin >> a >> b >> c; - Cú pháp của lệnh ra dữ liệu như sau: cout << (biểu thức 1) << (biểu thức 2) << (biểu thức 3); Ví dụ: cout << a; cin << a + b + c; cout << endl; Một số kiểu dữ liệu có thể chuyển đổi cho nhau được như kiểu nguyên và kiểu thực. Để chuyển đổi các kiểu dữ liệu ta có câu lệnh ép kiểu như sau: - Chuyển số nguyên kiểu int a thành số thực kiểu float a:(float)a; - Cắt phần lẻ của số thực kiểu double b thành kiểu số nguyên long long b: (long long)b.
- Bản chất kiểu dữ liệu char cũng là một kiểu số nguyên nên ta có thể thực hiện lệnh ép biến ch kiểu char sang kiểu số số nguyên như sau: int(ch); B. CÁC VÍ DỤ MẪU Ví dụ 1.1: Chương trình in ra dòng chào mừng: #include <bits/stdc++.h> using namespace std; int main() { cout<<"Hello C++!"; } Ví dụ 1.2: Chương trình in ra tổng hai số nguyên a, b. #include <bits/stdc++.h> using namespace std; int main() { long long a,b; cin>>a>>b; cout<<a + b; } Ví dụ 1.3: Chương trình in ra tổng 𝑆 = 1 + 2 + ⋯ + 𝑛. #include <bits/stdc++.h> Nguyễn Đức Toàn, tmathcoding Algorithm with C++ using namespace std; int main() { long long n; cin>>n; cout<<n*(n+1)/2; } Chú ý: Ta dễ dàng chứng minh được 𝑆 = 𝑛(𝑛 + 1)/2 bằng quy nạp toán học.4: Chương trình tính toán số học: #include <bits/stdc++.h> using namespace std; int main() { long long a,b; float c; cin>>a>>b>>c; cout<<a+b<<endl<<a*b<<endl; cout<<a/b<<endl<<a%b<<endl; cout<<c*(float)a/b; } Chú ý: Ta có phép chia lấy nguyên giữa hai số nguyên là: 𝑎/𝑏, phép chia lấy dư giữa hai số nguyên là 𝑎%𝑏, phép chia lấy số thực của số nguyên ta cần ép sang kiểu thực bằng câu lệnh (float)a.
BÀI TẬP ÁP DỤNG Bài 1.1 – (N0101A) Nhập xuất Yêu cầu: Viết chương trình nhập vào một số nguyên và in ra số nguyên đó Dữ liệu: Một số nguyên kiểu int. Kết quả: In ra số nguyên vừa nhập vào. Ví dụ: Input output 10 10 Bài 1.2 – (N0102A) Tính toán 1 Yêu cầu: Viết chương trình in ra tổng hai số nguyên 𝑎 và 𝑏 kiểu 64 bit. Dữ liệu: Một dòng ghi hai số nguyên 𝑎, 𝑏 kiểu 64 bit.
Kết quả: Ghi ra tổng hai số nguyên. Ví dụ: input output 23 5 Nguyễn Đức Toàn, tmathcoding Algorithm with C++ Bài 1.3 – (N0103A) Tính toán 2 Yêu cầu: Viết chương trình nhập vào số nguyên 𝑛. In ra số gấp 3 lần số đó. Dữ liệu: Một dòng ghi một số nguyên 𝑛 kiểu 64 bit, Kết quả: Ghi ra số gấp 3 lần 𝑛.
Ví dụ: input output 3 9 Bài 1.4 – (N0104A) Tính toán 3 Yêu cầu: Viết chương trình in ra tích hai số nguyên 𝑎 và 𝑏 kiểu 32 bit. Dữ liệu: Một dòng ghi hai số nguyên 𝑎, 𝑏 kiểu int. Kết quả: Ghi ra tích hai số nguyên. Ví dụ: input output 23 6 Bài 1.
Dữ liệu: Một dòng ba số nguyên 𝑎, 𝑏, 𝑐 ( 0 < |𝑎|, |𝑏|, |𝑐|≤ 109 ). Kết quả: Một dòng ghi giá trị 𝑆 = 𝑎 ∗ (𝑏 + 𝑐) + 𝑏 ∗ (𝑎 + 𝑐). Ví dụ: input output 123 13 Bài 1.6 – (N0106A) Tính toán 5 Yêu cầu: Viết chương trình nhập vào hai số 𝑎, 𝑏. Dữ liệu: Một dòng ghi 2 số 𝑎, 𝑏 (0 ≤ |𝑎|, |𝑏| < 109 ).
Kết quả: Đưa ra kết quả 𝑎 + 𝑏 + 𝑎 ∗ 𝑏. Ví dụ: input output 11 3 Bài 1. Cho biết hàm lấy phần nguyên căn 𝑛 là int(sqrt(n)) hoặc (long long)(sqrt(n)), bản chất ở đây là ép kiểu thực sang kiểu nguyên và cắt đi phần lẻ. Dữ liệu: Một dòng ghi số nguyên 𝑛 (0 < 𝑛 ≤ 1018 ).
Nguyễn Đức Toàn, tmathcoding Algorithm with C++ Kết quả: Đưa ra kết quả 𝑛 + √𝑛. Ví dụ: input output 10 13 Bài 1.8 – (N0108B) Tổng 1 đến n Yêu cầu: Tính tổng 𝑆 = 1 + 2 + ⋯ 𝑛. Dữ liệu: Một dòng ghi số nguyên 𝑛 (0 < 𝑛 ≤ 109 ). Kết quả: Đưa ra kết quả 𝑆.
Ví dụ: input output 9 45 Bài 1. Dữ liệu: Một dòng ghi số nguyên 𝑛 (0 < 𝑛 ≤ 109 ). Kết quả: Đưa ra kết quả 𝑆. Ví dụ: input output 3 16 Bài 1.10 – (N0110B) Tổng bình phương Yêu cầu: Tính tổng 𝑆 = 12 + 22 + ⋯ + 𝑛2.
Dữ liệu: Một dòng ghi số nguyên 𝑛 (0 < 𝑛 ≤ 106 ). Kết quả: Đưa ra kết quả 𝑆. Ví dụ: input output 3 14 Bài 1.11 – (N0111A) Chia lấy nguyên - dư Yêu cầu: Viết chương trình nhập vào số nguyên dương 𝑛 và 𝑘 .k + r , in ra 𝑞 và 𝑟. Ta có phép chia lấy nguyên trong C++ là 𝑛/𝑘 và phép chia lấy dư là 𝑛%𝑘.
Dữ liệu: Một dòng ghi hai số nguyên 𝑛, 𝑘 (0 < 𝑛, 𝑘 ≤ 1018 ). Kết quả: Đưa ra kết quả 𝑞 và 𝑟 trên một dòng. Ví dụ: Nguyễn Đức Toàn, tmathcoding Algorithm with C++ input output 10 3 31 Bài 1. In ra tích của số liền trước và số liền sau của 𝑛.
Dữ liệu: Một dòng ghi số nguyên 𝑛. Kết quả: Đưa ra tích của số liền trước và số liền sau của 𝑛. Ví dụ: input output 10 99 Bài 1.13 – (N0113A) Phần nguyên – phần lẻ Yêu cầu: Viết chương trình nhập vào số thực 𝑥. In ra phần nguyên và phần lẻ của 𝑥.
Phần nguyên của 𝑥 có thể lên tới 1018. Dữ liệu: Một dòng ghi số thực 𝑥. Kết quả: Đưa ra kết quả là phần nguyên và phần lẻ của 𝑥 trên một dòng. Ví dụ: input output 1.14 – (N0114B) Phép chia Yêu cầu: Viết chương trình nhập vào 2 số nguyên 𝑎, 𝑏.
Ta chú ý câu lệnh chia lấy số thực như sau: cout << setprecision(2); cout<<fixed; cout<<a/(float)b; Dữ liệu: Một dòng ghi hai số nguyên 𝑎, 𝑏 (0 < 𝑎, 𝑏 ≤ 109 ). Kết quả: - Dòng 1 ghi 𝑎/𝑏 là kết quả phép chia lấy nguyên, - Dòng 2 ghi 𝑎%𝑏 là kết quả phép chia lấy dư, - Dòng 3 ghi 𝑎/𝑏 là kết quả phép chia lấy 2 chữ số sau dấu thập phân. Ví dụ: input output 4 2 2 0 2.00 Nguyễn Đức Toàn, tmathcoding Algorithm with C++ Bài 1.15 – (N0115C) Tổ hợp Yêu cầu: Mr X muốn chọn 3 thành viên ban cán sự trong lớp 10A2 có 𝑛 học sinh. Hỏi số cách chọn? Dữ liệu: Một dòng ghi số nguyên dương 𝑛 (0 < 𝑛 ≤ 106 ).
Kết quả: Đưa ra kết quả là số cách chọn. Ví dụ: input output 3 1 Bài 1.16 – (N0116B) Mã ASCII Yêu cầu: Biết một ký tự trong C++ được khai báo như sau: char ch;mỗi một ký tự đều có mã ASCII của nó. Cách in ra ký tự có mã ASCII là 𝑛 như sau: cout<<char(n); Dữ liệu: Một một số nguyên 𝑛 (65 < 𝑛 ≤ 127).