Bài 828 : Viết chương trình thực hiện các yêu cầu sau: Cách khá hơn chút tuy nhiên vẫn phải dùng đến mảng 1 chiều hỗ trợ

Tải code tại đây
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375

/* Bài 828/222/SBT Thầy NTTMK: Viết chương trình thực hiện các yêu cầu sau:
a. Khai báo cấu trúc dữ liệu của một danh sách liên kết đơn các quyển sách.Biết rằng thông tin của một quyển sách bao gồm: tên sách (50 ký tự),tên tác giả (30 ký tự) và năm xuất bản .
b. Cài đặt tất cả các thao tác cơ bản cho danh sách liên kết các quyển sách.
c. Tìm quyển sách cũ nhất trong danh sách liên kết.
d. Tìm một năm có nhiều sách xuất bản nhất và liệt kê tất cả các quyển sách xuất bản trong năm đó .

663.cpp */

/* ======================================== BÀI LÀM ================================================== */

/* =============================== Các Thư Viện Sử Dụng Trong Chương Trình =========================== */
#include "stdio.h"
#include "conio.h"
#include "time.h"
#include "Windows.h"
#define  MAX 100
/* =================================================================================================== */

/* ============== Khai Báo Cấu Trúc Dữ Liệu Cho Danh Sách Liên Kết Đơn Các Quyển Sách ================ */
struct sach
{
 char TenSach[50];
 char TenTacGia[30];
 int NamXuatBan;
};
typedef struct sach SACH;

struct node
{
 SACH Data;
 struct node*pNext;
};
typedef struct node NODE;

struct list
{
 NODE*pHead;
 NODE*pTail;
};
typedef struct list LIST;
/* =================================================================================================== */

/* ========================= Khởi Tạo Danh Sách Liên Kết Đơn ========================================= */
void INit(LIST &l)
{
 l.pHead=NULL;
 l.pTail=NULL;
}
/* =================================================================================================== */

/* ====================== Tạo Node Trong Danh Sách Liên Kết Đơn Các Quyển Sách ======================= */
NODE*getnode(SACH x)
{
 NODE*p;
 p=new NODE;
 if(p==NULL)
  return NULL;
 p->Data=x;
 p->pNext=NULL;
 return p;
}
/* =================================================================================================== */

/* =================================== Thêm Vào Cuối Danh Sách ======================================= */
void AddTail(LIST &l,NODE*new_ele)
{
 if(l.pHead==NULL)
 {
  l.pHead=new_ele;
  l.pTail=l.pHead;
 }
 else
 {
  l.pTail->pNext=new_ele;
  l.pTail=new_ele;
 }
}
/* =================================================================================================== */

/* ====================== Nhập Dữ Liệu Danh Sách Liên Kết Đơn Các Quyển Sách ========================= */
void InPut(LIST &l)
{
 int n;
 quaylai:printf("\nNhap vao so luong cac quyen sach:");
 scanf("%d",&n);
 if(n<0||n>MAX)
 {
  printf("\nSo luong ban nhap vao khong hop le!Xin vui long nhap lai!");
  goto quaylai;
 }
 INit(l);
 for(int i=1;i<=n;i++)
 {
  SACH x;
  printf("\n>>>>>>> Nhap Vao Du Lieu Quyen Sach Thu %d <<<<<<<<<\n",i);
  fflush(stdin); 
  printf("\nNhap vao Ten Sach:");
  gets(x.TenSach);
  printf("\nNhap vao Ten Tac Gia:");
  gets(x.TenTacGia);
  do{
   printf("\nNhap vao Nam Xuat Ban:");
   scanf("%d",&x.NamXuatBan);
   if(x.NamXuatBan<0)
   {
    printf("\nNam Xuat Ban khong hop le!Xin vui long nhap lai!");
   }
  }while(x.NamXuatBan<0);
  NODE*p=getnode(x);
  AddTail(l,p);
 }
}
/* =================================================================================================== */

/* ======================== Xuất Danh Sách Liên Kết Đơn Các Quyển Sách =============================== */
void OutPut(LIST l)
{
 int dem=0;
 printf("So Thu Tu  \t");
 printf("Ten Quyen Sach\t\t");
 printf("Ten Tac Gia\t\t");
 printf("Nam Xuat Ban  \n\n");
 for(NODE*p=l.pHead;p!=NULL;p=p->pNext)
 {
  dem++;
  printf("%8d  ",dem);
  printf("%20s  ",p->Data.TenSach);
  printf("%30s  ",p->Data.TenTacGia);
  printf("%8d  \n\n",p->Data.NamXuatBan);
 }
}
/* =================================================================================================== */

