PDA

View Full Version : Code quản lý sách bằng C có sử dụng menu. Không thể tìm kiếm sách để chỉnh thông tin đc?



_Murin_
29-09-2009, 10:41 AM
Giờ mình đang làm 1 cái menu về quản lý sách. Mình không thể tìm kiếm sách để chỉnh thông tin đc ai sửa hộ với.


#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Dinh nghia cau truc quan ly sach
struct qlsach
{
char masach[7];
char tensach[23];
char tacgia[23];
char nhaxuatban[23];
char ngonngu[23];
int sln;
};
//Khai bao mang chua 100 cuon sach
struct qlsach b[100];
//Bien toan cuc luu tru so sach nhap
int n;
//Khai bao nguyen mau ham
void nhapthongtinsach();
void chinhthongtinsach();
void xoathongtinsach();
void timkiemsach();
void kiemtra();
void timkiem();

void main()
{
char choice;
while(1)
{
printf("\n MENU ");
printf("\n1.Them moi thong tin sach");
printf("\n2.Hieu chinh thong tin sach");
printf("\n3.Xoa thong tin sach");
printf("\n4.Tim kiem sach");
printf("\n5.Thoat");
printf("\nXin moi chon chuc nang: ");
fflush(stdin);
scanf("%c",&choice);
switch(choice)
{
case '1':
nhapthongtinsach();
break;
case '2':
chinhthongtinsach();
break;
case '3':
xoathongtinsach();
break;
case '4':
timkiemsach();
break;
case '5':
exit(0);
default:
printf("\nSelect option 1-5");
}
}
getch();
}
void nhapthongtinsach()
{
int i;
char choice;
i=0;
while(1)
{
clrscr();
printf("\nThem moi thong tin sach");
printf("\n______________________________");
kiemtra();
printf("\nTen sach: ");
fflush(stdin);
scanf("%s",b[i].tensach);
printf("\nTen tac gia: ");
fflush(stdin);
scanf("%s",b[i].tacgia);
printf("\nNha xuat ban sach: ");
fflush(stdin);
scanf("%s",b[i].nhaxuatban);
printf("\nNgon ngu :");
fflush(stdin);
scanf("%s",b[i].ngonngu);
printf("\nSo luong nhap :");
fflush(stdin);
scanf("%d",&b[i].sln);
while(b[i].sln<0)
{
printf("\nSo luong nhap phai lon hon 0");
printf("\nXin moi ban nhap lai :");
fflush(stdin);
scanf("%d",&b[i].sln);
}
i++;
n=i;
printf("\n______________________________");
printf("\nBan co muon tiep tuc(c/k)?:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='k')
{
break;
}
}
getch();
}
//Ham kiem tra ma sach
void kiemtra()
{
int len;
int i=0;
printf("\nMa sach: ");
fflush(stdin);
scanf("%s",b[i].masach);
len=strlen(b[i].masach);
while(len!=7)
{
printf("\nMa sach co 7 ky tu");
printf("\nXin moi nhap lai: ");
fflush(stdin);
scanf("%s",b[i].masach);
len=strlen(b[i].masach);
}
while(b[i].masach[0]!='V')
{
printf("\nMa sach phai co ky tu V dau tien");
printf("\nXin moi nhap lai: ");
fflush(stdin);
scanf("%s",b[i].masach);
}
getch();
}
void chinhthongtinsach()
{
int i;
char choice;
while(1)
{
clrscr();
int i;
int test;
char msach[23];
printf("\nNhap Ma sach can tim kiem: ");
fflush(stdin);
scanf("%s",msach);
for(i=0;i<n;i++)
{
if(strcmp(b[i].masach,msach)==0)
{
printf("\n______________________________");
printf("\nTen sach: %s",b[i].tensach);
printf("\nTac gia: %s",b[i].tacgia);
printf("\nNha Xuat Ban: %s",b[i].nhaxuatban);
printf("\nNgon ngu: %s",b[i].ngonngu);
printf("\nSo luong: %d",b[i].sln);
printf("\n______________________________");
printf("\nNhap Ten sach: ");
fflush(stdin);
scanf("%s",b[i].tensach);
printf("\nNhap Ten tac gia: ");
fflush(stdin);
scanf("%s",b[i].tacgia);
printf("\nNhap Nha xuat ban sach: ");
fflush(stdin);
scanf("%s",b[i].nhaxuatban);
printf("\nNhap Ngon ngu :");
fflush(stdin);
scanf("%s",b[i].ngonngu);
printf("\nNhap So luong :");
fflush(stdin);
scanf("%d",&b[i].sln);
while(b[i].sln<0)
{
printf("\nSo luong nhap phai lon hon 0");
printf("\nXin moi ban nhap lai :");
fflush(stdin);
scanf("%d",&b[i].sln);
}
test=0;
}
}
printf("\n______________________________");
printf("\nBan co muon tiep tuc(c/k)?:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='k')
{
break;
}
}
getch();
}
void xoathongtinsach()
{
int index;
char choice,choice1;
while(1)
{
timkiem();
printf("\n______________________________");
printf("\nBan co muon xoa du lieu khong(c/k)?:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='c')
{
for(int i=index;i<n;i++)
{
b[i].masach==b[index-1].masach;
b[i].tensach==b[index-1].tensach;
b[i].tacgia==b[index-1].tacgia;
b[i].nhaxuatban==b[index-1].nhaxuatban;
b[i].ngonngu==b[index-1].ngonngu;
b[i].sln==b[index-1].sln;
}
n--;
}
if(choice=='k')
{
break;
}
printf("\n______________________________");
printf("\nBan co muon tiep tuc(c/k)?:");
fflush(stdin);
scanf("%c",&choice1);
if(choice1=='k')
{
break;
}
}
getch();
}
void timkiemsach()
{
}
void timkiem()
{
int i;
int test;
char msach[23];
printf("\nNhap Ma sach can tim kiem: ");
fflush(stdin);
scanf("%s",msach);
for(i=0;i<n;i++)
{
if(strcmp(b[i].masach,msach)==0)
{
printf("\n______________________________");
printf("\nTen sach: %s",b[i].tensach);
printf("\nTac gia: %s",b[i].tacgia);
printf("\nNha Xuat Ban: %s",b[i].nhaxuatban);
printf("\nNgon ngu: %s",b[i].ngonngu);
printf("\nSo luong: %d",b[i].sln);
printf("\n______________________________");
test=0;
}
}
if(test==1)
{
printf("\nKhong co thong tin ban can tim kiem");
}
getch();
}

thanhphongcttv
29-09-2009, 11:44 AM
Mình đã đặt bẫy và biết chỗ lỗi là do chưa xoá sạch vùng đệm, nhưng chưa biết khắc phục thế nào nữa. Bạn chạy chương trình sẽ thấy chỗ mình đặt bẫy.

Không hiểu sao mà Tên Sách lại xuất hiện trên Mã sách (mặc dù mã sách nhập trước tiên).
Nhờ các bạn giải thích và khắc phục giúp tớ với!

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Dinh nghia cau truc quan ly sach
struct qlsach
{
char masach[7];
char tensach[23];
char tacgia[23];
char nhaxuatban[23];
char ngonngu[23];
int sln;
};
//Khai bao mang chua 100 cuon sach
struct qlsach b[100];
//Bien toan cuc luu tru so sach nhap
int n;
//Khai bao nguyen mau ham
void nhapthongtinsach();
void chinhthongtinsach();
void xoathongtinsach();
void timkiemsach();
void kiemtra();
void timkiem();

int main()
{
char choice;
while(1)
{
printf("\n MENU ");
printf("\n1.Them moi thong tin sach");
printf("\n2.Hieu chinh thong tin sach");
printf("\n3.Xoa thong tin sach");
printf("\n4.Tim kiem sach");
printf("\n5.Thoat");
printf("\nXin moi chon chuc nang: ");
fflush(stdin);
scanf("%c",&choice);
switch(choice)
{
case '1':
nhapthongtinsach();
break;
case '2':
chinhthongtinsach();
break;
case '3':
xoathongtinsach();
break;
case '4':
timkiemsach();
break;
case '5':
exit(0);
default:
printf("\nSelect option 1-5");
}
}
getch();
}
void nhapthongtinsach()
{
int i;
char choice;
i=0;
while(1)
{
//clrscr();
printf("\nThem moi thong tin sach");
printf("\n______________________________");
kiemtra();
printf("\nTen sach: ");
fflush(stdin);
scanf("%s",b[i].tensach);
printf("\nTen tac gia: ");
fflush(stdin);
scanf("%s",b[i].tacgia);
printf("\nNha xuat ban sach: ");
fflush(stdin);
scanf("%s",b[i].nhaxuatban);
printf("\nNgon ngu :");
fflush(stdin);
scanf("%s",b[i].ngonngu);
printf("\nSo luong nhap :");
fflush(stdin);
scanf("%d",&b[i].sln);
while(b[i].sln<0)
{
printf("\nSo luong nhap phai lon hon 0");
printf("\nXin moi ban nhap lai :");
fflush(stdin);
scanf("%d",&b[i].sln);
}
i++;
n=i;
printf("\n______________________________");
printf("\nBan co muon tiep tuc(c/k)?:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='k'||choice=='K')
{
break;
}
}
getch();
}
//Ham kiem tra ma sach
void kiemtra()
{
int len;
int i=0;
printf("\nMa sach: ");
scanf("%s",b[i].masach);
len=strlen(b[i].masach);
while(len!=7)
{
printf("\nMa sach co 7 ky tu");
printf("\nXin moi nhap lai: ");
fflush(stdin);
scanf("%s",b[i].masach);
len=strlen(b[i].masach);
fflush(stdin);
}
while(b[i].masach[0]!='V')
{
printf("\nMa sach phai co ky tu V dau tien");
printf("\nXin moi nhap lai: ");
fflush(stdin);
scanf("%s",b[i].masach);
}
getch();
}
void chinhthongtinsach()
{
int i;
char choice;
while(1)
{
//clrscr();
int i;
int test=1;
char msach[23];
printf("\nNhap Ma sach can tim kiem: ");
fflush(stdin);
scanf("%s",msach);
for(i=0;i<n;i++)
{
/*printf("\n%d",strcmp(b[i].masach,msach));
if(strcmp(b[i].masach,msach)==0)
{
printf("\n______________________________");
printf("\nTen sach: %s",b[i].tensach);
printf("\nTac gia: %s",b[i].tacgia);
printf("\nNha Xuat Ban: %s",b[i].nhaxuatban);
printf("\nNgon ngu: %s",b[i].ngonngu);
printf("\nSo luong: %d",b[i].sln);
printf("\n______________________________");
printf("\nNhap Ten sach: ");
fflush(stdin);
scanf("%s",b[i].tensach);
printf("\nNhap Ten tac gia: ");
fflush(stdin);
scanf("%s",b[i].tacgia);
printf("\nNhap Nha xuat ban sach: ");
fflush(stdin);
scanf("%s",b[i].nhaxuatban);
printf("\nNhap Ngon ngu :");
fflush(stdin);
scanf("%s",b[i].ngonngu);
printf("\nNhap So luong :");
fflush(stdin);
scanf("%d",&b[i].sln);
while(b[i].sln<0)
{
printf("\nSo luong nhap phai lon hon 0");
printf("\nXin moi ban nhap lai :");
fflush(stdin);
scanf("%d",&b[i].sln);
}
test=0;
}*/
printf("\n______________________________");
printf("\n%d\n",strcmp(b[i].masach,"V123456"));
printf("\n%d\n",strcmp(b[i].masach,msach));
printf("\n%d\n",strcmp(msach,"V123456"));
printf("\nMasach: %s\n",b[i].masach);
printf("\nDo dai masach: %d\n",strlen(b[i].masach));
printf("\nTen sach: %s",b[i].tensach);
printf("\nTac gia: %s",b[i].tacgia);
printf("\nNha Xuat Ban: %s",b[i].nhaxuatban);
printf("\nNgon ngu: %s",b[i].ngonngu);
printf("\nSo luong: %d",b[i].sln);
printf("\n______________________________");
test=0;
}
printf("\n______________________________");
printf("\nBan co muon tiep tuc(c/k)?:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='k')
{
break;
}

}
getch();
}
void xoathongtinsach()
{
int index;
char choice,choice1;
while(1)
{
timkiem();
printf("\n______________________________");
printf("\nBan co muon xoa du lieu khong(c/k)?:");
fflush(stdin);
scanf("%c",&choice);
if(choice=='c')
{
for(int i=index;i<n;i++)
{
b[i].masach==b[index-1].masach;
b[i].tensach==b[index-1].tensach;
b[i].tacgia==b[index-1].tacgia;
b[i].nhaxuatban==b[index-1].nhaxuatban;
b[i].ngonngu==b[index-1].ngonngu;
b[i].sln==b[index-1].sln;
}
n--;
}
if(choice=='k')
{
break;
}
printf("\n______________________________");
printf("\nBan co muon tiep tuc(c/k)?:");
fflush(stdin);
scanf("%c",&choice1);
if(choice1=='k')
{
break;
}
}
getch();
}
void timkiemsach()
{
}
void timkiem()
{
int i;
int test=1;
char msach[23];
printf("\nNhap Ma sach can tim kiem: ");
fflush(stdin);
scanf("%s",msach);
for(i=0;i<n;i++)
{
if(strcmp(b[i].masach,msach)==0)
{
printf("\n______________________________");
printf("\nTen sach: %s",b[i].tensach);
printf("\nTac gia: %s",b[i].tacgia);
printf("\nNha Xuat Ban: %s",b[i].nhaxuatban);
printf("\nNgon ngu: %s",b[i].ngonngu);
printf("\nSo luong: %d",b[i].sln);
printf("\n______________________________");
test=0;
}
}
if(test==1)
{
printf("\nKhong co thong tin ban can tim kiem");
}
getch();
}

_Murin_
29-09-2009, 11:49 AM
uh để mình thử.Thanks nhé

bị thế là do chỗ in ra mã sách : //printf("\nMasach: %s\n",b[i].masach); Bỏ cái mã sách đi là ok.

thanhphongcttv
29-09-2009, 01:09 PM
Bạn không hiểu ý mình rồi!
Mình đặt bẫy bằng cách chèn đoạn này:

printf("\n______________________________");
printf("\n%d\n",strcmp(b[i].masach,"V123456"));
printf("\n%d\n",strcmp(b[i].masach,msach));
printf("\n%d\n",strcmp(msach,"V123456"));
printf("\nMasach: %s\n",b[i].masach);
printf("\nDo dai masach: %d\n",strlen(b[i].masach));
printf("\nTen sach: %s",b[i].tensach);
printf("\nTac gia: %s",b[i].tacgia);
printf("\nNha Xuat Ban: %s",b[i].nhaxuatban);
printf("\nNgon ngu: %s",b[i].ngonngu);
printf("\nSo luong: %d",b[i].sln);
Vào hàm chỉnh thông tin sách. Khi hàm này được gọi, nó sẽ in thông tin của sách trong bộ nhớ ra. Mình chỉ nhập vào một quyển thôi. Khi mình nhập dữ kiện là:

Mã: V123456
Tên: Xuan
Ten TG: Ha
Nha XB: Thu
Ngon Ngu: Dong
So luong: 999
thì đến khi gọi hàm hiệu chỉnh thông tin sách, phần mã sách nó in sai (Có thêm phần tên sách trong mã sách- V123456Xuan). Tại sao lại có lỗi đó?

_Murin_
29-09-2009, 01:23 PM
mình bỏ đoạn đó đi vì ko cần phải in mã sách.:D.Nhưng mình thử cố xem tại sao nó in cả mã cả tên:(

thanhphongcttv
29-09-2009, 01:31 PM
Bạn vẫn không hiểu! Hàm strcmp(,) lúc nào cũng bằng 1, bạn có để ý thấy không? Nếu nó cứ bằng 1 thì không bao giờ bạn nhảy được vào đoạn if để mà chỉnh sửa đâu!
Tại sao lúc nào nó cũng bằng 1? Tại vì mã sách lúc nào cũng có một phần được thêm vào, đó là tên sách, khi so sánh với mã sách nhập vào thì sẽ không khớp. Tại sao nó lại tự động thêm phần tên sách vào mã sách trong khi mình không có ra lệnh cho nó thêm? Cái này là vì xảy ra một lỗi nào đó mà mình cũng chưa biết, không phải ở giải thuật. Ai biết thì chỉ giúp với!