一、 课程设计目的
通过本课程设计,强化上机动手能力,使学生在理论和实践的基础上进一步巩固
《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;
}