用C语言设计一个职工文件emp.dat,每个职工记录包含职工号(no)、姓名(name)、部门号(depno)和工资(salary)信息。设计一个程序完成以下功能: (1)按照工资salary对所有职工记录进行递减排序。(*)
时间: 2024-10-23 16:02:14 浏览: 39
在C语言中,为了设计一个职工文件(emp.dat)并实现按照工资(salary)对职工记录进行递减排序的功能,我们可以采用以下步骤:
1. 首先,创建一个结构体来表示职工记录,包括职工号、姓名、部门号和工资等字段:
```c
typedef struct {
int no; // 职工号
char name[50]; // 姓名
int depno; // 部门号
float salary; // 工资
} Employee;
```
2. 定义一个函数来读取文件中的数据,并存储到Employee类型的数组中,假设我们有一个打开的文件指针`fp`:
```c
void readEmployees(Employee employees[], int num) {
for (int i = 0; i < num; ++i) {
fscanf(fp, "%d %s %d %.2f", &employees[i].no, employees[i].name, &employees[i].depno, &employees[i].salary);
}
}
```
3. 创建一个函数来对职工记录数组进行降序排序,这里可以使用快速排序或其他高效的排序算法,例如选择使用冒泡排序示例:
```c
void sortEmployeesDesc(Employee employees[], int n) {
quicksort(employees, 0, n - 1, compareSalaries);
}
// 比较函数,用于工资降序排列
int compareSalaries(const void *a, const void *b) {
const Employee *e1 = a;
const Employee *e2 = b;
return e2->salary - e1->salary; // 返回负数表示e1比e2薪水低,将进行交换
}
```
4. 最后,编写一个主函数来完成整个操作,包括打开文件、读取数据、排序以及关闭文件:
```c
#include <stdio.h>
int main() {
FILE *fp = fopen("emp.dat", "r"); // 打开文件
if (!fp) {
printf("Failed to open file.\n");
return 1;
}
Employee employees[100]; // 假设最多有100条记录
int num Employees;
// 读取文件数据
readEmployees(employees, &num);
// 对员工按工资降序排序
sortEmployeesDesc(employees, num);
// 输出排序后的结果
for (int i = 0; i < num; ++i) {
printf("%d %s, %d, %.2f\n", employees[i].no, employees[i].name, employees[i].depno, employees[i].salary);
}
fclose(fp); // 关闭文件
return 0;
}
```
请注意,上述代码仅作为基本示例,实际应用中可能需要处理更复杂的错误情况,并考虑文件的大小和内存管理。
阅读全文