Đề bài
/*Th™ng tin của s‡ch gồm: m‹ s‡ch, t•n s‡ch, nhˆ xuất bản, năm xuất bản, số
lượng, đơn gi‡ vˆ thˆnh tiền (= số lượng * đơn gi‡)
Cần thực hiện quản lý c‡c quyển s‡ch dưới dạng li•n kết đơn:
-Tạo danh s‡ch li•n kết đơn lưu trữ c‡c quyển s‡ch
-Nhập vˆo danh s‡ch c‡c quyển s‡ch
-In lại ds c‡c quyển s‡ch đ‹ nhập đ—
-In danh s‡ch t•n c‡c quyển s‡ch c— đơn gi‡ tr•n 50.000đ
-T“m kiếm quyển s‡ch c— m‹ lˆ k
-T“m kiếm quyển s‡ch c— t•n lˆ s
-T’nh tổng tiền tất cả c‡c quyển s‡ch c— trong danh s‡ch
-Sắp xếp danh s‡ch quyển s‡ch theo số lượng tăng dần
-Cho bit tãn quyn sch c n gi cao nht
ỗp dng c‡c y•u cầu tr•n
*/
Phần II: gợi ý triển khai
1. Khai báo cấu trúc dạng DSLK đơn để quản lý danh sách các quyển sách
struct Sach
{
int maS;
char tenS[30];
char nhaXB[30];
int namXB;
int soL;
float donG;
float thanhT;
};
struct Node
{
Sach info;
struct Node *next;
};
struct List
{
Node *Head;
Node *Tail;
};
2. Cài đặt các CTC cơ bản gồm: nhập thông tin 1 quyển sách, in thông tin 1 quyển sách
void nhapSach(Sach &x)
{
printf("Ma Sach:"); scanf("%d",&x.maS);
printf("Ten Sach:");
fflush(stdin); gets(x.tenS);
printf("Nha Xuat Ban:");
fflush(stdin); gets(x.nhaXB);
printf("Nam Xuat Ban:"); scanf("%d",&x.namXB);
printf("So Luong:");scanf("%d",&x.soL);
printf("Don Gia:");scanf("%f",&tg); x.donG = tg;
1
x.thanhT = x.soL * x.donG;
}
void inSach(Sach x)
{
printf("\n %4d",p->info.maS);
printf("%15s", p->info.tenS);
printf("%15s", p->info.nhaXB);
printf("%7d",p->info.namXB);
printf("%7d",p->info.soL);
printf("%7.2f",p->info.donG);
printf("%12.2f",p->info.thanhT);
}
3. Định nghĩa hàm khởi tạo danh sách rỗng, hàm tạo 1 nút chứa thông tin 1 quyển sách,
hàm chèn thêm 1 nút vào đầu danh sách, hàm xóa một nút đầu danh sách
void init(List &Q)
{
Q.Head = NULL;
Q.Tail = NULL;
}
Node *getNode(Sach x)
{
Node *p;
p = new Node();
if(p==NULL)
{
printf("\n Khong thanh cong");
exit(0);
}
p->info = x;
p->next = NULL;
return p;
}
void chenDau(List &Q, Node *p)
{
if(Q.Head == NULL)
{
Q.Head = p;
Q.Tail =p;
}
else
{
p->next = Q.Head;
Q.Head = p;
}
}
void xoaDau(List &Q)
2
{
Node *p;
if(Q.Head != NULL)
{
p = Q.Head;
Q.Head = Q.Head->next;
free(p);
if(Q.Head==NULL)
Q.Tail = NULL;
}
}
4. Định nghĩa các CTC thực hiện xử lý với danh sách các quyển sách
void nhapDSSach(List &Q)
{
int n,i;
Node *p;
Sach x;
float tg;
printf("Nhap so Sach:"); scanf("%d",&n);
for(i=0;i
{
nhapSach(x);
p = getNode(x);
chenDau(Q,p);
}
}
void inDSSach(List Q)
{
Node *p;
for(p=Q.Head; p!=NULL; p=p->next)
inSach(p->info);
}
void InSachGia50(List Q)
{
Node *p;
for(p=Q.Head; p!=NULL; p=p->next)
if(p->info.donG > 50000)
inSach(p->info);
}
5. Cài đặt CTC tìm kiếm quyển sách và sắp xếp các quyển sách
Node *TimSachMa(List Q,int k)
{
Node *p;
for(p=Q.Head; p!=NULL; p=p->next)
if(p->info.maS==k)
break;
3
return p;
}
Node *TimSachTen(List Q,char s[])
{
Node *p;
for(p=Q.Head; p!=NULL; p=p->next)
if(strcmp(p->info.tenS,s)==0)
break;
return p;
}
void TinhTongTien(List Q)
{
float s=0;
Node *p;
for(p=Q.Head; p!=NULL; p=p->next)
s = s + p->info.thanhT;
printf("\n Tong tien cac quyen sach la: %7.2f", s);
}
void SXSachSoLuongTang(List &Q)
{
Node *p,*q;
Sach tg;
for(p=Q.Head; p!=NULL; p=p->next)
for(q=p->next; q!=NULL; q=q->next)
if(p->info.soL > q->info.soL)
{
tg = p->info;
p->info = q->info;
q->info = tg;
}
}
void TenSachMax(List Q)
{
float max;
Node *p;
max = p->info.donG;
for(p=Q.Head; p!=NULL; p=p->next)
if(p->info.donG > max)
max = p->info.donG;
printf("\n Ten cac quyen sach co don gia cao nhat la \n");
for(p=Q.Head; p!=NULL; p=p->next)
if (p->info.donG == max)
printf("\n %15s",p->info.tenS);
}
6. Áp dụng các yêu cầu trên
4
int main()
{
List Q;
Node *p;
init(Q);
nhapDSSach(Q);
printf("\n\n\n DSCB da nhap:");
inDSSach(Q);
printf("\n\n\n Quyen sach cc gia 50.000:");
InSachGia50(Q);
int k;
printf("\n\n Nhap ma can tim:"); scanf("%d",&k);
p=TimSachMa(Q,k);
if(p==NULL)
printf("\n Khong tim thay \n");
else
printf("\n Co tim thay \n");
char s[30];
printf("\n\n Nhap t•n can tim:"); gets(s);
p=TimSachTen(Q,s);
if(p==NULL)
printf("\n Khong tim thay \n");
else
printf("\n Co tim thay \n");
TinhTongTien(Q);
SXSachSoLuongTang(Q);
printf("\n\n\n DS Sach da sap xep So luong tang dan:");
inDSSach(Q);
TenSachMax(Q);
xoaDau(Q);
printf("\n\n\n DSCB da thuc hien huy ptu dau: ");
inDSSach(Q);
//getch();
}
5