[ create a new paste ] login | about

Link: http://codepad.org/nFcRIw36    [ raw code | output | fork ]

C, pasted on May 6:
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
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
/* 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 đó .

661.cpp */
/* 

Tác giả: Nguyễn Việt Nam Sơn
Trung tâm đào tạo tin học - Thiết kế phần mềm - Sơn Đẹp Trai: www.SonDepTrai.com

Nguồn source code này Tôi viết vào năm 2012 lúc mới bắt đầu học lập trình C/C++ nên một số cách sẽ không được tối ưu - Bạn chỉ nên dùng trên tinh thần tham khảo thôi nhé.
Mong giúp đỡ được Bạn trên con đường Học Lập Trình.
TẤT CẢ VÌ SỰ THÀNH CÔNG CỦA BẠN

*/
/* ======================================== 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: Từ mảng a lọc tiếp các giá trị phân biệt (dữ liệu trong mảng a lúc này là dữ liệu năm xuất bản của các quyển sách) và tiếp tục đưa vào mảng 1 chiều b .
Bước 4: Khởi tạo 1 biến đếm=0,đem từng phần tử của mảng b so sánh lại với mảng a lúc đầu để tìm ra tần suất xuất hiện của các giá trị phân biệt trong mảng b và đưa các dữ liệu tần suất xuất hiện đó vào tiếp mảng 1 chiều c .
Bước 5: Tìm ra phần tử max của mảng c (lúc này chính là tần suất xuất hiện lớn nhất) .
Bước 6: Đem phần tử max đã tìm ra quay lại đối chiếu với mảng b ban đầu => tìm ra đc phần tử phân biệt trong mảng b có số lần xuất hiện bằng với số lần xuất hiện max đó . => đó chính là năm có số sách xuất bản nhiều nhất .
Bước 7: 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 b[],int c[])
{
	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 dem1=1,j=1,k=0;
	b[0]=a[0]; // Khởi tạo phần tử đầu tiên của mảng b bằng phần tử đầu tiên của mảng a .
	for(int i=1;i<dem;i++) // Cho vòng lặp chạy từ phần tử thứ 2 của mảng a .
	{
		if(a[i]!=a[i-1]) // Đặt điều kiện phần tử thứ 2 phải khác phần tử thứ 1 thì mới đưa vào mảng b => mục đích để đưa các giá trị phân biệt của mảng a vào trong mảng b .
		{
			dem1++; // Tăng biến đếm lên .
			b[j++]=a[i]; // Đưa các giá trị phân biệt của mảng a vào trong mảng b .
		}
	}
	/* ============================================================================================= */

	/* ======================================= Bước 4 ============================================== */
	for(int j=0;j<dem1;j++)
	{
		int dem2=0;
		for(int i=0;i<dem;i++)
		{
			if(b[j]==a[i]) // So sánh các phần tử của mảng b với mảng a ban đầu .
			{
				dem2++; // Mỗi lần các phần tử trong mảng b bằng với mảng a thì tăng biến đếm lên . Mục đích liệt kê ra tần suất xuất hiện của các phần tử có trong mảng,mỗi phần tử liệt kê 1 lần .
			}
		}
		c[k++]=dem2; // Lưu các tần suất xuất hiện của các phần tử phân biệt vào trong một mảng c .
	}
	/* ============================================================================================= */

	/* ======================================= Bước 5 ============================================== */
	int max=c[0]; // Khởi tạo max = phần tử đầu tiên của mảng c .
	for(int k=1;k<dem1;k++) // Số lượng phần tử của mảng c chính là số lượng các phần tử phân biệt của mảng a và cũng chính là số lượng phần của mảng b nên ta cho điều kiện l < dem .
	{
		if(c[k]>max)
		{
			max=c[k]; // Tìm ra tần suất xuất hiện lớn nhất .
		}
	}
	/* ============================================================================================= */

	/* ======================================= Bước 6 ============================================== */
	for(int j=0;j<dem1;j++)
	{
		int dem2=0;
		for(int i=0;i<dem;i++)
		{
			if(b[j]==a[i])
			{
				dem2++; // Mỗi lần bằng nhau thì tăng biến đếm lên .
			}
		}
		if(dem2==max) // Nếu biến đếm bằng đúng max (tần suất xuất hiện nhiều nhất mà ta đã tìm ra ở trên ) thì sẽ đi in ra tất cả các phần tử thỏa điều kiện đó .
		{
			d=b[j]; // Theo đề bài thì chỉ tìm ra 1 phần tử duy nhất có số lần xuất hiện nhiều nhất nên ta phải gán 1 ẩn phụ bằng với b[j] và đi tìm ra duy nhất 1 phần tử thỏa điều kiện có số lần xuất hiện nhiều nhất . Nếu có nhiều hơn 1 phần tử thỏa điều kiện như vậy thì ta chỉ cần tìm ra phần tử đầu tiên trong mảng thỏa thì xuất ra .
			break; // Tìm ra phần tử đầu tiên thì thoát ra khỏi vòng lặp .
		}
	}
	/* ============================================================================================= */

	/* ======================================= Bước 7 ============================================== */
	int dem3=0; // Khởi tạo biến đếm .
	printf("\nNam Co So Sach Xuat Ban Nhieu Nhat La Nam:%d",d);
	printf("\n");
	printf("\nSo Luong Sach Xuat Ban Trong Nam %d La:%d Quyen Sach",d,max);
	printf("\n");
	printf("\n>>>>>>>>>>>>>> Thong Tin Ve Cac Quyen Sach Xuat Ban Nam %d <<<<<<<<<<<<<\n",d);
	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==d)
		{
			dem3++;
			printf("%8d  ",dem3);
			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],b[MAX],c[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,b,c);
				break;
			}
		case 3:
			{
				goto quaylai;
				break;
			}
		case 0: 
			{
				Thanks();
			}
		}
	}while(w!=0);
}
/* =================================================================================================== */

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

