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

Sử dụng vector trong lập trình C++ - giải bài toán lập trình muôn thủa

0 0 54

Người đăng: Học Tile

Theo Viblo Asia

Chào buổi tối mọi người, hôm nay lang thang trên mạng bắt gặp bài toán quen thuộc một thời của quãng đường sinh viên IT.

Chắc hẳn rất nhiều bạn trong chúng ta đã gặp bài toán này hơn một lần trong suốt quá trình đi học ở giảng đường đại học.

Đấy chính là câu số 1 trong đề thi dưới đây:

Để giải bài toán trên có rất nhiều cách, từ dùng mảng để quản lý danh sách khách hàng, danh sách liên kết, stack, queue...

Hôm nay chúng ta hãy cùng nhau giải bài toán trên bằng vector trong thư viện STL(Standard Template Library) của C++.

Vector là gì?

Vậy hãy cùng xem vector là gì? nó có những ưu điểm gì nhé? Giống như là mảng (array), vector trong C++ là một đối tượng dùng để chứa các đối tượng khác, và các đối tượng được chứa này cũng được lưu trữ một cách liên tiếp trong vector.

Tuy nhiên, nếu như số lượng phần tử (size) của một mảng là cố định, thì ở vector, nó hoàn toàn có thể thay đổi trong suốt quá trình làm việc của chương trình

So với mảng, cách dùng của vector thì linh hoạt hơn nhiều, và đây là 1 số điểm nổi trội của vector so với mảng array :

  • Bạn không cần phải khai báo kích thước của mảng ví dụ int A[100]..., vector có thể tự động nâng kíck thước lên.
  • Nếu bạn thêm 1 phần tử vào vector đã đầy rồi, thì vector sẽ tự động tăng kíck thước của nó lên để dành chỗ cho giá trị mới này.- Vector còn có thể cho bạn biết số lượng các phần tử mà bạn đang lưu trong nó.
  • Dùng số phần tử âm vẫn được trong vector ví dụ A-10], A[-3], rất tiện trong việc cài đặt các giải thuật khác.

Cách dùng vector

Để có thể dùng vector thì chúng ta phải khai báo header vector và thư viện std

#include<vector> using namespace std;

Và để khai báo một vector ta dùng cú pháp:

vector<int> A ;

Câu lệnh trên định nghĩa 1 vector có kiểu int. Chú ý kiểu của vector được để trong 2 cái ngoặc nhọn.

Vì kíck thước của vector có thể nâng lên, cho nên không cần khai báo cho nó có bao nhiêu phần tử cũng được, hoặc nếu thích khai báo thì bạn cũng có thể khai báo một trong những cách như sau :

vector<int> A(10);
vector<int> A(10, 2);

Đồng thời ta cũng có thể khởi tạo cho 1 vector bằng giá trị của 1 vector khác, ví dụ :

vector<int> A(10,2); vector<int> B(A); 

Với dòng lệnh trên thì vector B sẽ là bản sao của vector A.

Tiếp đến chúng ta hãy cùng nhau làm quen về một số hàm hay được sử dụng trong vector nhé

Để thêm một phần tử vào vị trí sau cùng của vector:

name_of_vector.push_back(name_of_element);

Để bỏ đi phần tử cuối cùng của vector:

name_of_vector.pop_back();

Để bỏ đi tất cả các phần tử của vector:

name_of_vector.clear();

Để lấy ra phần tử đầu tiên của vector:

name_of_vector.front();

Để lấy ra phần tử cuối cùng của vector:

name_of_vector.back();

Để lấy ra phần tử vị trí thứ n của vector (đếm từ 0):

name_of_vector.at(n);

Để biết số lượng phần tử của vector:

name_of_vector.size();

Để biết vector có phần tử hay không:

name_of_vector.empty();

Để duyệt vector bằng iterator:

vector<integer>::iterator iter_name; // Khai báo con trỏ để duyệt
for (iter_name = name_of_vector.begin(); iter_name != name_of_vector.end(); iter_name++) {
cout << *iter_name << endl;
}

Chú ý, sau khi bạn dùng áp dụng toán tử ++ vào biến iterator, nó sẽ chỉ đến phần tử tiếp theo của vector. Còn toán tử * (value of) cho biết giá trị của phần tử mà con trỏ iterator đang trỏ tới.

Giải quyết bài toán lập trình muôn thủa

Quay lại với bàn toán đầu đề bài, chúng ta hãy cùng nhau đi giải quyết nó. Khai báo header vector và một số header khác hay dùng của C++

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;

Khai báo một data structure chứa thông tin khách hàng:

// Declare structure information
typedef struct customer
{ char mName[100]; char mCusType[3]; //Type of customer CN/CT/NN char mProduct[100]; int mQuantity; double mPrice;
}TY_Customer;

Khai báo một vector để chứa và quản lý thông tin khách hàng TY_Customer

typedef std::vector<TY_Customer> TY_CustomerList;
TY_CustomerList vList;

Định nghĩa 4 hàm chính để thực hiện các chức năng:

  • Nhập số khách hàng
  • Thông tin khách hàng
  • Sắp xếp thông tin khách hàng
  • In ra danh sách khách hàng