/* ================================= Tìm Quyển Sách Cũ Nhất ========================================== */
void TimQuyenSachCuNhat(LIST l)
{
 NODE*pNode;
 int dem=0;
 int min=INT_MAX;
 for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
 {
  if(pNode->Data.NamXuatBan<min)
  {
   min=pNode->Data.NamXuatBan;
  }
 }
 printf("\nQuyen Sach Co Nam Xuat Ban Cu Nhat La Nam:%d",min);
 printf("\n");
 printf("\n>>>>>>>>>>>>>> Thong Tin Ve Quyen Sach Xuat Ban Nam %d <<<<<<<<<<<<<\n",min);
 printf("\n");
 printf("So Thu Tu  \t");
 printf("Ten Quyen Sach\t\t");
 printf("Ten Tac Gia\t\t");
 printf("Nam Xuat Ban  \n\n");
 for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
 {
  if(pNode->Data.NamXuatBan==min)
  {
   dem++;
   printf("%8d  ",dem);
   printf("%20s  ",pNode->Data.TenSach);
   printf("%30s  ",pNode->Data.TenTacGia);
   printf("%8d  \n\n",pNode->Data.NamXuatBan);
  }
 } 
}
/* =================================================================================================== */

/* Ý Tưởng : Tìm một năm có nhiều sách xuất bản nhất và liệt kê tất cả các quyển sách xuất bản trong năm đó .

Bước 1: Đầu tiên ta đi sắp xếp dữ liệu năm xuất bản tăng dần (nhưng nếu ta chỉ sắp xếp riêng dữ liệu năm xuất bản tăng thì sau khi ra kết quả cuối cùng là số năm xuất bản nhiều sách nhất ta đem so sánh lại với danh sách lúc đầu để in ra thông tin về tên tác giả và tên sách ứng với năm đó thì kết quả sẽ bị sai lệch tên tác giả và tên sách . Do đó ta phải sắp xếp nguyên cả danh sách tăng dần luôn => bảo đảm được năm xuất bản cũng tăng dần và kết quả không bị sai lệch về tên tác giả và tên sách lúc đối chiếu với số năm tìm được) .
Bước 2: Đưa hết các dữ liệu giá trị năm xuất bản (lúc này đã được sắp tăng dần) vào mảng 1 chiều a .
Bước 3: Xử lý trên mảng 1 chiều a ta đi tìm ra phần tử có số lần xuất hiện nhiều nhất => đó là năm sản xuất sách nhiều nhất .
Bước 4: Sau khi đã xác định được năm sản xuất sách nhiều nhất => dễ dàng in ra các thông tin về các cuốn sách xuất bản trong năm đó . */

/* ====================== Bước 1 =========================== */
void SapTangDan(LIST &l)
{
 NODE *p,*q; // Khai báo 2 con trỏ p,q .
 SACH temp;
 for(p=l.pHead;p!=NULL;p=p->pNext)
 {
  for(q=p->pNext;q!=NULL;q=q->pNext)
  {
   if(p->Data.NamXuatBan>q->Data.NamXuatBan)
   {
    temp=p->Data;
    p->Data=q->Data;
    q->Data=temp;
   }
  }
 }
}
/* ========================================================== */

void TimRaNamCoNhieuSachXuatBanNhatVaLietKeCacSachXuatBanTrongNamDo(LIST l,int a[])
{
 int i=0,dem=0,d;
 NODE*pNode;
 SapTangDan(l); // sắp danh sách tăng dần .
 /* ======================================= Bước 2 ============================================== */
 for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
 {
  dem++; // Tăng biến đếm lên .
  a[i++]=pNode->Data.NamXuatBan; // đưa dữ liệu năm xuất bản sách vào mảng 1 chiều a .
 }
 /* ============================================================================================= */
 
 /* ======================================= Bước 3 ============================================== */
 int max=0,dem1=0,nam=a[0];
 for(int i=0;i<dem;i++)
 {
  if(a[i]!=a[i-1])
  {
   dem1=0;
  }
  dem1++;
  if(dem1>max)
  {
   max=dem1;
   nam=a[i];
  }
 }
 /* ============================================================================================= */
 
 /* ======================================= Bước 4 ============================================== */
 int dem2=0; // Khởi tạo biến đếm .
 printf("\nNam Co So Sach Xuat Ban Nhieu Nhat La Nam:%d",nam);
 printf("\n");
 printf("\nSo Luong Sach Xuat Ban Trong Nam %d La:%d Quyen Sach",nam,max);
 printf("\n");
 printf("\n>>>>>>>>>>>>>> Thong Tin Ve Cac Quyen Sach Xuat Ban Nam %d <<<<<<<<<<<<<\n",nam);
 printf("\n");
 printf("So Thu Tu  \t");
 printf("Ten Quyen Sach\t\t");
 printf("Ten Tac Gia\t\t");
 printf("Nam Xuat Ban  \n\n");
 for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
 {
  if(pNode->Data.NamXuatBan==nam)
  {
   dem2++;
   printf("%8d  ",dem2);
   printf("%20s  ",pNode->Data.TenSach);
   printf("%30s  ",pNode->Data.TenTacGia);
   printf("%8d  \n\n",pNode->Data.NamXuatBan);
  }
 }
 /* ============================================================================================= */
}

