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. /*
  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. // chuan hoan ho ten
  172. void ChuanHoaTen(char *name) {
  173. char temp[100];
  174. int i = 0, j = 0;
  175. int len = strlen(name);
  176.  
  177. while (i < len && name[i] == ' ') i++;
  178.  
  179. int space = 0;
  180. while (i < len) {
  181. if (name[i] != ' ') {
  182. if (space && j > 0) {
  183. temp[j++] = ' ';
  184. space = 0;
  185. }
  186. temp[j++] = name[i];
  187. } else {
  188. space = 1;
  189. }
  190. i++;
  191. }
  192.  
  193. if (j > 0 && temp[j-1] == ' ') j--;
  194. temp[j] = '\0';
  195.  
  196. for (i = 0; i < j; i++) {
  197. if (temp[i] >= 'A' && temp[i] <= 'Z')
  198. temp[i] = temp[i] - 'A' + 'a';
  199. }
  200.  
  201. int newWord = 1;
  202. for (i = 0; i < j; i++) {
  203. if (temp[i] == ' ') {
  204. newWord = 1;
  205. } else if (newWord && temp[i] >= 'a' && temp[i] <= 'z') {
  206. temp[i] = temp[i] - 'a' + 'A';
  207. newWord = 0;
  208. } else {
  209. newWord = 0;
  210. }
  211. }
  212.  
  213. strcpy(name, temp);
  214. }
  215. //end chuan hoan ho ten//
  216.  
  217.  
  218.  
  219.  
  220. // Nhap thong tin sinh vien moi
  221. struct Sinhvien nhapSinhVien(List L) {
  222. struct Sinhvien sv;
  223. printf("\n+-----------------------------------------+\n");
  224. printf("| NHAP THONG TIN SINH VIEN MOI |\n");
  225. printf("+-----------------------------------------+\n");
  226. while (1) {
  227. printf(">> Nhap MSSV: ");
  228. scanf("%s", sv.id);
  229. if (LOCATE(sv.id, L) != END(L)) {
  230. printf("MSSV da ton tai, nhap lai\n");
  231. } else {
  232. break;
  233. }
  234. }
  235. printf(">> Nhap ho ten: ");
  236. scanf(" %[^\n]", sv.name);
  237. ChuanHoaTen(sv.name);
  238.  
  239. do {
  240. printf("Nhap ngay sinh (dd/mm/yyyy): ");
  241. scanf("%s", sv.ns);
  242.  
  243. int size = strlen(sv.ns);
  244. ChuanHoan(sv.ns, size);
  245.  
  246. // printf("%s",sv.ns);
  247.  
  248. char day[3], month[3], year[5];
  249.  
  250.  
  251. day[0] = sv.ns[0];
  252. day[1] = sv.ns[1];
  253. day[2] = '\0';
  254.  
  255.  
  256. month[0] = sv.ns[3];
  257. month[1] = sv.ns[4];
  258. month[2] = '\0';
  259.  
  260. for (int i = 6, j = 0; i <= size; i++, j++) {
  261. year[j] = sv.ns[i];
  262. year[j+1] = '\0';
  263. }
  264.  
  265. int d = atoi(day);
  266. int m = atoi(month);
  267. int y = atoi(year);
  268. // printf("thang: %d \n",m);
  269. // printf("nam: %d \n",y);
  270. int maxday = soNgayTrongThang(m,y);
  271. // printf("Ngay max: %d \n",maxday);
  272. if (d <= 0 || d > maxday || m <= 0 || m > 12 || y <= 100) {
  273. printf("Ngay sinh khong hop le vui long nhap lai!\n");
  274. } else {
  275.  
  276. int namNow = 2025;
  277.  
  278. do {
  279. printf("Nhap tuoi: ");
  280. scanf("%d", &sv.tuoi);
  281. if (sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2) {
  282. printf("Vui long nhap lai tuoi dung voi tuoi that cua ban\n");
  283. }
  284. } while (sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2);
  285.  
  286.  
  287. break;
  288. }
  289.  
  290. } while (1);
  291.  
  292.  
  293. return sv;
  294. }
  295.  
  296.  
  297. // In danh sach sinh vien
  298. void PRINT_LIST(List L) {
  299. if (L.Last == 0) {
  300. printf("Danh sach rong!\n");
  301. return;
  302. }
  303.  
  304. printf("\n+-----+--------------+---------------------------+--------------+-------+\n");
  305. printf("| STT | MSSV | Ho Ten | Ngay Sinh | Tuoi |\n");
  306. printf("+-----+--------------+---------------------------+--------------+-------+\n");
  307.  
  308. for (int i = 0; i < L.Last; i++) {
  309. printf("| %-3d | %-12s | %-25s | %-12s | %-5d |\n",
  310. i+1, L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  311. }
  312.  
  313. printf("+-----+--------------+---------------------------+--------------+-------+\n");
  314. }
  315.  
  316.  
  317. // Sap xep theo ten
  318. void SORT_BY_NAME(List *L) {
  319. for (int i = 0; i < L->Last - 1; i++) {
  320. for (int j = i + 1; j < L->Last; j++) {
  321. if (strcmp(L->A[i].name, L->A[j].name) > 0) {
  322. struct Sinhvien tmp = L->A[i];
  323. L->A[i] = L->A[j];
  324. L->A[j] = tmp;
  325. }
  326. }
  327. }
  328. printf("Da sap xep theo ten\n");
  329. }
  330.  
  331. // Sap xep theo tuoi
  332. void SORT_BY_TUOI(List *L) {
  333. for (int i = 0; i < L->Last - 1; i++) {
  334. for (int j = i + 1; j < L->Last; j++) {
  335. if (L->A[i].tuoi > L->A[j].tuoi) {
  336. struct Sinhvien tmp = L->A[i];
  337. L->A[i] = L->A[j];
  338. L->A[j] = tmp;
  339. }
  340. }
  341. }
  342. printf("Da sap xep theo tuoi\n");
  343. }
  344.  
  345. // Tim kiem theo ten
  346. void SEARCH_BY_NAME(List L) {
  347. char ten[50];
  348. int found = 0;
  349. printf(">> Nhap ten can tim: ");
  350. scanf(" %[^\n]", ten);
  351. for (int i = 0; i < L.Last; i++) {
  352. if (strcmp(L.A[i].name, ten) == 0) {
  353. printf("MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  354. L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  355. found = 1;
  356. }
  357. }
  358. if (!found) printf("Khong tim thay sinh vien\n");
  359. }
  360.  
  361. // ================== MAIN ==================
  362. int main() {
  363.  
  364. char *names[] = {
  365. "NGUYEN DUC QUANG",
  366. "TRAN MINH QUANG",
  367. "LUONG VIET NHAT",
  368. "HOANG GIA THE",
  369. "NGUYEN TIEN DUNG"
  370. };
  371.  
  372. char *ids[] = {
  373. "2411061767",
  374. "2411062029",
  375. "2411061614",
  376. "2411061927",
  377. "2411061649"
  378. };
  379.  
  380. int n = 5; // so thanh vien
  381.  
  382. printf("+==================================================================================+\n");
  383. printf("| BAI TAP LON BAI 7 - QUAN LI SINH VIEN | \n");
  384. printf("| | \n");
  385. printf("| LOP: DH14C4 | \n");
  386. printf("+==================================================================================+\n");
  387. printf("| %-30s | %-20s | |\n", "THANH VIEN NHOM", "MA SINH VIEN");
  388. printf("+----------------------------------------------------------------------------------+\n");
  389.  
  390. for (int i = 0; i < n; i++) {
  391. printf("| %-30s | :%-19s | | \n", names[i], ids[i]);
  392. printf("+----------------------------------------------------------------------------------+\n");
  393. }
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406. List L;
  407. MAKENULL_LIST(&L);
  408. int choice;
  409. while (1) {
  410. printf("\n+=================================================================+\n");
  411. printf("| HE THONG QUAN LY SINH VIEN |\n");
  412. printf("+=================================================================+\n");
  413. printf("| [1] Them sinh vien vao vi tri bat ky (INSERT_LIST) |\n");
  414. printf("| [2] Xoa sinh vien tai vi tri (DELETE_LIST) |\n");
  415. printf("| [3] Tim kiem sinh vien theo MSSV (LOCATE) |\n");
  416. printf("| [4] Xem thong tin theo vi tri (RETRIEVE) |\n");
  417. printf("| [5] In danh sach sinh vien (PRINT_LIST) |\n");
  418. printf("| [6] Sap xep danh sach theo ten |\n");
  419. printf("| [7] Sap xep danh sach theo tuoi |\n");
  420. printf("| [8] Tim kiem sinh vien theo ten |\n");
  421. printf("| [0] Thoat chuong trinh |\n");
  422. printf("+=================================================================+\n");
  423. printf(">> Nhap lua chon cua ban: ");
  424. scanf("%d", &choice);
  425.  
  426. if (choice == 0) {
  427. printf("Da thoat\n");
  428. break;
  429. }
  430. switch (choice) {
  431. case 1: {
  432. struct Sinhvien sv = nhapSinhVien(L);
  433. Position p;
  434. printf("Nhap Vi Tri Sinh Vien Muon Them Chen Vao Dau 1 Cuoi 2: ");
  435. scanf("%d", &p);
  436. if(p == 1 ){
  437. INSERT_LIST(sv, 1, &L);
  438. printf("Them sinh vien vao thanh cong. \n");
  439. }
  440. else if(p == 2){
  441. INSERT_LIST(sv, END(L), &L);
  442. printf("Them sinh vien vao thanh cong. \n") ;
  443. }
  444. else{
  445. printf("Lua chon khong hop le \n");
  446. }
  447.  
  448. break;
  449. }
  450. case 2: {
  451. Position p;
  452. printf(">> Nhap vi tri muon xoa (1..%d): ", L.Last);
  453. scanf("%d", &p);
  454. DELETE_LIST(p, &L);
  455. break;
  456. }
  457. case 3: {
  458. char id[20];
  459. printf("\n+-----------------------------------------+\n");
  460. printf("| TIM KIEM SINH VIEN THEO MSV |\n");
  461. printf("+-----------------------------------------+\n");
  462. printf(">> Nhap MSV can tim: ");
  463. scanf("%s", id);
  464. Position pos = LOCATE(id, L);
  465. if (pos == END(L)) {
  466. printf("Khong tim thay\n");
  467. } else {
  468. struct Sinhvien sv = RETRIEVE(pos, L);
  469. printf("Tim thay MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  470. sv.id, sv.name, sv.ns, sv.tuoi);
  471. }
  472. break;
  473. }
  474. case 4: {
  475. Position p;
  476. printf("\n+-----------------------------------------+\n");
  477. printf("| XEM THONG TIN THEO VI TRI |\n");
  478. printf("+-----------------------------------------+\n");
  479. printf(">> Nhap vi tri: ");
  480. scanf("%d", &p);
  481. if (p < FIRST(L) || p >= END(L)) {
  482. printf("Vi tri khong hop le\n");
  483. } else {
  484. struct Sinhvien sv = RETRIEVE(p, L);
  485. printf("Thong tin SV tai vi tri %d: MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  486. p, sv.id, sv.name, sv.ns, sv.tuoi);
  487. }
  488. break;
  489. }
  490. case 5:
  491. PRINT_LIST(L);
  492. break;
  493. case 6:
  494. SORT_BY_NAME(&L);
  495. break;
  496. case 7:
  497. SORT_BY_TUOI(&L);
  498. break;
  499. case 8:
  500. SEARCH_BY_NAME(L);
  501. break;
  502. default:
  503. printf("Lua chon khong hop le\n");
  504. }
  505. }
  506.  
  507. return 0;
  508. }
Success #stdin #stdout 0s 5288KB
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