学生信息管理系统(C语言,带文件操作)

前情提示

这是本人大一的C语言程序设计的结课设计作业,由于这段时间一直在学习Java,C语言很久没学了,所以在CSDN上找了很多代码,经过对比最终发现博客C语言 学生成绩管理系统 控制台 文件操作(未涉及数据库)最符合我的需求,然后对这个程序进行了一些修改,于是我的结课设计就诞生了
在这里插入图片描述

程序简介

本程序设计具有学生信息的输入、显示、查询、更新、删除、保存等功能,利用清屏函数使操作界面简洁美观,易于操作。程序用了指针、结构体、链表等知识点。运用菜单实现交互式管理,用户轻松的按键即可实现对软件的操作,操作简单易懂,功能丰富,可以很好的满足需要

流程图

在这里插入图片描述

源程序函数目录

在这里插入图片描述

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define max 100		//数组定义统一大小

int g = 0;		//全局变量,为登录时输入密码次数
int student_number = 5;		//全局变量,student_number为学生的人数

struct user      //定义一个结构体,存储用户登录账号和密码,并初始化五个管理员的信息
{
	char username[20];
	char password[20];
}user[5] = {
	{"蒋超", "1450824311"},
	{"李佳树", "2041775273"},
	{"刘英杰", "395636706"},
	{"胡友亮", "924056026"},
	{"黄家杨", "2946644844"}
};

struct student		//定义结构体,包含学生信息,并初始化五个学生的信息 
{
	char name[max];		//姓名
	char num[max];		//学号
	char sex[max];		//性别
	int chinese;		//语文成绩
	int mathematic;		//数学成绩
	int english;		//英语成绩
	int computer;		//计算机成绩
}s[5] = {
	{  "蒋超", "00001", "boy", 80,90,80,90},
	{  "李佳树", "00002", "boy", 60,80,90,50},
	{  "黄家杨", "00003", "girl", 85,65,75,90},
	{  "胡友亮", "00004", "boy", 55,65,75,80},
	{  "刘英杰", "00005", "girl", 90,95,98,99}
};

struct student* p;		//定义一个结构体指针

//主菜单函数声明
void login();				//登入函数
void main_menu();				//主界面函数
void input_record();  		//输入学生成绩处理   1
void show_record();  		//显示学生成绩处理   2   
void search_record();  		//查询学生成绩处理   3
void change_record();  		//更新学生成绩处理   4
void delete_record();  		//删除学生信息   5
void calc_record(); 	 	//计算成绩处理   6
void save_record();  		//保存处理   7
void exit_record();  		//退出   8


//查询子函数声明
void search_by_num();  		//学号查询
void search_by_name();  	//姓名查询
void search_by_sex();  		//性别查询
void search_by_exit();  	//返回上一级


//计算子函数声明
void calc_sum();  			//计算总成绩
void calc_ave();  			//计算平均成绩
void calc_eixt();  			//返回上一级


//自定义函数
void print_table();			//表头
void print_table_sum();		//总成绩表格
void print_table_ave();		//平均分表格
void read();     			//将文件中的数据读入到结构体数组中


int main()    				//*主函数
{
	login();		//首先进行管理员登录
	main_menu();		//登录成功后显示主界面
	return 0;
}


void login()    //登录函数,管理员使用该系统前需进行登录,定义密码只允许输错三次 
{
	int i;
	char id[20], password[20];
	printf("****登录界面****\n");
	printf("请输入账号名:");
	scanf("%s", id);
	printf("请输入密码:");
	scanf("%s", password);
	for (i = 0; i < 5; i++)		//遍历五个管理员的信息,如果输入的信息在初始化的信息中存在则登录成功
	{
		if (strcmp(id, user[i].username) == 0 && strcmp(password, user[i].password) == 0)
		{
			printf("登录成功!\n");
			system("cls");		//清屏函数
			main_menu();			//登录成功,打印主界面
			break;
		}
	}

	if (i == 5)     //遍历完一轮管理员信息,此时i=5且未找到符合的管理员信息,说明账号密码输入错误
	{
		system("cls");
		printf("登录失败!\n\n");
		g++;	//有三次登录机会,每次登录都遍历一次user结构体
		if (g >= 3)		//若三次机会都用完,则退出系统
		{
			printf("你已经输错三次,将自动退出系统\n");
			exit(1);
		}
		else
		{
			login();	//否则,登陆成功,进入主界面
		}
	}
}


