C语言实现学生管理系统

1. 项目介绍

1.1 功能

该项目是一个简易的学生管理系统,实现了“添加学生”,“删除学生”,“查询学生基础信息”,“查询学生所选课程”,“学生选课”,“可选课程管理”等功能。

要求:

①学生信息包括 学号,姓名,班级,所选课程 四个信息; 课程包括 课程名,地点,时间 三个信息,要求学生选课只能从已有课程中选且不重复

②将学生信息持久化存储到文件中,要求对原始信息加密处理

③(进阶) 对②中存储信息的文件进行读取和解析,并在控制台打印

④(进阶) 自定义一个异常处理类,能够在 添加学生时输入信息不合法、选课重复 时抛出异常提示用户

1.2 采用的数据结构

学生列表和课程列表都采用的的顺序表结构。

1.3 项目组成

1.3.1 头文件部分

1. Secret.h -> 包含加密解密函数的声明,加密解密算法采用Base64算法,对于该部分我有一篇文章进行过详细介绍利用Base64加密算法将数据加密解密-CSDN博客

2. Stusystem.h -> 包含各种结构体,顺序表,以及函数的声明。

1.3.2 源文件部分

1. CourseControl.c -> 包含与课程管理有关函数的实现。

2. Secret.c -> 包含加密解密函数的实现。

3. Student_course.c -> 包含与学生选课退课。

4. StudentControl.c -> 包含与学生管理有关函数的实现。

1.3.3 资源文件部分

1. Course_tmp.txt -> 用于临时存放未加密的课程信息。

2. CourseInformation.txt -> 用于存放加密后的课程信息。

3. Student_tmp.txt -> 用于临时存放未加密的学生信息。

4. StudentInformation.txt -> 用于存放加密后的学生信息。

并在Secret.h中有如下定义:

#define StuTmp "Student_tmp.txt"
#define StuInfo "StudentInformation.txt"
#define CouTmp "Course_tmp.txt"
#define CouInfo "CourseInformation.txt"

2. 源码

2.1 头文件

2.1.1 Secret.h

#pragma once
#define StuTmp "Student_tmp.txt"
#define StuInfo "StudentInformation.txt"
#define CouTmp "Course_tmp.txt"
#define CouInfo "CourseInformation.txt"

//加密函数
void Into_Base64(const char dest[], const char src[]);//目标文件,源文件
//解密函数
void Out_Base64(const char dest[], const char src[]);//目标文件,源文件

2.1.2 StuSystem.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define ID_MAX 20//学号长度
#define NAME_MAX_STU 20//学生姓名长度
#define CLASS_MAX 5//班级编号长度
#define COURSE_MAX 10//学生最多可选课程数量
#define NAME_MAX_COURSE 20//课程名长度
#define ADDERSS_MAX 20//上课地址长度
#define TIME_MAX 7//某课程的上课时间段数

typedef struct Student//学生
{
	char ID[ID_MAX];//学号
	char name[NAME_MAX_STU];//姓名
	char class[CLASS_MAX];//班级
	int size;//已选课程节数
	int course[COURSE_MAX];//选课序号
}Stu;

typedef struct SeqListStu//学生花名册
{
	Stu* data;
	int size;
	int capacity;
}Roster;

typedef struct Time//课程时间
{
	int week;//1, 2, 3, 4, 5, 6, 7
	int begin;//
	int end;//
}Time;

typedef struct Course//课程
{
	int ID;
	char name[NAME_MAX_COURSE];//课程名
	char address[ADDERSS_MAX];//上课地址
	int frequency;
	Time time[TIME_MAX];//时间
}Cou;

typedef struct SeqListCou//课程列表
{
	Cou* data;
	int size;
	int capacity;
}Curriculum;

//初始化花名册
void InitRoster(Roster* ps);
//销毁花名册
void DestroyRoster(Roster* ps);
//检查花名册是否需要扩容
void RosterCapacityCheck(Roster* ps);
//增加学生
void AddStudent(Roster* ps);
//查询学生信息
void StuInfoSearch(Roster* ps);
//删除学生
void DelStudent(Roster* ps);


//查询学生所选课程
void StuCourseSearch(Roster* ps, Curriculum* pc);
//学生选课
void StuSelectCourse(Roster* ps, Curriculum* pc);



