1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phần mềm quản lý kho bán thành phẩm của xí nghiệp lắp ráp xe hơ

47 2 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Phần mềm quản lý kho bán thành phẩm của xí nghiệp lắp ráp xe hơi
Tác giả Trần Minh Lập
Người hướng dẫn ThS. Ngụ Tôn Khai
Trường học Đại học Công nghệ TP. HCM
Chuyên ngành Cấu trúc dữ liệu và giải thuật
Thể loại Tiểu luận
Năm xuất bản 2023
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 47
Dung lượng 2,34 MB

Nội dung

Một số phương pháp tìm kiếm và sắp xếp phổ biến là: HH Tìm kiếm tuyến tính: Tìm kiếm một phần tử bằng cách duyệt qua từng ph% tt trong một mảng hoặc danh sách liên kết cho đến khi tìm

Trang 1

TRƯỞNG ĐẠI HỌC CÔNG NGHỆ TP HCM

BỘ GIÁO DỤC VÀ ĐÀO TẠO

EHUTECH HUTECH

Đại học Công nghệ Tp.HCM học Công nghệ Tp.HCM

TIỂU LUẬN

CẤU TRÚC DƯ LIỆU VÀ GIẢI THUẬT

PHẦN MỀM QUẢN LÝ KHO BÁN THÀNH PHẨM CỦA XÍ

NGHIỆP LẮP RÁP XE HƠI

Sinh viên thực hiện: Trần Minh Lập

Lớp : 22TXTHOI

Khoá : 2022

Giảng viên hướng dẫn : ThS Ngô Tân Khai

TP H 6Chi Minh, thang Ø7 năm 2023

Trang 2

TRƯỞNG ĐẠI HỌC CÔNG NGHỆ TP HCM

BỘ GIÁO DỤC VÀ ĐÀO TẠO

EHUTECH HUTECH

Đại học Công nghệ Tp.HOM học Công nghệ Tp.HCM

TIỂU LUẬN

CẤU TRÚC DƯ LIỆU VÀ GIẢI THUẬT

PHẦN MỀM QUẢN LÝ KHO BÁN THÀNH PHẨM CỦA XÍ

NGHIỆP LẮP RÁP XE HƠI

Sinh viên thực hiện: Trần Minh Lập

Lớp : 22TXTHOI

Khoá : 2022

Giảng viên hướng dẫn : ThS Ngô Tân Khai

TP H 6Chi Minh, thang Ø7 năm 2023

Trang 3

1.2.3 Sấp xếp chọn (Selection SOrf): 5: Stccs+tsrexerrrererrrrrersrrrree 5

1.2.4 Sấp xếp chèn (Insertion SOrf): - ¿- + tt +t‡rt+trkerererkrrerrrkrrrrrrrrree 7

1.2.5 Sấp xếp nổi bọt (Bubble Sort): : ¿+ +c+St+t+xsrrskrsrrrtrtsrrrrrrree 8 1.2.6 Sắp xếp nhanh (Quick SOrf): -¿- 56-22 2E +E+ESE+EvE+eEtetrtrvererererrsre 9

1.2.7 Sắp xếp vun đống (Heap SOrt): - + c5 St+t+tsrrtrrtrrrrrrrrrrrree 12 1.2.8 Thực hành tìm kiếm và sắp xếp trên mảng số nguyên một chỉ âi: 15 I0 is 0 ni 18

2 DANH SÁCH LIÊN KẾT ĐƠN set 23

"Nha nh 23

"2N ¡on 24 2.2.1 Thực hành trên danh sách liên kết đơn - «55555 s++5<*ssss++ssss+ 27 2.3 Minh hoa trén G6 tal .ằee 31

3 CAY NHI PHAN TIM KIEM wu eecseecsssscssseessseessneessneeesneeesenesnessnsesneenneeatennees 33

“An ha ha 33 3.2 The hath 34 3.3 Minh hoa trén DEtal cc cceecsssssssssssnscccceeeeceeeeeeeeeeeceeeeseesseeeseeeseesaaensaaeaaaeees 37

4 STACK VÀ QUEUE ¿©5252 S222 S223 121211152315 2111 211111101 e2 39

Trang 4

