Sắp xếp struct trong c | Laptrinhcanban.com

HOME › >>

Sắp xếp struct trong c

Hướng dẫn cách sắp xếp struct trong C. Một mảng chứa phần tử là các struct trong C thì có thể được sắp xếp, và bạn sẽ học được cách sắp xếp mảng struct tăng dần và giảm dần trong C sau bài học này.

Logic sắp xếp struct trong c

Sắp xếp struct trong c, nói theo cách chính xác là sắp xếp các struct là phần tử của một mảng cấu trúc trong c theo giá trị của một thành viên nào đó.

Lấy ví dụ, chúng ta có mảng struct chứa 5 thực thể đại diện thông tin cho các bạn Bob, Ali, Tom, Ste và Leo như sau:

#include <stdio.h>
#define PERSON_NUM 5

//Khai báo kiểu cấu trúc
typedef struct {
char name[20];
char sex;
int age;
double height;
double weight;
} person_t;

main(void){
//Khởi tạo mảng cấu trúc với 5 thực thể được tạo ra từ cấu trúc
person_t p[PERSON_NUM] = {{"Bob", 'M', 19, 165.4, 72.5},
{"Ali", 'F', 19, 161.7, 44.2},
{"Tom", 'M', 20, 175.2, 66.3},
{"Ste", 'F', 18, 159.3, 48.5},
{"Leo", 'M', 19, 172.8, 67.2}};
}

Với mảng struct này, chúng ta có thể sắp xếp các struct có trong mảng theo các tiêu chí như chiều cao, cân nặng, hoặc là tên người theo thứ tự a b c chẳng hạn.

Do mảng cấu trúc cũng là một loại mảng trong C, do đó chúng ta có thể áp dụng các phương pháp cũng như logic sắp xếp mảng mà Kiyoshi đã hướng dẫn bạn trong bài viết sau đây:

Chúng ta cũng sẽ tiến hành sắp xếp các phần tử trong mảng thông qua phép hoán đổi. Điểm khác biệt duy nhất là thay vì so sánh giá trị của các phần tử trong mảng thông thường, thì chúng ta sẽ tiến hành so sánh giá trị của các thành viên trong phần tử của mảng struct mà thôi.

Sắp xếp struct trong c

Để sắp xếp tăng dần các struct là phần tử của mảng cấu trúc trong C, chúng ta so sánh giá trị của các thành viên trong phần tử của mảng struct và tiến hành hoán đổi phần tử khi tìm thấy phần tử phía sau có giá trị thành viên lớn hơn phần tử đứng trước nó.

Ngược lại thì để sắp xếp giảm dần các struct là phần tử của mảng cấu trúc trong C, chúng ta so sánh giá trị của các thành viên trong phần tử của mảng struct và tiến hành hoán đổi phần tử khi tìm thấy phần tử phía sau có giá trị thành viênnhỏ hơn phần tử đứng trước nó.

Để so sánh giá trị của các thành viên trong mảng cấu trúc, chúng ta sẽ sử dụng tới một trong 2 phương pháp mà Kiyoshi đã hướng dẫn trong bài:

Chúng ta cũng sử dụng tới logic hoán đổi bằng cách sử dụng định nghĩa bằng macro mà Kiyoshi đã giới thiệu cũng trong bài trên như sau:

/*Định nghĩa macro SWAP để hoán đổi phần tử trong mảng chỉ định*/
#define SWAP(type,x,y) do{type tmp = x; x = y; y = tmp;}while(0)

Ví dụ, với kiểu cấu trúc person_t ở trên, chúng ta sẽ viết hàm sắp xếp struct tăng dần và hàm sắp xếp struct giảm dần theo chiều cao (height) và theo tên gọi (name). Lưu ý là height thuộc kiểu số, do đó chúng ta có thể sử dụng trực tiếp các toán tử so sánh để so sánh chúng khi tiến hành sắp xếp. Tuy nhiên nếu thành viên thuộc kiểu chuỗi như name thì chúng ta cần sử dụng tới hàm so sánh chuỗi strcmp mà Kiyoshi đã hướng dẫn trong bài dưới đây:

Và chúng ta viết các hàm này trong chương trình sắp xếp struct trong C như sau:

#include <stdio.h>
#include <string.h>

/*Định nghĩa macro SWAP để hoán đổi phần tử trong mảng chỉ định*/
#define SWAP(type,x,y) do{type tmp = x; x = y; y = tmp;}while(0)

#define PERSON_NUM 5

