#include #include #include #define MAX_NAME_LENGTH 50 #define MAX_DEPARTMENT_LENGTH 10 typedef struct { int MNV; char HT[MAX_NAME_LENGTH]; float LUONG; char PHONG[MAX_DEPARTMENT_LENGTH]; } Employee; // Hàm để đọc danh sách nhân viên từ tệp Employee* readEmployeeListFromFile(const char* filename, int* n) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("Không thể mở tệp %s\n", filename); return NULL; } fscanf(file, "%d", n); Employee* employees = (Employee*)malloc((*n) * sizeof(Employee)); for (int i = 0; i < *n; i++) { fscanf(file, "%d", &employees[i].MNV); fscanf(file, "%s", employees[i].HT); fscanf(file, "%f", &employees[i].LUONG); fscanf(file, "%s", employees[i].PHONG); } fclose(file); return employees; } // Hàm để tính lương trung bình của từng phòng void calculateAverageSalaryByDepartment(Employee* employees, int n) { float totalSalaryA = 0, totalSalaryB = 0, totalSalaryC = 0; int countA = 0, countB = 0, countC = 0; for (int i = 0; i < n; i++) { if (strcmp(employees[i].PHONG, "A") == 0) { totalSalaryA += employees[i].LUONG; countA++; } else if (strcmp(employees[i].PHONG, "B") == 0) { totalSalaryB += employees[i].LUONG; countB++; } else if (strcmp(employees[i].PHONG, "C") == 0) { totalSalaryC += employees[i].LUONG; countC++; } } float averageSalaryA = countA > 0 ? totalSalaryA / countA : 0; float averageSalaryB = countB > 0 ? totalSalaryB / countB : 0; float averageSalaryC = countC > 0 ? totalSalaryC / countC : 0; printf("Lương trung bình phòng A: %.2f\n", averageSalaryA); printf("Lương trung bình phòng B: %.2f\n", averageSalaryB); printf("Lương trung bình phòng C: %.2f\n", averageSalaryC); // Tìm phòng có lương trung bình cao nhất if (averageSalaryA > averageSalaryB && averageSalaryA > averageSalaryC) { printf("Phòng có lương trung bình cao nhất: A\n"); } else if (averageSalaryB > averageSalaryA && averageSalaryB > averageSalaryC) { printf("Phòng có lương trung bình cao nhất: B\n"); } else if (averageSalaryC > averageSalaryA && averageSalaryC > averageSalaryB) { printf("Phòng có lương trung bình cao nhất: C\n"); } } // Hàm để so sánh lương của các nhân viên (được sử dụng trong hàm qsort) int compareSalary(const void* a, const void* b) { Employee* empA = (Employee*)a; Employee* empB = (Employee*)b; if (empA->LUONG < empB->LUONG) { return -1; } else if (empA->LUONG > empB->LUONG) { return 1; } else { return 0; } } // Hàm để in danh sách nhân viên theo thứ tự tăng dần của lương void printEmployeeList(Employee* employees, int n) { qsort(employees, n, sizeof(Employee), compareSalary); printf("Danh sách nhân viên theo thứ tự tăng dần của lương:\n"); for (int i = 0; i < n; i++) { printf("MNV: %d, Họ tên: %s, Lương: %.2f, Phòng: %s\n", employees[i].MNV, employees[i].HT, employees[i].LUONG, employees[i].PHONG); } } // Hàm để lưu kết quả vào tệp output.txt void saveResultToFile(Employee* employees, int n) { FILE* file = fopen("output.txt", "w"); if (file == NULL) { printf("Không thể mở tệp output.txt\n"); return; } fprintf(file, "%d\n", n); for (int i = 0; i < n; i++) { fprintf(file, "%d\n", employees[i].MNV); fprintf(file, "%s\n", employees[i].HT); fprintf(file, "%.2f\n", employees[i].LUONG); fprintf(file, "%s\n", employees[i].PHONG); } fclose(file); } // Hàm để giải phóng bộ nhớ đã cấp phát cho danh sách nhân viên void freeEmployeeList(Employee* employees) { free(employees); } int main() { char filename[100]; printf("Nhập tên tệp: "); scanf("%s", filename); int n; Employee* employees = readEmployeeListFromFile(filename, &n); if (employees == NULL) { return 0; } // Tính lương trung bình của từng phòng và phòng có lương trung bình cao nhất calculateAverageSalaryByDepartment(employees, n); // In danh sách nhân viên theo thứ tự tăng dần của lương printEmployeeList(employees, n); // Lưu kết quả vào tệp output.txt saveResultToFile(employees, n); // Giải phóng bộ nhớ freeEmployeeList(employees); return 0; }