//初始化课程列表
void InitCurriculum(Curriculum* ps);
//检查课程列表是否需要扩容
void CurricCapacityCheck(Curriculum* ps);
//销毁课程列表
void DestroyCurriculum(Curriculum* ps);
//可选课程管理
void CourseControl(Curriculum* ps);
//添加课程
void AddCourse(Curriculum* ps);
//查看已有课程
void PrintCourse(Curriculum* ps);
//删除课程
void DelCourse(Curriculum* ps);

2.2 源文件

2.2.1 CourseControl.c

#define _CRT_SECURE_NO_WARNINGS
//管理课程,负责课程的增加,查找,修改等
#include "StuSystem.h"
#include "Secret.h"

void InitCurriculum(Curriculum* ps)
{
	assert(ps);
	ps->data = NULL;
	ps->size = 0;
	ps->capacity = 0;
	CurricCapacityCheck(ps);
	Out_Base64(CouTmp, CouInfo);

	FILE* ct = fopen(CouTmp, "r");
	if (ct == NULL)
	{
		perror("InitCurriculum fail:");
		exit(-1);
	}
	int i = 0;
	while (fscanf(ct, "%d %s %s %d ", &(ps->data[i].ID), ps->data[i].name, ps->data[i].address, &(ps->data[i].frequency)) != EOF)
	{
		for (int j = 0; j < ps->data[i].frequency; j++)
		{
			fscanf(ct, "%d %d %d ", &(ps->data[i].time[j].week), &(ps->data[i].time[j].begin), &(ps->data[i].time[j].end));
		}

		ps->size++;
		CurricCapacityCheck(ps);
		i++;
	}
	fclose(ct);
}

void CurricCapacityCheck(Curriculum* ps)
{
	assert(ps);
	int newcapacity = ps->capacity == 0? 16 : ps->capacity + 16;
	Cou* tmp = (Cou*)realloc(ps->data, sizeof(Cou) * newcapacity);
	if (tmp == NULL)
	{
		perror("realloc fail:\n");
		exit(-1);
	}

	ps->data = tmp;
	ps->capacity = newcapacity;
}

void DestroyCurriculum(Curriculum* ps)
{
	assert(ps);
	FILE* pf = fopen(CouTmp, "w");
	if (pf == NULL)
	{
		perror("DestroyCurriculum:");
		exit(-1);
	}
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		fprintf(pf, "%d %s %s %d ", ps->data[i].ID, ps->data[i].name, ps->data[i].address, ps->data[i].frequency);
		for (int j = 0; j < ps->data[i].frequency; j++)
		{
			fprintf(pf, "%d %d %d ", ps->data[i].time[j].week, ps->data[i].time[j].begin, ps->data[i].time[j].end);
		}

	}
	fclose(pf);

	Into_Base64(CouInfo, CouTmp);//加密
	FILE* pe = fopen(CouTmp, "w");//清空临时文件内容
	if (pe == NULL)
	{
		perror("DestroyCurriculum:");
		exit(-1);
	}
	fclose(pe);

	free(ps->data);
	ps->size = 0;
	ps->capacity = 0;
}

void CouControl_menu()
{
	printf("||=============课程管理系统=============||\n");
	printf("||------------- 1.添加课程 -------------||\n");
	printf("||------------- 2.删除课程 -------------||\n");
	printf("||----------- 3.查看已有课程 -----------||\n");
	printf("||--------------- 0.返回 ---------------||\n");
}

void CourseControl(Curriculum* ps)
{
	assert(ps);
	fflush(stdin); system("cls");
	int input = 0;
	do
	{
		CouControl_menu();
		printf("请选择:>");
		fflush(stdin);
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddCourse(ps);
			break;
		case 2:
			DelCourse(ps);
			break;
		case 3:
			PrintCourse(ps);
			system("pause"); fflush(stdin); system("cls");
			break;
		case 0:
			printf("即将返回!");
			system("pause"); fflush(stdin); system("cls");
			break;
		default:
			printf("输入错误,请重新输入!");
			system("pause"); fflush(stdin); system("cls");
			break;
		}
	} while (input);
}

void AddCourse(Curriculum* ps)
{
	assert(ps);
	printf("请输入课程编号:>");
	scanf("%d", &(ps->data[ps->size].ID));
	printf("请输入课程名称:>");
	scanf("%s", ps->data[ps->size].name);
	printf("请输入上课地址:>");
	scanf("%s", ps->data[ps->size].address);
	printf("请输入一周中该课程的节数:>");
	scanf("%d", &(ps->data[ps->size].frequency));
	int i = 0;
	for (i = 0; i < ps->data[ps->size].frequency; i++)
	{
		printf("请输入第%d节课在周几:", i + 1);
		getchar();
		scanf("%d", &(ps->data[ps->size].time[i].week));
		printf("第几节开始(可选1到11):>");
		scanf("%d", &(ps->data[ps->size].time[i].begin));
		printf("第几节结束(可选1到11):>");
		scanf("%d", &(ps->data[ps->size].time[i].end));
	}
	ps->size++;
	printf("添加成功!");
	system("pause"); fflush(stdin); system("cls");
}