//Khai báo kiểu cấu trúc
typedef struct {
char name[20];
char sex;
int age;
double height;
double weight;
} person_t;

//Tạo hàm in kiểu cấu trúc
void show_struct(person_t array[], int n){
for (short i = 0; i < PERSON_NUM; i++) {
printf("\n%s %c %d %.1f %.1f",array[i].name,array[i].sex,array[i].age,array[i].height,array[i].weight);
}
printf("\n");
}

//Tạo hàm sắp xếp struct tăng dần theo chiều cao
void asc_order_height(person_t array[], int n){
//Tạo vòng lặp để sắp xếp struct
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
//Nếu tìm ra phần tử có thành viên height lớn hơn
//thì hoán đổi với số đang xét
if (array[i].height > array[j].height) SWAP(person_t,array[i],array[j]);
}
}
}

//Tạo hàm sắp xếp struct giảm dần theo chiều cao
void desc_order_height(person_t array[], int n){
//Tạo vòng lặp để sắp xếp struct
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
//Nếu tìm ra phần tử có thành viên height nhỏ hơn
// thì hoán đổi với số đang xét
if (array[i].height < array[j].height) SWAP(person_t,array[i],array[j]);
}
}
}
// Tạo hàm sắp xếp struct tăng dần theo tên
void asc_order_name(person_t array[], int n){
//Tạo vòng lặp để sắp xếp struct
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
//Nếu tìm ra phần tử có thành viên name lớn hơn
// thì hoán đổi với số đang xét
if (strcmp(array[i].name, array[j].name) > 0) SWAP(person_t,array[i],array[j]);
}
}
}

// Tạo hàm sắp xếp struct giảm dần theo tên
void desc_order_name(person_t array[], int n){
//Tạo vòng lặp để sắp xếp struct
for(int i = 0; i < n - 1; i++){
for(int j = i + 1; j < n; j++){
//Nếu tìm ra phần tử có thành viên name nhỏ hơn
// thì hoán đổi với số đang xét
if (strcmp(array[i].name, array[j].name) < 0) SWAP(person_t,array[i],array[j]);
}
}
}

int main(void){
//Khởi tạo mảng cấu trúc với 5 thực thể được tạo ra từ cấu trúc
person_t p[PERSON_NUM] = {{"Bob", 'M', 19, 165.4, 72.5},
{"Ali", 'F', 19, 161.7, 44.2},
{"Tom", 'M', 20, 175.2, 66.3},
{"Ste", 'F', 18, 159.3, 48.5},
{"Leo", 'M', 19, 172.8, 67.2}};

printf("Mang struct ban dau:");
show_struct(p,PERSON_NUM);

printf("\nSap xep theo chieu cao tang dan:");
asc_order_height(p,PERSON_NUM);
show_struct(p,PERSON_NUM);

printf("\nSap xep theo chieu cao giam dan:");
desc_order_height(p,PERSON_NUM);
show_struct(p,PERSON_NUM);

printf("\nSap xep theo ten tang dan:");
asc_order_name(p,PERSON_NUM);
show_struct(p,PERSON_NUM);

printf("\nSap xep theo ten giam dan:");
desc_order_name(p,PERSON_NUM);
show_struct(p,PERSON_NUM);
}

Kết quả:

Mang struct ban dau:
Bob M 19 165.4 72.5
Ali F 19 161.7 44.2
Tom M 20 175.2 66.3
Ste F 18 159.3 48.5
Leo M 19 172.8 67.2

Sap xep theo chieu cao tang dan:
Tom M 20 175.2 66.3
Leo M 19 172.8 67.2
Bob M 19 165.4 72.5
Ali F 19 161.7 44.2
Ste F 18 159.3 48.5

Sap xep theo chieu cao giam dan:
Ste F 18 159.3 48.5
Ali F 19 161.7 44.2
Bob M 19 165.4 72.5
Leo M 19 172.8 67.2
Tom M 20 175.2 66.3

Sap xep theo ten tang dan:
Ali F 19 161.7 44.2
Bob M 19 165.4 72.5
Leo M 19 172.8 67.2
Ste F 18 159.3 48.5
Tom M 20 175.2 66.3

Sap xep theo ten tang dan:
Tom M 20 175.2 66.3
Ste F 18 159.3 48.5
Leo M 19 172.8 67.2
Bob M 19 165.4 72.5
Ali F 19 161.7 44.2

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách sắp xếp struct trong c rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/kieu-cau-truc-trong-c/sap-xep-struct-trong-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.