+1

Bài 1_Phần 2_Kiểu pair-lưu trữ cặp giá trị

  • pair được sử dụng để kết hợp hai giá trị có thể thuộc các kiểu dữ liệu khác nhau.
  • pair cung cấp một cách để lưu trữ hai đối tượng không đồng nhất dưới dạng một đơn vị. Về cơ bản nó được sử dụng nếu chúng ta muốn lưu trữ các bộ dữ liệu.
  • Phần tử đầu tiên được tham chiếu là 'first' và phần tử thứ hai là 'second' và thứ tự được cố định (first, second).
  • Để truy cập các phần tử, chúng ta sử dụng tên biến theo sau là toán tử dấu chấm, theo sau là từ khóa first hoặc second.
  • Ví dụ:
  • p.first
  • p.second

1. Khai báo kiểu Pair.

  • Cách 1 : Giá trị của first và second là mặc định:
  • pair<Kiểu dữ liệu_first, Kiểu dữ liệu_second> p1;
  • Cách 2 : Giá trị của first là giá trị kiểu 1, second là giá trị kiểu 2:
  • pair<Kiểu dữ liệu_first, Kiểu dữ liệu_second> p2 = {giá trị kiểu 1, giá trị kiểu 2}
  • Cách 3 : Giá trị của first là giá trị kiểu 1, second là giá trị kiểu 2:
  • pair<Kiểu dữ liệu_first, Kiểu dữ liệu_second> p3(giá trị kiểu 1, giá trị kiểu 2)
  • Cách 4 : Giá trị của first là giá trị kiểu 1, second là giá trị kiểu 2:
  • pair<Kiểu dữ liệu_first, Kiểu dữ liệu_second> p4 = make_pair(giá trị kiểu 1, giá trị kiểu 2)
  • Ví dụ:
#include <iostream>

using namespace std;

int main()
{
    pair<int, int> p1;
    pair<int, string> p2={1, "Nguyen Van An"};
    pair<int, float>p3(1,8.5);
    pair<float, float>p4= make_pair(8.3,7.5);

    return 0;
}

2. Sử dụng Pair trong chương trình.

2.1. Truy cập, xuất giá trị các phần tử của pair:

#include <iostream>

using namespace std;

int main()
{
    pair<int, int> p1;
    pair<int, string> p2={1, "Nguyen Van An"};
    pair<int, float>p3(1,8.5);
    pair<float, float>p4= make_pair(8.3,7.5);

    cout << p1.first << " "<< p1.second <<endl;
    cout << p2.first << " "<< p2.second <<endl;
    cout << p3.first << " "<< p3.second <<endl;
    cout << p4.first << " "<< p4.second <<endl;

    return 0;
}

2.2. Gán, nhập giá trị các phần tử của pair.

2.2.1. Gán trực tiếp, nhập từ bàn phím.

#include <iostream>

using namespace std;

