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. #include <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #ifdef _WIN32
  22. #define CLEAR "cls"
  23. #else
  24. #define CLEAR "clear"
  25. #endif
  26. #define MAX 100
  27.  
  28. typedef int Position;
  29.  
  30. // Cau truc mon hoc
  31. typedef struct {
  32. char tenMon[50];
  33.  
  34. } MonHoc;
  35.  
  36. // Cau truc sinh vien
  37. struct Sinhvien {
  38. char id[20];
  39. char name[50];
  40. char ns[20];
  41. int tuoi;
  42. float diem[MAX];
  43. int soMon;
  44. float gpa; // Thêm
  45. char hocLuc[20]; // Thêm
  46. };
  47.  
  48. // Kieu danh sach mang
  49. typedef struct {
  50. struct Sinhvien A[MAX];
  51. int Last;
  52. } List;
  53.  
  54. typedef struct {
  55. MonHoc A[MAX];
  56. int count;
  57. } MonHocList;
  58.  
  59. // =============================== Cac thao tac co ban ===============================
  60.  
  61. Position FIRST(List L) {
  62. return 1;
  63. }
  64.  
  65. Position END(List L) {
  66. return L.Last + 1;
  67. }
  68.  
  69. Position NEXT(Position P, List L) {
  70. if (P < END(L)) return P + 1;
  71. return END(L);
  72. }
  73.  
  74. Position PREVIOUS(Position P, List L) {
  75. if (P > FIRST(L)) return P - 1;
  76. return FIRST(L);
  77. }
  78.  
  79. struct Sinhvien RETRIEVE(Position P, List L) {
  80. return L.A[P-1];
  81. }
  82.  
  83. Position LOCATE(char id[], List L) {
  84. for (int i = 0; i < L.Last; i++) {
  85. if (strcmp(L.A[i].id, id) == 0)
  86. return i+1;
  87. }
  88. return END(L);
  89. }
  90.  
  91. void MAKENULL_LIST(List *L) {
  92. L->Last = 0;
  93. }
  94.  
  95. int EMPTY_LIST(List L){
  96. return L.Last == 0;
  97. }
  98.  
  99. void INSERT_LIST(struct Sinhvien x, Position P, List *L) {
  100. if (L->Last >= MAX) {
  101. printf("Danh sach day\n");
  102. return;
  103. }
  104. if (P < FIRST(*L) || P > END(*L)) {
  105. printf("Vi tri khong hop le\n");
  106. return;
  107. }
  108. for (int i = L->Last; i >= P; i--) {
  109. L->A[i] = L->A[i-1];
  110. }
  111.  
  112. L->A[P-1] = x;
  113. L->Last++;
  114. }
  115.  
  116. void DELETE_LIST(Position P, List *L) {
  117. if (P < FIRST(*L) || P >= END(*L)) {
  118. printf("Vi tri khong hop le\n");
  119. return;
  120. }
  121. for (int i = P-1; i < L->Last-1; i++) {
  122. L->A[i] = L->A[i+1];
  123. }
  124. L->Last--;
  125. }
  126.  
  127.  
  128.  
  129. // Xoa sinh vien theo MSV
  130. void DELETE_BY_ID(char id[], List *L) {
  131. printf("\n+==========================================================================+\n");
  132. printf("| XOA SINH VIEN THEO MSV |\n");
  133. printf("+==========================================================================+\n");
  134.  
  135. Position p = LOCATE(id, *L);
  136.  
  137. if (p == END(*L)) {
  138. printf("| Khong tim thay sinh vien co MSV: %-36s|\n", id);
  139. printf("+==========================================================================+\n");
  140. return;
  141. }
  142.  
  143. struct Sinhvien sv = L->A[p - 1];
  144.  
  145. char confirm;
  146. printf("| Tim thay sinh vien: |\n");
  147. printf("| MSSV : %-59s|\n", sv.id);
  148. printf("| Ho ten : %-59s|\n", sv.name);
  149. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  150. printf("+--------------------------------------------------------------------------+\n");
  151. printf(" Ban co chac chan muon xoa sinh vien nay khong? (y/n): ");
  152. scanf(" %c", &confirm);
  153. printf("+==========================================================================+\n");
  154.  
  155. if (confirm != 'y' && confirm != 'Y') {
  156. printf("| Da huy thao tac xoa sinh vien. |\n");
  157. printf("+==========================================================================+\n");
  158. return;
  159. }
  160.  
  161. for (int i = p - 1; i < L->Last - 1; i++) {
  162. L->A[i] = L->A[i + 1];
  163. }
  164. L->Last--;
  165.  
  166. printf("| Da xoa sinh vien thanh cong |\n");
  167. printf("+--------------------------------------------------------------------------+\n");
  168. printf("| Thong tin sinh vien da xoa: |\n");
  169. printf("| MSSV : %-59s|\n", sv.id);
  170. printf("| Ho ten : %-59s|\n", sv.name);
  171. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  172. printf("+==========================================================================+\n");
  173. }
  174.  
  175.  
  176.  
  177. // ================== Cac chuc nang mo rong ==================
  178.  
  179. void ChuanHoan(char s[], int size) {
  180. for (int i = 0; i < size; i++) {
  181. if (s[i] == '/') {
  182. if (i == 1) {
  183. for (int j = size; j >= 0; j--) {
  184. s[j+1] = s[j];
  185. }
  186. s[0] = '0';
  187. size++;
  188. }
  189. if (s[i+2] == '/' && i+2 < size) {
  190. for (int k = size; k >= i+1; k--) {
  191. s[k+1] = s[k];
  192. }
  193. s[i+1] = '0';
  194. size++;
  195. }
  196. }
  197. }
  198. }
  199.  
  200. int laNamNhuan(int y) {
  201. return ( (y % 400 == 0) || (y % 4 == 0 && y % 100 != 0) );
  202. }
  203.  
  204. int soNgayTrongThang(int m, int y) {
  205. if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
  206. return 31;
  207. if (m == 4 || m == 6 || m == 9 || m == 11)
  208. return 30;
  209. if (m == 2)
  210. return laNamNhuan(y) ? 29 : 28;
  211. return 0;
  212. }
  213.  
  214. void ChuanHoaTen(char *name) {
  215. char temp[100];
  216. int i = 0, j = 0;
  217. int len = strlen(name);
  218.  
  219. while (i < len && name[i] == ' ') i++;
  220. int space = 0;
  221. while (i < len) {
  222. if (name[i] != ' ') {
  223. if (space && j > 0) {
  224. temp[j++] = ' ';
  225. space = 0;
  226. }
  227. temp[j++] = name[i];
  228. } else {
  229. space = 1;
  230. }
  231. i++;
  232. }
  233.  
  234. if (j > 0 && temp[j-1] == ' ') j--;
  235. temp[j] = '\0';
  236.  
  237. for (i = 0; i < j; i++) {
  238. if (temp[i] >= 'A' && temp[i] <= 'Z')
  239. temp[i] = temp[i] - 'A' + 'a';
  240. }
  241.  
  242. int newWord = 1;
  243. for (i = 0; i < j; i++) {
  244. if (temp[i] == ' ') {
  245. newWord = 1;
  246. } else if (newWord && temp[i] >= 'a' && temp[i] <= 'z') {
  247. temp[i] = temp[i] - 'a' + 'A';
  248. newWord = 0;
  249. } else {
  250. newWord = 0;
  251. }
  252. }
  253.  
  254. strcpy(name, temp);
  255. }
  256.  
  257. struct Sinhvien nhapSinhVien(List L) {
  258. struct Sinhvien sv;
  259. printf("\n+-----------------------------------------+\n");
  260. printf("| NHAP THONG TIN SINH VIEN MOI |\n");
  261. printf("+-----------------------------------------+\n");
  262. while (1) {
  263. printf(">> Nhap MSV: ");
  264. scanf("%s", sv.id);
  265. if (LOCATE(sv.id, L) != END(L)) {
  266. printf("MSSV da ton tai, nhap lai\n");
  267. } else {
  268. break;
  269. }
  270. }
  271.  
  272.  
  273. int check;
  274.  
  275. do {
  276. check = 1;
  277. printf(">> Nhap ho ten: ");
  278. scanf(" %19[^\n]", sv.name);
  279.  
  280. for (int i = 0; i < strlen(sv.name); i++) {
  281. if (!((sv.name[i] >= 'a' && sv.name[i] <= 'z') || (sv.name[i] >= 'A' && sv.name[i] <= 'Z') || sv.name[i] == ' ')) {
  282. check = 0;
  283. break;
  284. }
  285. }
  286.  
  287. if (check == 0) {
  288. printf("Ho va ten khong chua so hoac ky tu dac biet : \n");
  289. } else {
  290.  
  291. ChuanHoaTen(sv.name);
  292.  
  293. }
  294. } while (check == 0);
  295.  
  296. do {
  297. printf(">> Nhap ngay sinh (dd/mm/yyyy): ");
  298. scanf("%s", sv.ns);
  299.  
  300. int size = strlen(sv.ns);
  301. ChuanHoan(sv.ns, size);
  302.  
  303. char day[3], month[3], year[5];
  304. day[0] = sv.ns[0];
  305. day[1] = sv.ns[1];
  306. day[2] = '\0';
  307. month[0] = sv.ns[3];
  308. month[1] = sv.ns[4];
  309. month[2] = '\0';
  310.  
  311. int index = 6;
  312. for (int i = 0; i < 1; i++) {
  313. for (int j = 0; j < 4; j++) {
  314. year[j] = sv.ns[index + j];
  315. }
  316. }
  317. year[4] = '\0';
  318.  
  319.  
  320. int d = atoi(day);
  321. int m = atoi(month);
  322. int y = atoi(year);
  323.  
  324.  
  325. int maxday = soNgayTrongThang(m,y);
  326. if (d <= 0 || d > maxday || m <= 0 || m > 12 || y <= 100) {
  327. printf("Ngay sinh khong hop le vui long nhap lai!\n");
  328. } else {
  329. int namNow = 2025;
  330. do {
  331. printf(">> Nhap tuoi: ");
  332. scanf("%d", &sv.tuoi);
  333. if (sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2) {
  334. printf("Vui long nhap lai tuoi dung voi tuoi that cua ban\n");
  335. }
  336. } while (sv.tuoi < namNow - y - 2 || sv.tuoi > namNow - y + 2);
  337. break;
  338. }
  339. } while (1);
  340.  
  341. sv.soMon = 0;
  342. sv.gpa = 0.0;
  343. strcpy(sv.hocLuc, "Chua xep loai");
  344.  
  345. return sv;
  346. }
  347.  
  348. void PRINT_LIST(List L) {
  349. if (L.Last == 0) {
  350. printf("Danh sach rong!\n");
  351. return;
  352. }
  353.  
  354. printf("\n+-----+--------------+---------------------------+--------------+-------+\n");
  355. printf("| STT | MSSV | Ho Ten | Ngay Sinh | Tuoi |\n");
  356. printf("+-----+--------------+---------------------------+--------------+-------+\n");
  357.  
  358. for (int i = 0; i < L.Last; i++) {
  359. printf("| %-3d | %-12s | %-25s | %-12s | %-5d |\n",
  360. i+1, L.A[i].id, L.A[i].name, L.A[i].ns, L.A[i].tuoi);
  361. }
  362.  
  363. printf("+-----+--------------+---------------------------+--------------+-------+\n");
  364. }
  365.  
  366. void SORT_BY_NAME(List *L) {
  367. for (int i = 0; i < L->Last - 1; i++) {
  368. for (int j = i + 1; j < L->Last; j++) {
  369. if (strcmp(L->A[i].name, L->A[j].name) > 0) {
  370. struct Sinhvien tmp = L->A[i];
  371. L->A[i] = L->A[j];
  372. L->A[j] = tmp;
  373. }
  374. }
  375. }
  376. printf("Da sap xep theo ten\n");
  377. }
  378.  
  379. void SORT_BY_TUOI(List *L) {
  380. for (int i = 0; i < L->Last - 1; i++) {
  381. for (int j = i + 1; j < L->Last; j++) {
  382. if (L->A[i].tuoi > L->A[j].tuoi) {
  383. struct Sinhvien tmp = L->A[i];
  384. L->A[i] = L->A[j];
  385. L->A[j] = tmp;
  386. }
  387. }
  388. }
  389. printf("Da sap xep theo tuoi\n");
  390. }
  391.  
  392. void themMonHoc(MonHocList *dsMon) {
  393. if (dsMon->count >= MAX) {
  394. printf("Danh sach mon hoc da day!\n");
  395. return;
  396. }
  397.  
  398. MonHoc mh;
  399. printf(">> Nhap ten mon hoc: ");
  400. scanf(" %[^\n]", mh.tenMon);
  401. for (int i = 0; i < dsMon->count; i++) {
  402. if (strcmp(dsMon->A[i].tenMon, mh.tenMon) == 0) {
  403. printf("Mon hoc da ton tai!\n");
  404. return;
  405. }
  406. }
  407.  
  408. dsMon->A[dsMon->count++] = mh;
  409. printf("Da them mon hoc thanh cong!\n");
  410. }
  411.  
  412. float diemHe10SangHe4(float diem10) {
  413. if (diem10 >= 9.0) return 4.0;
  414. if (diem10 >= 8.5) return 3.7;
  415. if (diem10 >= 8.0) return 3.5;
  416. if (diem10 >= 7.0) return 3.0;
  417. if (diem10 >= 6.5) return 2.5;
  418. if (diem10 >= 5.5) return 2.0;
  419. if (diem10 >= 5.0) return 1.5;
  420. if (diem10 >= 4.0) return 1.0;
  421. return 0.0;
  422. }
  423.  
  424. float tinhDiemTB10(struct Sinhvien sv) {
  425. if (sv.soMon == 0) return 0.0;
  426. float tongDiem = 0;
  427. for (int i = 0; i < sv.soMon; i++) {
  428. tongDiem += sv.diem[i];
  429. }
  430. return tongDiem / sv.soMon;
  431. }
  432.  
  433. float tinhGPA(struct Sinhvien sv) {
  434. if (sv.soMon == 0) return 0.0;
  435. float tongDiemHe4 = 0;
  436. for (int i = 0; i < sv.soMon; i++) {
  437. tongDiemHe4 += diemHe10SangHe4(sv.diem[i]);
  438. }
  439. return tongDiemHe4 / sv.soMon;
  440. }
  441.  
  442. void xepLoaiHocLuc(float gpa, char *hocLuc) {
  443. if (gpa >= 3.6) {
  444. strcpy(hocLuc, "Xuat sac");
  445. } else if (gpa >= 3.2) {
  446. strcpy(hocLuc, "Gioi");
  447. } else if (gpa >= 2.5) {
  448. strcpy(hocLuc, "Kha");
  449. } else if (gpa >= 2.0) {
  450. strcpy(hocLuc, "Trung Binh");
  451. } else {
  452. strcpy(hocLuc, "Yeu");
  453. }
  454. }
  455.  
  456. void nhapDiemChoSinhVien(List *L, MonHocList dsMon) {
  457. if (EMPTY_LIST(*L)) {
  458. printf("Danh sach sinh vien rong!\n");
  459. return;
  460. }
  461.  
  462. if (dsMon.count == 0) {
  463. printf("Chua co mon hoc nao trong he thong!\n");
  464. return;
  465. }
  466.  
  467. for (int i = 0; i < L->Last; i++) {
  468. struct Sinhvien *sv = &L->A[i];
  469. printf("\nNhap diem cho sinh vien: %s - %s\n", sv->id, sv->name);
  470. sv->soMon = dsMon.count;
  471.  
  472. for (int j = 0; j < dsMon.count; j++) {
  473. float diem;
  474. do {
  475. printf(">> Diem mon %-25s: ", dsMon.A[j].tenMon);
  476. scanf("%f", &diem);
  477. if (diem < 0 || diem > 10) {
  478. printf("Diem khong hop le! Nhap lai (0-10)\n");
  479. }
  480. } while (diem < 0 || diem > 10);
  481. sv->diem[j] = diem;
  482. }
  483.  
  484. sv->gpa = tinhGPA(*sv);
  485. xepLoaiHocLuc(sv->gpa, sv->hocLuc);
  486. }
  487.  
  488. printf("\nNhap diem thanh cong cho tat ca sinh vien!\n");
  489. }
  490.  
  491.  
  492. void hienThiKetQuaHocTap(List L, MonHocList dsMon) {
  493. if (L.Last == 0) {
  494. printf("Danh sach rong!\n");
  495. return;
  496. }
  497.  
  498. if (dsMon.count == 0) {
  499. printf("Chua co mon hoc nao de tinh diem!\n");
  500. PRINT_LIST(L);
  501. return;
  502. }
  503.  
  504. printf("\n+-----+--------------+---------------------------+------------+------------+----------------+\n");
  505. printf("| STT | MSSV | Ho Ten | Diem TB 10 | Diem TB 4 | Xep Loai |\n");
  506. printf("+-----+--------------+---------------------------+------------+------------+----------------+\n");
  507.  
  508. for (int i = 0; i < L.Last; i++) {
  509. struct Sinhvien sv = L.A[i];
  510. float diem10 = tinhDiemTB10(sv);
  511.  
  512. printf("| %-3d | %-12s | %-25s | %-10.2f | %-10.2f | %-14s |\n",
  513. i + 1, sv.id, sv.name, diem10, sv.gpa, sv.hocLuc);
  514. }
  515.  
  516. printf("+-----+--------------+---------------------------+------------+------------+----------------+\n");
  517. }
  518.  
  519. void SORT_BY_HOCLUC(List *L) {
  520. if (L->Last == 0 || L->A[0].soMon == 0) {
  521. printf("Chua co sinh vien hoac chua nhap diem de xep loai!\n");
  522. return;
  523. }
  524.  
  525. for (int i = 0; i < L->Last - 1; i++) {
  526. for (int j = i + 1; j < L->Last; j++) {
  527. if (L->A[i].gpa < L->A[j].gpa) {
  528. struct Sinhvien tmp = L->A[i];
  529. L->A[i] = L->A[j];
  530. L->A[j] = tmp;
  531. }
  532. else if (L->A[i].gpa == L->A[j].gpa) {
  533. if (tinhDiemTB10(L->A[i]) < tinhDiemTB10(L->A[j])) {
  534. struct Sinhvien tmp = L->A[i];
  535. L->A[i] = L->A[j];
  536. L->A[j] = tmp;
  537. }
  538. }
  539. }
  540. }
  541. printf("Da sap xep danh sach sinh vien theo Hoc luc (GPA) giam dan.\n");
  542. }
  543.  
  544.  
  545. // ================== MAIN ==================
  546. int main() {
  547.  
  548. List L;
  549. MAKENULL_LIST(&L);
  550.  
  551. MonHocList dsMon;
  552. dsMon.count = 0;
  553.  
  554.  
  555.  
  556. int choice;
  557.  
  558. printf("\n+=================================================================+\n");
  559. printf("| HE THONG QUAN LY SINH VIEN |\n");
  560. printf("+=================================================================+\n");
  561. printf("| [1] Them sinh vien vao danh sach |\n");
  562. printf("| [2] Xoa sinh vien theo MSV |\n");
  563. printf("| [3] Nhap diem cho cac sinh vien |\n");
  564. printf("| [4] Tim kiem sinh vien theo MSV |\n");
  565. printf("| [5] Sap xep danh sach theo ten |\n");
  566. printf("| [6] In danh sach sinh vien |\n");
  567. printf("| [7] Them mon hoc moi vao danh sach |\n");
  568. printf("| [8] Xem ket qua hoc tap (Diem TB 10, GPA, Xep loai) |\n");
  569. printf("| [9] Sap xep danh sach theo hoc luc (GPA) |\n");
  570. printf("| [10] Clear man hinh (giu nguyen du lieu) |\n");
  571. printf("| [11] Chinh sua diem sinh vien theo MSV |\n");
  572. printf("| [0] Thoat chuong trinh |\n");
  573. printf("+=================================================================+\n");
  574. while (1) {
  575.  
  576. printf("\n>> Nhap lua chon cua ban: ");
  577. scanf("%d", &choice);
  578.  
  579. if (choice == 0) {
  580. printf("Da thoat\n");
  581. break;
  582. }
  583. switch (choice) {
  584. case 1: {
  585. struct Sinhvien sv = nhapSinhVien(L);
  586. Position p;
  587. printf("Nhap Vi Tri Sinh Vien Muon Them Chen Vao (Dau: 1, Cuoi: 2): ");
  588. scanf("%d", &p);
  589. if(p == 1 ){
  590. INSERT_LIST(sv, 1, &L);
  591. printf("Them sinh vien vao thanh cong. \n");
  592. }
  593. else if(p == 2){
  594. INSERT_LIST(sv, END(L), &L);
  595. printf("Them sinh vien vao thanh cong. \n");
  596. }
  597. else{
  598. printf("Lua chon khong hop le \n");
  599. }
  600. break;
  601. }
  602. case 2: {
  603. char id[20];
  604. printf("\n+-----------------------------------------+\n");
  605. printf("| XOA SINH VIEN THEO MA SINH VIEN |\n");
  606. printf("+-----------------------------------------+\n");
  607. printf(">> Nhap MSV can xoa: ");
  608. scanf("%s", id);
  609. DELETE_BY_ID(id, &L);
  610. break;
  611. }
  612. case 3: {
  613. printf("\n+---------------------------------------------+\n");
  614. printf("| NHAP DIEM CHO CAC SINH VIEN |\n");
  615. printf("+---------------------------------------------+\n");
  616. nhapDiemChoSinhVien(&L, dsMon);
  617. break;
  618. }
  619. case 4: {
  620.  
  621. char id[20];
  622. printf("\n+-----------------------------------------+\n");
  623. printf("| TIM KIEM SINH VIEN THEO MSV |\n");
  624. printf("+-----------------------------------------+\n");
  625. printf(">> Nhap MSV: ");
  626. scanf("%s", id);
  627. Position p = LOCATE(id, L);
  628. if (p == END(L)) {
  629. printf(" Khong tim thay sinh vien co MSV: %s\n", id);
  630.  
  631. } else {
  632. struct Sinhvien sv = RETRIEVE(p, L);
  633. printf(" Da tim thay sinh vien trong danh sach \n");
  634. printf("+==========================================================================+\n");
  635. printf("| Thong tin sinh vien: |\n");
  636. printf("| MSSV : %-59s|\n", sv.id);
  637. printf("| Ho ten : %-59s|\n", sv.name);
  638. printf("| Ngay sinh : %-27sTuoi : %-11d |\n", sv.ns, sv.tuoi);
  639. printf("+==========================================================================+\n");
  640. }
  641. break;
  642. }
  643. case 5:
  644.  
  645. SORT_BY_NAME(&L);
  646. PRINT_LIST(L);
  647. break;
  648. case 6:
  649. PRINT_LIST(L);
  650. break;
  651. case 7:
  652. printf("\n+-----------------------------------------+\n");
  653. printf("| THEM MON HOC MOI |\n");
  654. printf("+-----------------------------------------+\n");
  655. themMonHoc(&dsMon);
  656. break;
  657. case 8: {
  658. printf("\n+---------------------------------------------+\n");
  659. printf("| KET QUA HOC TAP CUA SINH VIEN |\n");
  660. printf("+---------------------------------------------+\n");
  661. hienThiKetQuaHocTap(L, dsMon);
  662. break;
  663. }
  664. case 9: {
  665. printf("\n+---------------------------------------------+\n");
  666. printf("| SAP XEP SINH VIEN THEO HOC LUC |\n");
  667. printf("+---------------------------------------------+\n");
  668. SORT_BY_HOCLUC(&L);
  669. hienThiKetQuaHocTap(L, dsMon);
  670. break;
  671. }
  672. case 10: {
  673. system(CLEAR);
  674. printf("+==============================================================+\n");
  675. printf("| HE THONG QUAN LY SINH VIEN |\n");
  676. printf("+==============================================================+\n");
  677. printf("| [1] Them sinh vien vao danh sach |\n");
  678. printf("| [2] Xoa sinh vien theo MSV |\n");
  679. printf("| [3] Nhap diem cho cac sinh vien |\n");
  680. printf("| [4] Tim kiem sinh vien theo MSV |\n");
  681. printf("| [5] Sap xep danh sach theo ten |\n");
  682. printf("| [6] In danh sach sinh vien |\n");
  683. printf("| [7] Them mon hoc moi vao danh sach |\n");
  684. printf("| [8] Xem ket qua hoc tap (Diem TB 10, GPA, Xep loai) |\n");
  685. printf("| [9] Sap xep danh sach theo hoc luc (GPA) |\n");
  686. printf("| [10] Clear man hinh (giu nguyen du lieu) |\n");
  687. printf("| [11] Chinh sua diem sinh vien theo MSV |\n");
  688. printf("| [0] Thoat chuong trinh |\n");
  689. printf("+==============================================================+\n");
  690. printf("Man hinh da duoc lam moi.\n");
  691. break;
  692. }
  693. default:
  694. printf("Lua chon khong hop le\n");
  695. case 11: {
  696. char id[20];
  697. int found = 0;
  698.  
  699. printf("\n+---------------------------------------------+\n");
  700. printf("| CHINH SUA DIEM SINH VIEN THEO MSV |\n");
  701. printf("+---------------------------------------------+\n");
  702. printf(">> Nhap MSV can chinh sua: ");
  703. scanf("%s", id);
  704.  
  705. for (int i = 0; i < L.Last; i++) {
  706. if (strcmp(L.A[i].id, id) == 0) {
  707. found = 1;
  708. struct Sinhvien *sv = &L.A[i];
  709. printf("\nThong tin sinh vien:\n");
  710. printf("MSSV: %s\n", sv->id);
  711. printf("Ho ten: %s\n", sv->name);
  712. printf("So mon hoc hien co: %d\n", sv->soMon);
  713.  
  714. if (sv->soMon == 0) {
  715. printf("Sinh vien chua co diem mon hoc nao de chinh sua!\n");
  716. break;
  717. }
  718.  
  719. printf("\nCac diem hien tai:\n");
  720. for (int j = 0; j < sv->soMon; j++) {
  721. printf(" Mon %d: %.2f\n", j + 1, sv->diem[j]);
  722. }
  723.  
  724. int mon;
  725. printf("\n>> Nhap thu tu mon muon chinh sua (1-%d): ", sv->soMon);
  726. scanf("%d", &mon);
  727.  
  728. if (mon >= 1 && mon <= sv->soMon) {
  729. float diemMoi;
  730. do {
  731. printf(">> Nhap diem moi cho mon %d (0-10): ", mon);
  732. scanf("%f", &diemMoi);
  733. if (diemMoi < 0 || diemMoi > 10)
  734. printf("Diem khong hop le, vui long nhap lai!\n");
  735. } while (diemMoi < 0 || diemMoi > 10);
  736. sv->diem[mon - 1] = diemMoi;
  737. } else {
  738. printf("So thu tu mon khong hop le!\n");
  739. break;
  740. }
  741.  
  742. // C?p nh?t l?i GPA và h?c l?c
  743. sv->gpa = tinhGPA(*sv);
  744. xepLoaiHocLuc(sv->gpa, sv->hocLuc);
  745.  
  746. printf("\nDa cap nhat diem cho sinh vien co MSV %s.\n", id);
  747. printf("GPA moi: %.2f | Hoc luc: %s\n", sv->gpa, sv->hocLuc);
  748. break;
  749. }
  750. }
  751.  
  752. if (!found)
  753. printf("\nKhong tim thay sinh vien co MSV %s!\n", id);
  754.  
  755. break;
  756. }
  757.  
  758. }
  759. }
  760. return 0;
  761. }
  762.  
  763.  
Success #stdin #stdout 0s 5308KB
stdin
Standard input is empty
stdout
+=================================================================+
|              HE THONG QUAN LY SINH VIEN                         |
+=================================================================+
| [1] Them sinh vien vao danh sach                		  |
| [2] Xoa sinh vien theo MSV                    		  |
| [3] Nhap diem cho cac sinh vien                                 |
| [4] Tim kiem sinh vien theo MSV              			  |
| [5] Sap xep danh sach theo ten                       		  |
| [6] In danh sach sinh vien                                      |
| [7] Them mon hoc moi vao danh sach                              |
| [8] Xem ket qua hoc tap (Diem TB 10, GPA, Xep loai)             |
| [9] Sap xep danh sach theo hoc luc (GPA)                        |
| [10] Clear man hinh (giu nguyen du lieu)	                  |
| [11] Chinh sua diem sinh vien theo MSV                          |
| [0] Thoat chuong trinh                                          |
+=================================================================+

>> Nhap lua chon cua ban: Da thoat