void PrintCourse(Curriculum* ps)
{
	assert(ps);
	int i = 0;
	printf("\n");
	printf("%-10s\t%-20s\t%-20s\t%-20s\n", "课程编号", "课程名称", "上课地点", "一周节数");
	for (i = 0; i < ps->size; i++)
	{
		printf("%-10d\t%-20s\t%-20s\t%-5d\n", ps->data[i].ID, ps->data[i].name, ps->data[i].address, ps->data[i].frequency);
		for (int j = 0; j < ps->data[i].frequency; j++)
		{
			printf("第%d节:周%d  第%d节课到第%d节课\n", j + 1, ps->data[i].time[j].week, ps->data[i].time[j].begin, ps->data[i].time[j].end);
		}
		printf("\n");
	}
	printf("\n");
}


void DelCourse(Curriculum* ps)
{
	assert(ps);
	int tmp = 0;
	printf("请输入课程编号:>");
	scanf("%d", &tmp);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (tmp == ps->data[i].ID)
		{
			int input = 0;
			printf("\n已找到,课程名称为:%s,确认要删除吗?\n", ps->data[i].name);
			printf("输入1即可继续删除,否则继续取消:>");
			scanf("%d", &input);
			if (input != 1)
			{
				printf("未确认,已取消!\n");
				system("pause"); fflush(stdin); system("cls");
				return;
			}
			//删除课程
			for (int j = i; j < ps->size - 1; j++)
			{
				ps->data[j] = ps->data[j + 1];
			}
			break;
		}
	}
	if (i == ps->size)
	{
		printf("没有这个课程!请仔细检查课程编号!\n");
	}
	printf("删除成功!\n");
	ps->size--;
	system("pause"); fflush(stdin); system("cls");
}

2.2.2 Secret.c

#define _CRT_SECURE_NO_WARNINGS
//加密解密函数
#include <stdio.h>
#include "Secret.h"

char Base64_Int(char tem)//字符转Base64编码
{
    if (tem >= 'A' && tem <= 'Z')
        return tem - 'A';
    else if (tem >= 'a' && tem <= 'z')
        return tem + 26 - 'a';
    else if (tem >= '0' && tem <= '9')
        return tem + 52 - '0';
    else if (tem == '+')
        return 62;
    else if (tem == '/')
        return 63;
}

char Base64_Char(int tem)//Base64编码转字符
{
    if (tem >= 0 && tem <= 25)
        return tem + 'A';
    else if (tem >= 26 && tem <= 51)
        return tem + 'a' - 26;
    else if (tem >= 52 && tem <= 61)
        return tem + '0' - 52;
    else if (tem == 62)
        return '+';
    else if (tem == 63)
        return '/';
}

void Into_Char(char* dest, int* src, int flag)//将二进制数转换为char类型//flag==1转换为Base64,flag==0转换为ascll
{
    int tem = 0;
    int n = 1;
    int num = 0;
    if (flag)
        num = 5;
    else
        num = 7;
    for (int i = num; i >= 0; i--)
    {
        tem += *(src + i) * n;
        n *= 2;
    }
    if (flag)
        *dest = Base64_Char(tem);
    else
        *dest = tem;
}

void Into_Binary(int* dest, char src, int flag)//将src转换为二进制存到dest中//flag==1将Base64编码转换为二进制,flag==0将ascll转换为二进制
{
    int n = 2;
    int num = 0;
    if (flag)
    {
        num = 5;
        src = Base64_Int(src);
    }
    else
    {
        num = 7;
    }
    for (int i = num; i >= 0; i--)
    {
        *(dest + i) = src % n;
        src /= 2;
    }
}

