30/09/2018, 18:18

Làm menu chức năng

khi chọn case 2 thì nó chỉ hiện menu mà không xuất ra được mảng danh sách sinh viên

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

typedef struct SinhVien
{
    int maSV;
    char hoTen[30];
    float diem;
    char xepLoai[15];
}SV;
void nhapMotSV(SV &sv)
{
    printf("-->MA SO SV: ");
    scanf("%d", &sv.maSV);
    printf("-->HO TEN SV: ");       fflush(stdin);
    gets(sv.hoTen);
    printf("-->DIEM SV: ");
    scanf("%f", &sv.diem);
}
void nhapMangSV(SV sv[], int n)
{
    for(int i=0; i<n; i++)
    {
        printf("Nhap thong tin sinh vien thu %d:
", i+1);
        nhapMotSV(sv[i]);

        if(sv[i].diem >= 8)
            strcpy(sv[i].xepLoai, "GIOI");
        else if(7 <= sv[i].diem && sv[i].diem < 8)
            strcpy(sv[i].xepLoai, "KHA");
        else if(5 <= sv[i].diem && sv[i].diem < 7)
            strcpy(sv[i].xepLoai, "TRUNG BINH");
        else
            strcpy(sv[i].xepLoai, "YEU");

        for(int j=0; j<i; j++)
            while(sv[i].maSV == sv[j].maSV)
            {
                printf("Trung ma sinh vien. Moi nhap lai ma sinh vien: ");
                scanf("%d", &sv[i].maSV);
            }
    }
}

void xuatMotSV(SV sv, int i)
{
    printf("%-5d %-20d %-30s %10.2f %20s
", i, sv.maSV, sv.hoTen, sv.diem, sv.xepLoai);
}
void XuatMangSV(SV sv[], int n)
{
    printf("%-5s %-20s %-30s %10s %20s
", "STT", "MSSV", "HO TEN", "DIEM", "XEP LOAI");
    for(int i=0; i<n; i++)
        xuatMotSV(sv[i], i+1);
}

int linearSearch(SV sv[], int n, int x)
{
    int i = 0;
    sv[n].maSV = x;
    while(sv[i].maSV != x)
        i++;
    if(i<n) return i;
    return -1;
}
void HoanVi(SV &a, SV &b)
{
    SV t = a;  a = b;   b = t;
}
void interChangeSort(SV sv[], int n)
{
    for(int i=0; i<n-1; i++)
        for(int j=i+1; j<n; j++)
            if(sv[i].diem < sv[j].diem)
                HoanVi(sv[i], sv[j]);
}
void deleteY(SV sv[], int &n, int k)
{
    for(int i=k; i<n-1; i++)
        sv[i] = sv[i+1];
    n--;
}
int main()
{
    int n, chon = 0 , x, kq;
    SV sv[MAX];
    do
    {
        system("cls");
        printf("			 ============MENU================================
");
        printf("			 |1. Tao danh sach sinh vien                    |
");
        printf("			 |2. Xuat danh sach sinh vien                   |
");
        printf("			 |3. Tim Kiem sinh vien ma X                    |
");
        printf("			 |4. Sap xep danh sach theo thu tu giam dan diem|
");
        printf("			 |5. Xoa sinh vien co ma Y                      |
");
        printf("			 |6. Thoat                                      |
");
        printf("			 ================================================
");
        printf("Ban chon: ");
        scanf("%d", &chon);
        switch(chon)
        {
            case 1:
                printf("Nhap so luong sinh vien: ");
                scanf("%d", &n);
                nhapMangSV(sv,n);
                break;
            case 2:
                XuatMangSV(sv,n);
                break;
            case 3:
                printf("Nhap vao ma sinh vien can tim kiem: ");
                scanf("%d", &x);
                kq = linearSearch(sv,n,x);
                if(kq == -1)
                    printf("Du lieu sai
");
                else
                {
                    printf("THONG TIN SV TIM THAY:
");
                    printf("%-5s %-20s %-30s %10s %20s
", "STT", "MSSV", "HO TEN", "DIEM", "XEP LOAI");
                    xuatMotSV(sv[kq],kq);
                }
                break;
            case 4:
                interChangeSort(sv,n);
                printf("DANH SACH SAU KHI SAP XEP DIEM GIAM DAN:
");
                XuatMangSV(sv,n);
                break;
            case 5:
                printf("Nhap ma sinh vien can xoa: ");
                scanf("%d", &x);
                deleteY(sv,n,x);
                printf("DANH SACH SAU KHI XOA:
");
                XuatMangSV(sv,n);
                break;
            case 6:
                break;
            default:
                printf("Ban chon sai. Moi ban chon lai MENU!
");
                break;
        }
    }while(chon!=6);
    return 0;
}
vũ xuân quân viết 20:34 ngày 30/09/2018

tự đề một đường nội dung hỏi một nẻo ?
Không đưa phần code của hàm cần hỏi lên thì làm sao biết vì sao sai ?
Đưa kiểu này thì chả có ai giúp được.

Interns viết 20:27 ngày 30/09/2018

đã show toàn code rồi đó @masoivn. Cái mình hỏi chỉ ở chỗ làm menu thôi còn mấy hàm khác là đúng hết rồi. Bạn test giúp mình thì biết

Phạm Chương viết 20:24 ngày 30/09/2018

Mình có 1 vài góp ý .

  1. Lập trình nếu thắc mắc logic hướng xử lý , ý tưởng bạn hỏi.
  2. Lập trình nên debug xem lỗi nằm chỗ nào chứ bỏ lên đoạn code hỏi không có ai đủ kiên nhẫn ngồi đọc đâu bạn.
Interns viết 20:23 ngày 30/09/2018

@Chuong_Pham mình chỉ hỏi chỗ làm menu. Bây giờ bạn chạy thử giúp mình đi bạn sẽ hiểu mình hỏi cái gì

Pham Van Hai viết 20:26 ngày 30/09/2018

Mình chạy kết quả in ra bình thường nhé. Lưu ý bạn một số chỗ

  • Không nên dùng hàm này để xóa bộ đệm, vì nó thực sự không hoạt động

fflush(stdin);

thay vào đó bọn có thể dùng getchar();

  • ‘char* gets(char*)’ is deprecated , do vậy bạn không nên dùng hàm này nữa bạn có thể dùng fgets(); thay thế.
Interns viết 20:24 ngày 30/09/2018

ok cảm ơn @Pham_Van_Hai nhe! . Chỗ menu ví dụ mình chọn 1 thì là nhập sinh viên sau đó mình muốn xoá sạch màn hình và tiếp tục chọn 2 và xuất ra, sau đó mình xoá sạch màn hình và tiếp tục chọn … thì dùng cách nào nhỉ

vũ xuân quân viết 20:21 ngày 30/09/2018

Lý do sao mình nói như vậy: swtich case là đơn giản: nên không thể gây ra lỗi. Nên lỗi có thể xảy ra trong hàm xử lý của swtich case đó. Do đó khi đọc code mình chỉ nghĩ lỗi xảy ra trong hàm.

chỗ xóa màn hình tham khảo link này
http://www.programmingsimplified.com/c/conio.h/clrscr

*grab popcorn* viết 20:22 ngày 30/09/2018

Tại s fflush ko thực sự hoạt động vậy bạn? Bạn có thể nói rõ thêm đc ko? Hoặc đưa link nói về vấn đề này cũng đc.

Pham Van Hai viết 20:32 ngày 30/09/2018

Theo chuẩn C có nói bạn nhé.

The C standard says:
If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

Cụ thể bạn có thể xem ở đây

stackoverflow.com
C graphics

What does fflush(stdin) do in C programing?

c, operating-system, signals
asked by C graphics on 12:45AM - 07 Apr 14

Bài liên quan
0