Thứ Bảy, 20 tháng 4, 2024

46. Chương trình tào lao phiên bản 3 phần 3

Phần này sẽ khó khăn hơn so với Hàm Xuất.


Hàm xuất thông tin 1 sinh viên đơn giản là in thông tin sinh viên đó, vì vậy trong hàm xuatSinhVien(SinhVien a[], int n) chúng ta chỉ cần gọi hàm xuất thông tin 1 sinh viên trong mỗi vòng lặp là toàn bộ thông tin sẽ được in ra.
Với hàm nhập có đôi chút khác biệt, trong phiên bản 2, mỗi vòng lặp sau hàm fgets() chúng ta cần sử dụng hàm strndup() để sao chép giá trị.

Chúng ta sẽ viết trước hàm nhap(SinhVien x) để nhập thông tin 1 sinh viên. Đại khái chúng ta sẻ hỏi từng thông tin, sau đó người dùng sẽ nhập thông tin và câu hỏi tiếp theo sẽ hiện lên, cứ vậy cho đến khi xong.
 

Đây là phác họa, chúng ta sẽ sửa lại một chút, tương tự như phiên bản 2, chúng ta sẽ sử dụng con trỏ, hàm sẽ trở thành nhap(SinhVien *x)

void nhap(SinhVien *x){
   printf("Nhap ten : ");
   fgets(x->hoten, sizeof(x->hoten), stdin);
   printf("Nhap email : ");
   fgets(x->email, sizeof(x->email), stdin);
   printf("Nhap dia chi : ");
   fgets(x->diaChi, sizeof(x->diaChi), stdin);
   printf("Nhap nganh hoc : ");
   fgets(x->chuyenNganh, sizeof(x->chuyenNganh), stdin);
   printf("Nhap diem trung binh : ");
    scanf("%lf", &x->diemTrungBinh);
}

 

Bây giờ chương trình của chúng ta sẽ như sau

 

#include "stdio.h"


struct SinhVien{
    char hoten[50];
    char email[50];
    char diaChi[60];
    char chuyenNganh[40];
    double diemTrungBinh;
};
//Thay struct SinhVien = SinhVien
typedef struct SinhVien SinhVien;

void nhap(SinhVien *x);
void nhapSinhVien(SinhVien a[], int n);
void xuat(SinhVien x);
void xuatSinhVien(SinhVien a[], int n);

int main(){
    struct SinhVien sv[3] = {
               {"Tran Van A", "tranvanA@email.com","123 HV Da Nang", "CNTT", 6.80},
               {"Le Van B", "levanB@email.com","456 HV Da Nang", "CNTT", 7.80},
               {"Nguyen Thi C", "nguyenthiC@email.com","789 HV Da Nang", "CNTT", 8.80}
    };
    xuatSinhVien(sv, 3);
    //SinhVien x = sv[0];
    //xuat(x);
    
    return 0;
}

void nhap(SinhVien *x){
   printf("Nhap ten : ");
   fgets(x->hoten, sizeof(x->hoten), stdin);
   printf("Nhap email : ");
   fgets(x->email, sizeof(x->email), stdin);
   printf("Nhap dia chi : ");
   fgets(x->diaChi, sizeof(x->diaChi), stdin);
   printf("Nhap nganh hoc : ");
   fgets(x->chuyenNganh, sizeof(x->chuyenNganh), stdin);
   printf("Nhap diem trung binh : ");
    scanf("%lf", &x->diemTrungBinh);
}

void nhapSinhVien(SinhVien a[], int n){
}
void xuat(SinhVien x){
    printf("------------------------\n");
    printf("Ho ten : %s\n", x.hoten);
    printf("Email : %s\n", x.email);
    printf("Dia chi : %s\n", x.diaChi);
    printf("Chuyen nganh : %s\n", x.chuyenNganh);
    printf("Diem trung binh : %.2lf\n", x.diemTrungBinh);
    printf("------------------------\n");
}
void xuatSinhVien(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Thong tin sinh vien thu %d :\n", i + 1);
        xuat(a[i]);
    }
}
Sử dụng IDE Online, chúng ta sẽ chạy thử chương trình



