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 :