// Main functions
int input_number_of_customers(void);
void input_customers_infor(TY_CustomerList* vList, int n);
void display_list(TY_CustomerList* vList);
void sort_customer_list(TY_CustomerList* vList);

Chúng ta cũng định nghĩa một số hàm bổ trợ cho các hàm chính ở trên như sau:

// Other supporting functions
void print_menu(void); // Print selection menu
double get_discount(char* mCusType); //Get discount information
double calculate_money(TY_Customer *tmp); //Calculate total amount of money of each customer
void print_a_customer_info(TY_Customer *tmp); //Display information of a customer
bool compare(TY_Customer tmp1, TY_Customer tmp2); // Used for vector sort
void check_valid_input(void); // Check input data is valid or not

Như bao bài toán bắt đầu khác, chúng ta sẽ dùng standard input/output function để nhập vào các thông tin từ bàn phím.

Bắt đầu với hàm nhập số khách hàng, vì số khách hàng là một số luôn dương nên chúng ta cần check thêm điều kiện đầu vào:

int input_number_of_customers(void)
{ cout << "Please input number of customers (n>=1): \t"; int n; cin >> n; while(!cin || n <=0) { // user didn't input a number cout << "Please input a positive numeric data! \n"; cin.clear(); // reset failed bit cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input cin >> n; } return n;
}

Tiếp đến là hàm nhập thông tin khách hàng, các thông tin sẽ được đưa vào biến tạm tmp và đưa vào vector thông qua hàm push_back như sau.

Chúng ta cũng cần check các dữ liệu dạng số numeric.

void input_customers_infor(TY_CustomerList* vList, int n) { //Input information of customers char select; if (!vList->empty()) { cout << "List is not empty. Do you want to add more data? (Y/N): "; cin >> select; if (select == 'N' || select == 'n') return; } TY_Customer tmp; for (int i = 0; i < n; i++) { cout << "Please input information of customer #" << i+1; cout << "\nInput customer name: "; cin >> tmp.mName; cout << "Customer name = " << tmp.mName << "\n"; do { cout << "\nInput customer type [CN/CT/NN]: "; cin >> tmp.mCusType; //customer type must be CN, CT or NN } while ((strcmp(tmp.mCusType, "CN") != 0) && strcmp(tmp.mCusType, "CT") != 0 && strcmp(tmp.mCusType, "NN") != 0); cout << "Customer type = " << tmp.mCusType << "\n"; cout << "\nInput product name: "; cin >> tmp.mProduct; cout << "Product = " << tmp.mProduct << "\n"; // Quantity and Price must be digit data cout << "\nInput product quantity (Numeric): "; cin >> tmp.mQuantity; while(!cin) { // user didn't input a number cin.clear(); // reset failed bit cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input cin >> tmp.mQuantity; } cout << "Quantity = " << tmp.mQuantity << "\n"; cout << "\nInput product price (Numeric): "; cin >> tmp.mPrice; while(!cin) { // user didn't input a number cin.clear(); // reset failed bit cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input cin >> tmp.mPrice; } cout << "Price = " << tmp.mPrice << "\n"; if(!cin) { // user didn't input a number cin.clear(); // reset failed bit cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input } vList->push_back(tmp); } return;
} 

Có rất nhiều cách để duyệt các phần tử của một vector, ở đây chúng ta dùng cách đơn giản nhất là auto hoặc iterator

void display_list(TY_CustomerList* vList) { if(vList->empty()) { cout << "NO RECORDS\n"; return; } cout << "NAME\t" << "TYPE\t" << "PRODUCT\t" << "QUANTITY\t" << "PRICE\t" << "MONEY\n"; cout << "---------------------------------------------------------------\n"; for (auto tmp : *vList) { print_a_customer_info(&tmp); }
}

Sau đấy là hàm sắp xếp các phần tử của vector, chúng ta chỉ việc dùng sort của thư viện std

void sort_customer_list(TY_CustomerList* vList) { if(vList->empty()) { cout << "NO RECORDS\n"; return; } cout << "Sorted customers information by DESC price\n"; std::sort(vList->begin(), vList->end(), compare);
}

Trong đó compare là con trỏ hàm chỉ đến hàm quy định thứ tự sort do ta tự định nghĩa:

bool compare(TY_Customer tmp1, TY_Customer tmp2) { return (tmp1.mPrice > tmp2.mPrice);
}

Các bạn có thể xem full lời giải của bài toán này ở ĐÂY/HERE

Như vậy với việc sử dụng vector thì ta có thể dễ dàng giải quyết bài toán "muôn thủa" ở trên. Nhanh hơn rất nhiều so với sử dụng mảng, hoặc các loại danh sách liên kết khác.

Nếu các bạn có các phương pháp giải khác nhanh gọn hơn thì hãy cùng nhau chia sẻ nhé. Chào thân ái và quyết thắng. ENJOY CODING!

Thanks for your time ^^.

Bình luận

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

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

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

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

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 396

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

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 737

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

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 358

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

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 449

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

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433