Chúng ta sẽ dùng vòng lặp For để nhập thông tin toàn bộ sinh viên trong hàm void nhapSinhVien(SinhVien a[], int n)

Đây là code của hàm:

void nhapSinhVien(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]);

       }
}
 

Đến lúc này chương trình của chúng ta sẽ như sau:

 #include "stdio.h"


struct SinhVien{
    char hoten[50];
    char email[50];
    char diaChi[60];
    char chuyenNganh[40];
    double diemTrungBinh;
};
//Thay struct SinhVien = SinhVien
typedef struct SinhVien SinhVien;

void nhap(SinhVien *x);
void nhapSinhVien(SinhVien a[], int n);
void xuat(SinhVien x);
void xuatSinhVien(SinhVien a[], int n);

int main(){
    struct SinhVien sv[3] = {
               {"Tran Van A", "tranvanA@email.com","123 HV Da Nang", "CNTT", 6.80},
               {"Le Van B", "levanB@email.com","456 HV Da Nang", "CNTT", 7.80},
               {"Nguyen Thi C", "nguyenthiC@email.com","789 HV Da Nang", "CNTT", 8.80}
    };
    xuatSinhVien(sv, 3);
    //SinhVien x = sv[0];
    //xuat(x);
    
    return 0;
}

void nhap(SinhVien *x){
   printf("Nhap ten : ");
   fgets(x->hoten, sizeof(x->hoten), stdin);
   printf("Nhap email : ");
   fgets(x->email, sizeof(x->email), stdin);
   printf("Nhap dia chi : ");
   fgets(x->diaChi, sizeof(x->diaChi), stdin);
   printf("Nhap nganh hoc : ");
   fgets(x->chuyenNganh, sizeof(x->chuyenNganh), stdin);
   printf("Nhap diem trung binh : ");
    scanf("%lf", &x->diemTrungBinh);
}

void nhapSinhVien(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]);

}
}
void xuat(SinhVien x){
    printf("------------------------\n");
    printf("Ho ten : %s\n", x.hoten);
    printf("Email : %s\n", x.email);
    printf("Dia chi : %s\n", x.diaChi);
    printf("Chuyen nganh : %s\n", x.chuyenNganh);
    printf("Diem trung binh : %.2lf\n", x.diemTrungBinh);
    printf("------------------------\n");
}
void xuatSinhVien(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Thong tin sinh vien thu %d :\n", i + 1);
        xuat(a[i]);
    }
}


Chạy thử chương trình


 


Để chạy thử chương trình, chúng ta tạo thêm một biến kiểu SinhVien: SinhVien sv2[3];
Sau đó ta gọi hàm nhapSinhVien(SinhVien a[], int n) với int n giả định là 3: nhapSinhVien(sv2, 3);
Đây là code chương trình cho đến lúc này:

#include "stdio.h"


struct SinhVien{
    char hoten[50];
    char email[50];
    char diaChi[60];
    char chuyenNganh[40];
    double diemTrungBinh;
};
//Thay struct SinhVien = SinhVien
typedef struct SinhVien SinhVien;

void nhap(SinhVien *x);
void nhapSinhVien(SinhVien a[], int n);
void xuat(SinhVien x);
void xuatSinhVien(SinhVien a[], int n);

int main(){
    
    struct SinhVien sv[3] = {
               {"Tran Van A", "tranvanA@email.com","123 HV Da Nang", "CNTT", 6.80},
               {"Le Van B", "levanB@email.com","456 HV Da Nang", "CNTT", 7.80},
               {"Nguyen Thi C", "nguyenthiC@email.com","789 HV Da Nang", "CNTT", 8.80}
    };
    SinhVien sv2[3];
    nhapSinhVien(sv2, 3);

    xuatSinhVien(sv, 3);
    //SinhVien x = sv[0];
    //xuat(x);
    
    return 0;
}

