【期末课程设计】学生成绩管理系统

简介: 【期末课程设计】学生成绩管理系统

水火莲花-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);




 博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰     裤    辣 !!!

相关文章
|
6月前
|
Java 关系型数据库 MySQL
毕业设计|课程设计|SSM开发实现图书管理系统(一)
毕业设计|课程设计|SSM开发实现图书管理系统
|
6月前
|
JavaScript 小程序 Java
基于SSM大学生宿舍管理系统的设计与实现
基于SSM大学生宿舍管理系统的设计与实现
73 1
|
SQL 数据管理 Java
C#宿舍管理系统(C#课程设计含源码)
C#宿舍管理系统(C#课程设计含源码)
157 0
C#宿舍管理系统(C#课程设计含源码)
|
存储 Java 关系型数据库
JavaWeb期末项目 图书馆管理系统
JavaWeb期末项目 图书馆管理系统
171 1
|
6月前
07——驾校科目一考试系统——布局题库
如果需要题库的资料(exam.txt)可以留下邮箱,博主会发给大家的。 总代码
124 1
|
6月前
|
前端开发 JavaScript Java
毕业设计|课程设计|SSM开发实现图书管理系统
毕业设计|课程设计|SSM开发实现图书管理系统
100 1
|
Java 程序员 PHP
C#简单学生信息管理系统(C#课程设计)
C#简单学生信息管理系统(C#课程设计)
79 0
|
存储 测试技术 C语言
C语言期末课程设计—【通讯录管理系统】让课程设计不再是痛苦2
C语言期末课程设计—【通讯录管理系统】让课程设计不再是痛苦2
|
存储 数据可视化 C语言
C语言期末课程设计—【通讯录管理系统】让课程设计不再是痛苦1
C语言期末课程设计—【通讯录管理系统】让课程设计不再是痛苦