C语言学生信息管理系统:使用文件存储和结构体实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
// 定义表中的属性
typedef struct student {
char id[13]; // 学号 char类型12位
char name[33]; // 姓名 varchar类型32位
int gender; // 性别 小整形
char birthdate[11]; // 出生日期 date类型
char major[21]; // 专业 varchar二十位
student()
{
memset(id, 0, sizeof id);
memset(name, 0, sizeof name);
memset(birthdate, 0, sizeof birthdate);
memset(major, 0, sizeof major);
}
} Student;
// 保存所有学生的数组
Student students[MAX_STUDENT_NUM];//结构体类型的数组
// 当前学生数目
int studentCount = 0;
// 从文件中读取数据
void load() {
FILE* fp = fopen("students.dat", "rb");
if (fp == NULL) {
printf("当前文件为空,请输入数据后进行操作\n");
return;
}
fread(&studentCount, sizeof(int), 1, fp);
fread(students, sizeof(Student), studentCount, fp);
fclose(fp);
}
// 向文件中写入数据
void save() {
FILE* fp = fopen("students.dat", "wb");
if (fp == NULL) {
printf("无法打开文件\n");
return;
}
fwrite(&studentCount, sizeof(int), 1, fp);
fwrite(students, sizeof(Student), studentCount, fp);//学生的总个数*一个学生的字节大小;
fclose(fp);
}
// 插入新的学生记录
void insert() {
if (studentCount >= MAX_STUDENT_NUM) {
printf("学生数量已达到上限\n");
return;
}
Student student;
printf("请输入学号:");
scanf("%s", student.id);
// 判断学号是否已经存在
for (int i = 0; i < studentCount; i++) {
if (strcmp(students[i].id, student.id) == 0) {
printf("学号已存在,请重新输入\n");
return;
}
}
printf("请输入姓名:");
scanf("%s", student.name);
printf("请输入性别(0表示女,1表示男):");
scanf("%d", &student.gender);
printf("请输入出生日期(格式:yyyy-mm-dd):");
scanf("%s", student.birthdate);
printf("请输入专业:");
scanf("%s", student.major);
students[studentCount++] = student;
save();
printf("新学生记录已插入\n");
}
//在学生信息表中,学号是唯一的标识,我们可以将其设为主键。
// 显示所有学生记录
void list() {
printf("学号\t姓名\t性别\t出生日期\t专业\n");
for (int i = 0; i < studentCount; i++) {
Student student = students[i];
printf("%s\t%s\t%s\t%s\t%s\n", student.id, student.name,
student.gender == 0 ? "女" : "男",
student.birthdate, student.major);
}
}
// 清空所有学生记录
void clear() {
studentCount = 0;
save();
printf("所有学生记录已清空\n");
}
// 根据学号删除学生记录
void remove() {
char id[13];
printf("请输入学号:") ;scanf("%s" ,&id); int found = 0;
for (int i = 0; i < studentCount; i++) {
Student student = students[i];
if (strcmp(student.id, id) == 0) {
found = 1;
for (int j = i; j < studentCount - 1; j++) {
students[j] = students[j + 1];
}
studentCount--;
save();
printf("学号为%s的学生记录已删除" , id);
break;
}
}
if (!found) {
printf("未找到\n");
}
}
// 根据学号查询学生记录
void find() {
char id[13];
printf("请输入学号:");
scanf("%s", id);
for (int i = 0; i < studentCount; i++) {
Student student = students[i];
if (strcmp(student.id, id) == 0) {
printf("学号\t姓名\t性别\t出生日期\t专业\n");
printf("%s\t%s\t%s\t%s\t%s\n", student.id, student.name,
student.gender == 0 ? "女" : "男",
student.birthdate, student.major);
return;
}
}
printf("未找到学号为%s的学生记录\n", id);
}
int main() {
load();
while (1) {
printf("1. 插入新的学生记录\n");
printf("2. 显示所有学生记录\n");
printf("3. 删除学生记录\n");
printf("4. 根据学号查询学生记录\n");
printf("5. 退出\n");
printf("请选择操作:");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
insert();
break;
case 2:
list();
break;
case 3:
remove();
break;
case 4:
find();
break;
case 5:
save();
exit(0);
default:
printf("无效的操作\n");
break;
}
printf("\n");
}
return 0;
}
将插入函数的调用转化为类SQL语言操作内容:
INSERT INTO students (id, name, gender, birthdate, major) VALUES ('学号', '姓名', 性别, '出生日期', '专业');
解释:
INSERT INTO students:插入数据到名为students的表中。(id, name, gender, birthdate, major):指定要插入数据的列名。VALUES ('学号', '姓名', 性别, '出生日期', '专业'):指定要插入的值,对应着前面列名的顺序。
注意:
性别在 SQL 中应该用数字 0 或 1 来表示。- '学号'、'姓名'、'出生日期'、'专业' 需要替换成实际输入的值。
总结
这个 C语言 学生信息管理系统实现了基本的增删查改功能,并且用文件存储数据,方便数据持久化。将插入操作转化成类 SQL 语句可以帮助理解数据的结构和操作逻辑,也为后续的数据库开发打下基础。
原文地址: https://www.cveoy.top/t/topic/njBh 著作权归作者所有。请勿转载和采集!