PDA

View Full Version : Nhờ các bác trên diễn đàn chỉ lỗi bài C .



ansobimat
28-04-2009, 19:26
Em làm bài C này rồi nhưng mà nó cứ báo lỗi không bít là phải sửa thế nào. Mong các bác trên diễn đàn chỉ giúp lỗi dùm em . Em cám ơn các bác.
Nó cứ báo lỗi :
Incompatible type conversion ở đoạn
if(strcmp(a[i].dtb,a[j].dtb)>0) và ở đoạn
if(strcmp(DTB,a[i].dtb)==0) và một số chỗ khác. Nhìn chung cứ chỗ nào liên quan đến dtb( điểm trung bình ) là nó báo lỗi. Em không hiểu tại sao. Mong các bác chỉ dùm.


#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

#define NMAX 100
typedef struct SinhVien
{
char MaSV[10],HoTen[30];
float Toan;
float Ly;
float Hoa;
float dtb;
} SinhVien;

SinhVien a[NMAX];
SinhVien SV;

// Cac ham su dung
void menu();//ham chon menu
void KhoiTao();// ham khoi tao danh sach
SinhVien Nhap(SinhVien SV);// ham nhap k sinh vien
void Xem(SinhVien SV);// ham xem danh sach sinh vien
void SapXep();// sap xep danh sach theo thu tu tang dan theo diem trung binh
void KiemTra();//Kiem tra danh sach da sap xep chua
int check();
void TimKiemTuyenTinh(); //tim kiem tuyen tinh theo hoten
void TimKiemNhiPhan();// tim kiem nhi phan theo dtb.
void Xoa();// xoa sinh vien co masv=x, ma sinh vien nhap tu ban phim
void Chen();// chen mot sinh vien vao danh sach da sap xep sao cho tinh sap xep van duoc bao ton
void LuuRaFile();//luu danh sach sinh vien ra file
void Doc_HienThi();// doc danh sach sinh vien tu file va hien thi
void KetThuc();
static int intCount=0;

// Ham chinh
void main()
{
int k;
char intSelect;
do
{
clrscr();
menu();
fflush(stdin);
scanf("%s",&intSelect);
switch(intSelect)
{
case '1': KhoiTao();
break;
case '2': Nhap(SV);
break;
case '3': Xem(SV);
break;
case '4': SapXep();
break;
case '5': KiemTra();
break;
case '6': TimKiemTuyenTinh();
break;
case '7': TimKiemNhiPhan();
break;
case '8': Xoa();
break;
case '9': Chen();
break;
case 's': LuuRaFile();
break;
case 'l' || 'L': Doc_HienThi();
break;
case 'z': KetThuc();
break;
default: printf("\nBan da nhap sai. Xin vui long nhap lai!");
}
}
while (intSelect !='0');
}


// Ham menu
void menu()
{
printf("\n************************************************ ******************************************");
printf("\n* MENU LUA CHON SINH VIEN *");
printf("\n************************************************ ******************************************");
printf("\n* Cac ban hay dua ra lua chon *");
printf("\n* 1. Khoi tao danh sach. *");
printf("\n* 2. Nhap k sinh vien. *");
printf("\n* 3. Xem danh sach sinh vien. *");
printf("\n* 4. Sap xep danh sach theo thu tu tang dan theo dtb *");
printf("\n* 5. Kiem tra xem danh sach da sap xep chua. *");
printf("\n* 6. Tim kiem tuyen tinh theo hoten. *");
printf("\n* 7. Tim kiem nhi phan theo dtb. *");
printf("\n* 8. Xoa sinh vien co masv=x, masv nhap tu ban phim. *");
printf("\n* 9. Chen mot sinh vien vao danh sach da sap xep sao cho tinh sap xep van duoc bao ton *");
printf("\n* s. Luu danh sach sinh vien ra file *");
printf("\n* l or L. Doc danh sach sinh vien tu file va hien thi. *");
printf("\n* z. Ket thuc. *");
}

// Ham khoi tao
void KhoiTao()
{
printf(" Khoi tao danh sach\n");
if (intCount!=0)
intCount=0;
printf(" Danh sach da duoc khoi tao\n");
getch();
return;
}

// Ham Nhap du lieu
SinhVien Nhap(SinhVien SV)
{
int k;
clrscr();
printf("Ban hay nhap so sinh vien:");
fflush(stdin);
scanf("%d",&k);
do
{
intCount+=1;
printf("\n Sinh vien thu %d",intCount);
printf("\n Ho ten:");
fflush(stdin);
gets(a[intCount].HoTen);
printf("\n Ma sinh vien:");
fflush(stdin);
gets(a[intCount].MaSV);
printf("\n Diem Toan:");
fflush(stdin);
scanf("%d",&a[intCount].Toan);
printf("\n Diem Ly:");
fflush(stdin);
scanf("%d",&a[intCount].Ly);
printf("\n Diem Hoa:");
fflush(stdin);
scanf("%d",&a[intCount].Hoa);
a[intCount].dtb=(a[intCount].Toan+a[intCount].Ly+a[intCount].Hoa)/3;
}
while (intCount<=k);
return(SV);
}