void main_menu()    //展示主菜单,并对用户的请求做出对应响应 
{
	read();				//将文件中的学生信息读取到链表中
	system("cls");		//清屏函数
	int x;
	//主菜单
	printf("*************************************************\n");
	printf("*\t欢迎使用高校学生成绩管理系统V2.0\t*\n");
	printf("*************************************************\n");
	printf("*\t\t1.输入学生信息\t\t\t*\n");
	printf("*\t\t2.显示学生信息\t\t\t*\n");
	printf("*\t\t3.查询学生信息\t\t\t*\n");
	printf("*\t\t4.更新学生信息\t\t\t*\n");
	printf("*\t\t5.删除学生信息\t\t\t*\n");
	printf("*\t\t6.计算学生成绩\t\t\t*\n");
	printf("*\t\t7.保存\t\t\t\t*\n");
	printf("*\t\t8.退出系统\t\t\t*\n");
	printf("*************************************************\n");
	printf("请输入你要执行的操作:");
	scanf("%d", &x);
	if (x == 1)
		input_record();  	//输入信息 
	if (x == 2)
		show_record();  	//显示信息 
	if (x == 3)
		search_record(); 	//查询信息 
	if (x == 4)
		change_record();  	//更新信息 
	if (x == 5)
		delete_record();  	//删除信息 
	if (x == 6)
		calc_record();  	//计算成绩 
	if (x == 7)
		save_record();  	//保存
	if (x == 8)
		exit_record();  	//退出
	else
	{
		printf("输入错误,即将重新进入主界面\n");
		main_menu();
	}
}


void input_record()		//输入学生成绩函数    1
{
	//定义两个char类型变量来获取用户的输入 
	char v, z;
	//在开头位置做一个标记
	aa:
		{
		system("cls");		//清屏函数

		printf("请输入学生姓名:");
		scanf("%s", s[student_number].name);

		printf("请输入学生学号(五位):");
		scanf("%s", s[student_number].num);

		printf("请输入学生性别(boy/girl):");
		scanf("%s", s[student_number].sex);

		printf("请输入学生语文成绩:");
		scanf("%d", &s[student_number].chinese);

		printf("请输入学生数学成绩:");
		scanf("%d", &s[student_number].mathematic);

		printf("请输入学生英语成绩:");
		scanf("%d", &s[student_number].english);

		printf("请输入学生计算机成绩:");
		scanf("%d", &s[student_number].computer);

		printf("请选择是否保存(y或n):");
		scanf("%s", &z);

		if (z == 'y')		//若输入为y,则保存信息到文件中
		{
			student_number++;
			save_record();
		}

		printf("是否继续添加,请选择(y或n)(否会回到主界面):");
		scanf("%s", &v);

		if (v == 'y')		//若输入为y,则跳转至开头标记aa处
		{
			goto aa;
		}

		else
		{
			main_menu();
		}
	}
}


void show_record()		//显示学生信息函数    2   
{
	system("cls");		//清屏函数

	int i, k, x;
	char get;
	x = student_number;

	print_table();		//打印表头 
	for (i = 0; i < x; i++)	//打印表格数据 
	{
		printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
	}

	printf("\n1.返回主界面\n2.返回上一级\n");
	printf("请输入:");
	scanf("%d", &k);

	if (k == 1)
	{
		main_menu();
	}

	else if (k == 2)
	{
		main_menu();
	}

}


void search_record()  	//查询学生成绩函数    3
{
	system("cls");		//清屏函数

	int x;

	//打印菜单
	printf("1 按学号查询\n");
	printf("2 按姓名查询\n");
	printf("3 按性别查询\n");
	printf("4 返回上一级\n");
	printf("请输入:");
	scanf("%d", &x);

	if (x == 1)
		search_by_num();	//按学号查询函数 
	if (x == 2)
		search_by_name();	//按姓名查询函数 
	if (x == 3)
		search_by_sex();	//按性别查询查询 
	if (x == 4)
		search_by_exit();	//返回主界面
	else
	{
		printf("输入错误\n");
		search_record();		//重新查询
	}

}


void print_table()    	//打印学生信息表格的表头函数 
{
	printf("+----------+----------+----------+------+------+------+------+\n");
	printf("|   姓名   |   学号   |   性别   | 语文 | 数学 | 英语 |计算机|\n");
	printf("+----------+----------+----------+------+------+------+------+\n");
}


void search_by_num()    //查询学生信息函数的子函数——按学号查询函数 
{
	int i, k;
	char num1[max];		//用户输入学生学号

	system("cls");		//清屏函数

	printf("请输入要查找的学号:");
	scanf("%s", num1);

	for (i = 0; i < student_number; i++)		//遍历链表,寻找是该学号是否存在
	{
		if (strcmp(num1, s[i].num) == 0)
		{
			print_table();
			printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
			break;
		}
	}

	if (i == student_number)		//student_number为全局变量学生的人数
	{
		printf("不存在这个学号!\n\n");
	}

	printf("1.返回主界面\n2.继续查询\n");
	printf("请输入:");
	scanf("%d", &k);

	if (k == 1)
	{
		main_menu();
	}

	else
	{
		search_record();
	}
}


