



















Preview text:
lOMoAR cPSD| 45474828
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT KHOA CÔN G NGHỆ SỐ BÀI TẬP CUỐI KÌ
GVHD: Nguyễn Thị Thùy Trang
Sinh viên: Nguyễn Hữu Định
Mã sinh viên: 23115053122305
Lớp học phần: 124TC>06
Đà Nẵng – Tháng 12/2024 lOMoAR cPSD| 45474828 MỤC LỤC
TUẦN 1_CÀI ĐẶT SQL SERVER VÀ SSMS....................................................................................................................1
CÂU 1:............................................................................................................................................................................1
CÂU 2:............................................................................................................................................................................2
TUẦN 5 - CHUẨN HÓA ERD CHO BÀI TẬP ĐÃ
GIAO....................................................................................................3
TUẦN 6 - TẠO DATABASE BÁN HÀNG THEO YÊU CẦU!...............................................................................................4
TUẦN 8-BỔ SUNG LỆNH ĐỂ THỰC HIỆN CÁC RÀNG BUỘC CHO DATABASE ĐÃ CÓ......................................................8
CÂU 1:............................................................................................................................................................................8
CÂU 2:............................................................................................................................................................................9
TUẦN 9 - NHẬP LIỆU CHO TẤT CẢ CÁC BẢNG DỮ LIỆU.............................................................................................10
CÂU 1:..........................................................................................................................................................................15
CÂU 2:..........................................................................................................................................................................17
CÂU 3:..........................................................................................................................................................................19
CÂU 4:..........................................................................................................................................................................20
CÂU 5:..........................................................................................................................................................................21
CÂU 6:..........................................................................................................................................................................22
TUẦN 13 – VIEW.....................................................................................................................................................23
CÂU 1. HÃY TẠO VIEW ĐỂ CHỨA NHỮNG ĐƠN HÀNG 'CHỜ XỬ LÝ'............................................................................................23
CÂU 2. VIẾT VIEW TÁCH HỌ VÀ TÊN THÀNH HỌ LÓT VÀ TÊN.....................................................................................................23
CÂU 3. VIẾT VIEW CHỨA NHỮNG NHÂN VIÊN CÒN ĐANG ĐI LÀM..............................................................................................23
TUẦN 14 - HÀM VÀ THỦ TỤC..................................................................................................................................24
CÂU 1:..........................................................................................................................................................................24
CÂU 2:..........................................................................................................................................................................26
CÂU 3:..........................................................................................................................................................................27
CÂU 4:..........................................................................................................................................................................28
CÂU 5:..........................................................................................................................................................................29
CÂU 6:..........................................................................................................................................................................30
CÂU 7:..........................................................................................................................................................................32
CÂU 8:..........................................................................................................................................................................33
CÂU 9:..........................................................................................................................................................................34
CÂU 10:........................................................................................................................................................................34
TUẦN 15 - NỘP BÀI TẬP TRIGGER...........................................................................................................................36
CÂU 1:..........................................................................................................................................................................36
CÂU 2:..........................................................................................................................................................................41 lOMoAR cPSD| 45474828
BÀI BÁO CÁO CUỐI KỲ
Bài 1: Viết chương trình tạo một menu danh sách liên kết đơn để quản lý danh sách
sinh viên thực hiện các công việc sau: Bài làm #include #include #include
typedef struct SinhVien { int MaSV; char TenSV[50]; char Lop[10]; float DCK; } SinhVien; typedef struct NUT { SinhVien sv; struct NUT *tiep; } NUT;
NUT *Tao_Nut(SinhVien SV) {
NUT *p = (NUT *)malloc(sizeof(NUT)); p->sv = SV; p- >tiep = NULL; return p; }
NUT *Insert_First(NUT *H, SinhVien SV) { NUT *p = Tao_Nut(SV); p->tiep = H; return p; }
NUT *Insert_Last(NUT *H, SinhVien SV) { NUT *p = Tao_Nut(SV); if (H == NULL) { return p; } NUT *tam = H; while
(tam->tiep != NULL) { tam = tam->tiep; } tam->tiep = p; return H; }
NUT *Insert_After(NUT *H, SinhVien SV, int pos) { NUT *p = Tao_Nut(SV);
if (H == NULL || pos <= 0) { Nguyễn H ữu Định Page | 1 lOMoAR cPSD| 45474828
return Insert_First(H, SV); } NUT *tam = H;
for (int i = 1; i < pos && tam != NULL; i++) { tam = tam->tiep; } if (tam != NULL) { p->tiep = tam->tiep; tam->tiep = p; } else {
printf("Vi tri vuot qua so luong sinh vien!\n"); } return H; } void INDS(NUT *H) { if (H == NULL) {
printf("Danh sach rong\n"); } else {
printf("============================================================= ==\n");
printf("| Ma sinh vien | Ten sinh vien | Lop | DCK |\n");
printf("---------------------------------------------------------------\n");
NUT *tam = H; while (tam != NULL) {
printf("| %12d | %-18s | %-5s | %.2f |\n", tam->sv.MaSV, tam->sv.TenSV, tam-
>sv.Lop, tam->sv.DCK); tam = tam->tiep; }
printf("============================================================= ==\n"); } }
NUT *Sua_Ten(NUT *H, int pos, char *tenMoi) {
if (H == NULL || pos <= 0) {
printf("Danh sach rong hoac vi tri khong hop le\n"); return H; } NUT *tam = H;
for (int i = 1; i < pos && tam != NULL; i++) { tam = tam->tiep; }
if (tam != NULL) { strcpy(tam- >sv.TenSV, tenMoi);
printf("Da cap nhat ten sinh vien\n"); } else {
printf("Khong tim thay sinh vien o vi tri nay\n"); Nguyễn Hữu Định Page | 2 lOMoAR cPSD| 45474828 } return H; }
NUT *Delete_First(NUT *H) { if (H == NULL) {
printf("Danh sach rong\n"); return H; } NUT *tam = H; H = H->tiep; free(tam);
printf("Da xoa sinh vien o vi tri dau danh sach\n"); return H; }
NUT *Delete_Last(NUT *H) { if (H == NULL) {
printf("Danh sach rong\n"); return H; }
if (H->tiep == NULL) { free(H);
printf("Da xoa sinh vien o vi tri cuoi danh sach\n"); return NULL; }
NUT *tam = H; while (tam-
>tiep->tiep != NULL) { tam = tam->tiep; }
free(tam->tiep); tam- >tiep = NULL;
printf("Da xoa sinh vien o vi tri cuoi danh sach\n"); return H; }
NUT *Delete_After(NUT *H, int pos) {
if (H == NULL || pos <= 0) {
printf("Danh sach rong hoac vi tri khong hop le\n"); return H; } NUT *tam = H;
for (int i = 1; i < pos && tam != NULL; i++) { tam = tam->tiep; }
if (tam != NULL && tam->tiep != NULL) {
NUT *nutXoa = tam->tiep; tam->tiep =
nutXoa->tiep; free(nutXoa);
printf("Da xoa sinh vien sau vi tri %d\n", pos); } else { Nguyễn H ữu Định Page | 3 lOMoAR cPSD| 45474828
printf("Vi tri khong hop le hoac khong co sinh vien nao de xoa\n"); } return H; }
NUT *Xoa_ViTri(NUT *H, int pos) {
if (H == NULL || pos <= 0) {
printf("Danh sach rong hoac vi tri khong hop le\n"); return H; } if (pos == 1) { NUT *tam = H; H = H->tiep; free(tam);
printf("Da xoa sinh vien o vi tri %d\n", pos); return H; } NUT *tam = H;
for (int i = 1; i < pos - 1 && tam != NULL; i++) { tam = tam->tiep; }
if (tam != NULL && tam->tiep != NULL) {
NUT *nutXoa = tam->tiep;
tam->tiep = nutXoa->tiep; free(nutXoa);
printf("Da xoa sinh vien o vi tri %d\n", pos); } else {
printf("Khong tim thay sinh vien o vi tri nay\n"); } return H; }
void TimKiem_MaSV(NUT *H, int maSV) { if (H == NULL) {
printf("Danh sach rong\n"); return; }
NUT *tam = H; while (tam !=
NULL) { if (tam->sv.MaSV == maSV) { printf("Tim thay sinh vien:\n");
printf("Ma SV: %d\nTen SV: %s\nLop: %s\nDCK: %.2f\n", tam->sv.MaSV, tam-
>sv.TenSV, tam->sv.Lop, tam->sv.DCK); return; } tam = tam->tiep; }
printf("Khong tim thay sinh vien voi ma SV: %d\n", maSV); } Nguyễn Hữu Định Page | 4 lOMoAR cPSD| 45474828
NUT *SapXep(NUT *H, int tangDan) {
if (H == NULL || H->tiep == NULL) { return H; }
for (NUT *i = H; i->tiep != NULL; i = i->tiep) {
for (NUT *j = i->tiep; j != NULL; j = j->tiep) {
if ((tangDan && i->sv.MaSV > j->sv.MaSV) || (!tangDan && i->sv.MaSV < j>sv.MaSV)) {
SinhVien temp = i->sv; i->sv = j->sv; j->sv = temp; } } } return H; }
void Xoa_ToanBo(NUT **H) { NUT *tam; while (*H != NULL) { tam = *H; *H = (*H)->tiep; free(tam); }
printf("Da xoa toan bo danh sach\n"); } int main() { NUT *H = NULL; int choice; do {
printf("\n========== MENU ==========");
printf("\n1. Tao danh sach sinh vien");
printf("\n2. Them sinh vien vao danh sach");
printf("\n3. Xem danh sach sinh vien");
printf("\n4. Sua ten sinh vien"); printf("\n5. Xoa sinh vien");
printf("\n6. Tim kiem sinh vien theo ma");
printf("\n7. Sap xep danh sach");
printf("\n8. Xoa toan bo danh sach");
printf("\n9. Thoat chuong trinh");
printf("\n===========================\n");
printf("Nhap lua chon: ");
scanf("%d", &choice); switch (choice) { case 1: { SinhVien sv; while (1) { Nguyễn H ữu Định Page | 5 lOMoAR cPSD| 45474828
printf("Nhap MaSV (nhap 0 de dung): ");
scanf("%d", &sv.MaSV); if (sv.MaSV ==
0) break; printf("Nhap ten SV: "); getchar(); // Xoa bo nho dem
fgets(sv.TenSV, sizeof(sv.TenSV), stdin);
sv.TenSV[strcspn(sv.TenSV, "\n")] = '\0'; printf("Nhap lop: ");
fgets(sv.Lop, sizeof(sv.Lop), stdin);
sv.Lop[strcspn(sv.Lop, "\n")] = '\0';
printf("Nhap diem cuoi ky: "); scanf("%f", &sv.DCK);
H = Insert_Last(H, sv); } break; } case 2: { SinhVien sv; int pos;
printf("Nhap MaSV: ");
scanf("%d", &sv.MaSV); printf("Nhap
ten SV: "); getchar(); // Xoa bo nho dem
fgets(sv.TenSV, sizeof(sv.TenSV), stdin);
sv.TenSV[strcspn(sv.TenSV, "\n")] = '\0'; printf("Nhap lop: ");
fgets(sv.Lop, sizeof(sv.Lop), stdin);
sv.Lop[strcspn(sv.Lop, "\n")] = '\0';
printf("Nhap diem cuoi ky: "); scanf("%f", &sv.DCK);
printf("Nhap vi tri can them (1 la dau danh sach, 2 la them vao sau vi tri nhap tu
ban phim, 3 la them vao cuoi danh sach): ");
scanf("%d", &pos); switch (pos) { case 1:
H = Insert_First(H, sv); break; case 2: int posThem;
printf("Nhap vi tri can them vao sau: ");
scanf("%d", &posThem);
H = Insert_After(H, sv, posThem); break; case 3:
H = Insert_Last(H, sv); break; default:
printf("Vi tri khong hop le\n"); break; } break; } Nguyễn Hữu Định Page | 6 lOMoAR cPSD| 45474828 case 3: { INDS(H); break; } case 4: { int pos; char tenMoi[50]; printf("Nhap vi tri sinh vien can sua: "); scanf("%d", &pos); printf("Nhap ten moi: "); getchar(); // Xoa bo nho dem fgets(tenMoi, sizeof(tenMoi), stdin); tenMoi[strcspn(tenMoi, "\n")] = '\0'; H = Sua_Ten(H, pos, tenMoi); break;
} case 5: { int subChoice; printf("Chon thao tac xoa (1: Xoa dau danh
sach, 2: Xoa sau vi tri, 3:
Xoa cuoi danh sach): "); scanf("%d", &subChoice); switch (subChoice) { case 1: H = Delete_First(H); break; case 2: { int pos;
printf("Nhap vi tri sinh vien ma ban muon xoa sau:
"); scanf("%d", &pos); H = Delete_After(H, pos); break; } case 3: H = Delete_Last(H); break; default:
printf("Lua chon khong hop le\n"); break; } break; } case 6: { int maSV;
printf("Nhap ma sinh vien can tim: ");
scanf("%d", &maSV); TimKiem_MaSV(H, maSV); break; Nguyễn H ữu Định Page | 7 lOMoAR cPSD| 45474828 } case 7: { int tangDan;
printf("Chon cach sap xep (1: Tang dan, 0: Giam dan): ");
scanf("%d", &tangDan); H = SapXep(H, tangDan);
printf("Da sap xep danh sach\n"); break; } case 8: { Xoa_ToanBo(&H); break; } case 9: {
printf("Thoat chuong trinh\n"); Xoa_ToanBo(&H); break; } default: {
printf("Lua chon khong hop le\n"); break; } }
} while (choice != 9); return 0; }
1. Tạo danh sách sinh viên, quá trình nhập sẽ dừng lại khi nhập mã sinh viên= 0
2. Thêm sinh viên vào danh sách với vị trí nhập vào: dựa vào vị trí đã nhập, gọicác
hàm Insert_First, Insert_After, Insert_Last cho phù hợp.
3. Xem danh sách sinh viên, trình bày dưới dạng các cột
4. Sửa lại Tên sinh viên khi nhập vào vị trí cần chỉnh sửa.
5. Xóa 1 sinh viên: dựa vào vị trí nhập (tương tự như thêm)
6. Tìm kiếm 1 sinh viên theo mã sinh viên
7. Sắp xếp theo mã sinh viên tăng dần và giảm dần khi thông báo người dùng
chọnlựa cách sắp xếp
8. Xóa toàn bộ danh sách. Nguyễn Hữu Định Page | 8 lOMoAR cPSD| 45474828
Bài 2: Viết chương trình cài đặt các phương pháp sắp xếp Shell Sort, Heap Sort,
Merge Sort áp dụng cho mảng các số nguyên được nhập từ bàn phím. Bài Làm #include
void inputArray(int arr[], int *size) {
printf("Nhap so luong phan tu: ");
scanf("%d", size); for (int i = 0; i <
*size; i++) { printf("Nhap phan tu thu
%d: ", i + 1); scanf("%d", &arr[i]); } }
void printArray(int arr[], int size) {
printf("Danh sach la:\n"); for
(int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); }
void insertionSort(int arr[], int size) {
for (int i = 1; i < size; i++) { int key = arr[i];
int j = i - 1; while (j >= 0
&& arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } }
void merge(int arr[], int left, int mid, int right) {
int n1 = mid - left + 1; int n2 = right - mid;
int leftArr[n1], rightArr[n2];
for (int i = 0; i < n1; i++) { leftArr[i] = arr[left + i]; }
for (int j = 0; j < n2; j++) {
rightArr[j] = arr[mid + 1 + j]; }
int i = 0, j = 0, k = left; while
(i < n1 && j < n2) { if
(leftArr[i] <= rightArr[j]) { arr[k] = leftArr[i]; Nguyễn H ữu Định Page | 9 lOMoAR cPSD| 45474828 i++; } else { arr[k] = rightArr[j]; j++; } k++; } while (i < n1) { arr[k] = leftArr[i]; i++; k++; } while (j < n2) { arr[k] = rightArr[j]; j++; k++; } }
void mergeSort(int arr[], int left, int right) {
if (left < right) { int mid = left + (right
- left) / 2; mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } } void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }
void heapify(int arr[], int size, int root) {
int largest = root; int left = 2 * root + 1; int right = 2 * root + 2;
if (left < size && arr[left] > arr[largest]) { largest = left; }
if (right < size && arr[right] > arr[largest]) { largest = right; } if (largest != root) {
swap(&arr[root], &arr[largest]); heapify(arr, size, largest); } } Nguyễn Hữu Định Page | 10 lOMoAR cPSD| 45474828
void heapSort(int arr[], int size) {
for (int i = size / 2 - 1; i >= 0; i--) { heapify(arr, size, i);
} for (int i = size - 1; i > 0; i--) { swap(&arr[0],
&arr[i]); heapify(arr, i, 0); } } int main() { int arr[100]; int size; int choice; int running = 1; while (running) {
printf("\n------------------------MENU---------------------------\n");
printf("1. Tao danh sach\n"); printf("2. In danh sach\n");
printf("3. Sap xep chen (Insertion Sort)\n"); printf("4. Sap xep
vun dong (Heap Sort)\n"); printf("5. Sap xep tron (Merge
Sort)\n"); printf("6. Thoat chuong trinh\n");
printf("-------------------------------------------------------\n"); printf("Nhap lua chon: "); scanf("%d", &choice); switch (choice) { case 1: inputArray(arr, &size); break; case 2: printArray(arr, size); break; case 3: insertionSort(arr, size);
printf("Danh sach da sap xep (Insertion Sort):\n"); printArray(arr, size); break; case 4: heapSort(arr, size);
printf("Danh sach da sap xep (Heap Sort):\n"); printArray(arr, size); break; case 5: mergeSort(arr, 0, size - 1);
printf("Danh sach da sap xep (Merge Sort):\n"); printArray(arr, size); break; case 6: running = 0; Nguyễn H ữu Định Page | 11 lOMoAR cPSD| 45474828
printf("Thoat chuong trinh.\n"); break; default:
printf("Lua chon khong hop le. Vui long chon lai.\n"); } } return 0; }
Bài 3: Viết lại chương trình ở bài 1 với dữ liệu của mảng được nhập từ file t ext
input.txt, xuất dữ liệu đã sắp xếp ra 1 file text output.txt. Bài làm #include #include #include typedef struct SinhVien { int MaSV; char TenSV[50]; char Lop[10]; float DCK; } SinhVien; typedef struct NUT { SinhVien sv; struct NUT *tiep; } NUT; NUT *Tao_Nut(SinhVien SV) {
NUT *p = (NUT *)malloc(sizeof(NUT)); p->sv = SV; p- >tiep = NULL; return p; }
NUT *Them_Sau(NUT *H, NUT *p){ if(H==NULL) H=p; else{ NUT *tam=H; while(tam-
>tiep!=NULL) tam=tam->tiep; tam->tiep=p; } return H; }
NUT *Insert_First(NUT *H, SinhVien SV) { NUT *p = Tao_Nut(SV); p->tiep = H; return p; } Nguyễn Hữu Định Page | 12 lOMoAR cPSD| 45474828
NUT *Insert_Last(NUT *H, SinhVien SV) { NUT *p = Tao_Nut(SV); if (H == NULL) { return p; } NUT *tam = H; while (tam->tiep != NULL) { tam = tam->tiep; } tam->tiep = p; return H; }
NUT *Insert_After(NUT *H, SinhVien SV, int pos) { NUT *p = Tao_Nut(SV);
if (H == NULL || pos <= 0) { return Insert_First(H, SV); } NUT *tam = H;
for (int i = 1; i < pos && tam != NULL; i++) { tam = tam->tiep; } if (tam != NULL) { p->tiep = tam->tiep; tam->tiep = p; } else {
printf("Vi tri vuot qua so luong sinh vien!\n"); } return H; } void INDS(NUT *H) { if (H == NULL) { printf("Danh sach rong\n"); } else {
printf("============================================================ ===\n");
printf("| Ma sinh vien | Ten sinh vien | Lop | DCK |\n");
printf("---------------------------------------------------------------\n");
NUT *tam = H; while (tam != NULL) {
printf("| %12d | %-18s | %-5s | %.2f |\n", tam->sv.MaSV, tam->sv.TenSV, tam- >sv.Lop, tam->sv.DCK); tam = tam->tiep; }
printf("============================================================ ===\n"); Nguyễn H ữu Định Page | 13 lOMoAR cPSD| 45474828 } }
NUT *Sua_Ten(NUT *H, int pos, char *tenMoi) {
if (H == NULL || pos <= 0) {
printf("Danh sach rong hoac vi tri khong hop le\n"); return H; } NUT *tam = H;
for (int i = 1; i < pos && tam != NULL; i++) { tam = tam->tiep; }
if (tam != NULL) { strcpy(tam-
>sv.TenSV, tenMoi); printf("Da cap nhat ten sinh vien\n"); } else {
printf("Khong tim thay sinh vien o vi tri nay\n"); } return H; } NUT *Delete_First(NUT *H) { if (H == NULL) { printf("Danh sach rong\n"); return H; } NUT *tam = H; H = H->tiep; free(tam);
printf("Da xoa sinh vien o vi tri dau danh sach\n"); return H; } NUT *Delete_Last(NUT *H) { if (H == NULL) { printf("Danh sach rong\n"); return H; } if (H->tiep == NULL) { free(H);
printf("Da xoa sinh vien o vi tri cuoi danh sach\n"); return NULL; } NUT *tam = H; while (tam- >tiep->tiep != NULL) { tam = tam->tiep; } free(tam- >tiep); tam->tiep = NULL; Nguyễn Hữu Định Page | 14 lOMoAR cPSD| 45474828
printf("Da xoa sinh vien o vi tri cuoi danh sach\n"); return H; }
NUT *Delete_After(NUT *H, int pos) {
if (H == NULL || pos <= 0) {
printf("Danh sach rong hoac vi tri khong hop le\n"); return H; } NUT *tam = H;
for (int i = 1; i < pos && tam != NULL; i++) { tam = tam->tiep; }
if (tam != NULL && tam->tiep != NULL) { NUT *nutXoa = tam->tiep;
tam->tiep = nutXoa->tiep; free(nutXoa);
printf("Da xoa sinh vien sau vi tri %d\n", pos); } else {
printf("Vi tri khong hop le hoac khong co sinh vien nao de xoa\n"); } return H; }
NUT *Xoa_ViTri(NUT *H, int pos) {
if (H == NULL || pos <= 0) {
printf("Danh sach rong hoac vi tri khong hop le\n"); return H; } if (pos == 1) { NUT *tam = H; H = H->tiep; free(tam);
printf("Da xoa sinh vien o vi tri %d\n", pos); return H; } NUT *tam = H;
for (int i = 1; i < pos - 1 && tam != NULL; i++) { tam = tam->tiep; }
if (tam != NULL && tam->tiep != NULL) { NUT *nutXoa = tam->tiep;
tam->tiep = nutXoa->tiep; free(nutXoa);
printf("Da xoa sinh vien o vi tri %d\n", pos); } else {
printf("Khong tim thay sinh vien o vi tri nay\n"); Nguyễn H ữu Định Page | 15 lOMoAR cPSD| 45474828 } return H; }
void TimKiem_MaSV(NUT *H, int maSV) { if (H == NULL) { printf("Danh sach rong\n"); return; } NUT *tam = H; while (tam != NULL) { if (tam->sv.MaSV == maSV) { printf("Tim thay sinh vien:\n");
printf("Ma SV: %d\nTen SV: %s\nLop: %s\nDCK: %.2f\n", tam->sv.MaSV, tam-
>sv.TenSV, tam->sv.Lop, tam->sv.DCK); return; } tam = tam->tiep; }
printf("Khong tim thay sinh vien voi ma SV: %d\n", maSV); }
NUT *SapXep(NUT *H, int tangDan) {
if (H == NULL || H->tiep == NULL) { return H; }
for (NUT *i = H; i->tiep != NULL; i = i->tiep) {
for (NUT *j = i->tiep; j != NULL; j = j->tiep) {
if ((tangDan && i->sv.MaSV > j->sv.MaSV) || (!tangDan && i->sv.MaSV < j>sv.MaSV)) { SinhVien temp = i->sv; i->sv = j->sv; j->sv = temp; } } } return H; } void Xoa_ToanBo(NUT **H) { NUT *tam; while (*H != NULL) { tam = *H; *H = (*H)->tiep; free(tam); }
printf("Da xoa toan bo danh sach\n"); } Nguyễn Hữu Định Page | 16 lOMoAR cPSD| 45474828 NUT *DocFile( NUT *H) {
FILE *file = fopen("C:\\Users\\dinhk\\Downloads\\NguyenHuuDinh_23\\input.txt", "r"); if (file==NULL) { printf("Khong the mo file"); return H; }
SinhVien sv; while (fscanf(file, "%5d %10[^\n] %5s %4f [^\n]", &sv.MaSV, sv.TenSV, sv.Lop, &sv.DCK) == 4) H = Them_Sau(H, Tao_Nut(sv)); fclose(file); return H; } void GhiFile(NUT *H) {
FILE *file = fopen("C:\\Users\\dinhk\\Downloads\\NguyenHuuDinh_23\\output.txt", "w"); if (file == NULL) {
printf("Khong the mo file de ghi.\n"); return; } NUT *tam = H; while (tam != NULL) { SinhVien sv = tam->sv;
fprintf(file, "%5d %s %s %.2f \n", sv.MaSV, sv.TenSV, sv.Lop, sv.DCK); tam = tam->tiep; } fclose(file);
printf("Ghi file thanh cong.\n"); } int main() { NUT *H = NULL; int choice; do {
printf("\n========== MENU ==========");
printf("\n1. Doc du lieu tu file INPUT"); printf("\n2. Ghi du lieu vao file OUTPUT");
printf("\n3. Xem danh sach sinh vien");
printf("\n4. Sua ten sinh vien");
printf("\n5. Xoa sinh vien"); printf("\n6.
Tim kiem sinh vien theo ma"); printf("\n7.
Sap xep danh sach"); printf("\n8. Xoa toan bo danh sach");
printf("\n9. Thoat chuong trinh");
printf("\n===========================\n");
printf("Nhap lua chon: "); scanf("%d", &choice); switch (choice) { case 1: Nguyễn H ữu Định Page | 17 lOMoAR cPSD| 45474828 H=DocFile(H);
printf("Doc du lieu tu file thanh cong\n"); break; case 2: GhiFile(H); break; case 3: { INDS(H); break; } case 4: { int pos; char tenMoi[50];
printf("Nhap vi tri sinh vien can sua: ");
scanf("%d", &pos); printf("Nhap ten
moi: "); getchar(); // Xoa bo nho dem
fgets(tenMoi, sizeof(tenMoi), stdin);
tenMoi[strcspn(tenMoi, "\n")] = '\0'; H
= Sua_Ten(H, pos, tenMoi); break; } case 5: { int subChoice;
printf("Chon thao tac xoa (1: Xoa dau danh sach, 2: Xoa sau vi tri,
3: Xoa cuoi danh sach): "); scanf("%d", &subChoice); switch (subChoice) { case 1: H = Delete_First(H); break; case 2: { int pos;
printf("Nhap vi tri sinh vien ma ban muon xoa sau:
"); scanf("%d", &pos); H = Delete_After(H, pos); break; } case 3: H = Delete_Last(H); break; default:
printf("Lua chon khong hop le\n"); break; } break; } case 6: { int maSV;
printf("Nhap ma sinh vien can tim: "); scanf("%d", &maSV); TimKiem_MaSV(H, maSV); break; Nguyễn Hữu Định Page | 18