#include #include #include struct Employee { int MNV; char HT[50]; double LUONG; char PHONG[10]; }; // Hàm để đọc danh sách nhân viên từ tệp struct Employee* readEmployeeListFromFile(const char* filename, int* numEmployees) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("Không thể mở tệp %s\n", filename); return NULL; } fscanf(file, "%d", numEmployees); struct Employee* employees = (struct Employee*)malloc(*numEmployees * sizeof(struct Employee)); for (int i = 0; i < *numEmployees; i++) { fscanf(file, "%d %s %lf %s", &employees[i].MNV, employees[i].HT, &employees[i].LUONG, employees[i].PHONG); } fclose(file); return employees; } // Hàm để tính lương trung bình của từng phòng và tìm phòng có lương trung bình cao nhất void calculateAverageSalary(struct Employee* employees, int numEmployees) { double totalSalaryA = 0, totalSalaryB = 0, totalSalaryC = 0; int countA = 0, countB = 0, countC = 0; for (int i = 0; i < numEmployees; 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++; } } double avgSalaryA = (countA > 0) ? totalSalaryA / countA : 0; double avgSalaryB = (countB > 0) ? totalSalaryB / countB : 0; double avgSalaryC = (countC > 0) ? totalSalaryC / countC : 0; printf("Lương trung bình của phòng A: %.2lf\n", avgSalaryA); printf("Lương trung bình của phòng B: %.2lf\n", avgSalaryB); printf("Lương trung bình của phòng C: %.2lf\n", avgSalaryC); if (avgSalaryA > avgSalaryB && avgSalaryA > avgSalaryC) { printf("Phòng A có lương trung bình cao nhất\n"); } else if (avgSalaryB > avgSalaryA && avgSalaryB > avgSalaryC) { printf("Phòng B có lương trung bình cao nhất\n"); } else if (avgSalaryC > avgSalaryA && avgSalaryC > avgSalaryB) { printf("Phòng C có lương trung bình cao nhất\n"); } else { printf("Có nhiều phòng có lương trung bình cao nhất\n"); } } // Hàm để in danh sách nhân viên theo thứ tự tăng dần của lương void printEmployeeList(struct Employee* employees, int numEmployees) { // Sắp xếp danh sách nhân viên theo thứ tự tăng dần của lương for (int i = 0; i < numEmployees - 1; i++) { for (int j = 0; j < numEmployees - i - 1; j++) { if (employees[j].LUONG > employees[j + 1].LUONG) { struct Employee temp = employees[j]; employees[j] = employees[j + 1]; employees[j + 1] = temp; } } } // In danh sách nhân viên printf("Danh sách nhân viên:\n"); for (int i = 0; i < numEmployees; i++) { printf("MNV: %d, HT: %s, Lương: %.2lf, Phòng: %s\n", employees[i].MNV, employees[i].HT, employees[i].LUONG, employees[i].PHONG); } } // Hàm để ghi kết quả vào tệp void writeResultToFile(struct Employee* employees, int numEmployees, const char* filename) { FILE* file = fopen(filename, "w"); if (file == NULL) { printf("Không thể mở tệp %s\n", filename); return; } fprintf(file, "%d\n", numEmployees); for (int i = 0; i < numEmployees; i++) { fprintf(file, "%d %s %.2lf %s\n", employees[i].MNV, employees[i].HT, employees[i].LUONG, employees[i].PHONG); } fclose(file); } int main() { // Đọc danh sách nhân viên từ tệp int numEmployees; struct Employee* employees = readEmployeeListFromFile("input.txt", &numEmployees); 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 calculateAverageSalary(employees, numEmployees); // In danh sách nhân viên theo thứ tự tăng dần của lương printEmployeeList(employees, numEmployees); // Ghi kết quả vào tệp writeResultToFile(employees, numEmployees, "output.txt"); // Giải phóng bộ nhớ đã cấp phát cho danh sách nhân viên free(employees); return 0; }