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 cincout, 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ượng cout.
  • <<: 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\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:

  1. Sử dụng endl: Chèn một ký tự xuống dòng ép bộ đệm đầu ra (output buffer) phải gửi dữ liệu ra ngay lập tức (gọi là flushing).
  2. 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ệnh cout để 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ểu int.
  • 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ểu int và lưu vào biến soNguyen.
  • 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ới cin 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ểu string bằng cin >> 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ệnh cin 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ào diemToan, số 9 vào diemLy, và số 7 vào diemHoa, 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ả khi diemToan, diemLy, diemHoa là số nguyên.

3. Kết hợp cincout để tạo chương trình tương tác

Mục đích chính của cincout 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à:

  1. 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ì.
  2. Nhập dữ liệu: Dùng cin để đọc dữ liệu người dùng gõ vào.
  3. 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.).
  4. 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 cincout

  • 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òng cout 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ằng cin >> 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 hay endl: 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:

  1. 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'.
  2. 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.
  3. Để đư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ử <<.
  4. Đ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 (").
  5. 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.
  6. 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ượng cout 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.

Làm thêm nhiều bài tập miễn phí tại đây

Comments

There are no comments at the moment.