void Into_Base64(const char dest[], const char src[])//加密函数//目标文件,源文件
{
    FILE* srcx = fopen(src, "r");
    if (srcx == NULL)
    {
        perror("source:");
        return;
    }
    FILE* destx = fopen(dest, "w");
    if (destx == NULL)
    {
        perror("destination:");
        return;
    }
    int flag = 1;
    while (flag)
    {
        char secret[5] = { 0 };//存储加密后数据
        int binary[25] = { 0 };//6和8的最小公倍数为24
        char ch = 0;
        for (int i = 0; i < 3; i++)
        {
            ch = getc(srcx);
            if (ch == -1)
            {
                flag = 0;
                goto interruption;
            }
            Into_Binary(binary + i * 8, ch, 0);
        }
    interruption:
        for (int i = 0; i < 4; i++)
        {
            Into_Char(secret + i, binary + i * 6, 1);
        }
        fprintf(destx, "%s", secret);
    }

    fclose(srcx);
    fclose(destx);
}

void Out_Base64(const char dest[], const char src[])//解密函数//目标文件,源文件
{
    FILE* srcx = fopen(src, "r");
    if (srcx == NULL)
    {
        perror("source:");
        return;
    }
    FILE* destx = fopen(dest, "w");
    if (destx == NULL)
    {
        perror("destination:");
        return;
    }
    int flag = 1;
    while (flag)
    {
        char secret[4] = { 0 };//存储解密后数据//
        int binary[25] = { 0 };//6和8的最小公倍数为24
        char ch = 0;
        for (int i = 0; i < 4; i++)
        {
            ch = getc(srcx);
            if (ch == -1)
            {
                flag = 0;
                goto interruption;
            }
            Into_Binary(binary + i * 6, ch, 1);
        }
    interruption:
        for (int i = 0; i < 3; i++)
        {
            Into_Char(secret + i, binary + i * 8, 0);
        }
        fprintf(destx, "%s", secret);
    }

    fclose(srcx);
    fclose(destx);
}

2.2.3 Student_course.c

#define _CRT_SECURE_NO_WARNINGS
#include "Secret.h"
#include "StuSystem.h"

void StuCourseSearch(Roster* ps, Curriculum* pc)
{
	assert(ps&&pc);
	char tmp[ID_MAX] = { 0 };
	printf("请输入学生学号:>");
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < ps->size; i++)//找学生
	{
		if (strcmp(tmp, ps->data[i].ID) == 0)
		{
			if (ps->data[i].size == 0)
			{
				printf("该学生还未选课!\n");
				break;
			}
			printf("%-10s\t%-20s\t%-20s\t%-20s\n", "课程编号", "课程名称", "上课地点", "一周节数");
			for (int j = 0; j < ps->data[i].size; j++)//遍历该学生的课
			{
				int k = 0;
				for (k = 0; k < pc->size; k++)//找到改编号对应的课程
				{
					if (pc->data[k].ID == ps->data[i].course[j])
					{
						printf("%-10d\t%-20s\t%-20s\t%-5d\n", pc->data[k].ID, pc->data[k].name, pc->data[k].address, pc->data[k].frequency);
						for (int x = 0; x < pc->data[k].frequency; x++)
						{
							printf("第%d节:周%d  第%d节课到第%d节课\n", x + 1, pc->data[k].time[x].week, pc->data[k].time[x].begin, pc->data[k].time[x].end);
						}
						printf("\n");
					}
				}
				if (k == pc->size)//找不到该课程,将该课程删掉
				{
					for (int s = j; s < ps->data[i].size - 1; s++)
					{
						ps->data[i].course[s] = ps->data[i].course[s + 1];
					}
					ps->data[i].size--;
				}
			}
			break;
		}
	}
	if (i == ps->size)
	{
		printf("查无此人!请仔细检查学号!\n");
	}
	system("pause"); fflush(stdin); system("cls");
}

void SelectCou(Roster* ps, Curriculum* pc, int i)
{
	assert(ps && pc);
	int id = 0;
	printf("请输入课程编号:>");
	scanf("%d", &id);
	int flag1 = 0;//是否存在这门课,0不存在
	int flag2 = 0;//是否已选这门课,0未选
	for (int j = 0; j < pc->size; j++)
	{
		if (pc->data[j].ID == id)
		{
			flag1 = 1;//存在
			break;
		}
	}
	for (int j = 0; j < ps->data[i].size; j++)
	{
		if (ps->data[i].course[j] == id)
		{
			flag2 = 1;//已选
		}
	}
	if (flag1 == 0)
	{
		printf("该门课程不存在!\n");
		return;
	}
	if (flag2 == 1)
	{
		printf("该学生已选这门课!\n");
		return;
	}

	ps->data[i].course[ps->data[i].size] = id;
	ps->data[i].size++;
	printf("选课成功!\n");
}

