1. Bài tập sắp xếp mảng struct sinh viên theo điểm trong C

Bài tập này chúng ta sẽ sử dụng các kiến thức từ ngôn ngữ lập trình C như: cách nhập xuất cơ bản trong ngôn ngữ lập trình C,cách sử dụng hàm trong C, cách sử dụng struct trong ngôn ngữ lập trình C, sử dụng vòng lặp for để duyệt thông tin của từng sinh viên  và cách sử dụng các thuật toán sắp xếp trong C.

Ta có thông tin của các sinh viên gồm có: Mã sinh viên, Tên sinh viên, Lớp , Điểm tổng kết. Yêu cầu của bài toán là sắp xếp thứ tự của sinh viên theo điểm tổng kết tăng dần bằng ngôn ngữ lập trình C.

2. Lời gải

Để thực hiện bài toán này chúng ta cần có kiến thức cơ bản về ngôn ngữ lập trình C, các cách nhập xuất cơ bản trong C, cách sử dụng hàm trong C, cách sử dụng struct trong ngôn ngữ lập trình C, sử dụng vòng lặp for để duyệt thông tin của từng sinh viên và sử dụng thuật toán sắp xếp trong C (đối với bài tập này tôi sẽ sử dụng thuật toán nổi bọt bubble sort).

Các bước thực hiện yêu cầu của bài tập sắp xếp thứ tự của sinh viên theo điểm tổng kết tăng dần dần bằng ngôn ngữ lập trình C như sau:

Bước 1: Ta khai báo một cấu trúc struct SinhVien gồm có: char MaSV[50](mã sinh viên); char TenSV[50](tên sinh viên); char Lop[50](lớp); float DiemTongKet(điểm tổng kết) và mảng sv[100] kiểu sinh viên có tối đa 100 phần tử.

Bước 2: Ta khỏi tạo hàm void Nhap(int n) dùng để nhập dữ liệu từ bàn phím thông tin của sinh viên. Trong hàm ta sử dụng vòng for bắt đầu từ int i=0, kết thúc khi i<n và mỗi lần i tăng lên 1 để nhập dữ liệu cho từng sinh viên từ sv[0] đến sv[n-1], trong vòng for thì nhập vào dữ liệu của sinh viên.

Bước 3: Ta khởi tạo hàm void Xuat(int n) dùng để hiển thị dữ liệu của sinh viên ra màn hình. Trong hàm ta sử dụng vòng for bắt đầu từ int i=0, kết thúc khi i<n và mỗi lần i tăng lên một để hiển thị dữ liệu của từng sinh viên từ sv[0] đến sv[n-1] ra màn hình, trong vòng for in dữ liệu của sinh viên ra màn hình.

Bước 4: Ta khởi tạo hàm void sapxep(int n) dùng để sắp xếp sinh viên theo điểm tổng kết tăng dần. Trong hàm ta khởi tạo vòng lặp for bắt đầu từ int i=0, kết thúc khi i<n-i và mỗi lần lặp i tăng lên 1; trong vòng for i ta khởi tạo vòng for j bắt đầu từ int j = n-1, j>i và mỗi lần lặp j giảm đi 1. Trong vòng for j ta dùng if với điều kiện nếu sv[i].DiemTongKet > sv[j].DiemTongKet thỏa mãn thì ta đổi chỗ sv[i] và sv[j] cho nhau (sử dụng biến trung gian SinhVien tg).

Bước 5: Trong hàm main ta khởi tạo biến int n (số lượng sinh viên) và nhập dữ liệu từ bàn phím và cho n.

Bước 6: Ta gọi hàm Nhap(n), Xuat(n) để hiển thị danh sách sinh viên chưa sắp xếp và hàm sapxep(n), Xuat(n) để hiển thị thông tin sinh viên đã sắp xếp rồi chạy chương trình.

Chương trình giải bài tập sắp xếp thứ tự của sinh viên theo điểm tổng kết tăng dần dần bằng ngôn ngữ lập trình C như sau:

#include <stdio.h>
// khai bao mang sv kieu SinhVien co toi da 100 phan tu
struct SinhVien{
    char MaSV[50];
    char TenSV[50];
    char Lop[50];
    float DiemTongKet;
} sv[100];

void Nhap(int n){// ham nhap thong tin sinh vien
    for(int i=0; i<n; i++){
        printf("\nNhap thong tin sinh vien thu %d:",i);
        printf("\nNhap ma sinh vien:");
        fflush(stdin);
        gets(sv[i].MaSV);
        printf("\nNhap ten sinh vien:");
        fflush(stdin);
        gets(sv[i].TenSV);
        printf("\nNhap lop:");
        fflush(stdin);
        gets(sv[i].Lop);
        printf("\nNhap diem tong ket:");
        scanf("%f", &sv[i].DiemTongKet);
    }
}
void Xuat(int n){//ham hien thi thong tin sinh vien
    printf("\n-----THONG TIN SINH VIEN----\n");
    printf("MaSV \t TenSV \t\t Lop \t DiemTongKet \n");
    for(int i=0; i<n; i++){
        printf("%s \t %s \t %s \t %f \n",sv[i].MaSV,sv[i].TenSV,sv[i].Lop,sv[i].DiemTongKet);
    }
}

void sapxep(int n){// ham sap xep su dung thuat toan noi bot
    for(int i=0; i<n-1; i++){
        for(int j=n-1;j>i;j--){
            if(sv[i].DiemTongKet > sv[j].DiemTongKet){// so sanh diem tong ket cua 2 sinh vien
                // doi cho hai sinh vien qua bien SinhVien tg
                SinhVien tg = sv[i];
                sv[i] = sv[j];
                sv[j] = tg;
            }
        }
    }
}

int main(){
    int n; // khai bao so sinh vien
    printf("Nhap so sinh vien:");
    scanf("%d",&n);
    Nhap(n);
    Xuat(n);
    printf("/n--DANH SACH SINH VIEN SAU KHI SAP XEP--/n");
    sapxep(n);
    Xuat(n);
}

Kết quả:

Nhap so sinh vien:3
Nhap thong tin sinh vien thu 0:
Nhap ma sinh vien:SV01
Nhap ten sinh vien:Chu Minh Nam
Nhap lop:D15CNPM2
Nhap diem tong ket:9

Nhap thong tin sinh vien thu 1:
Nhap ma sinh vien:SV02
Nhap ten sinh vien:Phung Thai Son
Nhap lop:D15CNPM2
Nhap diem tong ket:8

Nhap thong tin sinh vien thu 2:
Nhap ma sinh vien:SV03
Nhap ten sinh vien:Nguyen TriThanh
Nhap lop:D15TMDT6
Nhap diem tong ket:7

-----THONG TIN SINH VIEN----
MaSV     TenSV           Lop        DiemTongKet
SV01     Chu Minh Nam    D15CNPM2   9.000000
SV02     Phung Thai Son  D15CNPM2   8.000000
SV03     Nguyen TriThanh D15TMDT6   7.000000
/n--DANH SACH SINH VIEN SAU KHI SAP XEP--/n
-----THONG TIN SINH VIEN----
MaSV     TenSV           Lop        DiemTongKet
SV03     Nguyen TriThanh D15TMDT6   7.000000
SV02     Phung Thai Son  D15CNPM2   8.000000
SV01     Chu Minh Nam    D15CNPM2   9.000000

3. Tổng kết

Sau khi làm bài tập này các bạn cần phải hiểu và nắm được những kiến thức sau:

  • Cách nhập xuất cơ bản trong ngôn ngữ lập trình C.
  • Cách sử dụng hàm trong C.
  • Cách sử dụng struct trong C.
  • Cách sử dụng vòng lặp để duyệt thông tin của từng sinh viên trong C.
  • Cách nhập và hiển thị thông tin sinh viên trong C.
  • Cách sử dụng thuật toán sắp xếp trong C.