#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 语句可以帮助理解数据的结构和操作逻辑,也为后续的数据库开发打下基础。

C语言学生信息管理系统:使用文件存储和结构体实现

原文地址: https://www.cveoy.top/t/topic/njBh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录