void search_by_name()    //询学生信息函数的子函数——按姓名查询函数 
{
	int i, k;
	char name1[max];	//用户输入学生姓名

	system("cls");		//清屏函数
	printf("请输入查找的姓名:");
	scanf("%s", name1);

	for (i = 0; i < student_number; i++)		//遍历链表,看该名字是否存在
	{
		if (strcmp(name1, s[i].name) == 0)
		{
			print_table();
			printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
			break;
		}
	}

	if (i == student_number) 
	{
		printf("不存在这个姓名\n");
	}
	
	printf("1.返回主界面\n2.继续查询\n");
	printf("请输入:");
	scanf("%d", &k);

	if (k == 1)
	{
		main_menu();
	}

	else
	{
		search_record();
	}
}


void search_by_sex()    //询学生信息函数的子函数——按性别查询函数 
{
	int i, k;
	char sex1[max];		//用户输入学生的性别

	system("cls");		//清屏函数
	printf("请输入查找的性别(boy/girl):");
	scanf("%s", sex1);
	print_table();   //表格

	for (i = 0; i < student_number; i++)		//遍历链表,看该性别是否存在
	{
		if (strcmp(sex1, s[i].sex) == 0)
			printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
	}

	if (i == student_number)
	{
		printf("1.返回主界面\n2.继续查询\n");
	}
	printf("请输入:");
	scanf("%d", &k);

	if (k == 1)
	{
		main_menu();
	}

	else
	{
		search_record();
	}
}


void search_by_exit()    //返回上一级(返回主菜单)的函数 
{
	main_menu();
}


void change_record()    //更新学生成绩函数    4
{
	//输入学生学号修改学生信息并保持

	system("cls");		//清屏函数
	int i;
	char name2[max], sex2[max];
	int chinese2, mathematic2, english2, computer2;
	char numbefor[max];

	printf("请输入要修改的学生的学号:");     //用户输入学生学号
	scanf("%s", numbefor);

	for (i = 0; i < student_number; i++)		//遍历链表,看该学号是否存在
	{
		if (strcmp(numbefor, s[i].num) == 0)	//存在
		{
			printf("修改前:\n");
			print_table();		//打印表格

			printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);

			printf("请分别输入修改后信息\n");

			printf("请输入学生姓名:");
			scanf("%s", name2);

			printf("请输入学生性别:");
			scanf("%s", sex2);

			printf("请输入学生语文成绩:");
			scanf("%d", &chinese2);

			printf("请输入学生数学成绩:");
			scanf("%d", &mathematic2);

			printf("请输入学生英语成绩:");
			scanf("%d", &english2);

			printf("请输入学生计算机成绩:");
			scanf("%d", &computer2);

			printf("请选择是否保存(y或n):");
			getchar();
			if (getchar() == 'y')		//修改学生信息
			{
				strcpy(s[i].name, name2);
				strcpy(s[i].sex, sex2);
				s[i].chinese = chinese2;
				s[i].mathematic = mathematic2;
				s[i].english = english2;
				s[i].computer = computer2;
				save_record();		//保存学生信息到文件中

				printf("修改后:\n");
				printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
				printf("\n");
			}
			break;
		}
	}
	if (i == student_number)
	{
		printf("很抱歉!没有这位学生\n");
	}
	printf("是否继续修改,请选择(y/n):");
	getchar();
	if (getchar() == 'y')
	{
		change_record();		//继续修改
	}
	else
	{
		main_menu();		//返回主界面
	}
}


void delete_record()    //删除学生信息函数    5
{
	//输入学生学号删除学生信息并保存 

	system("cls");
	char num4[max];
	char a;
	int v;
	printf("请输入要删学生的学号:\n");
	scanf("%s", num4);

	int i, j;
	for (i = 0; i < student_number; i++)			//遍历链表,看学号是否存在
	{
		if (strcmp(num4, s[i].num) == 0)		//存在,执行删除操作
		{
			printf("你将要删除该学生信息\n");
			printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
			printf("\n");
			printf("y 确认删除\tn 取消\n");
			printf("请输入:");
			scanf("%s", &a);
			if (a == 'y')
			{
				for (j = i; j < student_number; j++)		//将链表中该节点指向下一节点以实现删除操作
				{
					strcpy(s[j].num, s[j + 1].num);  strcpy(s[j].name, s[j + 1].name);  strcpy(s[j].sex, s[j + 1].sex);
					s[j].chinese = s[j + 1].chinese;  s[j].mathematic = s[j + 1].mathematic;  s[j].english = s[j + 1].english;
					s[j].computer = s[j + 1].computer;
				}
				printf("删除成功!\n");
				student_number--;		//全局变量,student_number-1
				save_record();		//将删除后的信息保存到文件中
			}
			else
			{
				printf("已取消操作\n");
			}

		}
	}
	if (i == student_number)		//该学号不存在
	{
		printf("没有这个学号的学生\n");
	}
	printf("1.继续删除 2.返回主界面\n");
	printf("请输入:");
	scanf("%d", &v);
	if (v == 1)
	{
		delete_record();
	}
	else
	{
		main_menu;
	}
}


