C语言程序设计基础作业——参会人员管理系统

一、 课程设计目的
通过本课程设计,强化上机动手能力,使学生在理论和实践的基础上进一步巩固
《C 语言程序设计》课程学习的内容,掌握工程软件设计的基本方法。
学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
为后续各门计算机课程的学习打下坚实基础。
为毕业设计和以后工作打下必要基础。

二、课程设计内容

对参会人员进行信息收集和管理

三、需求分析
对所开发系统功能、性能的描述,想要实现的目标。
此系统可对该厂员工进行信息的录入,修改,删除,添加,查询,排序,统计,
打印等功能。用户可通过提示选择进入某一功能界面,然后进行对员工的信息管
理。每一功能模块都充分为用户考虑,编排详细。使用户可以方便快捷的了解员
工信息,及时有效的对员工进行信息的管理。

2.功能模块说明
对各个模块进行功能的描述。
录入模块:输入该厂现有员工信息并保存与文件中,方便日后进行排序,更
新,统计,打印等操作。
输出模块:将所有员工信息,或所需员工信息输出于屏幕上,用于打印或查
询员工信息。
删除模块:对已退休或离开该厂的员工进行删除操作。
添加模块:添加新入厂的员工信息并保存起来。
修改模块:找到该员工并,选择所要修改的选项。
排序模块:本程序只对员工录入顺序进行排序
查询模块:此模块分为按姓名查询

五、参会人员系统代码

#include <stdio.h>
#include <stdlib.h>

// 定义一个常量字符串变量 file_name,存储数据文件的名称
const char *file_name = "student_data.dat";

// 定义输出格式
#define output_format "%10s%4d%4d%7.2lf"

// 定义结构体 People,存储详细信息
typedef struct People {
    long offset;        
    char name[20];      
    int age;            
    int department;    
    double number;      
} People;

// 定义最大数量为10000的数组和一个计数变量
#define MAX_N 10000
People stus[MAX_N + 5];
int scnt;

// 从文件读取数据到数组中
int read_from_file(People *arr) {
    int i = 0;
    FILE *fp = fopen(file_name, "rb"); // 打开文件以二进制读取模式
    if (fp == NULL) return 0;
    while (1) {
        long offset = ftell(fp); // 获取当前文件指针位置
        if (fread(arr + i, sizeof(People), 1, fp) == 0) break; // 读取数据到数组,如果读取失败则退出循环
        arr[i].offset = offset; 
        i += 1; 
    }
    fclose(fp); 
    return i; 
}

// 将数组中的数据追加写入文件
long output_to_file(People *arr, int n) {
    FILE *fp = fopen(file_name, "ab"); 
    fseek(fp, 0, SEEK_END); // 移动文件指针到文件末尾
    long offset = ftell(fp); // 获取当前文件指针位置
    fwrite(arr, sizeof(People), n, fp); 
    fclose(fp); 
    return offset; // 返回文件指针位置
}

// 清空文件内容
void clear_file() {
    FILE *fp = fopen(file_name, "w"); // 打开文件以写模式
    fclose(fp); 
    return ;
}

// 将数组中的数据重新写入文件
void restor_data_to_file(People *arr, int n) {
    clear_file(); 
    output_to_file(arr, n); // 将数据写入文件
    return ;
}

// 列出所有成员的信息
void list_people() {
    int len = printf("%4s|%10s|%4s|%6s|%7s|",
        "id", "name", "age", "department", "number"
    ); // 打印表头
    printf("\n");
    for (int i = 0; i < len; i++) printf("="); // 打印表头下的分隔线
    printf("\n");
    for (int i = 0; i < scnt; i++) {
        printf("%4d|%10s|%4d|%6d|%7.2lf|\n", 
            i, stus[i].name,
            stus[i].age, stus[i].department,
            stus[i].number
        ); 
    }
    return ;
}

// 添加一个新的学生
void add_a_person() {
    printf("add new item : (name, age, department, number)\n");
    printf("mysql > ");
    // 从用户输入获取成员信息
    scanf("%s%d%d%lf", 
        stus[scnt].name, 
        &stus[scnt].age,
        &stus[scnt].department,
        &stus[scnt].number
    );
    // 将新成员的信息写入文件
    stus[scnt].offset = output_to_file(stus + scnt, 1);
    scnt += 1; 
    printf("add a new person success\n");
    return ;
}

// 修改文件中的某条成员记录
void modify_data_to_file(People *stu) {
    FILE *fp = fopen(file_name, "rb+"); // 打开文件以读写模式
    fseek(fp, stu->offset, SEEK_SET); // 移动文件指针到要修改的记录位置
    fwrite(stu, sizeof(People), 1, fp); // 写入修改后的记录
    fclose(fp); // 关闭文件
    return ;
}

// 修改一个成员的信息
void modify_a_person() {
    list_people(); // 列出所有成员的信息
    int id;
    do {
        printf("modify id : ");
        scanf("%d", &id); // 要修改的成员ID
    } while (id < 0 || id >= scnt); // 确保输入的ID有效
    printf("modify a item : (name, age, department, number)\n");
    printf("mysql > ");
    // 获取修改后的成员信息
    scanf("%s%d%d%lf", 
        stus[id].name, 
        &stus[id].age,
        &stus[id].department,
        &stus[id].number
        );
    // 将修改后的信息写入文件
    modify_data_to_file(stus + id);
    return ;
}

// 删除一个学生的信息
void delete_a_person() {
    if (scnt == 0) {
        printf("there is no people\n"); // 如果没有成员信息,提示用户
        return ;
    }
    list_people(); // 列出所有成员的信息
    int id;
    do {
        printf("delete id : ");
        scanf("%d", &id); // 获取要删除的学生ID
    } while (id < 0 || id >= scnt); 
    char s[100];
    printf("confim (y / n) : ");
    fflush(stdin); // 清空输入缓冲区
    scanf("%[^\n]", s); // 获取确认输入
    if (s[0] != 'y') return ; 
    
    // 将删除后的学生信息往前移动
    for (int i = id + 1; i < scnt; i++) {
        long offset = stus[i - 1].offset;
        stus[i - 1] = stus[i];
        stus[i - 1].offset = offset;
    }
    scnt -= 1; 
    restor_data_to_file(stus, scnt); // 将修改后的数据重新写入文件
    return ;
}

// 枚举类型
enum NO_TYPE {
    LIST = 1, 
    ADD,      
    MODIFY,   
    DELETE,   
    QUIT      
};

// 显示操作菜单
int usage() {
    int no;
    do {
        printf("%d : list people\n", LIST);
        printf("%d : add a new person\n", ADD);
        printf("%d : modify a person\n", MODIFY);
        printf("%d : delete a person\n", DELETE);
        printf("%d : quit\n", QUIT);
        printf("mysql > ");
        scanf("%d", &no); // 获取用户选择的操作
    } while (no < LIST || no > QUIT); // 确保选择有效
    return no;
}

// 主函数
int main() {
    scnt = read_from_file(stus); // 从文件读取数据
    while (1) {
        int no = usage(); // 显示操作菜单并获取选择
        switch (no) {
            case LIST: {
                list_people(); 
            } break;
            case ADD: {
                add_a_person(); 
            } break;
            case MODIFY: {
                modify_a_person(); 
            } break;
            case DELETE: {
                delete_a_person(); 
            } break;
            case QUIT: printf("quit\n"); exit(0); 
        }
    }
    return 0;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值