void add() //信息录入函数 { FILE *fp=NULL; //文件指针 int i,j; char cc[20]; for(i=0;i<N;i++) { if(*a[i].num!='\0') continue; else { printf("\n添加第%d辆公交车路线记录:\n",i+1); printf("\n请输入路线编码(3位编码,第一位为大写字母,后两位为数字):\n"); //路线编码 scanf("%s",cc); for(j=0;j<N;j++) //检验是否重复 if(strcmp(a[j].num,cc)==0) { printf("\n与已有路线编码重复,按回车键返回!!!\n"); fflush(stdin); //清除键盘缓冲区 getchar(); system("cls"); return; } strcpy(a[i].num,cc); printf("\n请输入司机姓名: "); //司机姓名 scanf("%s",a[i].name); printf("\n请输入途经站台总数(>=2): "); //站台总数 scanf("%d",&a[i].n); printf("\n"); —————
时间: 2024-04-28 07:20:27 浏览: 57
这段代码是一个信息录入函数,用于添加公交车路线记录。函数中使用文件指针fp来操作文件,利用一个for循环来录入信息。其中,如果a[i].num不为空,则跳过,否则就录入信息。录入信息包括路线编码、司机姓名、途经站台总数等,其中路线编码需要检测是否与已有路线编码重复。如果重复,则会提示用户按回车键返回,否则将信息保存在结构体数组a中。
相关问题
用所学过的C语言,以及链表相关知识,实现一个航班信息的录入、查询、显示、排序等功能。 航班信息节点设计,请参见附录。 2、 基本功能: 1) 录入航班信息(可以直接从键盘录入,也可通过文件存储) 2) 显示所有航班信息 3) 按照查询要求(比如日期、地点等),列出相关的航班信息。 3、 扩展要求: 1) 对录入的信息进行排序,给用户提供几种选择(比如按起飞时间排序、按起飞地址排序、票价等) 2) 能够将录入的信息存入本地,程序下次启动自动读取日志文件,从而获取上次运行的数据。
实现以上功能的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义航班信息结构体
typedef struct flight_info {
char date[20]; // 起飞日期
char time[20]; // 起飞时间
char from[50]; // 起飞地点
char to[50]; // 目的地
int price; // 票价
struct flight_info *next; // 指向下一个航班信息节点的指针
} FlightInfo;
// 定义全局变量,指向航班信息链表的头节点
FlightInfo *head = NULL;
// 函数声明
void add_flight_info();
void show_all_flight_info();
void search_flight_info();
void sort_flight_info();
void save_flight_info();
void load_flight_info();
int main() {
int choice;
do {
printf("\n1. 录入航班信息\n");
printf("2. 显示所有航班信息\n");
printf("3. 搜索航班信息\n");
printf("4. 排序航班信息\n");
printf("5. 保存航班信息到文件\n");
printf("6. 从文件加载航班信息\n");
printf("0. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_flight_info();
break;
case 2:
show_all_flight_info();
break;
case 3:
search_flight_info();
break;
case 4:
sort_flight_info();
break;
case 5:
save_flight_info();
break;
case 6:
load_flight_info();
break;
case 0:
printf("\n程序已退出。\n");
break;
default:
printf("\n输入的操作选择不正确,请重新输入。\n");
break;
}
} while (choice != 0);
return 0;
}
// 添加航班信息
void add_flight_info() {
printf("\n请输入航班信息:\n");
// 创建新节点
FlightInfo *new_node = (FlightInfo*)malloc(sizeof(FlightInfo));
printf("起飞日期(格式:yyyy-mm-dd):");
scanf("%s", new_node->date);
printf("起飞时间(格式:hh:mm):");
scanf("%s", new_node->time);
printf("起飞地点:");
scanf("%s", new_node->from);
printf("目的地:");
scanf("%s", new_node->to);
printf("票价:");
scanf("%d", &new_node->price);
new_node->next = NULL;
// 添加节点到链表
if (head == NULL) {
head = new_node;
} else {
FlightInfo *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
printf("航班信息添加成功。\n");
}
// 显示所有航班信息
void show_all_flight_info() {
if (head == NULL) {
printf("没有航班信息可供显示。\n");
} else {
printf("\n所有航班信息:\n");
printf("日期\t\t时间\t\t起飞地点\t目的地\t票价\n");
FlightInfo *p = head;
while (p != NULL) {
printf("%s\t%s\t%s\t\t%s\t%d\n", p->date, p->time, p->from, p->to, p->price);
p = p->next;
}
}
}
// 搜索航班信息
void search_flight_info() {
char query[50];
printf("\n请输入查询关键字:");
scanf("%s", query);
printf("\n查询结果:\n");
printf("日期\t\t时间\t\t起飞地点\t目的地\t票价\n");
FlightInfo *p = head;
while (p != NULL) {
if (strstr(p->date, query) != NULL || strstr(p->time, query) != NULL ||
strstr(p->from, query) != NULL || strstr(p->to, query) != NULL) {
printf("%s\t%s\t%s\t\t%s\t%d\n", p->date, p->time, p->from, p->to, p->price);
}
p = p->next;
}
}
// 排序航班信息
void sort_flight_info() {
int choice;
printf("\n请选择排序方式:\n");
printf("1. 按起飞时间排序\n");
printf("2. 按起飞地址排序\n");
printf("3. 按票价排序\n");
printf("请选择排序方式:");
scanf("%d", &choice);
switch (choice) {
case 1: {
// 按起飞时间排序
FlightInfo *p, *q, *tail = NULL;
while (head != tail) {
for (p = head; p->next != tail; p = p->next) {
q = p->next;
if (strcmp(p->time, q->time) > 0) {
// 交换两个节点
char temp_date[20], temp_time[20], temp_from[50], temp_to[50];
int temp_price;
strcpy(temp_date, p->date);
strcpy(temp_time, p->time);
strcpy(temp_from, p->from);
strcpy(temp_to, p->to);
temp_price = p->price;
strcpy(p->date, q->date);
strcpy(p->time, q->time);
strcpy(p->from, q->from);
strcpy(p->to, q->to);
p->price = q->price;
strcpy(q->date, temp_date);
strcpy(q->time, temp_time);
strcpy(q->from, temp_from);
strcpy(q->to, temp_to);
q->price = temp_price;
}
}
tail = p;
}
printf("\n按起飞时间排序后的航班信息:\n");
show_all_flight_info();
break;
}
case 2: {
// 按起飞地址排序
FlightInfo *p, *q, *tail = NULL;
while (head != tail) {
for (p = head; p->next != tail; p = p->next) {
q = p->next;
if (strcmp(p->from, q->from) > 0) {
// 交换两个节点
char temp_date[20], temp_time[20], temp_from[50], temp_to[50];
int temp_price;
strcpy(temp_date, p->date);
strcpy(temp_time, p->time);
strcpy(temp_from, p->from);
strcpy(temp_to, p->to);
temp_price = p->price;
strcpy(p->date, q->date);
strcpy(p->time, q->time);
strcpy(p->from, q->from);
strcpy(p->to, q->to);
p->price = q->price;
strcpy(q->date, temp_date);
strcpy(q->time, temp_time);
strcpy(q->from, temp_from);
strcpy(q->to, temp_to);
q->price = temp_price;
}
}
tail = p;
}
printf("\n按起飞地址排序后的航班信息:\n");
show_all_flight_info();
break;
}
case 3: {
// 按票价排序
FlightInfo *p, *q, *tail = NULL;
while (head != tail) {
for (p = head; p->next != tail; p = p->next) {
q = p->next;
if (p->price > q->price) {
// 交换两个节点
char temp_date[20], temp_time[20], temp_from[50], temp_to[50];
int temp_price;
strcpy(temp_date, p->date);
strcpy(temp_time, p->time);
strcpy(temp_from, p->from);
strcpy(temp_to, p->to);
temp_price = p->price;
strcpy(p->date, q->date);
strcpy(p->time, q->time);
strcpy(p->from, q->from);
strcpy(p->to, q->to);
p->price = q->price;
strcpy(q->date, temp_date);
strcpy(q->time, temp_time);
strcpy(q->from, temp_from);
strcpy(q->to, temp_to);
q->price = temp_price;
}
}
tail = p;
}
printf("\n按票价排序后的航班信息:\n");
show_all_flight_info();
break;
}
default:
printf("\n输入的操作选择不正确,请重新输入。\n");
break;
}
}
// 保存航班信息到文件
void save_flight_info() {
char filename[50];
printf("\n请输入要保存的文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
FlightInfo *p = head;
while (p != NULL) {
fprintf(fp, "%s %s %s %s %d\n", p->date, p->time, p->from, p->to, p->price);
p = p->next;
}
fclose(fp);
printf("航班信息已保存到文件:%s\n", filename);
}
// 从文件加载航班信息
void load_flight_info() {
char filename[50];
printf("\n请输入要加载的文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
head = NULL;
while (!feof(fp)) {
// 创建新节点
FlightInfo *new_node = (FlightInfo*)malloc(sizeof(FlightInfo));
fscanf(fp, "%s %s %s %s %d\n", new_node->date, new_node->time, new_node->from, new_node->to, &new_node->price);
new_node->next = NULL;
// 添加节点到链表
if (head == NULL) {
head = new_node;
} else {
FlightInfo *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
}
fclose(fp);
printf("航班信息已从文件:%s 加载完毕。\n", filename);
}
```
附录:航班信息节点设计
```
typedef struct flight_info {
char date[20]; // 起飞日期
char time[20]; // 起飞时间
char from[50]; // 起飞地点
char to[50]; // 目的地
int price; // 票价
struct flight_info *next; // 指向下一个航班信息节点的指针
} FlightInfo;
```
使用c语言编写一个企业员工信息管理系统并满足以下要求1. 录入员工信息:从键盘录入表示员工信息的结构体数组各项数据,并将结构 体数组的内容写入表示员工信息的文件中。 2. 更新员工信息:可以实现多次向数据文件追加员工记录的功能,添加完毕后 返回主菜单;能够实现根据员工工号删除文件中员工信息的操作,且可多次删除 记录;可以实现根据员工工号修改员工信息的功能,其中员工信息包括:工号、 姓名、年龄、工作、性别、地址、电话、入职时间,并将最终数据存储到文件中。 3. 查询员工信息:可分别根据姓名、年龄、工作对员工信息进行查询。 4. 排列员工信息:可根据年龄从小到大的顺序对员工信息进行排序。 5. 统计员工信息:能够根据员工的年龄、工作和性别统计显示满足要求的所有 员工信息。 6. 输出员工信息:将员工信息文件中的数据输出到显示器上。 7. 实现输入数字 0 则退出管理系统。
以下是一个简单的企业员工信息管理系统的 C 语言实现,具体实现细节可以根据需求进行修改和完善:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_EMPLOYEES 100 // 最大员工数量
#define MAX_NAME_LEN 20 // 姓名最大长度
#define MAX_WORK_LEN 30 // 工作最大长度
#define MAX_ADDR_LEN 50 // 地址最大长度
#define MAX_PHONE_LEN 15 // 电话最大长度
#define FILE_NAME "employees.dat" // 员工信息文件名
// 定义员工信息结构体
typedef struct {
int id; // 工号
char name[MAX_NAME_LEN]; // 姓名
int age; // 年龄
char work[MAX_WORK_LEN]; // 工作
char sex[5]; // 性别
char addr[MAX_ADDR_LEN]; // 地址
char phone[MAX_PHONE_LEN]; // 电话
char start_date[20]; // 入职时间
} employee;
// 函数声明
void print_menu();
void add_employee(employee *employees, int *count);
void update_employee(employee *employees, int *count);
void delete_employee(employee *employees, int *count);
void query_employee(employee *employees, int count);
void sort_employee(employee *employees, int count);
void stats_employee(employee *employees, int count);
void print_employee(employee emp);
void print_all_employee(employee *employees, int count);
void save_employees_to_file(employee *employees, int count);
void load_employees_from_file(employee *employees, int *count);
// 主函数
int main() {
employee employees[MAX_EMPLOYEES]; // 员工数组
int count = 0; // 员工数量
load_employees_from_file(employees, &count); // 从文件中读取员工信息
int choice = -1; // 用户选择菜单项
while (choice != 0) {
print_menu(); // 打印菜单项
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_employee(employees, &count);
break;
case 2:
update_employee(employees, &count);
break;
case 3:
delete_employee(employees, &count);
break;
case 4:
query_employee(employees, count);
break;
case 5:
sort_employee(employees, count);
break;
case 6:
stats_employee(employees, count);
break;
case 7:
print_all_employee(employees, count);
break;
case 0:
save_employees_to_file(employees, count); // 将员工信息写入文件
printf("谢谢使用,再见!\n");
break;
default:
printf("无效选项,请重新输入!\n");
break;
}
}
return 0;
}
// 打印菜单项
void print_menu() {
printf("员工信息管理系统\n");
printf("1. 录入员工信息\n");
printf("2. 更新员工信息\n");
printf("3. 删除员工信息\n");
printf("4. 查询员工信息\n");
printf("5. 排列员工信息\n");
printf("6. 统计员工信息\n");
printf("7. 输出员工信息\n");
printf("0. 退出\n");
}
// 录入员工信息
void add_employee(employee *employees, int *count) {
if (*count >= MAX_EMPLOYEES) {
printf("员工数量已达到上限,无法继续添加!\n");
return;
}
employee emp;
printf("请输入员工信息:\n");
printf("工号:");
scanf("%d", &(emp.id));
printf("姓名:");
scanf("%s", emp.name);
printf("年龄:");
scanf("%d", &(emp.age));
printf("工作:");
scanf("%s", emp.work);
printf("性别:");
scanf("%s", emp.sex);
printf("地址:");
scanf("%s", emp.addr);
printf("电话:");
scanf("%s", emp.phone);
printf("入职时间:");
scanf("%s", emp.start_date);
employees[*count] = emp;
(*count)++;
printf("员工信息已添加!\n");
}
// 更新员工信息
void update_employee(employee *employees, int *count) {
int id;
printf("请输入要修改的员工工号:");
scanf("%d", &id);
for (int i = 0; i < *count; i++) {
if (employees[i].id == id) {
employee emp;
printf("请输入新的员工信息:\n");
printf("姓名:");
scanf("%s", emp.name);
printf("年龄:");
scanf("%d", &(emp.age));
printf("工作:");
scanf("%s", emp.work);
printf("性别:");
scanf("%s", emp.sex);
printf("地址:");
scanf("%s", emp.addr);
printf("电话:");
scanf("%s", emp.phone);
printf("入职时间:");
scanf("%s", emp.start_date);
employees[i] = emp;
printf("员工信息已修改!\n");
return;
}
}
printf("未找到工号为 %d 的员工信息!\n", id);
}
// 删除员工信息
void delete_employee(employee *employees, int *count) {
int id;
printf("请输入要删除的员工工号:");
scanf("%d", &id);
for (int i = 0; i < *count; i++) {
if (employees[i].id == id) {
for (int j = i; j < *count - 1; j++) {
employees[j] = employees[j + 1];
}
(*count)--;
printf("员工信息已删除!\n");
return;
}
}
printf("未找到工号为 %d 的员工信息!\n", id);
}
// 查询员工信息
void query_employee(employee *employees, int count) {
int choice;
printf("请选择查询方式:\n");
printf("1. 按姓名查询\n");
printf("2. 按年龄查询\n");
printf("3. 按工作查询\n");
printf("请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
char name[MAX_NAME_LEN];
printf("请输入员工姓名:");
scanf("%s", name);
for (int i = 0; i < count; i++) {
if (strcmp(employees[i].name, name) == 0) {
print_employee(employees[i]);
}
}
break;
case 2:
int min_age, max_age;
printf("请输入员工年龄范围(最小年龄 最大年龄):");
scanf("%d %d", &min_age, &max_age);
for (int i = 0; i < count; i++) {
if (employees[i].age >= min_age && employees[i].age <= max_age) {
print_employee(employees[i]);
}
}
break;
case 3:
char work[MAX_WORK_LEN];
printf("请输入员工工作:");
scanf("%s", work);
for (int i = 0; i < count; i++) {
if (strcmp(employees[i].work, work) == 0) {
print_employee(employees[i]);
}
}
break;
default:
printf("无效选项,请重新输入!\n");
break;
}
}
// 排列员工信息
void sort_employee(employee *employees, int count) {
for (int i = 0; i < count - 1; i++) {
for (int j = 0; j < count - i - 1; j++) {
if (employees[j].age > employees[j + 1].age) {
employee temp = employees[j];
employees[j] = employees[j + 1];
employees[j + 1] = temp;
}
}
}
printf("员工信息已排列!\n");
}
// 统计员工信息
void stats_employee(employee *employees, int count) {
int age, sex;
char work[MAX_WORK_LEN];
printf("请输入员工信息统计条件:\n");
printf("年龄(-1 表示不限):");
scanf("%d", &age);
printf("性别(0 表示女,1 表示男,-1 表示不限):");
scanf("%d", &sex);
printf("工作(空格表示不限):");
scanf("%s", work);
int total = 0;
for (int i = 0; i < count; i++) {
if ((age == -1 || employees[i].age == age) &&
(sex == -1 || strcmp(employees[i].sex, sex == 0 ? "女" : "男") == 0) &&
(strcmp(work, "") == 0 || strcmp(employees[i].work, work) == 0)) {
total++;
}
}
printf("符合条件的员工数量为:%d\n", total);
}
// 输出单个员工信息
void print_employee(employee emp) {
printf("工号:%d,姓名:%s,年龄:%d,工作:%s,性别:%s,地址:%s,电话:%s,入职时间:%s\n",
emp.id, emp.name, emp.age, emp.work, emp.sex, emp.addr, emp.phone, emp.start_date);
}
// 输出所有员工信息
void print_all_employee(employee *employees, int count) {
for (int i = 0; i < count; i++) {
print_employee(employees[i]);
}
}
// 将员工信息写入文件
void save_employees_to_file(employee *employees, int count) {
FILE *fp = fopen(FILE_NAME, "wb");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fwrite(&count, sizeof(int), 1, fp);
fwrite(employees, sizeof(employee), count, fp);
fclose(fp);
printf("员工信息已保存到文件!\n");
}
// 从文件中读取员工信息
void load_employees_from_file(employee *employees, int *count) {
FILE *fp = fopen(FILE_NAME, "rb");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fread(count, sizeof(int), 1, fp);
fread(employees, sizeof(employee), *count, fp);
fclose(fp);
printf("已加载员工信息文件!\n");
}
```
注意事项:
- 为了方便管理,我们将员工信息保存在一个文件(`employees.dat`)中,程序启动时会从文件中读取员工信息,程序退出时会将员工信息写入文件。
- 由于使用了结构体数组来保存员工信息,因此需要传递指向员工数组的指针和当前员工数量的指针。
- 在查询员工信息时,我们提供了三种查询方式:按姓名查询、按年龄查询、按工作查询。其中,按年龄查询时用户需要输入年龄范围,按性别查询时用户需要输入 0 表示女、1 表示男、-1 表示不限。
- 在统计员工信息时,用户需要输入统计条件,包括年龄、性别、工作,其中年龄和性别可以输入 -1 表示不限,工作可以输入空格表示不限。
- 在保存员工信息到文件时,我们先将员工数量写入文件,然后再将员工数组写入文件。在读取员工信息时,我们先读取员工数量,然后再读取员工数组。
阅读全文