4.1 Lý thuyết ©2Sc ke SE EEE192111 11211171111 111711 0111111111111 1111 ke 39 A.2 Thur Banh ieeceeccccecccccccecseccccseescssececsuceccsececsuesscsucsucsucsnssesarsuesucsessessesaesesvaneaeeess 40

5 TONG HOP uceeecccsccccsecscscscecsececsucsesucsesucsesecsececsucarsucsesscsesassesarsnsataneatsesatevaneesere 42 TAI LIEU THAM KHAO ccccccsccscscsesccsesescssesceesscscsesccscsesessescsesseecsessucaescatsescacaeaceces 44

Trang 5

MO DAU

Cấu trúc dữ liệu và giải thuật là một môn học cơ bản va quan trọng trong lĩnh vực Khoa học Máy tính và Công nghệ Thông tin Môn học này tập trung nghiên cứu

v`cách tổ chức và quản lý dữ liệu cũng như các phương pháp giải quyết các vấn đề

trong lập trình Cấu trúc dữ liệu là cách tôi tổ chức và lưu trữ dữ liệu trong máy tính sao cho hiệu quả và dễ dàng truy cập Trong khi đó, giải thuật là tập hợp các quy trình

và phương pháp để thực hiện một công việc cụ thể

Môn học này không chỉ là nền tảng cho việc hiểu và xây dựng các ứng dụng

phức tạp, mà còn cung cấp cho tôi cái nhìn sâu sắc v`ề hiệu suất và hiệu quả của các

giải pháp lập trình Bằng cách tối ưu hóa cấu trúc dữ liệu và lựa chọn các giải thuật

thích hợp, tôi có thể cải thiện tính tương tác, tốc độ xử lý và sử dụng tài nguyên máy

tính một cách hiệu quả

Trong đề tài này, tôi sẽ tập trung vào việc sử dụng ngôn ngữ lập trình C++ để xây dựng một chương trình có khả năng lưu trữ và quản lý thông tin của một bảng dữ liệu, trong đó mỗi ph3n tử trong mảng 1 chi âI tương đương với một dòng (row) trong bảng

Mảng một chi`âi là một cấu trúc dữ liệu cơ bản trong lập trình, cho phép tôi lưu trữ một chuỗi các giá trị có cùng kiểu dữ liệu Sử dụng mảng 1 chi êâi để lưu trữ thông

tin bảng giúp tôi biểu diễn cấu trúc dữ liệu dễ dàng và hiệu quả, đ ồg thởi cung cấp

các tính năng cho việc tìm kiếm, thêm, xoá và sắp xếp dữ liệu một cách thuận tiện

Để thực hiện được mục tiêu này, tôi sẽ tập trung vào việc xây dựng các chức năng quan trọng như: thêm dữ liệu mới vào bảng, tìm kiếm thông tin, xoá dữ liệu, và hiển thị toàn bộ bảng Ð êng thời, tôi cũng sẽ xem xét và so sánh hiệu năng của các giải thuật để đảm bảo chương trình hoạt động một cách hiệu quả với số lượng lớn dữ liệu Trong bài báo cáo này, tôi sẽ tập trung vào phần cài đặt của chương trình và minh họa cách sử dụng mảng 1 chi`âi để lưu trữ thông tin bảng Các khái niệm cơ bản vềềngôn ngữ lập trình C++ và cấu trúc dữ liệu sẽ được giả định đã được nắm vững từ trước

Trang |

Trang 6

1 TIM KIEM VA SAPXEP

Có nhi 'âi cách để thực hiện tìm kiếm và sắp xếp, tùy thuộc vào cấu trúc dữ liệu

được sử dụng, số lượng ph tr, va yéu c 41 v éhiéu năng Một số phương pháp tìm kiếm và sắp xếp phổ biến là:

HH Tìm kiếm tuyến tính: Tìm kiếm một phần tử bằng cách duyệt qua từng ph% tt

trong một mảng hoặc danh sách liên kết cho đến khi tìm thấy hoặc hết tập hợp

Độ phức tạp thời gian trung bình là O(n), với n là số lượng ph tử

O Tìm kiếm nhị phân: Tìm kiếm một phần tử trong một mảng đã được sắp xếp

