C语言实现的学生成绩管理系统

学生成绩管理系统

1 系统概述

1.1 前言

 该系统非常适合初入大学的小白交差自己的C语言作用使用,在我大学的时候每次遇到这种作业也都急切的想要找类似的作业去抄。回想那时的自己如果能够找到类似的作业,就能率先多学习一些技术就可以带领妹子完成老师给的项目,瞬间就自信心爆棚同时也学到很多的东西。这也说明了知识分享的有多么的重要!浅浅的回忆了一下美好的大学时光且说明了本文的目的,接下来看正文。

1.2 系统结构

 首先系统主要实现的功能有学生信息的添加、查询、删除、修改、保存。对于添加功能是允许系统添加学生的信息,查询是能够将系统中的学生信息展示出来,该功能有两个方式一种是按照条件查询,即按照学生的学号查询,另一种则是将系统中的学生信息全部打印出来。删除功能则是按照学生的学号把该学生从系统中删除。保存则是将系统中的数据进行保存到本地磁盘中。理解的系统前提一定要把系统的结构搞清,本系统的结构很简单只有三个文件分别是util.c,util.h和main.c。其中util.c主要负责功能的实现,util.h则是进行函数的定义,而main.c是函数的调用入口。

2 系统展示

2.1 系统菜单功能

 系统菜单主要展示系统中的所有功能,也就是系统中对学生信息的增删改查
在这里插入图片描述

图1

2.2 系统成绩录入功能

 当我们从菜单页面输入数字1,则进入学生成绩录入功能。
在这里插入图片描述

图2

2.3 成绩查询功能

在这里插入图片描述

图3

在这里插入图片描述

图4

2.4 信息修改功能

在这里插入图片描述

图5

2.5 学生成绩删除功能

在这里插入图片描述

图6

2.6 学生成绩保存功能

在这里插入图片描述

图7

在这里插入图片描述

图8

2.7 数据库读取数据功能

 该功能是在系统开启之后自动读取save.txt文件中的数据,将文件中的数据读取到系统中。例如数据库文件中存放6条数据,然后启动系统。会发现系统中会已经存放了数据库文件中的数据。
在这里插入图片描述

图9

在这里插入图片描述

图10

2.8 成绩高级查询

在这里插入图片描述

图11

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图12

3 代码实现

3.1 系统文件结构

 对于util.c文件是所有功能实现的源文件,学生成绩管理系统的增删改查功能的函数均是在这个文件中实现,对于main.c函数则是负责页面功能的选择,而头文件则是负责二个文件的链接。注意该目录下还有一个save.txt文件充当数据库文件。
在这里插入图片描述

图13

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 结尾

 当然文中代码还有很多可以优化的地方,也有很多地方表述不清,时间精力有限请多多见谅。希望该文章能够帮助认真学习的你。

  • 35
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言学生成绩管理系统(以包含文件的形式写的),结构体,链表,数组,以下是main.c #include #include #include #define m 3/*宏定义m的值为3*/ struct node/*链表初始化*/ { char name[20]; int no; float score[m]; float sum; float avg; struct node *next; }; char ch[m+4][20]={{"学号"},{"姓名"},{"语文"},{"数学"},{"英语"},{"总分"},{"平均分"}};/*定义并初始化一个全局二维字符数组*/ #include "save.c"/*包含保存文件*/ #include "read.c"/*包含读取文件*/ #include "output.c"/*包含打印文件*/ #include "set.c"/*包含录入文件*/ #include "demand.c"/*包含查询文件*/ #include "sort.c"/*包含排序文件*/ #include "modified.c"/*包含修改文件*/ #include "add.c"/*包含添加文件*/ #include "del.c"/*包含删除文件*/ void main() { int n; printf("\n\t\t\t欢迎使用学生成绩管理系统\n\n"); printf("\t\t\t\t\t\t制 作: XIA XIA\n"); do { printf("\n\n1:学生成绩录入,并保存\n"); printf("2:学生成绩查询\n"); printf("3:学生成绩的排序\n"); printf("4:学生成绩的修改\n"); printf("5:学生成绩的打印\n"); printf("6:学生信息的添加\n"); printf("7:学生信息的删除\n"); printf("0:退出学生成绩管理系统\n\n\n"); printf("输入你要执行操作的相应序号\n"); scanf("%d",&n);/*输入相就的操作的序号*/ switch (n) { case 1: set();break;/*调用录入函数*/ case 2: demand();break;/*调用查询函数*/ case 3: sort();break;/*调用排序函数*/ case 4: modified();break;/*调用修改函数*/ case 5: output();break;/*调用打印函数*/ case 6: add();break;/*调用添加函数*/ case 7: del();break;/*调用删除函数*/ case 0: printf("正在退出学生成绩管理系统......\n");exit(0);/*直到输入“0”退出学生成绩管理系统*/ default:printf("输入错误码,请重新输入\n"); } }while(1); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值