void DelSelected(Roster* ps, int i)
{
	assert(ps);
	int id = 0;
	printf("请输入课程编号:>");
	scanf("%d", &id);
	int flag = 0;//是否存在这门课,0不存在
	for (int j = 0; j < ps->data[i].size; j++)
	{
		if (ps->data[i].course[j] == id)
		{
			flag = 1;
			for (int k = j; k < ps->data[i].size - 1; k++)
			{
				ps->data[i].course[k] = ps->data[i].course[k + 1];
			}
			ps->data[i].size--;
			break;
		}
	}
	if (flag == 0)
	{
		printf("该学生未选该门课或该门课不存在!\n");
		return;
	}

	printf("删除成功!\n");
}

void StuSelectCourse(Roster* ps, Curriculum* pc)
{
	assert(ps && pc);
	fflush(stdin); system("cls");
	char tmp[ID_MAX] = { 0 };
	printf("请输入学生学号:>");
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(tmp, ps->data[i].ID) == 0)
		{
			int input = 0;
			PrintCourse(pc);
			printf("该学生已选择编号为:");
			for (int j = 0; j < ps->data[i].size; j++)
			{
				printf("%d ", ps->data[i].course[j]);
			}
			printf("的课程.\n");

			do
			{
				printf("输入1继续选课, 输入2退课, 输入0返回:>");
				scanf("%d", &input);
				switch (input)
				{
				case 1:
					if (ps->data[i].size == COURSE_MAX)
					{
						printf("学生选课已达上限,无法继续选课!\n");
						break;
					}
					else
					{
						SelectCou(ps, pc, i);
						break;
					}
				case 2:
					if (ps->data[i].size == 0)
					{
						printf("该学生还未选课!\n");
						break;
					}
					else
					{
						DelSelected(ps, i);
						break;
					}
				case 0:
					printf("即将返回!\n");
					system("pause"); fflush(stdin); system("cls");
					break;
				default:
					printf("输入错误,请重新输入!\n");
					break;
				}
			} while (input);

			break;
		}
	}
	if (i == ps->size)
	{
		printf("查无此人!请仔细检查学号!\n");
	}
}

2.2.4 StudentControl.c

#define _CRT_SECURE_NO_WARNINGS
//学生管理系统
#include "StuSystem.h"
#include "Secret.h"

void InitRoster(Roster* ps)
{
	assert(ps);
	ps->data = NULL;
	ps->size = 0;
	ps->capacity = 0;
	RosterCapacityCheck(ps);
	Out_Base64(StuTmp, StuInfo);
	
	FILE* st = fopen(StuTmp, "r");
	if (st == NULL)
	{
		perror("InitRoster fail:");
		exit(-1);
	}
	int i = 0;
	while (fscanf(st, "%s %s %s %d ", ps->data[i].ID, ps->data[i].name, ps->data[i].class, &(ps->data[i].size)) != EOF) 
	{ 
		for (int j = 0; j < ps->data[i].size; j++)
		{
			fscanf(st, "%d ", &(ps->data[i].course[j]));
		}
		ps->size++;
		RosterCapacityCheck(ps);
		i++; 
	}
	fclose(st);
}

void DestroyRoster(Roster* ps)
{
	assert(ps);
	FILE* pf = fopen(StuTmp, "w");
	if (pf == NULL)
	{
		perror("DestroyRoster:");
		exit(-1);
	}
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		fprintf(pf, "%s %s %s %d ", ps->data[i].ID, ps->data[i].name, ps->data[i].class, ps->data[i].size);
		for (int j = 0; j < ps->data[i].size; j++)
		{
			fprintf(pf, "%d ", ps->data[i].course[j]);
		}
	}
	fclose(pf);

	Into_Base64(StuInfo, StuTmp);//加密
	FILE* pe = fopen(StuTmp, "w");//清空临时文件内容
	if (pe == NULL)
	{
		perror("DestroyRoster:");
		exit(-1);
	}
	fclose(pe);

	free(ps->data);
	ps->size = 0;
	ps->capacity = 0;
}

void RosterCapacityCheck(Roster* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0? 24 : ps->capacity + 24;
		Stu* tmp = (Stu*)realloc(ps->data, sizeof(Stu) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail:\n");
			exit(-1);
		}

		ps->data = tmp;
		ps->capacity = newcapacity;
	}
}

void AddStudent(Roster* ps)
{
	assert(ps);
	RosterCapacityCheck(ps);
	printf("请输入学生学号:>");
	scanf("%s", ps->data[ps->size].ID);
	printf("请输入学生姓名:>");
	scanf("%s", ps->data[ps->size].name);
	printf("请输入学生班级:>");
	scanf("%s", ps->data[ps->size].class);

	ps->data[ps->size].size = 0;
	printf("学生添加成功!\n");

	ps->size++;
	system("pause"); fflush(stdin); system("cls");
}