int main()
{
    pair<int, string> p2;

    p2.first = 2024;
    p2.second = "Chuc mung nam moi";
    cout << p2.first << " "<< p2.second <<endl;

    cout<<"Nhap vao mot so tu nhien: ";
    cin>>p2.first;
    cout << p2.first << " "<< p2.second <<endl;

    string s;
    cout<<"Nhap vao mot xau ki tu: ";
    getline(cin,s);
    p2.second=s;
    cout << p2.first << " "<< p2.second <<endl;

    return 0;
}
  • Chương trình trên không nhập được xâu do đã nhập giá trị số phía trước nên bị trôi lệnh.
  • Nguyên nhân :
  • Hàm getline() khi bạn nhập xâu s sẽ dừng nhập cho tới khi nó gặp được ký tự xuống dòng (enter), những ký tự nó đọc được từ luồng vào cin cho tới kí tự enter đó sẽ được gán cho string s.
  • Khi bạn nhập cin >> n sau đó ấn enter, thì giá trị mà bạn vừa nhập sẽ được gán cho n tuy nhiên ký tự enter ở cuối bạn nhập sẽ nằm trong luồng vào cin, khi hàm getline() đọc từ luồng cin thì sẽ gặp ký tự enter này do cin ở câu lệnh trên để lại.
  • Do getline() sẽ dừng nhập khi gặp enter nên nó sẽ dừng ngay tại lúc đó mà chưa hề nhập được ký tự nào và dẫn đến xâu s của bạn là một xâu rỗng.
  • Vậy nếu trước hàm getline() mà trong luồng cin có thừa kí tự enter(thông thường do cin ở câu lệnh trước đó để lại) thì sẽ xảy ra trôi lệnh.
  • Lưu ý rằng nếu bạn dùng câu lệnh getline() sau một câu lệnh getline() thì bạn sẽ không bị trôi lệnh vì hàm getline() sẽ xử lý ký tự enter ở cuối dòng chứ không để lại trong luồng vào như câu lệnh cin.
  • Cách khắc phục :
  • Khi bạn biết nguyên nhân getline() bị trôi lệnh là do đọc phải ký tự enter thừa trong luồng vào từ bàn phím nên để xử lý việc này bạn chỉ cần loại bỏ được ký tự enter này trước khi dùng getline().
  • Bạn có thể dùng hàm cin.ignore(1) hoặc cin.ingore() để loại bỏ đi 1 ký tự trong luồng cin, khi đó ký tự enter sẽ bị loại bỏ và hàm getline() sẽ đợi bạn nhập nội dung sau đó ấn enter. Ngoài ra bạn cũng có thể sử dụng hàm getchar() vì hàm này sẽ đọc 1 ký tự trong luồng cin và đọc được ký tự enter thừa.
  • Chương trình trên nhập vào từ bàn phím cả số và chữ như sau:
#include <iostream>

using namespace std;

int main()
{
    pair<int, string> p2;

    p2.first = 2024;
    p2.second = "Chuc mung nam moi";
    cout << p2.first << " "<< p2.second <<endl;

    cout<<"Nhap vao mot so tu nhien: ";
    cin>>p2.first;
    cout << p2.first << " "<< p2.second <<endl;

    cin.ignore();
    cout<<"Nhap vao mot xau ki tu: ";
    getline(cin,p2.second);
    cout << p2.first << " "<< p2.second <<endl;

    return 0;
}

2.2.2. Nhập, xuất tệp.

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream fin;
    ofstream fout;
    fin.open("DATA.INP",ios::in);
    fout.open("DATA.OUT",ios::out);
    if(fin.fail())
    {
        fout<<"Loi doc tep";
    }
    else
    {
        pair<int, string> p2;

        fin>>p2.first;

        fin.ignore();
        getline(fin,p2.second);
        fout << p2.first << " "<< p2.second <<endl;
    }

    fin.close();
    fout.close();
    return 0;
}
  • Ví dụ 1: Nhập vào tử số và mẫu số của một phân số là các giá trị nguyên. Rút gọn và xuất ra Tử số/Mẫu số = giá trị (kết quả phép chia).
#include <iostream>
#include <fstream>

using namespace std;
pair<int, int> getRutgon(pair<int, int> p)
{
    int ucln=abs(__gcd(p.first, p.second));
    p.first=p.first/ucln;
    p.second=p.second/ucln;
    return p;
}
int main()
{
    ifstream fin;
    ofstream fout;
    fin.open("DATA.INP",ios::in);
    fout.open("DATA.OUT",ios::out);
    if(fin.fail())
    {
        fout<<"Loi doc tep";
    }
    else
    {
        pair<int, int> p2;

        fin>>p2.first;

        fin.ignore();
        fin>>p2.second;

        pair<int, int> p=getRutgon(p2);
        fout << p.first << "/"<< p.second <<endl;
    }
    fin.close();
    fout.close();
    return 0;
}

Không có quyền nào được bảo lưu - Phạm vi công cộng

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí