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