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 ten[50];
  373. int found = 0;
  374. printf(">> Nhap ten can tim: ");
  375. scanf(" %[^\n]", ten);
  376. for (int i = 0; i < L.Last; i++) {
  377. if (strcmp(L.A[i].name, ten) == 0) {
  378. printf("MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  379. L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  380. found = 1;
  381. }
  382. }
  383. if (!found) printf("Khong tim thay sinh vien\n");
  384. }
  385.  
  386. // ================== MAIN ==================
  387. int main() {
  388. char *names[] = {
  389. "NGUYEN DUC QUANG",
  390. "TRAN MINH QUANG",
  391. "LUONG VIET NHAT",
  392. "HOANG GIA THE",
  393. "NGUYEN TIEN DUNG"
  394. };
  395.  
  396. char *ids[] = {
  397. "2411061767",
  398. "2411062029",
  399. "2411061614",
  400. "2411061927",
  401. "2411061649"
  402. };
  403.  
  404. int n = 5; // so thanh vien
  405.  
  406. printf("+==================================================================================+\n");
  407. printf("| BAI TAP LON BAI 7 - QUAN LI SINH VIEN | \n");
  408. printf("| | \n");
  409. printf("| LOP: DH14C4 | \n");
  410. printf("+==================================================================================+\n");
  411. printf("| %-30s | %-20s | |\n", "THANH VIEN NHOM", "MA SINH VIEN");
  412. printf("+----------------------------------------------------------------------------------+\n");
  413.  
  414. for (int i = 0; i < n; i++) {
  415. printf("| %-30s | :%-19s | | \n", names[i], ids[i]);
  416. printf("+----------------------------------------------------------------------------------+\n");
  417. }
  418.  
  419. List L;
  420. MAKENULL_LIST(&L);
  421.  
  422.  
  423.  
  424. int choice;
  425. while (1) {
  426. printf("\n+=================================================================+\n");
  427. printf("| HE THONG QUAN LY SINH VIEN |\n");
  428. printf("+=================================================================+\n");
  429. printf("| [1] Them sinh vien vao danh sach (INSERT_LIST) |\n");
  430. printf("| [2] Xoa sinh vien theo MSV (DELETE_BY_ID) |\n");
  431. printf("| [3] Nhap diem cho cac sinh vien |\n");
  432. printf("| [4] Tim kiem 1 sv tin theo MSV (LOCATE) |\n");
  433. printf("| [5] Tim kiem 1 sv theo ten |\n");
  434. printf("| [6] Sap xep danh sach theo ten (abc) |\n");
  435. printf("| [7] In danh sach sinh vien |\n");
  436. printf("| [8] Them mon hoc moi vao danh sach |\n");
  437.  
  438. printf("| [0] Thoat chuong trinh |\n");
  439. printf("+=================================================================+\n");
  440. printf(">> Nhap lua chon cua ban: ");
  441. scanf("%d", &choice);
  442.  
  443. if (choice == 0) {
  444. printf("Da thoat\n");
  445. break;
  446. }
  447. switch (choice) {
  448. case 1: {
  449. struct Sinhvien sv = nhapSinhVien(L);
  450. Position p;
  451. printf("Nhap Vi Tri Sinh Vien Muon Them Chen Vao Dau 1 Cuoi 2: ");
  452. scanf("%d", &p);
  453. if(p == 1 ){
  454. INSERT_LIST(sv, 1, &L);
  455. printf("Them sinh vien vao thanh cong. \n");
  456. }
  457. else if(p == 2){
  458. INSERT_LIST(sv, END(L), &L);
  459. printf("Them sinh vien vao thanh cong. \n");
  460. }
  461. else{
  462. printf("Lua chon khong hop le \n");
  463. }
  464. break;
  465. }
  466. case 2: {
  467. char id[20];
  468. printf("\n+-----------------------------------------+\n");
  469. printf("| XOA SINH VIEN THEO MA SINH VIEN |\n");
  470. printf("+-----------------------------------------+\n");
  471. printf(">> Nhap MSV can xoa: ");
  472. scanf("%s", id);
  473. DELETE_BY_ID(id, &L);
  474. break;
  475. }
  476. case 3: {
  477. char id[20];
  478. printf("\n+---------------------------------------------+\n");
  479. printf("| NHAP DIEM CHO CAC SINH VIEN |\n");
  480. printf("+---------------------------------------------+\n");
  481. // CHÚ Ý DUNG FOR LONG QUA CAC SINH VIEN VA DIEM NHA CAC BRO
  482. break;
  483. }
  484. case 4: {
  485.  
  486. char id[20];
  487. printf("\n+-----------------------------------------+\n");
  488. printf("| TIM KIEM SINH VIEN THEO MSV |\n");
  489. printf("+-----------------------------------------+\n");
  490. printf(">> Nhap MSV: ");
  491. scanf("%s", id);
  492. Position p = LOCATE(id, L);
  493. if (p < FIRST(L) || p >= END(L)) {
  494. printf("Vi tri khong hop le\n");
  495. } else {
  496. struct Sinhvien sv = RETRIEVE(p, L);
  497. printf("Thong tin SV co %d: MSSV: %s | Ho ten: %s | Ngay sinh: %s | Tuoi: %d\n",
  498. p, sv.id, sv.name, sv.ns, sv.tuoi);
  499. }
  500. break;
  501. }
  502. case 5:
  503. SEARCH_BY_NAME(L);
  504. break;
  505.  
  506. case 6:
  507. SORT_BY_NAME(&L);
  508. break;
  509. case 7:
  510. PRINT_LIST(L);
  511. break;
  512. case 8:{
  513. char mon[50];
  514. printf("Nhap mon hoc can them\n");
  515. scanf("%s",mon);
  516.  
  517. break;
  518. }
  519.  
  520. break;
  521. case 9:
  522.  
  523. default:
  524. printf("Lua chon khong hop le\n");
  525. }
  526. }
  527. return 0;
  528. }
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 1 sv tin theo MSV (LOCATE)                         |
| [5] Tim kiem 1 sv theo ten                                      |
| [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