Sắp xếp trong mảng struct, cụ thể là biến tạm

như trên tiêu đề ạ.
đề yêu cầu sắp xếp một mảng công nhân theo giờ làm(gio_lam) giảm dần
em bị kẹt chỗ khởi tạo biến tạm để sắp xếp trong mảng struct.
IDE không báo lỗi nhưng console lại không chạy hàm sap_xep và return về giá trị âm.
newbie nên có sai sót mọi người cứ góp ý ạ

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct cong_nhan
{
    char ten[31];
    int nam_sinh;
    int gio_lam;

}congnhan;

void Nhap_mang(struct cong_nhan a[], int n)
{
    for(int i = 0; i < n; i++)
    {
        printf("Cong nhan thu %d", i);
        printf("\nTen: ");
        fflush(stdin);
        gets(a[i].ten);
        printf("\nNam sinh: ");
        scanf("%d", &a[i].nam_sinh);
        printf("\nSo gio lam: ");
        scanf("%d", &a[i].gio_lam);
    }
}

void Xuat_mang(congnhan a[], int n)
{
    for(int i = 0; i < n; i++)
    {
        printf("\nThong tin cong nhan thu %d:\n", i);
        printf("Ten: %s \t Nam sinh: %d \t So gio lam: %d \n", a[i].ten, a[i].nam_sinh, a[i].gio_lam);
    }
}

void sap_xep(congnhan a[], int n)
{
    congnhan tmp;
    for(int i = 0; i < n; i++)
        for(int j = i + 1; j < n; i++)
        {
            if(a[i].gio_lam < a[j].gio_lam)
            {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
}

int main()
{
    int n;
    congnhan a[MAX];
    do
    {
        printf("Nhap so cong nhan:  ");
        scanf("%d", &n);
        if(n <= 0)
            printf("So cong nhan ban vua nhap khong hop le, Hay nhap lai!");
    }while(n <= 0);

    Nhap_mang(a, n);

    printf("\n\nMang cong nhan truoc khi sap xep: ");
    Xuat_mang(a, n);

    sap_xep(a, n);
    printf("\n\nMang cong nhan sau khi sap xep: ");
    Xuat_mang(a, n);

    return 0;
}

Nếu k nhầm thì do bạn nhập vào tham trị, phải nhập vào tham chiếu.
Về cơ cản thì thế này, khi bạn gọi 1 hàm và đưa biến vào làm tham số, c++ sẽ tạo bản copy của biến này và thao tác với các biến copy nên hàm sẽ thay đổi giá trị của biến copy chứ k phải biến truyền vào.
VD

void increase(int x) {x++;} 
... 
int a = 1;
increase(a) ;
cout << a; //in ra so 1

Muốn nó thay đổi giá trị biến truyền vào bạn phải truyền tham chiếu bằng cách thêm kí tự & vào trước tham số.

void increase(int &x) {x++;} 
... 
int a = 1;
increase(a) ;
cout << a; //in ra so 2

Mình giải thích có thể hơi khó hiểu, bạn có thể tự google về tham trị, tham chiếu để tìm hiểu thêm nha :sweat_smile:

4 Likes

Tag là C mà. :confused:

Phải là dùng con trỏ nha. :slight_smile:

void increase(int *x) { (*x)++; }

Pass vô thì:

increase(&a);
5 Likes

Các bác ơi, ở trong hàm sap_xep(congnhan a[ ], int n) em không sử dụng hàm swap(int *a, int *b)
Em đổi chỗ ngay trong hàm sap_xep luôn ạ
Em cũng có cho là hiểu về phần tham trị và tham biến
Em chỉ không hiểu về cái <kiểu dữ liệu> của biến của em nó cứ như là không trùng với cái struct congnhan a[ i ].gio_lam ấy ạ
Và cũng cảm ơn các bác nhiều vì đã quan tâm đến cái topic của em.

À thôi cám ơn các bác đã ghé qua xem code của em ạ
Hiện tại em đã tìm được lỗi sai rồi ạ

  void sap_xep(congnhan a[], int n)
  {
         congnhan tmp;
         for(int i = 0; i < n; i++)
                for(int j = i + 1; j < n; i++)//Nó bị sai chỗ i++ và đổi thành j++
                {
                         if(a[i].gio_lam < a[j].gio_lam)
                         {
                                  tmp = a[i];
                                  a[i] = a[j];
                                  a[j] = tmp;
                         }
                 }
  }

Cảm ơn các bác và đặc biệt là bác @drgnz đã fix cái topic nhìn khá nát của em ạ

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?