avatar
Untitled

Guest 743 20th May, 2023

#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;

// 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;
}
Description

No description

To share this paste please copy this url and send to your friends
RAW Paste Data