// Ham xem danh sach sinh vien
void Xem(SinhVien SV)
{
int stt=0;
int i;
clrscr();
printf("\n************************************************ ****************\n");
printf("\n* DANH SACH TOAN BO SINH VIEN *\n");
printf("\n************************************************ ****************\n");
printf("\n* STT HOTEN MASV TOAN LY HOA DTB *\n");
for (i=0;i<=intCount;i++);
{
printf("* %3d %10s %10s %10d %10f %10f *",stt++,a[i].HoTen,a[i].MaSV,a[i].Toan,a[i].Ly,a[i].Hoa,a[i].dtb);
}
getch();
return;
}


// Sap xep danh sach theo thu tu tang dan theo dtb
void SapXep()
{
int i,j;
float tg;
clrscr();

printf("\n Sap xep danh sach theo diem trung binh tang dan:");
for(i=0;i<=(intCount-1);i++)
for(j=i+1;j<=intCount;j++)
{
if(strcmp(a[i].dtb,a[j].dtb)>0)
{
tg=a[i].dtb;
a[i].dtb=a[j].dtb;
a[j].dtb=tg;
}
}
printf("\n Da sap xep xong!");
getch();
}

// Ham kiem tra xem danh sach da sap xep chua
void KiemTra()
{
int i,j;
int kt;
char ch;
printf("\n Kiem tra xem danh sach da sap xep chua? \-1 Da sap xep \n - 0 chua sap xep");
kt=check();
printf("\n Ket qua:%d",kt);
if (kt==0)
{
printf(" Danh sach chua duoc sap xep, Ban co muon sap xep lai khong? C/K?");
fflush(stdin);
ch=getch();
if(ch=='c'||ch=='C')
{
SapXep();
printf(" Da sap xep xong!");
}
return;
}
else
return;
}

// Ham check check()
int check()
{
int i,j;
int kq=1;
for (i=0;i<=(intCount-1);i++)
for (j=i+1;j<=intCount;j++)
if (strcmpi(a[i].dtb,a[j].dtb)>0)
{
kq=0;
break;
}
return kq;
}

// Ham tim kiem tuyen tinh theo hoten
void TimKiemTuyenTinh()
{
int i;
int stt=0;
char name[30];
printf("\n Hay nhap vao ho ten sinh vien muon tim:");
fflush(stdin);
gets(name);
strcpy(a[intCount+1].HoTen,name);
while(strcmp(a[i].HoTen,name)!=0)
{
i+=1;
}
if (i==intCount+1)
{
printf("\n khong tim thay ho ten sinh vien da nhap!");
return;
}
else
{
printf("\n da tim thay sinh vien!");
printf("\n************************************************ ****************\n");
printf("\n* DANH SACH TOAN BO SINH VIEN *\n");
printf("\n************************************************ ****************\n");
printf("\n* STT HOTEN MASV TOAN LY HOA *\n");
for (i=0;i<=intCount;i++);
{
printf("* %3d %10s %10s %10f %10f %10f *",stt++,a[i].HoTen,a[i].MaSV,a[i].Toan,a[i].Ly,a[i].Hoa);
}
getch();
}
return;
}

// Ham tim kiem nhi phan theo dtb
void TimKiemNhiPhan()
{
int i,j,stt=0;
int left=0,right=intCount;
float DTB;
clrscr();
KiemTra();
printf("\nNhap diem trung binh ban muon tim");
fflush(stdin);
scanf("%f",&DTB);
do
{
i=floor((left+right)/2);
if(strcmp(DTB,a[i].dtb)==0)
{
printf(" Da tim thay diem trung binh yeu cau:");
printf("\n************************************************ ****************\n");
printf("\n* DANH SACH TOAN BO SINH VIEN *\n");
printf("\n************************************************ ****************\n");
printf("\n* STT HOTEN MASV TOAN LY HOA DTB *\n");
for (i=0;i<=intCount;i++);
{
printf("* %3d %10s %10s %10d %10f %10f %10f *",stt++,a[i].HoTen,a[i].MaSV,a[i].Toan,a[i].Ly,a[i].Hoa),a[i].dtb;
}
getch();
return;
}

else
{
if(strcmp(DTB,a[i].dtb)<0)
right=i-1;
else left=i+1;
}
}while (left<=right);
printf(" Khong tim thay ket qua nao !");
return;
}

