fork download
  1. /*
  2. _______________________________________
  3. | Thành Viên Nhóm | Mã Sinh Viên |
  4. |_____________________________________|
  5. | Nguy?n Ð?c Quang | :2411061767 |
  6. | |
  7. | Tr?n Minh Quang | :2411062029 |
  8. | |
  9. | Lu?ng Vi?t Nh?t | :2411061614 |
  10. | |
  11. | Hoàng Gia Th? | :2411061927 |
  12. | |
  13. | Nguy?n Ti?n Dung | :2411061649 |
  14. |_____________________________________|
  15. */
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #define MAX 100
  20. typedef int Position;
  21.  
  22. // Cau truc sinh vien
  23. struct Sinhvien {
  24. char id[20];
  25. char name[50];
  26. char ns[20];
  27. int tuoi;
  28. };
  29.  
  30. // Kieu danh sach mang
  31. typedef struct {
  32. struct Sinhvien A[MAX];
  33. int Last;
  34. } List;
  35.  
  36. // ================== Cac thao tac co ban ==================
  37.  
  38. // Vi tri dau tien
  39. Position FIRST(List L) {
  40. return 1;
  41. }
  42.  
  43. // Vi tri ket thuc (sau phan tu cuoi)
  44. Position END(List L) {
  45. return L.Last + 1;
  46. }
  47.  
  48. // Vi tri ke tiep
  49. Position NEXT(Position P, List L) {
  50. if (P < END(L)) return P + 1;
  51. return END(L);
  52. }
  53.  
  54. // Vi tri truoc do
  55. Position PREVIOUS(Position P, List L) {
  56. if (P > FIRST(L)) return P - 1;
  57. return FIRST(L);
  58. }
  59.  
  60. // Lay phan tu o vi tri P
  61. struct Sinhvien RETRIEVE(Position P, List L) {
  62. return L.A[P-1];
  63. }
  64.  
  65. // Tim sinh vien theo MSSV
  66. Position LOCATE(char id[], List L) {
  67. for (int i = 0; i < L.Last; i++) {
  68. if (strcmp(L.A[i].id, id) == 0)
  69. return i+1;
  70. }
  71. return END(L);
  72. }
  73.  
  74. // Tao danh sach rong
  75. void MAKENULL_LIST(List *L) {
  76. L->Last = 0;
  77. }
  78.  
  79. // Kiem tra rong
  80. int EMPTY_LIST(List L){
  81. return L.Last == 0;
  82. }
  83.  
  84. // Chen phan tu vao vi tri P
  85. void INSERT_LIST(struct Sinhvien x, Position P, List *L) {
  86. if (L->Last >= MAX) {
  87. printf("Danh sach day\n");
  88. return;
  89. }
  90. if (P < FIRST(*L) || P > END(*L)) {
  91. printf("Vi tri khong hop le\n");
  92. return;
  93. }
  94. for (int i = L->Last; i >= P; i--) {
  95. L->A[i] = L->A[i-1];
  96. }
  97. L->A[P-1] = x;
  98. L->Last++;
  99. }
  100.  
  101. // Xoa phan tu tai vi tri P
  102. void DELETE_LIST(Position P, List *L) {
  103. if (P < FIRST(*L) || P >= END(*L)) {
  104. printf("Vi tri khong hop le\n");
  105. return;
  106. }
  107. for (int i = P-1; i < L->Last-1; i++) {
  108. L->A[i] = L->A[i+1];
  109. }
  110. L->Last--;
  111. }
  112.  
  113. // ================== Cac chuc nang mo rong ==================
  114.  
  115.  
  116. // Chuan hoa ngay sinh
  117.  
  118. void ChuanHoan(char s[], int size) {
  119. for (int i = 0; i < size; i++) {
  120. if (s[i] == '/') {
  121. if (i == 1) {
  122. for (int j = size; j >= 0; j--) {
  123. s[j+1] = s[j];
  124. }
  125. s[0] = '0';
  126. size++;
  127. }
  128. if (s[i+2] == '/' && i+2 < size) {
  129. for (int k = size; k >= i+1; k--) {
  130. s[k+1] = s[k];
  131. }
  132. s[i+1] = '0';
  133. size++;
  134. }
  135. }
  136. }
  137. }
  138.  
  139.  
  140.  
  141. int laNamNhuan(int y) {
  142. return ( (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0) );
  143. }
  144.  
  145. int soNgayTrongThang(int m, int y) {
  146. if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
  147. return 31;
  148. if (m == 4 || m == 6 || m == 9 || m == 11)
  149. return 30;
  150. if (m == 2)
  151. return laNamNhuan(y) ? 29 : 28;
  152. return 0;
  153. }
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160. // Nhap thong tin sinh vien moi
  161. struct Sinhvien nhapSinhVien(List L) {
  162. struct Sinhvien sv;
  163. printf("\n+-----------------------------------------+\n");
  164. printf("| NHAP THONG TIN SINH VIEN MOI |\n");
  165. printf("+-----------------------------------------+\n");
  166. while (1) {
  167. printf("Nhap MSSV: ");
  168. scanf("%s", sv.id);
  169. if (LOCATE(sv.id, L) != END(L)) {
  170. printf("MSSV da ton tai, nhap lai\n");
  171. } else {
  172. break;
  173. }
  174. }
  175. printf("Nhap ho ten: ");
  176. scanf(" %[^\n]", sv.name);
  177.  
  178. do {
  179. printf("Nhap ngay sinh (dd/mm/yyyy): ");
  180. scanf("%s", sv.ns);
  181.  
  182. int size = strlen(sv.ns);
  183. ChuanHoan(sv.ns, size);
  184.  
  185. // printf("%s",sv.ns);
  186.  
  187. char day[3], month[3], year[5];
  188.  
  189.  
  190. day[0] = sv.ns[0];
  191. day[1] = sv.ns[1];
  192. day[2] = '\0';
  193.  
  194.  
  195. month[0] = sv.ns[3];
  196. month[1] = sv.ns[4];
  197. month[2] = '\0';
  198.  
  199. for (int i = 6, j = 0; i <= size; i++, j++) {
  200. year[j] = sv.ns[i];
  201. year[j+1] = '\0';
  202. }
  203.  
  204. int d = atoi(day);
  205. int m = atoi(month);
  206. int y = atoi(year);
  207. // printf("thang: %d \n",m);
  208. // printf("nam: %d \n",y);
  209. int maxday = soNgayTrongThang(m,y);
  210. // printf("Ngay max: %d \n",maxday);
  211. if (d <= 0 || d > maxday || m <= 0 || m > 12 || y <= 100) {
  212. printf("Ngay sinh khong hop le vui long nhap lai!\n");
  213. } else {
  214.  
  215. break;
  216. }
  217.  
  218. } while (1);
  219.  
  220.  
  221.  
  222. printf("Nhap tuoi: ");
  223. scanf("%d", &sv.tuoi);
  224. return sv;
  225. }
  226.  
  227. // In danh sach sinh vien
  228. void PRINT_LIST(List L) {
  229. if (L.Last == 0) {
  230. printf("Danh sach rong\n");
  231. return;
  232. }
  233. printf("\n+================================================================================+\n");
  234. printf("| DANH SACH SINH VIEN |\n");
  235. printf("+================================================================================+\n");
  236. printf("| %-10s | %-20s | %-12s | %-5s |\n", "MSV", "Ho Ten", "Ngay Sinh", "Tuoi");
  237. printf("+--------------------------------------------------------------------------------+\n");
  238. for (int i = 0; i < L.Last; i++) {
  239. printf("%d) MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  240. i+1, L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  241. }
  242. }
  243.  
  244. // Sap xep theo ten
  245. void SORT_BY_NAME(List *L) {
  246. for (int i = 0; i < L->Last - 1; i++) {
  247. for (int j = i + 1; j < L->Last; j++) {
  248. if (strcmp(L->A[i].name, L->A[j].name) > 0) {
  249. struct Sinhvien tmp = L->A[i];
  250. L->A[i] = L->A[j];
  251. L->A[j] = tmp;
  252. }
  253. }
  254. }
  255. printf("Da sap xep theo ten\n");
  256. }
  257.  
  258. // Sap xep theo tuoi
  259. void SORT_BY_TUOI(List *L) {
  260. for (int i = 0; i < L->Last - 1; i++) {
  261. for (int j = i + 1; j < L->Last; j++) {
  262. if (L->A[i].tuoi > L->A[j].tuoi) {
  263. struct Sinhvien tmp = L->A[i];
  264. L->A[i] = L->A[j];
  265. L->A[j] = tmp;
  266. }
  267. }
  268. }
  269. printf("Da sap xep theo tuoi\n");
  270. }
  271.  
  272. // Tim kiem theo ten
  273. void SEARCH_BY_NAME(List L) {
  274. char ten[50];
  275. int found = 0;
  276. printf("Nhap ten can tim: ");
  277. scanf(" %[^\n]", ten);
  278. for (int i = 0; i < L.Last; i++) {
  279. if (strcmp(L.A[i].name, ten) == 0) {
  280. printf("MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  281. L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  282. found = 1;
  283. }
  284. }
  285. if (!found) printf("Khong tim thay sinh vien\n");
  286. }
  287.  
  288. // ================== MAIN ==================
  289. int main() {
  290.  
  291. char *names[] = {
  292. "NGUYEN DUC QUANG",
  293. "TRAN MINH QUANG",
  294. "LUONG VIET NHAT",
  295. "HOANG GIA THE",
  296. "NGUYEN TIEN DUNG"
  297. };
  298.  
  299. char *ids[] = {
  300. "2411061767",
  301. "2411062029",
  302. "2411061614",
  303. "2411061927",
  304. "2411061649"
  305. };
  306.  
  307. int n = 5; // so thanh vien
  308.  
  309. printf("+==================================================================================+\n");
  310. printf("| BAI TAP LON BAI 7 - QUAN LI SINH VIEN | \n");
  311. printf("| | \n");
  312. printf("| LOP: DH14C4 | \n");
  313. printf("+==================================================================================+\n");
  314. printf("| %-30s | %-20s | |\n", "THANH VIEN NHOM", "MA SINH VIEN");
  315. printf("+----------------------------------------------------------------------------------+\n");
  316.  
  317. for (int i = 0; i < n; i++) {
  318. printf("| %-30s | :%-19s | | \n", names[i], ids[i]);
  319. printf("+----------------------------------------------------------------------------------+\n");
  320. }
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333. List L;
  334. MAKENULL_LIST(&L);
  335. int choice;
  336. while (1) {
  337. printf("\n+=================================================================+\n");
  338. printf("| HE THONG QUAN LY SINH VIEN |\n");
  339. printf("+=================================================================+\n");
  340. printf("| [1] Them sinh vien vao vi tri bat ky (INSERT_LIST) |\n");
  341. printf("| [2] Xoa sinh vien tai vi tri (DELETE_LIST) |\n");
  342. printf("| [3] Tim kiem sinh vien theo MSSV (LOCATE) |\n");
  343. printf("| [4] Xem thong tin theo vi tri (RETRIEVE) |\n");
  344. printf("| [5] In danh sach sinh vien (PRINT_LIST) |\n");
  345. printf("| [6] Sap xep danh sach theo ten |\n");
  346. printf("| [7] Sap xep danh sach theo tuoi |\n");
  347. printf("| [8] Tim kiem sinh vien theo ten |\n");
  348. printf("| [0] Thoat chuong trinh |\n");
  349. printf("+=================================================================+\n");
  350. printf(">> Nhap lua chon cua ban: ");
  351. scanf("%d", &choice);
  352.  
  353. if (choice == 0) {
  354. printf("Da thoat\n");
  355. break;
  356. }
  357. switch (choice) {
  358. case 1: {
  359. struct Sinhvien sv = nhapSinhVien(L);
  360. Position p;
  361. printf("Nhap vi tri chen (1..%d): ", END(L));
  362. scanf("%d", &p);
  363. INSERT_LIST(sv, p, &L);
  364. break;
  365. }
  366. case 2: {
  367. Position p;
  368. printf("Nhap vi tri muon xoa (1..%d): ", L.Last);
  369. scanf("%d", &p);
  370. DELETE_LIST(p, &L);
  371. break;
  372. }
  373. case 3: {
  374. char id[20];
  375. printf("\n+-----------------------------------------+\n");
  376. printf("| TIM KIEM SINH VIEN THEO MSV |\n");
  377. printf("+-----------------------------------------+\n");
  378. printf(">> Nhap MSV can tim: ");
  379. scanf("%s", id);
  380. Position pos = LOCATE(id, L);
  381. if (pos == END(L)) {
  382. printf("Khong tim thay\n");
  383. } else {
  384. struct Sinhvien sv = RETRIEVE(pos, L);
  385. printf("Tim thay MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  386. sv.id, sv.name, sv.ns, sv.tuoi);
  387. }
  388. break;
  389. }
  390. case 4: {
  391. Position p;
  392. printf("\n+-----------------------------------------+\n");
  393. printf("| XEM THONG TIN THEO VI TRI |\n");
  394. printf("+-----------------------------------------+\n");
  395. printf("Nhap vi tri: ");
  396. scanf("%d", &p);
  397. if (p < FIRST(L) || p >= END(L)) {
  398. printf("Vi tri khong hop le\n");
  399. } else {
  400. struct Sinhvien sv = RETRIEVE(p, L);
  401. printf("Thong tin SV tai vi tri %d: MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  402. p, sv.id, sv.name, sv.ns, sv.tuoi);
  403. }
  404. break;
  405. }
  406. case 5:
  407. PRINT_LIST(L);
  408. break;
  409. case 6:
  410. SORT_BY_NAME(&L);
  411. break;
  412. case 7:
  413. SORT_BY_TUOI(&L);
  414. break;
  415. case 8:
  416. SEARCH_BY_NAME(L);
  417. break;
  418. default:
  419. printf("Lua chon khong hop le\n");
  420. }
  421. }
  422.  
  423. return 0;
  424. }
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
+==================================================================================+
|                              BAI TAP LON BAI 7 - QUAN LI SINH VIEN               |    
|                                                                                  | 
|                                        LOP: DH14C4                               |    
+==================================================================================+
|               THANH VIEN NHOM                | MA SINH VIEN         |            |
+----------------------------------------------------------------------------------+
|               NGUYEN DUC QUANG               | :2411061767          |            | 
+----------------------------------------------------------------------------------+
|               TRAN MINH QUANG                | :2411062029          |            | 
+----------------------------------------------------------------------------------+
|               LUONG VIET NHAT                | :2411061614          |            | 
+----------------------------------------------------------------------------------+
|               HOANG GIA THE                  | :2411061927          |            | 
+----------------------------------------------------------------------------------+
|               NGUYEN TIEN DUNG               | :2411061649          |            | 
+----------------------------------------------------------------------------------+

+=================================================================+
|                     HE THONG QUAN LY SINH VIEN                  |
+=================================================================+
| [1] Them sinh vien vao vi tri bat ky (INSERT_LIST)              |
| [2] Xoa sinh vien tai vi tri (DELETE_LIST)                      |
| [3] Tim kiem sinh vien theo MSSV (LOCATE)                       |
| [4] Xem thong tin theo vi tri (RETRIEVE)                        |
| [5] In danh sach sinh vien (PRINT_LIST)                         |
| [6] Sap xep danh sach theo ten                                  |
| [7] Sap xep danh sach theo tuoi                                 |
| [8] Tim kiem sinh vien theo ten                                 |
| [0] Thoat chuong trinh                                          |
+=================================================================+
>> Nhap lua chon cua ban: Da thoat