/* ============================== Designed By : Nguyễn Việt Nam Sơn ================================== */

/* ========================================== THE END ================================================ */


Output:
Line 18: error: conio.h: No such file or directory
Line 20: error: Windows.h: No such file or directory
Line 53: error: expected ';', ',' or ')' before '&' token
In function 'getnode':
Line 64: error: 'new' undeclared (first use in this function)
Line 64: error: (Each undeclared identifier is reported only once
Line 64: error: for each function it appears in.)
Line 64: error: expected ';' before 'NODE'
t.c: At top level:
Line 74: error: expected ';', ',' or ')' before '&' token
Line 90: error: expected ';', ',' or ')' before '&' token
In function 'OutPut':
Line 132: error: 'for' loop initial declaration used outside C99 mode
In function 'TimQuyenSachCuNhat':
Line 148: error: 'INT_MAX' undeclared (first use in this function)
t.c: At top level:
Line 190: error: expected ';', ',' or ')' before '&' token
In function 'TimRaNamCoNhieuSachXuatBanNhatVaLietKeCacSachXuatBanTrongNamDo':
Line 225: error: redefinition of 'i'
Line 211: error: previous definition of 'i' was here
Line 225: error: 'for' loop initial declaration used outside C99 mode
Line 236: error: redefinition of 'j'
Line 223: error: previous definition of 'j' was here
Line 236: error: 'for' loop initial declaration used outside C99 mode
Line 239: error: 'for' loop initial declaration used outside C99 mode
Line 252: error: redefinition of 'k'
Line 223: error: previous definition of 'k' was here
Line 252: error: 'for' loop initial declaration used outside C99 mode
Line 262: error: redefinition of 'j'
Line 236: error: previous definition of 'j' was here
Line 262: error: 'for' loop initial declaration used outside C99 mode
Line 265: error: 'for' loop initial declaration used outside C99 mode
In function 'resizeConsole':
Line 310: error: 'HWND' undeclared (first use in this function)
Line 310: error: expected ';' before 'console'
Line 311: error: 'RECT' undeclared (first use in this function)
Line 311: error: expected ';' before 'r'
Line 312: error: 'console' undeclared (first use in this function)
Line 312: error: 'r' undeclared (first use in this function)
Line 313: error: 'TRUE' undeclared (first use in this function)
In function 'gotoxy':
Line 319: error: 'HANDLE' undeclared (first use in this function)
Line 319: error: expected ';' before 'hstdout'
Line 320: error: 'COORD' undeclared (first use in this function)
Line 320: error: expected ';' before 'position'
Line 321: error: 'hstdout' undeclared (first use in this function)
Line 321: error: 'position' undeclared (first use in this function)
In function 'textcolor':
Line 327: error: 'HANDLE' undeclared (first use in this function)
Line 327: error: expected ';' before 'mau'
Line 328: error: 'mau' undeclared (first use in this function)
Line 328: error: 'STD_OUTPUT_HANDLE' undeclared (first use in this function)
In function 'Thanks':
Line 348: error: 'for' loop initial declaration used outside C99 mode
In function 'main':
Line 427: warning: return type of 'main' is not 'int'


Create a new paste based on this one


Comments: