- vừa được xem lúc

Bài 7. Kiểu pair-lưu trữ cặp giá trị

0 0 9

Người đăng: Vàng Văn Quyn

Theo Viblo Asia

  • 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. 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ừ abnf phím cả số và chữ như sau:
#include <iostream>
#include <fstream> 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>
#include <algorithm> 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;
}

Bình luận

Bài viết tương tự

- vừa được xem lúc

Memory layout của một chương trình C/C++

1. Đặt Vấn Đề.

0 0 45

- vừa được xem lúc

Sự khác nhau giữa bộ nhớ Heap và bộ nhớ Stack trong lập trình

1. Giới thiệu. . Như chúng ta đã biết thì việc Quản lý bộ nhớ đối với một lập trình viên là rất quan trọng.

0 0 57

- vừa được xem lúc

Tích hợp thư viện C/C++ vào một dự án Flutter như thế nào?

Chào các bạn hôm nay rảnh rỗi thì mình viết một bài hướng dẫn về cách tích hợp một thư viện C/C++ vào một dự án Flutter. Thì cũng khá đơn giãn thôi vì Flutter đã cũng cấp cho chúng ta một thư viện khá

0 0 61

- vừa được xem lúc

Programming

Definition of Programming. .

0 0 34

- vừa được xem lúc

Gọi hàm của C++ trong Python bằng ctypes

Nếu đã từng dùng qua các thư viện liên quan đến toán học của Python như numpy, các bạn sẽ để ý thấy các nó có tốc độ xử lý rất nhanh. Điều này là do một phần của package này được viết bằng C/C++ và ph

0 0 40

- vừa được xem lúc

Build ứng dụng Cross Platform với Go và CGO

1. Giới thiệu.

0 0 37