bằng cách so sánh giá trị của phẦn tử với giá trị của phần tử ở giữa mảng, r loại bỏ nửa mảng không chứa ph tử c3n tìm Lặp lại quá trình này cho đến khi

tìm thấy hoặc hết mảng Độ phức tạp thời gian trung bình là O(log n)

Độ phức tạp thời gian trung bình là O(n2)

O Sắp xếp chọn: Sắp xếp một mảng bằng cách duyệt qua từng phần tử, r`ä chọn ra

phần tử nhỏ nhất (hoặc lớn nhất) trong đoạn mảng chưa được sắp xếp, và đổi

chỗ nó với phần tử ở vị trí hiện tại Độ phức tạp thời gian trung bình là O(n2)

O Sap xếp nhanh: Sắp xếp một mảng bằng cách chọn ra một phần tử làm chốt (pivot), r ä phân chia mảng thành hai đoạn, một đoạn chứa các phần tử nhỏ hơn

hoặc bằng chốt, và một đoạn chứa các phần tử lớn hơn hoặc bằng chốt Sau đó,

áp dụng thuật toán sắp xếp nhanh cho hai đoạn này một cách đệ quy Độ phức tạp thởi gian trung bình là O(n log n), với n là số lượng phi tử

Trang 2

Trang 7

1.2 Thực hành

Trong ph3n này, tôi sẽ tìm hiểu v` các thuật toán tìm kiếm và sắp xếp cơ bản

trong ngồn ngữ lập trình C++ Tôi sẽ giới thiệu v`ềthuật toán tìm kiếm tun tự (linear search) và tìm kiếm nhị phân (binary search), cũng như các thuật toán sấp xếp chọn (selection sort), sắp xếp chèn (insertion sort) và sấp xếp nổi bọt (bubble sort)

1.2.1 Tìm kiếm tuẦin ty (Linear Search):

Thuật toán tìm kiém tu% ty 1a phương pháp tìm kiếm đơn giản nhất Nó tìm kiếm một ph3n tử trong một mảng bằng cách duyệt từ đầi đến cuối mảng và so sánh

từng phẦn tử với giá trị c % tìm

Trong trường hợp tìm thấy phần tử, thuật toán trả v`ềvị trí đi tiên của phần tử

đó trong mảng Nếu không tìm thấy, thuật toán trả v`êmột giá trị đại diện cho việc không tìm thấy (ví dụ: -1)

O Ưu điểm: Đơn giản, dễ hiểu, có thể áp dụng cho mảng không được sắp xếp [1 Nhược điểm: Hiệu suất kém khi mảng lớn vì phải duyệt qua tất cả các ph ân tử

Vi du v €tim kiém tu% tự trong C++:

#include <iostream>

int linearSearch(int arr[], int n, int target) {

for (int 1 = 031 <n; i++) {

Trang 3

Trang 8

1.2.2 Tìm kiếm nhị phân (Binary Search):

Thuật toán tìm kiếm nhị phân áp dụng cho mảng đã được sắp xếp

Phương pháp này giới hạn phạm vi tìm kiếm bằng cách chia mảng thành hai

ph % va so sénh ph tử ở giữa với giá trị cn tìm

Nếu ph3n tử ở giữa bằng với giá trị c3 tìm, thuật toán trả v`ềvị trí cla ph % tr

đó Nếu phần tử ở giữa lớn hơn giá trị c n tìm, tiếp tục tìm kiếm trong nửa đi tiên của

mảng Ngược lại, tìm kiếm trong nửa thứ hai của mảng

Thuật toán này tiếp tục lặp lại quá trình chia mảng đến khi tìm thấy phần tử

hoặc không còn ph tử nào để kiểm tra

1 Ưu điểm: Hiệu suất tốt hơn tìm kiếm tu ân tự khi mảng lớn và đã được sắp xếp

HH Nhược điển: Yêu ci mảng đã được sắp xếp, và phức tạp khi thực hiện trên mảng động

Ví dụ v êm kiếm nhị phan trong C++:

#include <iostream>

