Bài 3.1: Bài tập thực hành nhập xuất cơ bản trong C++

Bài 3.1: Bài tập thực hành nhập xuất cơ bản trong C++
Chào mừng trở lại với chuỗi bài viết về C++! Sau khi đã làm quen với cấu trúc cơ bản của một chương trình C++ ở các bài trước, hôm nay chúng ta sẽ đi sâu vào một khía cạnh cực kỳ quan trọng và thường xuyên sử dụng: Nhập xuất dữ liệu (Input/Output - I/O).
Một chương trình máy tính không chỉ đơn thuần là thực hiện các phép tính một cách "âm thầm" mà còn cần khả năng giao tiếp với thế giới bên ngoài. Nó cần lấy dữ liệu từ người dùng hoặc các nguồn khác để xử lý (nhập - input) và hiển thị kết quả hoặc thông báo ra màn hình, file, hay các thiết bị khác (xuất - output).
Trong C++, bộ đôi hoàn hảo cho việc nhập xuất cơ bản qua console (màn hình dòng lệnh) chính là cin
và cout
. Chúng ta sẽ tìm hiểu cách sử dụng chúng một cách hiệu quả qua các ví dụ thực hành chi tiết.
Để sử dụng cin
và cout
, bạn luôn cần phải bao gồm thư viện <iostream>
vào đầu file mã nguồn của mình.
#include <iostream> // Đây là dòng ma thuật!
int main() {
// Code nhập xuất của chúng ta sẽ ở đây
return 0;
}
cout
: Khi chương trình của bạn "Nói"
cout
(phát âm như "see-out") là đối tượng dùng để xuất dữ liệu ra luồng output chuẩn, mà thông thường là màn hình console của bạn. Bạn sử dụng toán tử <<
(toán tử chèn - insertion operator) để "đẩy" dữ liệu muốn hiển thị vào cout
.
Hãy xem vài ví dụ đơn giản:
Ví dụ 1: Xuất một dòng chữ (String)
#include <iostream>
int main() {
cout << "Xin chao, day la C++!" << endl;
return 0;
}
Giải thích:
cout
là đối tượng output.<<
là toán tử chèn. Nó lấy dữ liệu ở bên phải ("Xin chao, day la C++!"
) và đẩy nó ra luồngcout
."Xin chao, day la C++!"
là một chuỗi ký tự (string literal), được đặt trong dấu nháy kép.endl
(end-line) cũng được đẩy vào luồng output. Nó có chức năng xuống dòng và xóa bộ đệm (flush the buffer). Việc xuống dòng giúp output dễ đọc hơn. Bạn cũng có thể dùng'\n'
(ký tự xuống dòng) thay choendl
,'\n'
thường hiệu quả hơn về mặt tốc độ nếu bạn không cần xóa bộ đệm ngay lập tức.
Output của chương trình trên sẽ là:
Xin chao, day la C++!
Ví dụ 2: Xuất một số
#include <iostream>
int main() {
cout << 12345 << endl;
cout << 3.14159 << '\n'; // Dùng '\n' cũng được
return 0;
}
Giải thích:
- Bạn có thể trực tiếp xuất các số nguyên (integer) như
12345
và số thực (floating-point) như3.14159
mà không cần dấu nháy kép. - C++ đủ thông minh để biết cách hiển thị chúng.
Output:
12345
3.14159
Ví dụ 3: Xuất giá trị của biến
Bạn có thể lưu trữ dữ liệu trong các biến và xuất giá trị của chúng.
#include <iostream>
#include <string> // Cần thư viện string để dùng string
int main() {
int tuoi = 25;
double chieuCao = 1.75;
string ten = "Nguyen Van A"; // Khai báo biến kiểu string
cout << "Ten: " << ten << endl;
cout << "Tuoi: " << tuoi << " nam" << endl;
cout << "Chieu cao: " << chieuCao << " met" << '\n';
return 0;
}
Giải thích:
- Chúng ta khai báo ba biến:
tuoi
(kiểuint
),chieuCao
(kiểudouble
), vàten
(kiểustring
). Lưu ý cần#include <string>
để sử dụngstring
. - Chúng ta có thể kết hợp nhiều thứ trên cùng một dòng output bằng cách nối các toán tử
<<
lại với nhau:cout << "Ten: " << ten << endl;
. cout
sẽ xuất"Ten: "
, sau đó xuất giá trị của biếnten
("Nguyen Van A"
), rồi mới xuống dòng.
Output:
Ten: Nguyen Van A
Tuoi: 25 nam
Chieu cao: 1.75 met
cin
: Khi chương trình của bạn "Lắng nghe"
cin
(phát âm như "see-in") là đối tượng dùng để nhập dữ liệu từ luồng input chuẩn, mà thông thường là bàn phím của người dùng. Bạn sử dụng toán tử >>
(toán tử trích xuất - extraction operator) để "lấy" dữ liệu từ cin
và lưu nó vào một biến.
Ví dụ 4: Nhập một số nguyên
#include <iostream>
int main() {
int soLuong; // Khai báo biến để lưu trữ dữ liệu nhập
cout << "Moi nhap so luong san pham: "; // Nhắc người dùng nhập liệu
cin >> soLuong; // Đọc dữ liệu từ bàn phím và lưu vào biến soLuong
cout << "Ban da nhap: " << soLuong << " san pham." << endl;
return 0;
}
Giải thích:
- Chúng ta khai báo một biến
soLuong
kiểuint
. - Dòng
cout
đầu tiên là một lời nhắc (prompt) cho người dùng biết chương trình đang chờ họ nhập gì. Đây là một thói quen tốt khi sử dụngcin
. cin >> soLuong;
thực hiện việc đọc. Khi chương trình chạy đến dòng này, nó sẽ dừng lại và chờ người dùng gõ dữ liệu từ bàn phím, sau đó nhấn Enter. Dữ liệu người dùng gõ vào sẽ được trích xuất và lưu trữ vào biếnsoLuong
.- Dòng
cout
cuối cùng hiển thị lại giá trị vừa nhập để xác nhận.
Nếu người dùng nhập 15
và nhấn Enter, output sẽ là:
Moi nhap so luong san pham: 15
Ban da nhap: 15 san pham.
Ví dụ 5: Nhập một số thực
Tương tự với số nguyên, bạn có thể nhập số thực vào biến kiểu double
hoặc float
.
#include <iostream>
int main() {
double giaCa;
cout << "Moi nhap gia cua san pham: ";
cin >> giaCa;
cout << "Gia ban vua nhap la: " << giaCa << " VND." << endl;
return 0;
}
Giải thích:
- Hoạt động tương tự như nhập số nguyên, nhưng dữ liệu được đọc và lưu vào biến
giaCa
kiểudouble
.
Nếu người dùng nhập 99.50
và nhấn Enter, output sẽ là:
Moi nhap gia cua san pham: 99.50
Gia ban vua nhap la: 99.50 VND.
Ví dụ 6: Nhập một từ (String)
Khi sử dụng cin >> tenBienKieuString
, toán tử >>
sẽ đọc các ký tự từ input cho đến khi gặp ký tự trắng đầu tiên (khoảng trắng, tab, hoặc ký tự xuống dòng) và lưu chuỗi ký tự đó vào biến string.
#include <iostream>
#include <string>
int main() {
string tenRieng;
cout << "Moi nhap ten rieng cua ban: ";
cin >> tenRieng; // Chi doc mot tu
cout << "Ten rieng cua ban la: " << tenRieng << endl;
return 0;
}
Giải thích:
- Chúng ta khai báo biến
tenRieng
kiểustring
. cin >> tenRieng;
đọc input.
Nếu người dùng nhập Hoa Nguyen
và nhấn Enter, output sẽ là:
Moi nhap ten rieng cua ban: Hoa Nguyen
Ten rieng cua ban la: Hoa
Bạn thấy đấy, chỉ có từ "Hoa" được đọc vào biến tenRieng
. Phần " Nguyen" vẫn còn trong bộ đệm input và sẽ ảnh hưởng đến các thao tác nhập tiếp theo (nếu có).
Ví dụ 7: Nhập cả dòng (Line)
Để đọc toàn bộ dòng input, bao gồm cả khoảng trắng, bạn nên sử dụng hàm getline
. Hàm này thường được sử dụng với cin
. Cú pháp cơ bản là getline(luong_input, bien_string);
.
#include <iostream>
#include <string>
#include <limits> // Can cho cin.ignore
int main() {
string hoVaTen;
cout << "Moi nhap ho va ten day du cua ban: ";
// Can xu ly bo dem neu co lenh cin >> truoc do
// cin.ignore(numeric_limits<streamsize>::max(), '\n');
getline(cin, hoVaTen); // Doc toan bo dong cho den khi gap Enter
cout << "Ho va ten day du cua ban la: " << hoVaTen << endl;
return 0;
}
Giải thích:
- Chúng ta sử dụng
getline(cin, hoVaTen);
để đọc toàn bộ dòng input (bao gồm cả khoảng trắng) cho đến khi người dùng nhấn Enter, và lưu kết quả vào biếnhoVaTen
. - Lưu ý quan trọng: Nếu trước lệnh
getline
có một lệnhcin >> ...;
(đọc số hoặc một từ), ký tự Enter (\n
) cuối cùng của lệnh nhập trước đó có thể vẫn còn lại trong bộ đệm input. Khigetline
chạy, nó sẽ đọc ngay ký tự\n
đó và dừng lại, khiến chuỗihoVaTen
bị rỗng. Để khắc phục, bạn cần xóa bộ đệm input trước khi gọigetline
. Dòng codecin.ignore(...)
(đã chú thích trong ví dụ) là cách phổ biến để làm điều này. Tuy nhiên, trong ví dụ này,getline
là lệnh nhập đầu tiên saumain
, nên không cần xử lý bộ đệm. Chúng ta sẽ gặp lại vấn đề này và cách giải quyết chi tiết hơn trong các bài tập nâng cao.
Nếu người dùng nhập Tran Thi B
và nhấn Enter, output sẽ là:
Moi nhap ho va ten day du cua ban: Tran Thi B
Ho va ten day du cua ban la: Tran Thi B
Kết hợp cin
và cout
: Chương trình Tương tác
Sức mạnh của nhập xuất nằm ở việc kết hợp chúng để tạo ra các chương trình tương tác với người dùng.
Ví dụ 8: Hỏi tên và chào mừng
#include <iostream>
#include <string>
int main() {
string ten;
// Buoc 1: Nhac nguoi dung nhap ten
cout << "Ban ten la gi? ";
// Buoc 2: Doc ten tu ban phim
// Dung getline de doc ca ho va ten neu co khoang trang
getline(cin, ten);
// Buoc 3: Hien thi loi chao su dung ten vua nhap
cout << "Xin chao, " << ten << "! Rat vui duoc gap ban." << endl;
return 0;
}
Giải thích:
- Chương trình in lời nhắc.
- Sử dụng
getline
để đọc tên đầy đủ (có thể có khoảng trắng). - In lời chào cá nhân hóa bằng cách nối chuỗi cố định với biến
ten
.
Nếu người dùng nhập Pham Van C
và nhấn Enter, output:
Ban ten la gi? Pham Van C
Xin chao, Pham Van C! Rat vui duoc gap ban.
Ví dụ 9: Tính tổng hai số
#include <iostream>
int main() {
int so1, so2; // Khai bao hai bien so nguyen
int tong;
// Buoc 1: Nhac nguoi dung nhap so thu nhat
cout << "Moi nhap so nguyen thu nhat: ";
// Buoc 2: Doc so thu nhat
cin >> so1;
// Buoc 3: Nhac nguoi dung nhap so thu hai
cout << "Moi nhap so nguyen thu hai: ";
// Buoc 4: Doc so thu hai
cin >> so2;
// Buoc 5: Thuc hien phep tinh
tong = so1 + so2;
// Buoc 6: Hien thi ket qua
cout << "Tong cua " << so1 << " va " << so2 << " la: " << tong << endl;
return 0;
}
Giải thích:
- Chương trình yêu cầu nhập hai số lần lượt.
- Sử dụng
cin
hai lần để đọc vàoso1
vàso2
. - Tính tổng và lưu vào biến
tong
. - In kết quả ra màn hình, bao gồm cả các số đã nhập và kết quả tính được.
Nếu người dùng nhập 10
(Enter) rồi 25
(Enter), output:
Moi nhap so nguyen thu nhat: 10
Moi nhap so nguyen thu hai: 25
Tong cua 10 va 25 la: 35
Comments