0965303260
TP. Hồ Chí Minh

[C]. Mảng cấu trúc

Mảng cấu trúc giúp các bạn có thể giải quyết được các bài toán kiểu quản lý danh sách đối tượng : quản lý sinh viên, quản lý thư viện...

NỘI DUNG : 

  • Mảng cấu trúc
  • Hàm nhập mảng cấu trúc
  • Hàm xuất mảng cấu trúc
  • Video tutorial 

main frame

1. Mảng cấu trúc

Giả sử bạn cần quản lý danh sách khoảng 5000 sinh viên, khi đó thứ bạn cần đó là một mảng kiểu sinh viên có 5000 phần tử, mỗi phần tử trong mảng sẽ là một sinh viên

Sau khi có danh sách sinh viên được lưu trong mảng rồi thì bạn có thể sắp xếp, tìm kiếm, xóa, thay đổi thông tin ...

Ví dụ : Khai báo mảng sinh viên có 5000 phần tử

#include "stdio.h"
#include "string.h"

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

typedef struct SinhVien SinhVien;

int main(){
    SinhVien a[5000];
    return 0;
}


2. Hàm nhập mảng cấu trúc

Để nhập thông tin cho 1 mảng cấu trúc, ví dụ danh sách N sinh viên thì bạn nên viết 1 hàm nhập thông tin cho 1 sinh viên và một hàm nhập danh sách sẽ gọi hàm nhập 1 sinh viên để nhập toàn bộ danh sách

Mình hướng dẫn 2 cách xây dựng hàm nhập thông tin cho 1 sinh viên, bạn có thể lựa chọn cách mình thấy dễ tiếp cận.

Code 1 : Hàm nhập sử dụng con trỏ

void nhap(SinhVien *x){
    printf("Nhap ten : ");
    gets(x->hoten);
    printf("Nhap lop : ");
    gets(x->lop);
    printf("Nhap gpa : ");
    scanf("%lf", &x->gpa);
}

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

Code 2 : Hàm nhập không sử dụng con trỏ nhưng trả về kiểu cấu trúc

SinhVien nhap(SinhVien x){
    printf("Nhap ten : ");
    gets(x.hoten);
    printf("Nhap lop : ");
    gets(x.lop);
    printf("Nhap gpa : ");
    scanf("%lf", &x.gpa);
    return x;
}

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


3. Hàm xuất mảng cấu trúc

Tương tự như để xuất mảng cấu trúc bạn nên xây dựng hàm để in thông tin cho 1 biến struct rồi xây dựng thêm 1 hàm in ra toàn bộ mảng

Code : 

void xuat(SinhVien x){
    printf("------------------------\n");
    printf("Ho ten : %s\n", x.hoten);
    printf("Lop : %s\n", x.lop);
    printf("Gpa : %.2lf\n", x.gpa);
    printf("------------------------\n");
}

void xuatDS(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Thong tin sinh vien thu %d :\n", i + 1);
        xuat(a[i]);
    }
}


Kết hợp code 2 phần nhập xuất bạn có thể nhập thông tin cho danh sách sinh viên từ bàn phím và in ra thông tin các sinh viên trong danh sách như sau 

Chú ý xử lý trôi lệnh khi nhập tên cho mỗi sinh viên trong danh sách

Code : 

#include "stdio.h"
#include "string.h"

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

typedef struct SinhVien SinhVien;

SinhVien nhap(SinhVien x){
    printf("Nhap ten : ");
    gets(x.hoten);
    printf("Nhap lop : ");
    gets(x.lop);
    printf("Nhap gpa : ");
    scanf("%lf", &x.gpa);
    getchar(); // xoa enter sau khi nhap scanf
    return x;
}

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

void xuat(SinhVien x){
    printf("------------------------\n");
    printf("Ho ten : %s\n", x.hoten);
    printf("Lop : %s\n", x.lop);
    printf("Gpa : %.2lf\n", x.gpa);
    printf("------------------------\n");
}

void xuatDS(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Thong tin sinh vien thu %d :\n", i + 1);
        xuat(a[i]);
    }
}


int main(){
    SinhVien a[5000];
    int n; // so luong sinh vien
    printf("Nhap so luong sinh vien : ");
    scanf("%d", &n);
    getchar();
    nhapDS(a, n);
    xuatDS(a, n);
    return 0;
}


Video Struct : 

i1c-BG0LJmc