int binarySearch(int arr[], int low, int high, int target) {

while (low <= high) {

int mid = low + (high - low) / 2;

if (arr[mid] == target) {

return mid; // Tra v €vi tri néu tim thay

} else if (arr[mid] < target) {

low =mid+ 1;

Trang 4

Trang 9

1.2.3 S&p xép chon (Selection Sort):

Sắp xếp chọn là một thuật toán sấp xếp đơn giản và dễ hiểu

Thuật toán này hoạt động bằng cách tìm phần tử nhỏ nhất trong mảng và đưa nó

v €vi tri dW tiên Sau đó, tiếp tục tìm phần tử nhỏ nhất trong mảng con còn lại và đưa

nó tiếp tục vào vị trí thích hợp trong mảng con còn lại Quá trình này được lặp lại cho

đến khi mảng được sắp xếp hoàn chỉnh

1 Ưu điểm: Don giản, dễ hiểu, dễ cài đặt

O Nhược điểm: Hiệu suất chậm hơn trong trường hợp mảng lớn vì phải tìm kiếm

phẦn tử nhỏ nhất trong mảng còn lại ở mỗi bước

Trang 5

Trang 10

/¡ Đổi chỗ phn tử nhỏ nhất tìm được với phẦn tử ở vị trí ¡

int temp = arr[i];

std::cout << "Mang sau khi sap xep: ";

for (int 1 = 031 <n; i++) {

Trang 11

1.2.4 Sap xép chén (Insertion Sort):

Sấp xếp chèn là một thuật toán sắp xếp tương đối hiệu quả cho các mảng có kích thước nhỏ hoặc đã g3 sắp xếp

Thuật toán này hoạt động bằng cách chèn một ph3n tử từ mảng chưa sắp xếp vào đúng vị trí trong mảng đã sắp xếp Đi`âi này được thực hiện bằng cách so sánh

phần tử hiện tại với các phần tử liên trước nó trong mảng đã sắp xếp và đưa phẦn tử

hiện tại vào vị trí thích hợp trong mảng đã sắp xếp

1 Ưu điển: Hiệu suất tốt hơn trong trường hợp mảng g3 sấp xếp, dễ cài đặt

HH Nhược điểm: Hiệu suất chậm hơn so với một số thuật toán sắp xếp hiệu quả hơn

như sắp xếp nhanh hoặc sắp xếp gộp

Trang 7

Trang 12

1.2.5 Sấp xếp nổi bọt (Bubble Sort):

Sấp xếp nổi bọt là một thuật toán sấp xếp đơn giản nhưng hiệu quả cho các

mảng nhỏ

Thuật toán này hoạt động bằng cách so sánh hai phần tử li k €trong mang và đổi chỗ chúng nếu chúng không được sấp xếp theo thứ tự Quá trình này được lặp lại

cho đến khi mảng được sắp xếp hoàn chỉnh

O Uu diém: Don giản, dễ cài đặt, hiệu suất tốt trong trưởng hợp mảng g3n sắp

xếp

O Nhược điểm: Hiệu suất kém hơn trong trường hợp mảng lớn vì phải thực hiện

nhi âi phép đổi chỗ

//¡ Đổi chỗ hai phần tử nếu không được sắp xếp

int temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

Trang 8

Trang 13

std::cout << "Mang sau khi sap xep: ";

for (int 1 = 031 <n; i++) {

1.2.6 Sap xép nhanh (Quick Sort):

Sấp xếp nhanh là một thuật toán sắp xếp dựa trên ý tưởng của chia để trị, tức là

chia mang c% sấp xếp thành các mảng con nhỏ hơn và sắp xếp riêng biệt từng mảng con đó Thuật toán sấp xếp nhanh có các bước chính như sau:

1 Chọn một phần tử làm phẦn tử chốt (pivot) trong mảng

O Phân vùng mảng thành hai phần, sao cho các phần tử nhỏ hơn hoặc bằng phần

tử chốt ở bên trái, và các ph3n tử lớn hơn phần tử chốt ở bên phải

1 Sắp xếp đệ quy hai phẦn trái và phải cho đến khi không thể chia nhỏ hơn được

HH Sắp xếp nhanh có một số ưu điểm và nhược điểm như sau:

Trang 14

O Thuật toán có độ phức tạp thởi gian xấu nhất là O(n^2), rất kém hiệu quả khi

sắp xếp các mảng đã được sắp xếp hoặc có nhi `âi ph3n tử trùng lặp

Thuật toán không ổn định, có thể thay đổi thứ tự của các phần tử bằng nhau trong mảng

1 Việc chọn phần tử chốt phù hợp khó khăn, có thể ảnh hưởng đến hiệu suất của thuật toán Nếu chọn ngẫu nhiên, có thể rơi vào các trường hợp đặc biệt

Ví dụ v`ềthuât toán sắp xếp nhanh trong C++

int partition(int arr[], int low, int high) {

int pivot = arr[high];

int i = low - 1;

for (int j = low; j < high; j++) {

// Néu ph% té hién tại nhỏ hơn hoặc bằng chốt

if (arr[j] <= pivot) {

i++; // Tang ¡ lên

swap(arrli], arr[jl);

Trang 10

Trang 15

return i + 1; // Tra v chỉ số của chốt

void quickSort(int arr[], int low, int high) {

if (low < high) {

int pi = partition(arr, low, high);

quickSort(arr, low, pi - 1);

quickSort(arr, pi + 1, high);

void printArray(int arr[], int size) {

for (int 1 = 0; 1 < size; i++) {

int size = sizeof(arr) / sizeof(arr[0]);

cout << "Mang ban dau la: ";

Trang 16

1.2.7 Sấp xếp vun đống (Heap Sort):

Sắp xếp vun đống là một thuật toán sấp xếp dựa trên một cấu trúc dữ liệu được

gọi là đống nhị phân (binary heap), gọi đơn giản là đống Đống nhị phân là một cây nhị phân hoàn chỉnh, có tính chất là giá trị của mỗi nút không nhỏ hơn (hoặc không lớn hơn) giá trị của các nút con của nó Có hai loại đống nhị phân là đống cực đại (max heap) và đống cực tiểu (min heap) Trong đống cực đại, giá trị của mỗi nút không nhỏ hơn giá trị của các nút con, và giá trị lớn nhất nằm ở gốc của cây Trong đống cực tiểu, giá trị của mỗi nút không lớn hơn giá trị của các nút con, và giá trị nhỏ nhất nằm ở gốc của cây

Thuật toán sắp xếp vun đống có các bước chính như sau:

O Vun mảng c3n sắp xếp thành một đống cực đại (hoặc cực tiểu)

Lay ph%® tử lớn nhất (hoặc nhỏ nhất) ở gốc của đống ra và đưa vào vị trí cuối

cting clla mang

1 Vun lại phẦn còn lại của mảng thành một đống cực đại (hoặc cực tiểu)

1 Lặp lại các bước trên cho đến khi mảng được sắp xếp hoàn toàn

HH Thuật toán sắp xếp vun đống có một số ưu điểm và nhược điểm như sau:

Trang 17

O Thuật toán không thân thiện với bộ đệm, vì nó làm việc trên toàn bộ mảng tại

một thời điểm, có thể gây ra lỗi bộ nhớ cache

O Thuật toán khó khăn trong việc tận dụng tính song song hóa, vì việc vun lại

mảng phụ thuộc vào kết quả của các bước trước

Đây là một ví dụ v`êthuật toán sắp xếp vun đống trong C++:

heapify(arr, size, largest);

void heapSort(int arr[], int size) {

for (int 1 = size / 2 - 1;1>=0;1 ) {

heapify(arr, size, 1);

for (int 1 = size - 1;1>0;1 ) {

Trang 13

Trang 18

swap(arr[0], arr[i]);

heapify(arr, i, 0);

void printArray(int arr[], int size) {

for (int 1 = 0; 1 < size; i++) {

int size = sizeof(arr) / sizeof(arr[0]);

cout << "Mang ban dau la: ";

Tdi da tim hiéu v €cdc thuat todn tim kiém tu %n ty va tim kiếm nhị phân, cũng

như các thuật toán sắp xếp chọn, sắp xếp chèn và sắp xếp nổi bọt Tôi đã biết cách hoạt

động của mỗi thuật toán và có các ví dụ minh họa v`ềcách sử dụng chúng trong C++

Trang 14

Trang 19

Để hiểu rõ hơn v`êcác thuật toán này va cách triển khai chúng trong C++, tdi cd thể tìm hiểu thông tin và tài liệu bổ sung từ các ngu ni tham khảo, sách giáo khoa v`ê cấu trúc dữ liệu và giải thuật, hoặc các tài liệu trực tuyến v lập trình

Lưu ý rằng hiệu suất của các thuật toán có thể thay đổi dựa trên ngữ cảnh và tính chất của dữ liệu đầ vào Khi triển khai các thuật toán trong ứng dụng thực tế, hãy xem xét kỹ càng để chọn thuật toán phù hợp nhất cho bài toán cụ thể mà tôi đang giải quyết

Trang 15

Trang 20

1.2.8 Thực hành tìm kiếm và sắp xếp trên mảng số nguyên mot chia

#include <iostream> using namespace std;

void printArray(int arr[], int n) {

int search(int arr[], int n, int x) {

for (int 1 = 031 <n; i++) {

void sort(int arr[], int n) {

for (int i= 1;i <n; i++) {

int key = arr[i];

Trang 21

int n = sizeof(arr) / sizeof(arr[0]);

cout << " Mang ban d%u la: " << endl;

Chương trình này có các ph Ân sau:

H Phân khai báo thư viện: #include <iostteam> là lệnh để sử dụng thư viện iostream trong C++, thu vién này chứa các hàm nhập xuất dữ liệu như cin và cout using namespace std; la lénh để sử dụng không gian tên std, không gian tên này chứa các hàm và biến của thư viện chuẩn C++

Trang 17

Trang 22

O Phần định nghĩa hàm: Chương trình này có ba hàm được định nghĩa là printArray, search và sort Hàm printArray có chức năng in ra một mảng số nguyên theo định dạng [a, b, c, .| Hàm search có chức năng tìm kiếm một phẦn tử trong mảng số nguyên bằng thuật toán tìm kiếm tuần tự, hàm này trả v`ề chỉ số của ph tử nếu tìm thấy, hoặc trả v`ê-1 nếu không tìm thấy Hàm sort có chức năng sắp xếp một mảng số nguyên theo thứ tự tăng dần bằng thuật toán sắp xếp chèn, hàm này không trả v giá trị mà chỉ thay đổi trực tiếp mảng đầ Vào

1 Phần hàm chính: Hàm main là hàm chính của chương trình, hàm này được gọi khi chương trình bắt đ`âi chạy Hàm này có các bước sau:

1 Khởi tạo một mảng số nguyên gần 8 ph3n tử là {5, 3, 7, 9, 2, 4, 6, 8} và lấy kích thước của mảng bằng cách chia kích thước của toàn bộ mảng cho kích

thước của một phn tử

O Inra mảng ban đầi bằng cách gọi hàm printArray

O Tìm kiếm một ph3n tử trong mảng bằng cách gọi hàm search, ph3n tử c3 tìm là

7 Nếu tìm thấy, in ra chỉ số của ph*n tử đó trong mảng, nếu không tìm thấy, in

ra thông báo không tìm thấy

O Sp xép mang bang cach goi ham sort

O Inra mảng sau khi sắp xếp bằng cách gọi hàm printArray

1 Kết thúc hàm và trả v`giá trị 0

1.3 Minh họa trên đềtài

Đối với đềtài "Chương trình quản lý thông tin phân xưởng" trong đó mỗi phần

tử của mảng sẽ lưu trữ thông tin vì một phân xưởng g ồn các trưởng dữ liệu:

idPhanXuong, tenPhanXuong va tenQuanDoc

Tôi sẽ thực hiện tạo chương trình C++ để thêm, hiển thị, tìm kiếm và sắp xếp các phẦn tử trong mảng dữ liệu này Trong đó, tôi sẽ áp dụng các thuật toán tìm kiếm và

sắp xếp đã học và thực hành trong phần 1.2 để giải quyết các yêu c`âi của đ tài

struct PhanXuong {

Trang 18

Trang 23

void nhapThongTin(PhanXuong arr[], int& n) {

cout << "Nhap so luong phan xuong muon nhap: ";

cin >> n;

cin.ignore();

for (int 1 = 031 <n; i++) {

cout << "Nhap thong tin phan xuong thu "<<i+ 1 << endl;

cout << "Nhap idPhanXuong: ";

Trang 19

Ngày đăng: 09/02/2025, 16:55

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN