0965303260
TP. Hồ Chí Minh

[C]. Tìm Kiếm Với Cấu Trúc

Tìm kiếm trên mảng cấu trúc là bài toán thường gặp và tương đối đơn giản, trong bài viết này mình sẽ hướng dẫn các bạn cách tìm kiếm để lọc dữ liệu trong mảng cấu trúc.

NỘI DUNG : 

  • Tìm kiếm với mảng cấu trúc
  • Video tutorial 

tìm kiếm struct

Tìm kiếm với mảng cấu trúc 

Trong các ví dụ dưới đây mình sẽ sử dụng cấu trúc sinh viên để demo. 

Nếu bạn chưa biết thuật toán tìm kiếm tuyến tính thì bạn có thể học tại đây

Các hàm nhập xuất mình sử dụng trong chương trình như sau : 

struct SinhVien{
    char ma[50];
    char hoten[50];
    char lop[50];
    char ngaysinh[50];
    double gpa;
};

typedef struct SinhVien SinhVien;

void nhap(SinhVien *x){
    getchar();
    printf("Nhap ma sv : "); gets(x->ma);
    printf("Nhap ho ten : "); gets(x->hoten);
    printf("Nhap lop : "); gets(x->lop);
    printf("Nhap ngay sinh : "); gets(x->ngaysinh);
    printf("Nhap diem gpa : "); scanf("%lf", &x->gpa);
}

void xuat(SinhVien x){
    printf("------------------------\n");
    printf("%s\n", x.ma);
    printf("%s\n", x.hoten);
    printf("%s\n", x.lop);
    printf("%s\n", x.ngaysinh);
    printf("%.2lf\n", x.gpa);
    printf("------------------------\n");
}

void nhapDS(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Nhap thong tin sinh vien thu %d : \n", i + 1);
        nhap(&a[i]);
    }
}


Bài toán 1. Tìm kiếm sinh viên theo mã cho trước

Bạn sẽ xây dựng một hàm có tham số là 1 mảng struct và tên mã sinh viên cần tìm kiếm, tiến hành duyệt tuần tự và so sánh mã sinh viên của sinh viên trong danh sách với mã sinh viên cần tìm.

Code : 

void tim_kiem_ma(SinhVien a[], int n, char masv[]){
    int found = 0;
    for(int i = 0; i < n; i++){
        if(strcmp(masv, a[i].ma) == 0){
            xuat(a[i]);
            found = 1; 
            break;
        }
    }
    if(found == 0){
        printf("Khong tim thay sinh vien co ma %s\n", masv);
    }
}

int main(){
    int n; 
    SinhVien a[1000];
    printf("Nhap so luong sinh vien : ");
    scanf("%d", &n);
    nhapDS(a, n);
    char masv[100];
    printf("Nhap ma sinh vien can tim kiem : ");
    getchar();
    gets(masv);
    tim_kiem_ma(a, n, masv);
}


Bài toán 2 : Liệt kê những sinh viên có điểm gpa cao nhất theo thứ tự trong danh sách

Để làm bài toán này trước hết bạn tìm điểm gpa cao nhất trong danh sách sinh viên sau đó duyệt danh sách và so khớp nếu gpa của sinh viên duyệt qua bằng với điểm gpa cao nhất thì in ra thông tin.

Code : 

void tim_kiem_gpa(SinhVien a[], int n){
    double max_gpa = 0;
    for(int i = 0; i < n; i++){
        if(a[i].gpa > max_gpa){
            max_gpa = a[i].gpa;
        }
    }
    printf("Danh sach sinh vien co diem gpa cao nhat : \n");
    for(int i = 0; i < n; i++){
        if(a[i].gpa == max_gpa){
            xuat(a[i]);
        }
    }
}

int main(){
    int n; 
    SinhVien a[1000];
    printf("Nhap so luong sinh vien : ");
    scanf("%d", &n);
    nhapDS(a, n);
    tim_kiem_gpa(a, n);
}


Bài toán 3 : Tìm kiếm các sinh viên có chứa cụm từ cho trước

Để làm bài này bạn cần sử dụng hàm strstr() để kiểm tra xâu con, nếu tên sinh viên chứa cụm tìm kiếm thì in thông tin.

Code : 

void tim_kiem_ten(SinhVien a[], int n, char tensv[]){
    int found = 0;
    for(int i = 0; i < n; i++){
        if(strstr(a[i].hoten, tensv) != NULL){
            xuat(a[i]);
            found = 1;
        }
    }
    if(found == 0){
        printf("Khong tim thay sinh vien co ten chua cum %s\n", tensv);
    }
}

int main(){
    int n; 
    SinhVien a[1000];
    printf("Nhap so luong sinh vien : ");
    scanf("%d", &n);
    nhapDS(a, n);
    getchar();
    char tensv[100];
    printf("Nhap ten sinh vien can tim kiem : ");
    gets(tensv);
    tim_kiem_ten(a, n, tensv);
}


Bài toán 4 : Tìm kiếm sinh viên sinh vào tháng cho trước

Bài toán này bạn nên viết 1 hàm để lấy về tháng từ ngày sinh của sinh viên, ngày sinh của sinh viên ở dạng chuẩn dd/mm/yyyy ví dụ 22/12/2002

Để tách ra tháng bạn có thể xử lý xâu cơ bản hoặc dùng strtok()

Code : 

int thang(char date[]){
    int res = (date[3] - '0') * 10 + (date[4] - '0');
    return res;
}

void tim_kiem_thang(SinhVien a[], int n, int month){
    int found = 0;
    for(int i = 0; i < n; i++){
        if(thang(a[i].ngaysinh) == month){
            xuat(a[i]);
            found = 1;
        }
    }
    if(found == 0){
        printf("Khong tim thay sinh vien sinh vao thang %d\n", month);
    }
}

int main(){
    int n; 
    SinhVien a[1000];
    printf("Nhap so luong sinh vien : ");
    scanf("%d", &n);
    nhapDS(a, n);
    int month;
    printf("Nhap vao thang can tim kiem : ");
    scanf("%d", &month);
    tim_kiem_thang(a, n, month);
}


Video Struct : 

i1c-BG0LJmc