fork download
  1. /*
  2. _______________________________________
  3. | Thành Viên Nhóm | Ma 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.  
  21. typedef int Position;
  22.  
  23. // Cau truc sinh vien
  24. typedef struct {
  25. char tenMon[50];
  26.  
  27. } MonHoc;
  28.  
  29. struct Sinhvien {
  30. char id[20];
  31. char name[50];
  32. char ns[20];
  33. int tuoi;
  34. float diem[MAX];
  35. int soMon;
  36. };
  37.  
  38. // Kieu danh sach mang
  39. typedef struct {
  40. struct Sinhvien A[MAX];
  41. int Last;
  42. } List;
  43.  
  44.  
  45.  
  46. // =============================== Cac thao tac co ban ===============================
  47.  
  48. Position FIRST(List L) {
  49. return 1;
  50. }
  51.  
  52. Position END(List L) {
  53. return L.Last + 1;
  54. }
  55.  
  56. Position NEXT(Position P, List L) {
  57. if (P < END(L)) return P + 1;
  58. return END(L);
  59. }
  60.  
  61. Position PREVIOUS(Position P, List L) {
  62. if (P > FIRST(L)) return P - 1;
  63. return FIRST(L);
  64. }
  65.  
  66. struct Sinhvien RETRIEVE(Position P, List L) {
  67. return L.A[P-1];
  68. }
  69.  
  70. Position LOCATE(char id[], List L) {
  71. for (int i = 0; i < L.Last; i++) {
  72. if (strcmp(L.A[i].id, id) == 0)
  73. return i+1;
  74. }
  75. return END(L);
  76. }
  77.  
  78. void MAKENULL_LIST(List *L) {
  79. L->Last = 0;
  80. }
  81.  
  82. int EMPTY_LIST(List L){
  83. return L.Last == 0;
  84. }
  85.  
  86. void INSERT_LIST(struct Sinhvien x, Position P, List *L) {
  87. if (L->Last >= MAX) {
  88. printf("Danh sach day\n");
  89. return;
  90. }
  91. if (P < FIRST(*L) || P > END(*L)) {
  92. printf("Vi tri khong hop le\n");
  93. return;
  94. }
  95. for (int i = L->Last; i >= P; i--) {
  96. L->A[i] = L->A[i-1];
  97. }
  98.  
  99. L->A[P-1] = x;
  100. L->Last++;
  101. }
  102.  
  103. void DELETE_LIST(Position P, List *L) {
  104. if (P < FIRST(*L) || P >= END(*L)) {
  105. printf("Vi tri khong hop le\n");
  106. return;
  107. }
  108. for (int i = P-1; i < L->Last-1; i++) {
  109. L->A[i] = L->A[i+1];
  110. }
  111. L->Last--;
  112. }
  113.  
  114.  
  115.  
  116. // Xoa sinh vien theo MSV
  117. void DELETE_BY_ID(char id[], List *L) {
  118. printf("\n+==========================================================================+\n");
  119. printf("| XOA SINH VIEN THEO MSV |\n");
  120. printf("+==========================================================================+\n");
  121.  
  122. Position p = LOCATE(id, *L);
  123.  
  124. if (p == END(*L)) {
  125. printf("| Khong tim thay sinh vien co MSV: %-36s|\n", id);
  126. printf("+==========================================================================+\n");
  127. return;
  128. }
  129.  
  130. struct Sinhvien sv = L->A[p - 1];
  131.  
  132. char confirm;
  133. printf("| Tim thay sinh vien: |\n");
  134. printf("| MSSV : %-59s|\n", sv.id);
  135. printf("| Ho ten : %-59s|\n", sv.name);
  136. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  137. printf("+--------------------------------------------------------------------------+\n");
  138. printf(" Ban co chac chan muon xoa sinh vien nay khong? (y/n): ");
  139. scanf(" %c", &confirm);
  140. printf("+==========================================================================+\n");
  141.  
  142. if (confirm != 'y' && confirm != 'Y') {
  143. printf("| Da huy thao tac xoa sinh vien. |\n");
  144. printf("+==========================================================================+\n");
  145. return;
  146. }
  147.  
  148. for (int i = p - 1; i < L->Last - 1; i++) {
  149. L->A[i] = L->A[i + 1];
  150. }
  151. L->Last--;
  152.  
  153. printf("| Da xoa sinh vien thanh cong |\n");
  154. printf("+--------------------------------------------------------------------------+\n");
  155. printf("| Thong tin sinh vien da xoa: |\n");
  156. printf("| MSSV : %-59s|\n", sv.id);
  157. printf("| Ho ten : %-59s|\n", sv.name);
  158. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  159. printf("+==========================================================================+\n");
  160. }
  161.  
  162.  
  163.  
  164.  
  165.  
  166. // ================== Cac chuc nang mo rong ==================
  167.  
  168. void ChuanHoan(char s[], int size) {
  169. for (int i = 0; i < size; i++) {
  170. if (s[i] == '/') {
  171. if (i == 1) {
  172. for (int j = size; j >= 0; j--) {
  173. s[j+1] = s[j];
  174. }
  175. s[0] = '0';
  176. size++;
  177. }
  178. if (s[i+2] == '/' && i+2 < size) {
  179. for (int k = size; k >= i+1; k--) {
  180. s[k+1] = s[k];
  181. }
  182. s[i+1] = '0';
  183. size++;
  184. }
  185. }
  186. }
  187. }
  188.  
  189. int laNamNhuan(int y) {
  190. return ( (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0) );
  191. }
  192.  
  193. int soNgayTrongThang(int m, int y) {
  194. if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
  195. return 31;
  196. if (m == 4 || m == 6 || m == 9 || m == 11)
  197. return 30;
  198. if (m == 2)
  199. return laNamNhuan(y) ? 29 : 28;
  200. return 0;
  201. }
  202.  
  203. void ChuanHoaTen(char *name) {
  204. char temp[100];
  205. int i = 0, j = 0;
  206. int len = strlen(name);
  207.  
  208. while (i < len && name[i] == ' ') i++;
  209. int space = 0;
  210. while (i < len) {
  211. if (name[i] != ' ') {
  212. if (space && j > 0) {
  213. temp[j++] = ' ';
  214. space = 0;
  215. }
  216. temp[j++] = name[i];
  217. } else {
  218. space = 1;
  219. }
  220. i++;
  221. }
  222.  
  223. if (j > 0 && temp[j-1] == ' ') j--;
  224. temp[j] = '\0';
  225.  
  226. for (i = 0; i < j; i++) {
  227. if (temp[i] >= 'A' && temp[i] <= 'Z')
  228. temp[i] = temp[i] - 'A' + 'a';
  229. }
  230.  
  231. int newWord = 1;
  232. for (i = 0; i < j; i++) {
  233. if (temp[i] == ' ') {
  234. newWord = 1;
  235. } else if (newWord && temp[i] >= 'a' && temp[i] <= 'z') {
  236. temp[i] = temp[i] - 'a' + 'A';
  237. newWord = 0;
  238. } else {
  239. newWord = 0;
  240. }
  241. }
  242.  
  243. strcpy(name, temp);
  244. }
  245.  
  246. struct Sinhvien nhapSinhVien(List L) {
  247. struct Sinhvien sv;
  248. printf("\n+-----------------------------------------+\n");
  249. printf("| NHAP THONG TIN SINH VIEN MOI |\n");
  250. printf("+-----------------------------------------+\n");
  251. while (1) {
  252. printf(">> Nhap MSV: ");
  253. scanf("%s", sv.id);
  254. if (LOCATE(sv.id, L) != END(L)) {
  255. printf("MSSV da ton tai, nhap lai\n");
  256. } else {
  257. break;
  258. }
  259. }
  260.  
  261.  
  262. int check;
  263.  
  264. do {
  265. check = 1;
  266. printf(">> Nhap ho ten: ");
  267. scanf(" %19[^\n]", sv.name);
  268.  
  269. for (int i = 0; i < strlen(sv.name); i++) {
  270. if (!((sv.name[i] >= 'a' && sv.name[i] <= 'z') || (sv.name[i] >= 'A' && sv.name[i] <= 'Z') || sv.name[i] == ' ')) {
  271. check = 0;
  272. break;
  273. }
  274. }
  275.  
  276. if (check == 0) {
  277. printf("Ho va ten khong chua so hoac ky tu dac biet (Nhap lai)\n");
  278. } else {
  279.  
  280. ChuanHoaTen(sv.name);
  281.  
  282. }
  283. } while (check == 0);
  284.  
  285. do {
  286. printf(">> Nhap ngay sinh (dd/mm/yyyy): ");
  287. scanf("%s", sv.ns);
  288.  
  289. int size = strlen(sv.ns);
  290. ChuanHoan(sv.ns, size);
  291.  
  292. char day[3], month[3], year[5];
  293. day[0] = sv.ns[0];
  294. day[1] = sv.ns[1];
  295. day[2] = '\0';
  296. month[0] = sv.ns[3];
  297. month[1] = sv.ns[4];
  298. month[2] = '\0';
  299. for (int i = 6, j = 0; i <= size; i++, j++) {
  300. year[j] = sv.ns[i];
  301. year[j+1] = '\0';
  302. }
  303.  
  304. int d = atoi(day);
  305. int m = atoi(month);
  306. int y = atoi(year);
  307. int maxday = soNgayTrongThang(m,y);
  308. if (d <= 0 || d > maxday || m <= 0 || m > 12 || y <= 100) {
  309. printf("Ngay sinh khong hop le vui long nhap lai!\n");
  310. } else {
  311. int namNow = 2025;
  312. do {
  313. printf(">> Nhap tuoi: ");
  314. scanf("%d", &sv.tuoi);
  315. if (sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2) {
  316. printf("Vui long nhap lai tuoi dung voi tuoi that cua ban\n");
  317. }
  318. } while (sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2);
  319. break;
  320. }
  321. } while (1);
  322.  
  323.  
  324. return sv;
  325. }
  326.  
  327. void PRINT_LIST(List L) {
  328. if (L.Last == 0) {
  329. printf("Danh sach rong!\n");
  330. return;
  331. }
  332.  
  333. printf("\n+-----+--------------+---------------------------+--------------+-------+\n");
  334. printf("| STT | MSSV | Ho Ten | Ngay Sinh | Tuoi |\n");
  335. printf("+-----+--------------+---------------------------+--------------+-------+\n");
  336.  
  337. for (int i = 0; i < L.Last; i++) {
  338. printf("| %-3d | %-12s | %-25s | %-12s | %-5d |\n",
  339. i+1, L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  340. }
  341.  
  342. printf("+-----+--------------+---------------------------+--------------+-------+\n");
  343. }
  344.  
  345. void SORT_BY_NAME(List *L) {
  346. for (int i = 0; i < L->Last - 1; i++) {
  347. for (int j = i + 1; j < L->Last; j++) {
  348. if (strcmp(L->A[i].name, L->A[j].name) > 0) {
  349. struct Sinhvien tmp = L->A[i];
  350. L->A[i] = L->A[j];
  351. L->A[j] = tmp;
  352. }
  353. }
  354. }
  355. printf("Da sap xep theo ten\n");
  356. }
  357.  
  358. void SORT_BY_TUOI(List *L) {
  359. for (int i = 0; i < L->Last - 1; i++) {
  360. for (int j = i + 1; j < L->Last; j++) {
  361. if (L->A[i].tuoi > L->A[j].tuoi) {
  362. struct Sinhvien tmp = L->A[i];
  363. L->A[i] = L->A[j];
  364. L->A[j] = tmp;
  365. }
  366. }
  367. }
  368. printf("Da sap xep theo tuoi\n");
  369. }
  370.  
  371. void SEARCH_BY_NAME(List L) {
  372. char name[20];
  373. printf("\n+==========================================================================+\n");
  374. printf("| TIM KIEM SINH VIEN THEO HO TEN |\n");
  375. printf("+==========================================================================+\n");
  376. printf(">> Nhap ten can tim: \n");
  377. scanf(" %[^\n]", name);
  378. int found = 0;
  379.  
  380. for (int i = 0; i < L.Last; i++) {
  381. if (strstr(L.A[i].name, name) != NULL) {
  382. found = 1;
  383. struct Sinhvien sv = L.A[i];
  384.  
  385. printf(" Da tim thay sinh vien trong danh sach \n");
  386. printf("+==========================================================================+\n");
  387. printf("| Thong tin sinh vien: |\n");
  388. printf("| MSSV : %-59s|\n", sv.id);
  389. printf("| Ho ten : %-59s|\n", sv.name);
  390. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  391. printf("+==========================================================================+\n");
  392. }
  393. }
  394.  
  395. if (!found) {
  396. printf(" Khong tim thay sinh vien nao co ten chua tu khoa tren \n");
  397. }
  398. }
  399.  
  400.  
  401. // ================== MAIN ==================
  402. int main() {
  403. char *names[] = {
  404. "NGUYEN DUC QUANG",
  405. "TRAN MINH QUANG",
  406. "LUONG VIET NHAT",
  407. "HOANG GIA THE",
  408. "NGUYEN TIEN DUNG"
  409. };
  410.  
  411. char *ids[] = {
  412. "2411061767",
  413. "2411062029",
  414. "2411061614",
  415. "2411061927",
  416. "2411061649"
  417. };
  418.  
  419. int n = 5; // so thanh vien
  420.  
  421. printf("+==================================================================================+\n");
  422. printf("| BAI TAP LON BAI 7 - QUAN LI SINH VIEN | \n");
  423. printf("| | \n");
  424. printf("| LOP: DH14C4 | \n");
  425. printf("+==================================================================================+\n");
  426. printf("| %-30s | %-20s | |\n", "THANH VIEN NHOM", "MA SINH VIEN");
  427. printf("+----------------------------------------------------------------------------------+\n");
  428.  
  429. for (int i = 0; i < n; i++) {
  430. printf("| %-30s | :%-19s | | \n", names[i], ids[i]);
  431. printf("+----------------------------------------------------------------------------------+\n");
  432. }
  433.  
  434. List L;
  435. MAKENULL_LIST(&L);
  436.  
  437.  
  438.  
  439. int choice;
  440. while (1) {
  441. printf("\n+=================================================================+\n");
  442. printf("| HE THONG QUAN LY SINH VIEN |\n");
  443. printf("+=================================================================+\n");
  444. printf("| [1] Them sinh vien vao danh sach (INSERT_LIST) |\n");
  445. printf("| [2] Xoa sinh vien theo MSV (DELETE_BY_ID) |\n");
  446. printf("| [3] Nhap diem cho cac sinh vien |\n");
  447. printf("| [4] Tim kiem sinh vien theo MSV (LOCATE) |\n");
  448. printf("| [5] Tim kiem sinh vien theo ten (SEARCH_BY_NAME) |\n");
  449. printf("| [6] Sap xep danh sach theo ten (abc) |\n");
  450. printf("| [7] In danh sach sinh vien |\n");
  451. printf("| [8] Them mon hoc moi vao danh sach |\n");
  452.  
  453. printf("| [0] Thoat chuong trinh |\n");
  454. printf("+=================================================================+\n");
  455. printf(">> Nhap lua chon cua ban: ");
  456. scanf("%d", &choice);
  457.  
  458. if (choice == 0) {
  459. printf("Da thoat\n");
  460. break;
  461. }
  462. switch (choice) {
  463. case 1: {
  464. struct Sinhvien sv = nhapSinhVien(L);
  465. Position p;
  466. printf("Nhap Vi Tri Sinh Vien Muon Them Chen Vao Dau 1 Cuoi 2: ");
  467. scanf("%d", &p);
  468. if(p == 1 ){
  469. INSERT_LIST(sv, 1, &L);
  470. printf("Them sinh vien vao thanh cong. \n");
  471. }
  472. else if(p == 2){
  473. INSERT_LIST(sv, END(L), &L);
  474. printf("Them sinh vien vao thanh cong. \n");
  475. }
  476. else{
  477. printf("Lua chon khong hop le \n");
  478. }
  479. break;
  480. }
  481. case 2: {
  482. char id[20];
  483. printf("\n+-----------------------------------------+\n");
  484. printf("| XOA SINH VIEN THEO MA SINH VIEN |\n");
  485. printf("+-----------------------------------------+\n");
  486. printf(">> Nhap MSV can xoa: ");
  487. scanf("%s", id);
  488. DELETE_BY_ID(id, &L);
  489. break;
  490. }
  491. case 3: {
  492. char id[20];
  493. printf("\n+---------------------------------------------+\n");
  494. printf("| NHAP DIEM CHO CAC SINH VIEN |\n");
  495. printf("+---------------------------------------------+\n");
  496. // CHÚ Ý DUNG FOR LONG QUA CAC SINH VIEN VA DIEM NHA CAC BRO
  497. break;
  498. }
  499. case 4: {
  500.  
  501. char id[20];
  502. printf("\n+-----------------------------------------+\n");
  503. printf("| TIM KIEM SINH VIEN THEO MSV |\n");
  504. printf("+-----------------------------------------+\n");
  505. printf(">> Nhap MSV: ");
  506. scanf("%s", id);
  507. Position p = LOCATE(id, L);
  508. if (p == 0 || p == END(L)) {
  509. printf(" Khong tim thay sinh vien co MSV: \n", id);
  510.  
  511. } else {
  512. struct Sinhvien sv = RETRIEVE(p, L);
  513. printf(" Da tim thay sinh vien trong danh sach \n");
  514. printf("+==========================================================================+\n");
  515. printf("| Thong tin sinh vien: |\n");
  516. printf("| MSSV : %-59s|\n", sv.id);
  517. printf("| Ho ten : %-59s|\n", sv.name);
  518. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  519. printf("+==========================================================================+\n");
  520. }
  521. break;
  522. }
  523. case 5:
  524. SEARCH_BY_NAME(L);
  525. break;
  526.  
  527. case 6:
  528. SORT_BY_NAME(&L);
  529. break;
  530. case 7:
  531. PRINT_LIST(L);
  532. break;
  533. case 8:{
  534. char mon[50];
  535. printf("Nhap mon hoc can them\n");
  536. scanf("%s",mon);
  537.  
  538. break;
  539. }
  540.  
  541. break;
  542. case 9:
  543.  
  544. default:
  545. printf("Lua chon khong hop le\n");
  546. }
  547. }
  548. return 0;
  549. }
Success #stdin #stdout 0s 5320KB
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 danh sach (INSERT_LIST)              	  |
| [2] Xoa sinh vien theo MSV (DELETE_BY_ID)                       |
| [3] Nhap diem cho cac sinh vien                                 |
| [4] Tim kiem sinh vien theo MSV (LOCATE)                        |
| [5] Tim kiem sinh vien theo ten (SEARCH_BY_NAME)                |
| [6] Sap xep danh sach theo ten (abc)                            |
| [7] In danh sach sinh vien                                      |
| [8] Them mon hoc moi vao danh sach                              |
| [0] Thoat chuong trinh                                          |
+=================================================================+
>> Nhap lua chon cua ban: Da thoat