void calc_record()    //计算学生成绩函数    6
{
	//有两个功能,一个是计算总成绩一个是计算平均分 

	system("cls");		//清屏函数
	int x;
	printf("1 计算总成绩\n");
	printf("2 计算平均分\n");
	printf("3 返回上一级\n");
	printf("请输入:");
	scanf("%d", &x);

	if (x == 1)
		calc_sum();		//计算总成绩
	if (x == 2)
		calc_ave();		//计算平均成绩
	if (x == 3)
		main_menu();		//返回主界面
	else
	{
		printf("输入错误\n");
		calc_record();	//重新打印该界面
	}
}


void print_table_sum()    //计算总成绩函数的子函数——打印总成绩表格的表头 
{
	printf("+----------+----------+----------+------+------+------+------+------+\n");
	printf("|   姓名   |   学号   |   性别   | 语文 | 数学 | 英语 |计算机|总成绩|\n");
	printf("+----------+----------+----------+------+------+------+------+------+\n");
}


void print_table_ave()    //计算平均分函数的子函数——打印平均成绩表格的表头 
{
	printf("+----------+----------+----------+------+------+------+------+------+\n");
	printf("|   姓名   |   学号   |   性别   | 语文 | 数学 | 英语 |计算机|平均分|\n");
	printf("+----------+----------+----------+------+------+------+------+------+\n");
}


void calc_sum()    //计算学生成绩函数的子函数——计算总成绩函数 
{
	print_table_sum();		//打印表头
	int i, k, sum = 0;		//sum为学生的总成绩
	int x = student_number;		//student_number为学生人数

	for (i = 0; i < x; i++)
	{
		sum = s[i].chinese + s[i].mathematic + s[i].english + s[i].computer;
		printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6d\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, sum);
	}

	printf("1 返回上一级\n2 返回主界面\n ");
	printf("请输入:");
	scanf("%d", &k);

	if (k == 1)
		calc_record();
	if (k == 2)
		main_menu();
	else
	{
		printf("输入错误!\n");
		calc_record();
	}
}


void calc_ave()    //计算学生成绩函数的子函数——计算平均成绩函数 
{
	print_table_ave();		//打印表头
	int i, k;
	int x = student_number;		//student_number为学生人数
	float ave;		//ave为学生平均成绩

	for (i = 0; i < x; i++)
	{
		ave = (s[i].chinese + s[i].mathematic + s[i].english + s[i].computer) * 0.25;
		printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6.2f\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, ave);
		if (i == 6)
		{
			break;
		}
	}

	printf("1 返回上一级\n2 返回主界面\n ");
	printf("请输入:");
	scanf("%d", &k);

	if (k == 1)
		calc_record();
	if (k == 2)
		main_menu();
	else
	{
		printf("输入错误!\n");
		calc_record();
	}
}


void calc_eixt()    //返回上一级(返回主菜单)函数 
{
	main_menu();
}


void save_record()  //保存学生信息函数    7(将结构体数组学生数据写入到文件中) 
{
	FILE* fp;		//定义一个文件指针
	int i;

	//若文件打开失败
	if ((fp = fopen("student-list", "wb")) == NULL)		//以二进制方式对文件进行读写
	{
		printf("cannot open file\n");
		return;
	}

	fwrite(&student_number, 4, 1, fp);    	//将学生人数写入文件

	for (i = 0; i < student_number; i++)    	//二进制写
	{
		if (fwrite(&s[i], sizeof(struct student), 1, fp) != 1)
		{
			printf("file write error\n");	//出错处理
		}
		else
		{
			printf("file write sucess\n");	//文件写入成功
		}
	}
	fclose(fp);		//关闭文件指针
}


void read()     //将文件中的数据读入到结构体数组中
{
	FILE* fp;		//定义一个文件指针
	int i;

	//若文件打开失败
	if ((fp = fopen("student-list", "rb")) == NULL)		//以二进制方式读取文件
	{
		printf("cannot open file\n");
		return;
	}

	fread(&student_number, 4, 1, fp);     //读取学生人数

	for (i = 0; i < student_number; i++)		//二进制写
	{
		if (fread(&s[i], sizeof(struct student), 1, fp) != 1)
		{
			printf("file read error\n");	//出错处理
		}
		else
		{
			printf("file read sucess\n");	//文件读取成功
		}
	}
	fclose(fp);		//关闭文件指针
}


void exit_record()  	//退出系统函数    8
{
	printf("感谢您的使用,已退出!");
	exit;
}

  • 111
    点赞
  • 641
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论
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); }
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

超霸霸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值