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