学生成绩管理系统
1 系统概述
1.1 前言
该系统非常适合初入大学的小白交差自己的C语言作用使用,在我大学的时候每次遇到这种作业也都急切的想要找类似的作业去抄。回想那时的自己如果能够找到类似的作业,就能率先多学习一些技术就可以带领妹子完成老师给的项目,瞬间就自信心爆棚同时也学到很多的东西。这也说明了知识分享的有多么的重要!浅浅的回忆了一下美好的大学时光且说明了本文的目的,接下来看正文。
1.2 系统结构
首先系统主要实现的功能有学生信息的添加、查询、删除、修改、保存。对于添加功能是允许系统添加学生的信息,查询是能够将系统中的学生信息展示出来,该功能有两个方式一种是按照条件查询,即按照学生的学号查询,另一种则是将系统中的学生信息全部打印出来。删除功能则是按照学生的学号把该学生从系统中删除。保存则是将系统中的数据进行保存到本地磁盘中。理解的系统前提一定要把系统的结构搞清,本系统的结构很简单只有三个文件分别是util.c,util.h和main.c。其中util.c主要负责功能的实现,util.h则是进行函数的定义,而main.c是函数的调用入口。
2 系统展示
2.1 系统菜单功能
系统菜单主要展示系统中的所有功能,也就是系统中对学生信息的增删改查
2.2 系统成绩录入功能
当我们从菜单页面输入数字1,则进入学生成绩录入功能。
2.3 成绩查询功能
2.4 信息修改功能
2.5 学生成绩删除功能
2.6 学生成绩保存功能
2.7 数据库读取数据功能
该功能是在系统开启之后自动读取save.txt文件中的数据,将文件中的数据读取到系统中。例如数据库文件中存放6条数据,然后启动系统。会发现系统中会已经存放了数据库文件中的数据。
2.8 成绩高级查询
3 代码实现
3.1 系统文件结构
对于util.c文件是所有功能实现的源文件,学生成绩管理系统的增删改查功能的函数均是在这个文件中实现,对于main.c函数则是负责页面功能的选择,而头文件则是负责二个文件的链接。注意该目录下还有一个save.txt文件充当数据库文件。
3.2 主要功能的代码
util.c文件中的代码:
#pragma warning(disable:4996)
#include<stdio.h>
#include"util.h"
#include<string.h>
#include <stdlib.h>
Student* head = NULL;
// 从文件中读取数据
int student_read() {
FILE* fp = fopen("./src/save.txt", "r");
int judge = 0;
int stunum = 0;
char name[10] = "";
char sex = 'c';
float s = -1.0;
Student* pre = head, * pre1=NULL;
while (!feof(fp)) {
char buffer[100] = "";
fscanf(fp, "%s", buffer);
int temp = judge % 4;
switch (temp)
{
case 0:
stunum = atoi(buffer);
break;
case 1:
strcpy(name, buffer);
break;
case 2:
sex = buffer[0];
break;
case 3:
s = (float)atof(buffer);
break;
default:
break;
}
if ((judge + 1) % 4 == 0) {
int i = judge / 4;
st[i].stuNum = stunum;
strcpy(st[i].name, name);
st[i].sex = sex;
st[i].score = s;
if (i == 0) {
head = &st[i];
count[i] = 1;
pre = head;
}
else {
pre1 = &st[i];
count[i] = 1;
pre->next = pre1;
pre = pre1;
pre->next = NULL;
pre1 = NULL;
}
}
judge += 1;
}
fclose(fp);
return 0;
}
//对数据进行一次初始化
void init() {
for (int i = 0; i < 100; i++) {
st[i].id = i;
}
student_read();
}
void menu() {
printf("********************************\n");
printf("*-《欢迎使用学生成绩管理系统》-*\n");
printf("*--------1、学生成绩录入-------*\n");
printf("*--------2、学生成绩查询-------*\n");
printf("*--------3、学生成绩修改-------*\n");
printf("*--------4、学生成绩删除-------*\n");
printf("*--------5、学生成绩保存-------*\n");
printf("*--------6、成绩高级查询-------*\n");
printf("*--------0、退 出--------*\n");
printf("*------------------------------*\n");
printf("*------请输入你的选择!!!----*\n");
printf("********************************\n");
}
void student_con() {
printf("------请输入查询学生的学号------\n");
int idnum = 0;
scanf("%d",&idnum);
Student* pre = head;
while (pre != NULL && pre->stuNum != idnum) {
pre = pre->next;
}
if (pre != NULL && pre->stuNum == idnum) {
printf("%d\t%s\t%c\t%.2f\n", pre->stuNum, pre->name, pre->sex, pre->score);
printf("------ 查询成功 ------\n");
}
else if (pre == NULL) {
printf("数据库中不存在该学生!!!\n");
system("pause");
}
}
//全部查询
void student_list() {
if (head == NULL) {
printf("抱歉数据库中没有存放数据!\n");
}
else {
printf("--------- 查询结果 ---------\n");
Student* p = head;
printf("学号\t姓名\t性别\t成绩\n");
while (p != NULL) {
printf("%d\t%s\t%c\t%.2f\n", p->stuNum, p->name, p->sex, p->score);
p = p->next;
}
}
system("pause");
}
//学生查询
void menufind() {
printf("------欢迎来到查询功能模块------\n");
printf("-请输入查询方式(1:学号查询,2:全部查询)-\n");
int optfind = 0;
scanf("%d", &optfind);
switch (optfind)
{
case 1:
student_con();
break;
case 2:
student_list();
break;
default:
break;
}
}
//添加学生
int findvoid(int a[], int size) {
int i = 0;
while (i < size && a[i] != 0) {
i += 1;
}
return i;
}
void student_add() {
printf("------欢迎来到成绩录入模块------\n");
if (head == NULL) {
head = st;
printf("请输入学号......\n");
int a1 = scanf("%d", &head->stuNum);
getchar();
printf("请输入姓名......\n");
int a2 = scanf("%s", &head->name);
getchar();
printf("请输入性别(男:F,女:W)......\n");
int a3 = scanf("%c", &head->sex);
getchar();
printf("请输入成绩......\n");
int a4 = scanf("%f", &head->score);
count[0] = 1;
}
else if (head != NULL) {
Student* temp = NULL;
Student* pre = head;
int idx = 0;
while (pre->next != NULL) {
pre = pre->next;
}
idx = findvoid(count, 100);
if (idx == 100) {
printf("抱歉数据库已经存满学生了!!!\n");
system("pause");
}
else {
temp = &st[idx];
printf("请输入学号......\n");
int a1 = scanf("%d", &temp->stuNum);
getchar();
printf("请输入姓名......\n");
int a2 = scanf("%s", &temp->name);
getchar();
printf("请输入性别(男:F,女:W)......\n");
int a3 = scanf("%c", &temp->sex);
getchar();
printf("请输入成绩......\n");
int a4 = scanf("%f", &temp->score);
count[idx] = 1;
pre->next = temp;
temp->next = NULL;
}
}
printf("------- 信息录入成功 -------\n");
}
//删除学生
void student_del() {
printf("请输入你想要删除学生的学号......\n");
int idnum = 0;
int s = scanf("%d", &idnum);
//如果删除的学生是head节点
if (head->stuNum == idnum) {
count[head->id] = 0;
head = head->next;
printf("删除成功!!!\n");
system("pause");
}
else {
//如果删除的节点不是head节点则进行一次查找
Student* pre = head;
Student* temp = head->next;
while (temp != NULL && temp->stuNum != idnum) {
pre = temp;
temp = temp->next;
}
if (temp != NULL && temp->stuNum == idnum) {
pre->next = temp->next;
temp->next = NULL;
count[temp->id] = 0;
printf("删除成功!!!\n");
system("pause");
}
else if (temp == NULL) {
printf("数据库中不存在该学生!!!\n");
system("pause");
}
}
}
//修改学生成绩
void student_alter() {
printf("用户您好,您已经进入修改页面!!!\n");
printf("请您输入要修改学生的id......\n");
int stuidx = 0;
int alter = scanf("%d", &stuidx);
Student* temp = head;
while (temp!=NULL&&temp->stuNum!=stuidx)
{
temp = temp->next;
}
if (temp == NULL || temp->stuNum != stuidx) {
printf("抱歉没有找到该用户,请返回主界面!!!\n");
system("pause");
}
else if (temp != NULL && temp->stuNum == stuidx) {
printf("你查找的学生存在......\n");
printf("学号\t姓名\t性别\t成绩\n");
printf("%d\t%s\t%c\t%.2f\n", temp->stuNum, temp->name, temp->sex, temp->score);
printf("请您输入您想要修改的信息!!!(1:学号,2:姓名,3:性别,4:成绩)\n");
int opt = 0;
int opts = scanf("%d", &opt);
getchar();
switch (opt)
{
case 1:
printf("请输入修改的学号......\n");
scanf("%d",&temp->stuNum);
printf("修改成功!");
system("pause");
break;
case 2:
printf("请输入修改的姓名......\n");
scanf("%s", &temp->name);
printf("修改成功!");
system("pause");
break;
case 3:
printf("请输入修改的性别......\n");
scanf("%c", &temp->sex);
printf("修改成功!");
system("pause");
break;
case 4:
printf("请输入修改的成绩......\n");
scanf("%f",&temp->score);
printf("修改成功!");
system("pause");
break;
default:
break;
}
}
}
//保存学生信息
void student_save(int countsize) {
FILE* p = fopen("./src/save.txt", "w");
if (!p) {
perror(p);
printf("打开文件失败!!!\n");
system("pause");
fclose(p);
return;
}
for (int i = 0; i < countsize; i++) {
if (count[i] == 1) {
printf("%d\t%s\t%c\t%.2f\n", st[i].stuNum, st[i].name, st[i].sex, st[i].score);
fprintf(p,"%d\t%s\t%c\t%.2f\n", st[i].stuNum, st[i].name, st[i].sex, st[i].score);
}
}
fclose(p);
printf("保存成功!!!\n");
system("pause");
}
high.c文件中功能实现:
#pragma warning(disable:4996)
#include<stdio.h>
#include"util.h"
#include<string.h>
#include <stdlib.h>
void menu1() {
printf("**********************************************\n");
printf("*-《用户您好!该界面已经是成绩系统高级功能》-*\n");
printf("*------------1、输出学生成绩的排名-----------*\n");
printf("*------------2、输出最高的学生成绩-----------*\n");
printf("*------------3、输出最低的学生成绩-----------*\n");
printf("*-------------请输入你的选择!!!-----------*\n");
printf("*---------------0、退 出---------------*\n");
printf("**********************************************\n");
}
void student_sort() {
//首先设置一个数组
Student sttemp[100];
//将所有的学生存放到里面
int idx = 0;
for (int i = 0; i < 100; i++) {
//如果count[i]==1表明此时已经存放了学生成绩
if (count[i] == 1) {
sttemp[idx] = st[i];
idx += 1;
}
}
printf("%d\n",idx);
//使用冒泡排序算法对其进行排序
for (int i = 0; i < idx; i++) {
for (int j = 0; j < idx - 1- i; j++) {
if (sttemp[j].score < sttemp[j + 1].score) {
Student temp = sttemp[j];
sttemp[j] = sttemp[j + 1];
sttemp[j + 1] = temp;
}
}
}
printf("*------------ 查询成功 -----------*\n");
printf("学号\t姓名\t性别\t成绩\n");
for (int i = 0; i < idx; i++) {
//如果count[i]==1表明此时已经存放了学生成绩
printf("%d\t%s\t%c\t%.2f\n", sttemp[i].stuNum, sttemp[i].name, sttemp[i].sex, sttemp[i].score);
}
}
void student_max() {
//将所有的学生存放到里面
int idx = 0;
float num = 0;
for (int i = 0; i < 100; i++) {
//如果count[i]==1表明此时已经存放了学生成绩
if (count[i] == 1&&st[i].score>num) {
idx = i;
printf("%s\n", st[i].name);
num = st[i].score;
}
}
printf("*------------ 查询成功 -----------*\n");
printf("学号\t姓名\t性别\t成绩\n");
printf("%d\t%s\t%c\t%.2f\n", st[idx].stuNum, st[idx].name, st[idx].sex, st[idx].score);
}
void student_min() {
//将所有的学生存放到里面
int idx = 0;
float num = 10000000000000000000;
for (int i = 0; i < 100; i++) {
if (count[i] == 1 && st[i].score < num) {
idx = i;
num = st[i].score;
}
}
printf("*------------ 查询成功 -----------*\n");
printf("学号\t姓名\t性别\t成绩\n");
printf("%d\t%s\t%c\t%.2f\n", st[idx].stuNum, st[idx].name, st[idx].sex, st[idx].score);
}
void othermenu() {
int n = 1;
while (n != 0)
{
menu1();
int index = 0;
scanf("%d", &index);
switch (index)
{
case 1:
student_sort();
break;
case 2:
student_max();
break;
case 3:
// student_max();
student_min();
break;
case 0:
n = 0;
break;
default:
break;
}
}
}
3.4 头文件
high.h文件中的声明:
#pragma once
void othermenu();
util.h文件中的声明:
#pragma once
void menu();// 菜单
void student_list();//学生查询
void student_add();
void student_save();
void menufind();
typedef struct student {
int stuNum;
char name[10];
char sex;
float score;
struct student* next;
int id;
}Student;
Student st[100];
int count[100];
3.5 程序入口
main.c中的代码:
#include"util.h"
#include<stdio.h>
#pragma warning(disable:4996)
#include<string.h>
#include <stdlib.h>
#include"high.h"
int main() {
init();
int n = 1;
while (n!=0)
{
menu();
int index = 0;
scanf("%d", &index);
switch (index)
{
case 1:
student_add();
break;
case 2:
menufind();
break;
case 3:
student_alter();
break;
case 4:
student_del();
break;
case 5:
student_save(100);
break;
case 6:
othermenu();
break;
case 0:
n = 0;
break;
default:
break;
}
}
}
4 结尾
当然文中代码还有很多可以优化的地方,也有很多地方表述不清,时间精力有限请多多见谅。希望该文章能够帮助认真学习的你。