1. Bài tập sắp xếp mảng sinh viên theo tên bằng ngôn ngữ lập trình C

Yêu cầu của bài tập này chúng ta sẽ dùng mảng để quản lý sinh viên gồm có: nhập vào thông tin sinh viên(mã sinh viên, tên sinh viên, lớp), điểm các môn học (toán, văn, anh và điểm trung bình 3 môn), sắp xếp các sinh viên đó theo tên và hiển thị thông tin của sinh viên đó ra màn hình.

Để thực hiện được bài tập này ta cần những kiến thức từ ngôn ngữ lập trình C như: cách nhập xuất cơ bản, cách sử dụng mảng một chiều, cách sử dụng cấu trúc struct, cách sử dụng các cách sắp xếp và cách sử dụng hàm trong ngôn ngữ lập trình C.

2. Lời giải

Đầu tiên để 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, mảng một chiều trong C, cách sắp xếp các phần tử của mảng trong C , cách sử dụng hàm và cách sử dụng cấu trúc struct trong ngôn ngữ lập trình C.

Các bước thực hiện yêu cầu của bài tập sắp xếp mảng sinh viên sinh viên theo tê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ó: int MaSV(mã sinh viên); char TenSV[50](tên sinh viên); char Lop[50](lớp); float Dtoan(điểm toán); float Dvan(điểm văn); float Danh(điểm anh);

Bước 2: Trong hàm main ta khai báo mảng SinhVien sv[100] và biến int n là số sinh viên có trong mảng rồi nhập dữ liệu cho n.

Bước 3: Ta khỏi tạo hàm void Nhap(SinhVien sv[], int n) dùng để nhập dữ liệu từ bàn phím cho mảng. Trong hàm ta sử dụng vòng for bắt đầu từ int i =0 và kết thúc khi i<n và mỗi lần i tăng lên một để 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 4: Ta khởi tạo hàm void Xuat(SinhVien sv[], int n) dùng để hiển thị dữ liệu từ mảng ra màn hình. Trong hàm ta sử dụng vòng for bắt đầu từ int i =0 và 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 5: Ta khởi tạo hàm void Sapxep(SinhVien sv[], int n) dùng để sắp xếp sinh viên trong mảng theo tên. Trong hàm ta sử dụng vòng for bắt đầu từ int i = 0 và kết thúc khi i<n-1, trong vòng for i ta sử dụng vòng for bắt đầu từ int j = i+1, kết thúc khi j<n mỗi lần lặp j tăng lên 1, trong vòng for j ta sử dụng if với hàm so sánh chuỗi strcmp() nằm trong thư viện string.h để so sánh 2 tên sinh viên sv[i].TenSV và sv[j].TenSV nếu nó >0 (sắp xếp từ a đến z) thì ta đổi chỗ sv[i] cho sv[j] (bằng biến trung gian).

Bước 6: Trong hàm main ta gọi hàm Nhap(sv,n), Xuat(sv,n) và hàm Sapxep(sv,n) và Xuat(sv,n) để hiển thị mảng 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 mảng sinh viên sinh viên theo tên bằng ngôn ngữ lập trình C như sau:

#include<stdio.h>
#include<string.h>
//khai bao mot cau truc sinh vien
struct SinhVien{
    int MaSV;
    char TenSV[50];
    char Lop[50];
    float Dtoan;
    float Dvan;
    float Danh;
};
void Nhap(SinhVien sv[], int n)//ham nhap sinh vien
{
    for(int i=0; i<n ; i++)//vong lap for duyet sinh vien trong mang tu 0 den n-1
    {
        //nhap du lieu vao mang
        printf("Nhap sinh vien thu %d",i);
        printf("\nNhap ma sinh vien:");
        scanf("%d", &sv[i].MaSV);
        printf("\nNhap ten sinh vien:");
        fflush(stdin);
        gets(sv[i].TenSV);
        printf("\nNhap lop:");
        gets(sv[i].Lop);
        fflush(stdin);
        printf("\nNhap diem toan:");
        scanf("%f", &sv[i].Dtoan);
        printf("\nNhap diem van:");
        scanf("%f", &sv[i].Dvan);
        printf("\nNhap diem tieng anh:");
        scanf("%f", &sv[i].Danh);
    }
}
void Xuat(SinhVien sv[], int n)//ham xuat sinh vien
{
    printf("MaSV \t TenSV \t Lop \t Toan \t Van \t Anh \t DTB\n");
    for(int i=0; i<n ; i++)//vong lap for duyet sinh vien trong mang 0 den n-1
    {
        //hien thi cac sinh vien trong mang
        printf("%d \t %s \t %s \t %0.2f \t %0.2f \t %0.2f \t %0.2f\n", sv[i].MaSV, sv[i].TenSV, sv[i].Lop, sv[i].Dtoan , sv[i].Dvan , sv[i].Danh, (sv[i].Dtoan + sv[i].Dvan + sv[i].Danh)/3);
    }
}
void Sapxep(SinhVien sv[], int n)// ham sap xep
{
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
           if(strcmp(sv[i].TenSV,sv[j].TenSV)>0)//so sanh hai ten sinh vien
          {
            SinhVien k=sv[i];
            sv[i]=sv[j];
            sv[j]=k;
          }
        }
    } 
}
int main()
{
    SinhVien sv[100];// khai bao mang sinh vien co 100 o nho
    int n;//khai bao so nguyen n la sinh vien
    //Nhap du lieu cua n
    do{
        printf("Nhap so sinh vien:");
        scanf("%d", &n);
        if(n<1 || n>100)
        {
            printf("Nhap lai:");
        }
    }while(n<1 || n>100);//dieu kien neu n<1 hoac n>100 yeu cau nhap lai
    
    Nhap(sv, n);//goi ham nhap mang
    printf("\nDanh sach cac sinh vien la:\n");
    Xuat(sv,n);// goi ham xuat mang
    printf("\nDanh sau khi sap xep la:\n");
    Sapxep(sv,n);// goi sap xep
    Xuat(sv,n);
}

Kết quả:

Nhap so sinh vien:3
Nhap sinh vien thu 0
Nhap ma sinh vien:1

Nhap ten sinh vien:A

Nhap lop:12A7

Nhap diem toan:10

Nhap diem van:9

Nhap diem tieng anh:8
Nhap sinh vien thu 1
Nhap ma sinh vien:2

Nhap ten sinh vien:B

Nhap lop:12A7

Nhap diem toan:9

Nhap diem van:8

Nhap diem tieng anh:7
Nhap sinh vien thu 2
Nhap ma sinh vien:3

Nhap ten sinh vien:C

Nhap lop:12A7

Nhap diem toan:7

Nhap diem van:6

Nhap diem tieng anh:5

Danh sach cac sinh vien la:
MaSV     TenSV   Lop     Toan    Van     Anh     DTB
1        A       12A7    10.00   9.00    8.00    9.00
2        B       12A7    9.00    8.00    7.00    8.00
3        C       12A7    7.00    6.00    5.00    6.00

Danh sau khi sap xep la:
MaSV     TenSV   Lop     Toan    Van     Anh     DTB
1        A       12A7    10.00   9.00    8.00    9.00
2        B       12A7    9.00    8.00    7.00    8.00
3        C       12A7    7.00    6.00    5.00    6.00

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 ngôn ngữ lập trình C.
  • Cách sử dụng mảng một chiều trong ngôn ngữ lập trình C.
  • Các sử dụng cấu trúc struct trong ngôn ngữ C.
  • Cách sử dụng vòng lặp for để duyệt các phần tử trong mảng.
  • Cách sắp xếp mảng sinh viên theo tên trong C.
  • Cách đổi chỗ qua biến trung gian.