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ọngthườ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à cincout. 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 cincout, 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ồng cout.
  • "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 cho endl, '\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ư 12345số 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ểu int), chieuCao (kiểu double), và ten (kiểu string). Lưu ý cần #include <string> để sử dụng string.
  • 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ến ten ("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ểu int.
  • 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ụng cin.
  • 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ến soLuong.
  • 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ểu double.

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ểu string.
  • 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ến hoVaTen.
  • Lưu ý quan trọng: Nếu trước lệnh getline có một lệnh cin >> ...; (đọ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. Khi getline chạy, nó sẽ đọc ngay ký tự \n đó và dừng lại, khiến chuỗi hoVaTen bị rỗng. Để khắc phục, bạn cần xóa bộ đệm input trước khi gọi getline. Dòng code cin.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 sau main, 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 cincout: 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ào so1so2.
  • 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

There are no comments at the moment.