// Xoa sinh vien co masv=x ( Ma sinh vien nhap tu ban phim)
void Xoa()
{
int i,done=0;
int stt=0;
int found;
char Code_SV[10],Code_TG[10];
char ch;
while(!done)
{
if(intCount!=0)
{
printf("\nNhap vao ma sinh vien:");
fflush(stdin);
gets(Code_SV);
i=0;found=0;
do
{
strcpy(Code_TG,a[i].MaSV);
if(strcmp(Code_SV,Code_TG)==0)
found=i;
i++;

}
while (i<intCount);
if (!found)
printf("\n Khong tim thay cuon sach co ma sach: %s",Code_SV);
else
{
printf("\nTim thay cuon sach trong danh sach:");
printf("\n* STT HOTEN MASV TOAN LY HOA DTB *\n");
printf("* %3d %10s %10s %10f %10f %10f *",stt++,a[found].HoTen,a[found].MaSV,a[found].Toan,a[found].Ly,a[found].Hoa);
printf("\n co muon xoa khong _ C/K?");
fflush(stdin);
ch=getch();
if(ch=='c' || ch=='C')
{
for(i=found;i<=intCount;i++)
{ a[i]=a[i+1];}
printf("\nDa xoan");
}
else
printf("\nViec xoa da bi huy");
}
done=1;
getch();
}
else
{done=1;}

}
return;
}

// Ham chen sinh vien
void Chen()
{
SinhVien newsv;
char code[10],name[30];
int i,j,tg,kt;
printf("\nNhap vao sinh vien moi:");
printf("\nNhap vao ma sinh vien moi:");
fflush(stdin);
gets(code);
if (strcmp(code,"")==0)
{
printf("\nNhap lai ma sach:");
fflush(stdin);
gets(code);
}
else
{
strcpy(newsv.MaSV,code);
printf("\nTen sinh vien:");
fflush(stdin);
gets(name);
strcpy(newsv.HoTen,name);
printf("\nDiem Toan:");
fflush(stdin);
scanf("%f",&newsv.Toan);
printf("\nDiem Ly:");
fflush(stdin);
scanf("%f",&newsv.Ly);
printf("\nDiem Hoa:");
fflush(stdin);
scanf("%f",&newsv.Hoa);
newsv.dtb=(newsv.Toan+newsv.Ly+newsv.Hoa)/3;
printf("\nDanh kiem tra danh sach!");
kt=check();
if(kt==0)
{
printf("\nDanh sach chua sap xep nen khong chen duoc!");
getch();
return;

}
else
{
i=1;
while(strcmp(newsv.dtb,a[i].dtb)>0 && i<intCount)
i+=1;
printf("\nVi tri chen la:%d",i);
getch();
if(i>intCount)
{
a[i]=newsv;
}
else
{
for(j=intCount;j>i;j--) // dich chuyen cac phan tu tu vi tri tim thay lui lai 1 vi tri de chen
{
a[j+1]=a[j];
}
a[i]=newsv; // chen vao vi tri
intCount+=1;
}
}
}
return;
}


// Luu danh sach sinh vien ra file sinhvien.dat
void LuuRaFile()
{
FILE *f;
SinhVien SV;
if((f=fopen("sinhvien.dat","wb"))==NULL)
{
printf("Khong the mo file!\n");
exit(0);
}
SV= Nhap(SV);
{
fwrite(&SV, sizeof(SinhVien), 1, f);
}
fclose(f);
}


// Mo file sinhvien.dat de doc danh sach vva hien thi danh sach nay
void Doc_HienThi()
{
FILE *f;
f=fopen("sinhvien.dat","rb");
while (fread(&SV,sizeof(SinhVien),1,f),!feof(f))
{
Xem(SV);
}
fclose(f);
return;
}

// Ham ket thuc
void KetThuc()
{
exit(0);
}

Thần Obelisk
28-04-2009, 21:07
xin lỗi mình chỉ là người mới bước vào lập trình C++ có cái này mình muốn hỏi bạn ,mong bạn và các anh chị đừng cười fflush(stdin) có nghĩa là gì vậy

dataonline
28-04-2009, 21:12
xin lỗi mình chỉ là người mới bước vào lập trình C++ có cái này mình muốn hỏi bạn ,mong bạn và các anh chị đừng cười fflush(stdin) có nghĩa là gì vậy

Đơn giản hàm đó làm sạch bộ đệm . Trong các thao tác đọc hay xuất dữ liệu thì dữ liệu đều lưu tạm trong bộ đệm sau đó tùy theo yêu cầu nó được lấy ra . Nếu bạn không làm sạch bộ đệm thì có thể xảy ra các trường hợp không như ý muốn . Điển hình như lệnh scanf("%d",&n) sau câu lệnh này trong bộ đệm vẫn còn kí tự '\n' nếu sau câu lệnh đó bạn dùng các lênh như gets() hay getchar() .. các lệnh đó tự động lấy kí tự còn trong bộ đệm ra --> làm sai kết quả mà bạn định đọc .

Thần Obelisk
28-04-2009, 21:42
vâng cảm ơn bạn đã giải thích tận tình mình đã hiểu rõ được vấn đề

kimduquan
29-04-2009, 08:27
dtb có kiểu dữ liệu là float thì làm sao mà sử dụng được với các hàm thao tác trên chuỗi,fflush(stdin) dùng để làm sạch bộ đệm của thiết bị nhập chuẩn ngoài ra còn 1 số bộ đệm khác như stdout:thiết bị xuất chuẩn,stdprt:thiết bị in chuẩn...nói chung là trước khi nhập chuỗi thì dùng fflush(stdin),còn trước khi xuất thì dùng hàm fflush(stdout).