void nhap(SinhVien *x){
   printf("Nhap ten : ");
   fgets(x->hoten, sizeof(x->hoten), stdin);
   printf("Nhap email : ");
   fgets(x->email, sizeof(x->email), stdin);
   printf("Nhap dia chi : ");
   fgets(x->diaChi, sizeof(x->diaChi), stdin);
   printf("Nhap nganh hoc : ");
   fgets(x->chuyenNganh, sizeof(x->chuyenNganh), stdin);
   printf("Nhap diem trung binh : ");
    scanf("%lf", &x->diemTrungBinh);
}

void nhapSinhVien(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]);

}
}
void xuat(SinhVien x){
    printf("------------------------\n");
    printf("Ho ten : %s\n", x.hoten);
    printf("Email : %s\n", x.email);
    printf("Dia chi : %s\n", x.diaChi);
    printf("Chuyen nganh : %s\n", x.chuyenNganh);
    printf("Diem trung binh : %.2lf\n", x.diemTrungBinh);
    printf("------------------------\n");
}
void xuatSinhVien(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Thong tin sinh vien thu %d :\n", i + 1);
        xuat(a[i]);
    }
}


Khi chạy thử chương trình chúng ta sẽ gặp tình trạng Trôi lệnh giống phiên bản 2, để khác phục, chúng ta sử dụng
lệnh scanf("\n")

Đồng thời sửa lại lệnh xuất: xuatSinhVien(sv2, 3);


Chạy thử chương trình, mọi thứ đã hoàn hảo.



Đây là code hoàn chỉnh của chương trình

#include "stdio.h"


struct SinhVien{
    char hoten[50];
    char email[50];
    char diaChi[60];
    char chuyenNganh[40];
    double diemTrungBinh;
};
//Thay struct SinhVien = SinhVien
typedef struct SinhVien SinhVien;

void nhap(SinhVien *x);
void nhapSinhVien(SinhVien a[], int n);
void xuat(SinhVien x);
void xuatSinhVien(SinhVien a[], int n);

int main(){
    
    struct SinhVien sv[3] = {
               {"Tran Van A", "tranvanA@email.com","123 HV Da Nang", "CNTT", 6.80},
               {"Le Van B", "levanB@email.com","456 HV Da Nang", "CNTT", 7.80},
               {"Nguyen Thi C", "nguyenthiC@email.com","789 HV Da Nang", "CNTT", 8.80}
    };
    SinhVien sv2[3];
    nhapSinhVien(sv2, 3);
    xuatSinhVien(sv2, 3);
    //SinhVien x = sv[0];
    //xuat(x);
    
    return 0;
}

void nhap(SinhVien *x){
   printf("Nhap ten : ");
   scanf("\n");
   fgets(x->hoten, sizeof(x->hoten), stdin);
   printf("Nhap email : ");
   fgets(x->email, sizeof(x->email), stdin);
   printf("Nhap dia chi : ");
   fgets(x->diaChi, sizeof(x->diaChi), stdin);
   printf("Nhap nganh hoc : ");
   fgets(x->chuyenNganh, sizeof(x->chuyenNganh), stdin);
   printf("Nhap diem trung binh : ");
    scanf("%lf", &x->diemTrungBinh);
}

void nhapSinhVien(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]);

}
}
void xuat(SinhVien x){
    printf("------------------------\n");
    printf("Ho ten : %s\n", x.hoten);
    printf("Email : %s\n", x.email);
    printf("Dia chi : %s\n", x.diaChi);
    printf("Chuyen nganh : %s\n", x.chuyenNganh);
    printf("Diem trung binh : %.2lf\n", x.diemTrungBinh);
    printf("------------------------\n");
}
void xuatSinhVien(SinhVien a[], int n){
    for(int i = 0; i < n; i++){
        printf("Thong tin sinh vien thu %d :\n", i + 1);
        xuat(a[i]);
    }
}


Phần tiếp theo

Phần trước

Không có nhận xét nào:

Đăng nhận xét