水火莲花-C疑难专题
9 篇文章1 订阅
因其独特,因其始终如一
文章目录
一、学生成绩管理系统介绍
二、学生成绩管理系统设计思路
三、源代码
1. test.c
2. Student Management System.c
3.Stu_System.c
4.Teacher.c
5.Student Management System.h
前言:
学生成绩管理系统含教师登录入口和学生登录入口,可实现学生信息的添加,删除,查找,排名、保存等
一、学生成绩管理系统介绍
该项目分为5个文件,其中4个 .c源文件和1个 .h头文件
test.c 项目实现的整体框架及成绩管理系统的初始登录界面等
Student Management System.c 实现教师系统和学生系统的登录界面和系统成员数据的初始化
Stu_System.c 实现学生登录系统等相关功能
Teacher.c 实现老师登录系统等相关功能
Student Management System.h 存放项目中的各种头文件、#define 定义的常变量、函数、结构体的声明等
推荐使用集编译链接于一体的翻译环境
推荐环境:
Visual Studio 2017版及或更高、Dev-C++、Visual Studio Code等 C/C++编译器
学生成绩管理系统介绍
该成绩管理系统有两个登录入口,分为教师入口和学生入口。
一个学生的成绩信息包括:学生姓名,年龄、性别,学号,专业、成绩。
教师系统可以添加学生信息、删除学生信息、查询学生信息、查看学生总排名;学生系统可以查看所输入的学生的信息、排名等。教师每添加一个学生,在退出学生成绩管理系统后,程序会自动将学生信息以二进制文本的形式保存为一个txt文件,下次登录成绩管理系统时,程序会自动加载信息,教师也可以手动将某个或所有学生信息永久删除
学生成绩管理系统运行界面
二、学生成绩管理系统设计思路
首先要封装一个系统总界面,这个比较简单,只需要控制好间距,用printf即可实现,然后用 switch...case 语句来选择教师登录还是学生登录,并用do...while循环封装,保证该系统可以多次使用;在教师系统和学生系统中,也用类似的printf、switch...case选择语句加do...while循环来实现相应的选择功能。
其次是对学生系统进行初始化,为了节省内存,达到系统运行效率最大化,项目使用了动态内存管理的方法,初始化时先用动态内存函数开辟三个学生的空间,后面随着学生数量的增加,当系统空间被填满后,就再多开辟两个学生的空间,满了之后继续开辟,如此往复,每次只多开辟两个学生的空间。这里使用动态内存管理可以避免内存过度浪费。
接下来是老师录入信息,删除学生等。录入信息直接采用scanf函数即可,删除学生信息首先得找到这个学生,所以得单独再封装一个由学生姓名查找学生信息的函数,也方便后面查学生信息时使用,找到这个学生后,用这个学生个的下一个学生的数据覆盖它,然后用后面的进皆覆盖前面的信息,最后使学生人数减1即可,这里的覆盖使用memset函数完成即可。
还有对学生的成绩排名的功能,在教师系统和学生系统的排名处都要展示排名。因为学生信息在结构体中,所以推荐用 qsort快速排序函数完成,但需要将qsort函数由原来的升序改为降序。
最后就是学生信息的保存及加载。在整个项目的最后可以添加一个而进行写文件的语句,并将学生信息逐条通过rwrite函数循环写入文件中;而加载文件中的二进制学生信息则是在初始化学生信息的时候,单独封装一个读文件的函数,用来加载学生数据。读写文件都用二进制的方式是为了防止学生信息泄露。
三、源代码
1. test.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
void menu()
{
printf("————————————————————————————————————————————————————————————————\n");
printf(" 学生成绩管理系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
printf(" 1.教师登录 2.学生登录 \n");
printf(" 0.退出系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
int main()
{
int input = 0;
System Mge;
Init_System(&Mge);
int ret = 0;
do
{
menu();
printf("请选择:-> ");
scanf("%d", &input);
switch (input)
{
case 1:
//进入教师系统
Teacher_System(&Mge);
break;
case 2:
Stu_System(&Mge);
break;
case 3:
break;
case 0:
break;
default:
break;
}
} while (input);
return 0;
}
2. Student Management System.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int Increase_Capacity2(System* Mge)//先判断是否够
{
assert(Mge);
if (Mge->sz == Mge->Max_Space)
{
Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));
if (Mge->data == NULL)
{
perror("realloc");
return 1;
}
Mge->data = tmp;
Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/
return 0;
}
else
return 0;
}
void Load_Sy(System* Mge)
{
assert(Mge);
FILE* pf = fopen("data.txt", "rb");
if (pf == NULL)
{
return;
}
else
{
Stu tmp = { 0 };
while (fread(&tmp, sizeof(Stu), 1, pf))
{
if (1 == Increase_Capacity2(Mge))
return;//开辟失败
else
{
Mge->data[Mge->sz] = tmp;
Mge->sz +=1;
}
}
}
fclose(pf);
pf = NULL;
}
void Menu_Teacher()
{
printf("\n—————————— 教师系统 ————————————\n");
printf(" 1.录入学生信息 2.删除学生信息 \n");
printf(" 3.显示所有学生信息 4.查看排名 \n");
printf(" 5.查询学生信息 6.一键删除所有学生信息 \n");
printf(" 0.退出教师系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
void Menu_Stu()
{
printf("\n—————————— 学生系统 ————————————\n");
printf(" 1.查看我的信息 \n");
printf(" 0.退出学生系统 \n");
printf("————————————————————————————————————————————————————————————————\n");
}
void Init_System(System* Mge)
{
//初始化系统
assert(Mge);
Mge->data = (Stu*)malloc(Inti_Data * sizeof(Stu));//初始化三个学生的空间
if (Mge->data == NULL)
{
perror("malloc");
return;
}
else
{
Mge->sz=0;
Mge->Max_Space = Inti_Data;
//加载通讯录
Load_Sy(Mge);
}
}
void Teacher_System(System* Mge)//教师系统
{
assert(Mge);
int input = 0;
do
{
Menu_Teacher();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
Add_Stu(Mge);//增加学生信息
break;
case 2:
Del_Stu(Mge);//删除学生信息
break;
case 3:
Show_Stu(Mge);//打印
break;
case 4:
Sort(Mge);//查看排名
break;
case 5:
SearchStu(Mge);//查找学生
break;
case 6:
Del_Exit(Mge);//删除所有信息
break;
case 0:
De_System(Mge);
break;
default:
printf("退出教师系统\n");
break;
}
} while (input);
}
void Stu_System(System* Mge)
{
assert(Mge);
int input = 0;
do
{
Menu_Stu();
printf("请选择:->");
scanf("%d", &input);
switch (input)
{
case 1:
View(Mge);
break;
case 0:
break;
default:
printf("输入错误,请重新输入:");
break;
}
} while (input);
}
3.Stu_System.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int FindName1(System* Mge, char* str1)
{
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
if (strcmp(str1, Mge->data[i].Name) == 0)
return i;//找到了
}
return Mge->sz;
}
int Comper2(const void* p1, const void* p2)
{
return(((Stu*)p2)->Garde-(((Stu*)p1)->Garde));
}
void View(System* Mge)
{
assert(Mge);
printf("请输入你的名字:->\n");
char str1[10] = "0";
scanf("%s",str1);
qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper2);
int i=FindName1(Mge,str1);
if (i == Mge->sz)
{
printf("请检查你的信息是否正确或找老师查询信息是否录入\n");
return;
}
else
{
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩", "排名");
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde,
i+1);
}
}
4.Teacher.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int FindName(System* Mge,char*str1)
{
assert(Mge && str1);
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
if (strcmp(str1, Mge->data[i].Name) == 0)
return i;//找到了
}
return Mge->sz;
}
int Increase_Capacity(System* Mge)//先判断是否够
{
assert(Mge);
if (Mge->sz == Mge->Max_Space)
{
Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));
if (Mge->data == NULL)
{
perror("realloc");
return 1;
}
Mge->data = tmp;
Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/
return 0;
}
else
return 0;
}
void Add_Stu(System* Mge)//录入学生信息
{
assert(Mge);
int z = Increase_Capacity(Mge);
if (z == 1)
printf("增容失败\n");
else//不用增容
{
printf("请输入姓名:\n");
scanf("%s", Mge->data[Mge->sz].Name);
printf("请输入年龄:\n");
scanf("%d",&(Mge->data[Mge->sz].Age));
printf("请输入学号:\n");
scanf("%s",Mge->data[Mge->sz].Id);
printf("请输入性别:\n");
scanf("%s",Mge->data[Mge->sz].Sex);
printf("请输入专业:\n");
scanf("%s",Mge->data[Mge->sz].Pro);
printf("请输入成绩:\n");
scanf("%d",&(Mge->data[Mge->sz].Garde));
Mge->sz += 1;
}
}
void Show_Stu(System* Mge)//打印学生信息
{
assert(Mge);
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s\n",
"姓名", "年龄", "学号", "性别", "专业","成绩");
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde);
}
}
void Del_Stu(System* Mge)//删除学生信息
{
assert(Mge);
printf("请输入你要删除学生的名字:\n");
char str1[10] = "0";
scanf("%s", str1);
//先找到学生
int z=FindName(Mge,str1);
if (z == Mge->sz)
{
printf("未找到该学生\n");
return;
}
else
{
int i = 0;
for (i = z; i < Mge->sz; i++)
{
memmove(&Mge->data[i], &Mge->data[i + 1], sizeof(Stu));
}
Mge->sz--;
}
}
int Comper(const void* p1, const void* p2)
{
return(((Stu*)p2)->Garde - (((Stu*)p1)->Garde));
}
void Sort(System* Mge)
{
assert(Mge);
qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper);
printf("学生排名为:\n");
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩","排名");
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde
, i+1);
}
}
void SearchStu(System* Mge)
{
assert(Mge);
char str1[15] = "0";
printf("请输入要查找的学生的姓名");
scanf("%s", str1);
int i = FindName(Mge, str1);
if (i == Mge->sz)
{
printf("未找到该学生\n");
return;
}
else
{
printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s\n",
"姓名", "年龄", "学号", "性别", "专业", "成绩");
printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d\n",
Mge->data[i].Name,
Mge->data[i].Age,
Mge->data[i].Id,
Mge->data[i].Sex,
Mge->data[i].Pro,
Mge->data[i].Garde);
}
}
void De_System(System* Mge)//写入文件
{
assert(Mge);
FILE* pf = fopen("data.txt", "wb");
Stu tmp = { 0 };
int i = 0;
for (i = 0; i < Mge->sz; i++)
{
//以二进制的形式写入文件
fwrite(Mge->data + i, sizeof(Stu), 1, pf);
}
//关闭文件
free(Mge->data);
Mge->data = NULL;
fclose(pf);
pf = NULL;
}
void Del_Exit(System* Mge)
{
assert(Mge);
memset(Mge->data, 0, sizeof(Stu) * (Mge->sz));
Mge->sz= 0;
}
5.Student Management System.h
#pragma once
#define Inti_Data 3
#define Add_Connt 2
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<string.h>
//学生信息
typedef struct Stu
{
//结构体类型重命名为Stu
char Name[15];
int Age;
char Id[19];//学号
char Sex[5];//性别
char Pro[24];//专业
int Garde;//成绩
}Stu;
typedef struct System
{
Stu* data;
int sz;//学生人数
int Max_Space;//系统最大容量
}System;
void Teacher_System(System* Mge);
int FindName(System* Mge, char* str1);
void Init_System(System* Mge);
void Add_Stu(System* Mge);
void Show_Stu(System* Mge);
void Del_Stu(System* Mge);
void Sort(System* Mge);
void SearchStu(System* Mge);
void Stu_System(System* Mge);
void View(System* Mge);
void De_System(System* Mge);
void Del_Exit(System* Mge);
博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰 裤 辣 !!!