void PrintRoster(Roster* ps)
{
	assert(ps);
	int i = 0;
	printf("%-20s\t%-20s\t%-5s\n", "学号", "姓名", "班级");
	for (i = 0; i < ps->size; i++)
	{
		printf("%-20s\t%-20s\t%-5s\n", ps->data[i].ID, ps->data[i].name, ps->data[i].class);
	}
	system("pause"); fflush(stdin); system("cls");
}

void SearchDesignatedStudent(Roster* ps)
{
	assert(ps);
	char tmp[ID_MAX] = { 0 };
	printf("请输入学生学号:>");
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(tmp, ps->data[i].ID) == 0)
		{
			printf("学号:%s\n姓名:%s\n班级:%s\n", ps->data[i].ID, ps->data[i].name, ps->data[i].class);
			//打印所选课程
			//PrintCurriculum(ps);
			break;
		}
	}
	if (i == ps->size)
	{
		printf("查无此人!请仔细检查学号!\n");
	}
	system("pause"); fflush(stdin); system("cls");
}

void StuControl_menu()
{
	printf("||=============学生查询系统=============||\n");
	printf("||----------- 1.查询学生列表 -----------||\n");
	printf("||----------- 2.查找单个学生 -----------||\n");
	printf("||--------------- 0.返回 ---------------||\n");
}

void StuInfoSearch(Roster* ps)
{
	assert(ps);
	fflush(stdin); system("cls");
	int input = 0;
	do
	{
		StuControl_menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			PrintRoster(ps);
			break;
		case 2:
			SearchDesignatedStudent(ps);
			break;
		case 0:
			printf("即将返回!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	system("pause"); fflush(stdin); system("cls");
}

void DelStudent(Roster* ps)
{
	assert(ps);
	char tmp[ID_MAX] = { 0 };
	printf("请输入学生学号:>");
	scanf("%s", tmp);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (strcmp(tmp, ps->data[i].ID) == 0)
		{
			for (int j = i; j < ps->size - 1; j++)
			{
				ps->data[j] = ps->data[j + 1];
			}
			break;
		}
	}
	if (i == ps->size)
	{
		printf("查无此人!请仔细检查学号!\n");
	}
	printf("删除成功!\n");
	ps->size--;
	system("pause"); fflush(stdin); system("cls");
}

2.2.5 test.c

#define _CRT_SECURE_NO_WARNINGS
#include "StuSystem.h"

void menu()
{
	printf("||=============学生管理系统=============||\n");
	printf("||------------- 1.添加学生 -------------||\n");
	printf("||------------- 2.删除学生 -------------||\n");
	printf("||--------- 3.查询学生基础信息 ---------||\n");
	printf("||--------- 4.查询学生所选课程 ---------||\n");
	printf("||------------- 5.学生选课 -------------||\n");//包括查看可选课程
	printf("||----------- 6.可选课程管理 -----------||\n");//包括查看可选课程
	printf("||--------------- 0.退出 ---------------||\n");
}

int main()
{
	int input = 0;
	Roster roster;
	InitRoster(&roster);
	Curriculum course;
	InitCurriculum(&course);
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddStudent(&roster);
			break;
		case 2:
			DelStudent(&roster);
			break;
		case 3:
			StuInfoSearch(&roster);
			break;
		case 4:
			StuCourseSearch(&roster, &course);
			break;
		case 5:
			StuSelectCourse(&roster, &course);
			break;
		case 6:
			CourseControl(&course);
			break;
		case 0:
			DestroyRoster(&roster);
			DestroyCurriculum(&course);
			printf("已退出学生管理系统!\n");
			break;
		default:
			printf("选择错误,请重新输入!\n");
			system("pause"); fflush(stdin); system("cls");
			break;
		}
	} while (input);
	return 0;
}

3. 总结

这是迄今为止,第一个由我自己独立完成的项目,没有借鉴过相关的文章或视频。

项目中依然存在许多问题,例如缺少对学生或课程信息输入合法性的检查……

对学生和课程的查找功能本应该单独封装为函数的,但是我在写了好几个涉及该功能的函数之后才意识到这个问题,实在懒得大改了,于是将错就错,反正这个功能写起来也并不麻烦。

算上头文件总计920行代码,最有成就感的一集。

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大筒木老辈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值