#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
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;
}
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);
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");
}
}
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;
}
}
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);
}
}
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);
}
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;
}
calculateAverageSalaryByDepartment(employees, n);
printEmployeeList(employees, n);
saveResultToFile(employees, n);
freeEmployeeList(employees);
return 0;
}