/* ====================================== Các Hàm Đồ Họa ============================================= */
// Hàm tăng kích cỡ của khung CMD .
void resizeConsole(int width, int height)
{
 HWND console = GetConsoleWindow();
 RECT r;
 GetWindowRect(console, &r);
 MoveWindow(console, r.left, r.top, width, height, TRUE);
}

// Hàm lấy tọa độ vị trí .
void gotoxy(int x,int y)
{
 HANDLE hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
 COORD position = {x,y};
 SetConsoleCursorPosition(hstdout,position);
}

// Hàm tô màu .
void textcolor(int x)
{
 HANDLE mau;
 mau=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(mau,x);
}

// Hàm đồ họa cho tên tác giả .
void NguyenVietNamSon()
{
 textcolor(14); // Tô màu vàng .
 printf("\n--------------------------------------------------------------------------------\n");
 printf("\n\t\t\tDesigned By : Nguyen Viet Nam Son              \n");
 printf("\n--------------------------------------------------------------------------------\n");
 textcolor(7); // Trả lại màu chữ bình thường .
}
/* =================================================================================================== */

/* =================================== Hiển Thị Lời Chào ============================================= */
void Thanks()
{
 system("cls"); // Xóa đi mọi dữ liệu đã làm trước đó .
 srand(time(NULL));
 for(int j=1;j<=20;j++)
 {
  int color=rand()%15+1; // Khởi tạo màu chạy ngẫu nhiên trong đoạn thang màu [1,15].
  Sleep(300);
  gotoxy(j-1,40);
  printf("   ");
  gotoxy(j,40);
  textcolor(color);
  printf("\nThanks You For Using The Program ! Goodbye And See You Later !\n"); // Khi người dùng thoát chương trình sẽ hiển thị lời chào !
 }
 textcolor(15);
 getch();
 gotoxy(3,42);
}
/* =================================================================================================== */

/* =========================================== MeNu ================================================== */
void MeNu()
{
 LIST lst;
 resizeConsole(800,600); // Tăng kích cỡ của khung CMD lên thành chiều rộng 800,chiều cao 600 .
 int w;
 int a[MAX];
 printf("\n");
 quaylai:NguyenVietNamSon();
 InPut(lst);
 printf("\n>>>>>>>>>>>>>>>>>>>>> Xuat Ra Danh Sach Cac Quyen Sach <<<<<<<<<<<<<<<<<<<<<<<<\n");
 printf("\n");
 printf("\n");
 OutPut(lst);
 printf("\n");
 do{
  // Bảng MeNu đưa ra cho người dùng các sự lựa chọn .
  textcolor(2); // Tô màu xanh nhạt cho MeNu
  printf("\n-------------------------------------MeNu---------------------------------------\n");
  printf("\n");  
  printf("\n 1.Tim Quyen Sach Cu Nhat ");
  printf("\n");
  printf("\n 2.Tim 1 Nam Co Nhieu Sach Xuat Ban Nhat Va In Ra Cac Quyen Sach Xuat Ban Nam Do ");
  printf("\n 3.Cap Nhat Lai Danh Sach Cac Quyen Sach ");
  printf("\n");
  printf("\n 0.Thoat chuong trinh ");
  printf("\n");
  printf("\n--------------------------------------------------------------------------------\n");
  printf("\n");
  textcolor(7); // Trả về lại màu bình thường .
  printf("\nChon:");
  scanf("%d",&w);
  printf("\nKet qua:\n");
  printf("\n");  
  // Cấu trúc switch-case .
  switch(w)
  {        
  case 1:
   {
    TimQuyenSachCuNhat(lst);
    break; 
   }
  case 2: 
   {
    TimRaNamCoNhieuSachXuatBanNhatVaLietKeCacSachXuatBanTrongNamDo(lst,a);
    break;
   }
  case 3:
   {
    goto quaylai;
    break;
   }
  case 0: 
   {
    Thanks();
   }
  }
 }while(w!=0);
}
/* =================================================================================================== */

/* ============================================ Main ================================================= */
void main()
{
 MeNu();
}

Nhận xét

Bài đăng phổ biến từ blog này

Bài 17 : Viết chương trình nhập số nguyên lớn N (khai báo:long N) có k chữ số

Bài Tập Cây Nhị Phân Tìm Kiếm

Bài 22 : Viết chương trình nhập vào số nguyên dương n gồm 5 chữ số,kiểm tra xem các chữ số n có phải là số đối xứng hay không ?