Bài 1.1: Nhập xuất sử dụng cin và cout trong C++

Bài 1.1: Nhập xuất sử dụng cin và cout trong C++
Chào mừng trở lại với hành trình chinh phục C++ cùng FullhouseDev! Sau khi bạn đã làm quen với cấu trúc cơ bản của một chương trình C++ đơn giản, đã đến lúc chúng ta tìm hiểu cách chương trình của mình có thể "nói chuyện" với thế giới bên ngoài và "lắng nghe" người dùng. Khả năng nhập và xuất dữ liệu là nền tảng cho mọi ứng dụng tương tác.
Trong bài học đầu tiên mang tính thực hành này, chúng ta sẽ đi sâu vào hai đối tượng cực kỳ quan trọng trong C++: cout
để xuất dữ liệu ra màn hình console, và cin
để nhập dữ liệu từ bàn phím. Đây là những công cụ bạn sẽ sử dụng liên tục trong quá trình lập trình C++, vì vậy hãy nắm vững chúng nhé!
Để sử dụng cin
và cout
, chúng ta cần bao gồm thư viện <iostream>
ở đầu file code của mình, và using namespace std;
.
1. Xuất dữ liệu ra màn hình với cout
cout
(viết tắt của console output) là đối tượng chuẩn được dùng để hiển thị thông tin ra luồng đầu ra chuẩn, mà thông thường chính là màn hình console (hoặc cửa sổ dòng lệnh).
Để "đẩy" dữ liệu ra cout
, chúng ta sử dụng toán tử chèn luồng (insertion operator), ký hiệu là <<
. Toán tử này lấy dữ liệu ở bên phải và gửi nó đến luồng cout
ở bên trái.
Ví dụ 1.1.1: In chuỗi ký tự cố định
Đơn giản nhất là in một dòng chữ chào mừng:
#include <iostream>
using namespace std;
int main() {
cout << "Chao mung den voi C++!"; // Su dung cout de in chuoi
return 0;
}
Giải thích code:
#include <iostream>
: Dòng này báo cho trình biên dịch rằng chúng ta muốn sử dụng các chức năng nhập/xuất được định nghĩa trong thư viện<iostream>
.cout
: Đây là đối tượngcout
.<<
: Toán tử chèn luồng."Chao mung den voi C++!"
: Đây là chuỗi ký tự mà chúng ta muốn hiển thị.
Khi chạy chương trình này, dòng chữ "Chao mung den voi C++!" sẽ xuất hiện trên màn hình console của bạn.
Ví dụ 1.1.2: In giá trị của biến
cout
không chỉ in được chuỗi cố định mà còn in được giá trị của các biến thuộc nhiều kiểu dữ liệu khác nhau như số nguyên (int
), số thực (double
), ký tự (char
), v.v.
#include <iostream>
int main() {
int soNguyen = 123;
double soThuc = 45.67;
char kyTu = 'X';
bool giaTriBool = true; // true thuong duoc in ra la 1, false la 0
cout << soNguyen;
cout << soThuc;
cout << kyTu;
cout << giaTriBool;
return 0;
}
Giải thích code:
- Chúng ta khai báo và gán giá trị cho các biến
soNguyen
,soThuc
,kyTu
,giaTriBool
. - Mỗi lệnh
cout << tenBien;
sẽ lấy giá trị hiện tại của biến và in nó ra luồng đầu ra. - Lưu ý: Kết quả in ra sẽ nằm liền kề nhau vì chúng ta chưa thêm ký tự xuống dòng.
Ví dụ 1.1.3: Xuống dòng với endl
và \n
Thông thường, sau khi in một thông tin, chúng ta muốn con trỏ xuống dòng để thông tin tiếp theo hiển thị ở dòng mới. Có hai cách phổ biến để làm điều này:
- Sử dụng
endl
: Chèn một ký tự xuống dòng và ép bộ đệm đầu ra (output buffer) phải gửi dữ liệu ra ngay lập tức (gọi là flushing). - Sử dụng ký tự đặc biệt
\n
(escape sequence cho newline): Chỉ đơn giản là chèn một ký tự xuống dòng. Nó thường không ép flush bộ đệm ngay lập tức (mặc dù với các chương trình nhỏ đơn giản thì bạn có thể không thấy sự khác biệt).
#include <iostream>
int main() {
cout << "Day la dong thu nhat." << endl; // Xuong dong va flush
cout << "Day la dong thu hai voi \\n.\n"; // Chi xuong dong
cout << "Dong cuoi cung.\n"; // Su dung \n la rat pho bien
cout << "Van ban nay " << "se " << "in tren mot dong." << endl; // Noi nhieu thu
return 0;
}
Giải thích code:
- Dòng đầu tiên sử dụng
endl
để xuống dòng và đảm bảo văn bản được in ra ngay lập tức. - Dòng thứ hai và thứ ba sử dụng ký tự
\n
để xuống dòng.\n
thường được ưa chuộng hơn về hiệu suất khi bạn chỉ cần xuống dòng mà không nhất thiết phải flush bộ đệm ngay lập tức. - Dòng cuối cùng cho thấy bạn có thể "nối chuỗi" nhiều thứ lại với nhau (chuỗi cố định, biến, biểu thức,
endl
hoặc\n
) bằng cách lặp lại toán tử<<
.
Ví dụ 1.1.4: Kết hợp chuỗi và biến
Một ứng dụng phổ biến là kết hợp chuỗi mô tả với giá trị của biến để tạo ra thông báo dễ đọc:
#include <iostream>
#include <string> // Can thiet cho kieu string
int main() {
string tenSinhVien = "Nguyen Van A";
int tuoi = 20;
double diemTrungBinh = 8.75;
cout << "Ten: " << tenSinhVien << endl;
cout << "Tuoi: " << tuoi << " tuoi\n";
cout << "Diem trung binh: " << diemTrungBinh << endl;
return 0;
}
Giải thích code:
- Chúng ta khai báo các biến
tenSinhVien
,tuoi
,diemTrungBinh
. - Sử dụng toán tử
<<
nhiều lần trong cùng một lệnhcout
để nối các chuỗi cố định ("Ten: ", "Tuoi: ", v.v.) với giá trị của các biến. - Kết quả sẽ là các dòng thông tin rõ ràng về sinh viên.
2. Nhập dữ liệu từ bàn phím với cin
cin
(viết tắt của console input) là đối tượng chuẩn được dùng để đọc dữ liệu từ luồng đầu vào chuẩn, mà thông thường chính là bàn phím.
Để "trích xuất" dữ liệu từ luồng nhập và lưu vào biến, chúng ta sử dụng toán tử trích luồng (extraction operator), ký hiệu là >>
. Toán tử này đọc dữ liệu từ luồng cin
ở bên trái và gán nó vào biến ở bên phải.
Ví dụ 1.1.5: Nhập một số nguyên
Chương trình sẽ dừng lại và chờ người dùng nhập một số nguyên từ bàn phím và nhấn Enter.
#include <iostream>
int main() {
int soNguyen; // Khai bao bien de luu gia tri nhap vao
// Luon luon xuat loi nhac truoc khi dung cin
cout << "Moi ban nhap mot so nguyen: ";
cin >> soNguyen; // Doc du lieu tu ban phim va luu vao bien soNguyen
// Xuat lai gia tri da nhap de xac nhan
cout << "Ban vua nhap so: " << soNguyen << endl;
return 0;
}
Giải thích code:
- Chúng ta khai báo biến
soNguyen
kiểuint
. - Dòng
cout << "Moi ban nhap mot so nguyen: ";
là lời nhắc quan trọng. Luôn luôn thông báo cho người dùng biết chương trình đang chờ họ nhập gì. cin >> soNguyen;
: Đây là lệnh nhập. Khi chương trình chạy đến đây, nó sẽ dừng lại cho đến khi người dùng gõ một giá trị và nhấn phím Enter.cin
sẽ cố gắng đọc dữ liệu nhập vào, chuyển đổi nó thành kiểuint
và lưu vào biếnsoNguyen
.- Dòng cuối cùng dùng
cout
để xác nhận lại giá trị đã nhập.
Ví dụ 1.1.6: Nhập các kiểu dữ liệu khác
Tương tự cout
, cin
có thể tự động xử lý việc đọc và chuyển đổi dữ liệu cho nhiều kiểu biến khác nhau (double
, char
, string
, v.v.).
#include <iostream>
#include <string> // Can thiet cho kieu string
int main() {
double chieuCao;
string ten;
char kyTuDau;
cout << "Nhap ten cua ban (chi mot tu): ";
cin >> ten; // Doc mot chuoi (dung o khoang trang)
cout << "Nhap chieu cao cua ban (vd: 1.75): ";
cin >> chieuCao; // Doc mot so thuc
cout << "Nhap mot ky tu bat ky: ";
cin >> kyTuDau; // Doc mot ky tu
cout << "\n--- Thong tin da nhap ---\n";
cout << "Ten: " << ten << endl;
cout << "Chieu cao: " << chieuCao << " m" << endl;
cout << "Ky tu dau tien ban nhap: " << kyTuDau << endl;
return 0;
}
Giải thích code:
cin >> bien;
sẽ đọc dữ liệu từ luồng nhập.- Mặc định, toán tử
>>
khi làm việc vớicin
sẽ bỏ qua các khoảng trắng (space, tab, newline) đứng trước dữ liệu mà nó đang tìm kiếm. - Nó sẽ đọc dữ liệu cho đến khi gặp khoảng trắng đầu tiên sau dữ liệu mong muốn. Ví dụ, khi bạn nhập "Tran Van A" cho biến
ten
kiểustring
bằngcin >> ten;
, nó chỉ đọc được "Tran" và dừng lại ở khoảng trắng. Các phần còn lại (" Van A") vẫn còn trong bộ đệm nhập cho các lệnhcin
tiếp theo (nếu có). - Lưu ý: Để đọc toàn bộ một dòng văn bản có chứa khoảng trắng (ví dụ: "Nguyen Van A"), bạn cần sử dụng hàm
getline()
, nhưng chúng ta sẽ tìm hiểu về nó trong một bài viết khác để giữ cho bài này đơn giản.
Ví dụ 1.1.7: Nhập nhiều giá trị trên cùng một dòng
Bạn có thể dùng toán tử >>
nhiều lần trên cùng một lệnh cin
để đọc nhiều giá trị vào các biến khác nhau, miễn là các giá trị đó được phân tách bởi khoảng trắng (space, tab, hoặc newline).
#include <iostream>
int main() {
int diemToan, diemLy, diemHoa;
cout << "Nhap diem Toan, Ly, Hoa, cach nhau boi khoang trang: ";
cin >> diemToan >> diemLy >> diemHoa; // Doc 3 so tu mot dong nhap
double diemTrungBinh = (diemToan + diemLy + diemHoa) / 3.0; // Tinh TBC, dung 3.0 de ket qua la so thuc
cout << "\nDiem trung binh cua ban la: " << diemTrungBinh << endl;
return 0;
}
Giải thích code:
- Lệnh
cin >> diemToan >> diemLy >> diemHoa;
sẽ chờ người dùng nhập ba giá trị. Khi người dùng nhập "8 9 7" và nhấn Enter,cin
sẽ đọc số 8 vàodiemToan
, số 9 vàodiemLy
, và số 7 vàodiemHoa
, sử dụng khoảng trắng làm dấu phân cách giữa các giá trị. - Sau đó, chương trình tính điểm trung bình và in ra kết quả. Việc sử dụng
3.0
thay vì3
trong phép chia là để đảm bảo kết quả là số thực, ngay cả khidiemToan
,diemLy
,diemHoa
là số nguyên.
3. Kết hợp cin
và cout
để tạo chương trình tương tác
Mục đích chính của cin
và cout
là cho phép chương trình của bạn tương tác với người dùng. Mô hình tương tác phổ biến nhất là:
- Xuất lời nhắc (Prompt): Dùng
cout
để nói cho người dùng biết chương trình đang cần thông tin gì. - Nhập dữ liệu: Dùng
cin
để đọc dữ liệu người dùng gõ vào. - Xử lý: Chương trình thực hiện các thao tác cần thiết với dữ liệu vừa nhận được (tính toán, kiểm tra, v.v.).
- Xuất kết quả/thông báo: Dùng
cout
để hiển thị kết quả xử lý hoặc thông báo cho người dùng.
Ví dụ 1.1.8: Chương trình tính chu vi hình chữ nhật đơn giản
#include <iostream>
int main() {
double chieuDai, chieuRong, chuVi;
// Buoc 1 & 2: Nhap chieu dai
cout << "Moi ban nhap chieu dai cua hinh chu nhat: ";
cin >> chieuDai;
// Buoc 1 & 2: Nhap chieu rong
cout << "Moi ban nhap chieu rong cua hinh chu nhat: ";
cin >> chieuRong;
// Buoc 3: Xu ly (tinh toan)
chuVi = 2 * (chieuDai + chieuRong);
// Buoc 4: Xuat ket qua
cout << "\n---------------------------\n"; // Tao mot duong phan cach
cout << "Hinh chu nhat co chieu dai " << chieuDai
<< " va chieu rong " << chieuRong
<< " co chu vi la: " << chuVi << endl;
return 0;
}
Giải thích code:
- Chương trình tuần tự thực hiện các bước: hỏi chiều dài (
cout
), đọc chiều dài (cin
), hỏi chiều rộng (cout
), đọc chiều rộng (cin
). - Sau khi có đủ dữ liệu, nó thực hiện phép tính chu vi.
- Cuối cùng, nó sử dụng
cout
để in ra kết quả tính toán, bao gồm cả giá trị nhập vào để người dùng dễ đối chiếu.
4. Một vài lưu ý quan trọng khi sử dụng cin
và cout
Bao gồm
<iostream>
: Luôn luôn nhớ#include <iostream>
ở đầu file code của bạn.#include <iostream> using namespace std; int main() { // Viet: cout << "Hello"; neu khong co using namespace std; cout << "Hello"; return 0; }
- Luôn đưa ra lời nhắc khi nhập: Đừng bao giờ chỉ dùng
cin >> bien;
mà không có một dòngcout
phía trước để nói cho người dùng biết bạn đang chờ họ nhập gì. Chương trình sẽ chỉ đứng yên và người dùng không hiểu chuyện gì đang xảy ra. - Hiểu cách
cin
đọc dữ liệu: Nhớ rằngcin >>
mặc định bỏ qua khoảng trắng đầu và dừng ở khoảng trắng sau. Điều này quan trọng khi bạn cần đọc các chuỗi có chứa khoảng trắng. (Hãy chờ đợi bài vềgetline
nhé!). - Chọn
\n
hayendl
: Dùng\n
cho việc xuống dòng đơn thuần vàendl
khi bạn muốn dữ liệu được in ra ngay lập tức. Trong hầu hết các trường hợp đơn giản,\n
là đủ.
Bài tập ví dụ: C++ Bài 1.A1: Hello Fullhouse Dev
Viết chương trình bằng C++ để in văn bản Welcome to Fullhouse Dev
.
INPUT FORMAT
OUTPUT FORMAT
In ra văn bản Welcome to Fullhouse Dev
trên 1 dòng duy nhất.
Ví dụ:
Input
Welcome to Fullhouse Dev
Ouput
Welcome to Fullhouse Dev
<br>
Hướng dẫn giải như sau:
- Bạn cần sử dụng thư viện chuẩn của C++ cho việc nhập/xuất dữ liệu. Hãy suy nghĩ xem thư viện nào cung cấp các chức năng như in ra màn hình? Gợi ý: Bắt đầu bằng chữ 'i' và 'o'.
- Trong thư viện đó, có một đối tượng chuẩn dùng để đưa dữ liệu ra luồng đầu ra (thường là màn hình console). Tên của nó bắt đầu bằng
c
. - Để đưa một đoạn văn bản (một chuỗi ký tự) ra đối tượng này, bạn sử dụng toán tử
<<
. - Đoạn văn bản cần in là cố định:
Welcome to Fullhouse Dev
. Đoạn văn bản này cần được đặt trong dấu nháy kép ("
). - Toàn bộ lệnh in này sẽ nằm trong hàm chính của chương trình C++, thường là hàm
main
. Hàm này là điểm bắt đầu thực thi chương trình. - Sau khi in xong, hàm
main
thường trả về giá trị 0 để báo hiệu chương trình kết thúc thành công.
Tóm lại, bạn chỉ cần:
- Khai báo thư viện cần thiết ở đầu file.
- Viết hàm
main
. - Bên trong hàm
main
, sử dụng đối tượngcout
và toán tử<<
để in chuỗi"Welcome to Fullhouse Dev"
. - Kết thúc hàm
main
bằng câu lệnh trả về 0.
Comments