学生管理系统

本文介绍了一个使用C++实现的学生学籍与成绩管理系统的详细设计与实现过程,系统包括数据录入、查询、删除与排序等功能,适用于教育机构对学生信息进行有效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学生管理系统
使用下面的数据,用C++设计一个简单的学籍管理系统,实现出最基本的功能。
学生基本信息文件(A.TXT)及其内容:A.TXT文件不需要编程录入数据,可用文本编辑工具直接生成:
学号 姓名 性别 宿舍号码 电话号码
01 张成成 男 501 87732111
02 李成华 女 101 87723112
… …. … … …………
学生成绩基本信息文件(B.TXT)及其内容:
学号 课程编号 课程名称 学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分
01 A01 大学物理 3 66 78 82
02 B03 高等数学 4 78 -1 90
… …. ………. … … …
功能要求及说明:
(1)数据录入功能:
对B.TXT进行数据录入,只录入每个学生的学号、课程编号、课程名称、学分、平时成绩、实验成绩、卷面成绩共7个数据. 综合成绩、学分由程序根据条件自动运算。
综合成绩的计算:如果本课程的实验成绩为-1,则表示无实验,综合成绩=平时成绩30%+卷面成绩70%; 如果实验成绩不为-1,表示本课程有实验,综合成绩=平时成绩15%+实验成绩.15%+卷面成绩*70%。
实得学分的计算:
综合成绩在60以上(含60 ),应得学分=课程学分
综合成绩在60以下 ,应得学分=0
(2)查询功能:分为学生基本情况查询和成绩查询两种
A:学生基本情况查询:
输入一个学号或姓名(可实现选择),查出此生的基本信息并显示输出。
B:成绩查询:
输入一个学号时,查询出此生的所有课程情况,格式如下:
学 号:xx 姓 名:xxxxx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
课程编号:xxx 课程名称:xxxxx 综合成绩:xxxx 实得学分: xx
… … … … ……… … …
共修:xx科,实得总学分为: xxx
(3)删除功能:当在A.TXT中删除一个学生时,自动地在B.TXT中删除此人所有信息。
(4 ) 排序功能:能实现选择按综合成绩或实得学分升序或降序排序并显示数据。

#include<iostream>
#include<fstream>
#include<string>
#include<windows.h>
#include<conio.h>
using namespace std;

void Code_File_Read()
{
	int i=0;
	char code[20];
	char temp[20];
	FILE* pFile=fopen("code.dat","r");
	system("cls");
	if(pFile==NULL)
	{
		printf("检测到第一次使用系统,请设置管理员密码:");
		fflush(stdin);
		code[i] =getch();
		printf("*");
		while(code[i] != '\r')
		{
			i++;
			code[i]=getch();
			if(code[i] != '\r')
			{
				printf("*");
			}
		}
		code[i]='\0';
		printf("\b\n");

		pFile=fopen("code.dat","w");
		fwrite(code,sizeof(char),20,pFile);
		printf("设置成功!\n");
		fclose(pFile);
		system("pause");
		return ;
	}

	fread(code,sizeof(char),20,pFile);

	printf("请输入原密码:");
	fflush(stdin);
	temp[i] =getch();
	printf("*");
	while(temp[i] != '\r')
	{
		i++;
		temp[i]=getch();
		if(temp[i] != '\r')
		{
			printf("*");
		}
	}
	temp[i]='\0';
	printf("\b\n");
	if(strcmp(temp,code))
	{
		printf("请输入新密码:");
		fflush(stdin);
		code[i] =getch();
		printf("*");
		while(code[i] != '\r')
		{
			i++;
			code[i]=getch();
			if(code[i] != '\r')
			{
				printf("*");
			}
		}
		code[i]='\0';
		printf("\b\n");
		fwrite(code,sizeof(char),20,pFile);
		printf("设置成功!\n");
		fclose(pFile);
		system("pause");
		return ;
	}
	printf("密码错误!\n");
	fclose(pFile);
	system("pause");
}

int Login()
{
	int i=0;
	char code[20];
	char temp[20];
	FILE* pFile=fopen("code.dat","r");
	system("cls");
	if(pFile==NULL)
	{
		printf("请先设置管理员密码!\n");
		system("pause");
		return 0;
	}

	fread(code,sizeof(char),20,pFile);
	printf("请输入密码:");
	fflush(stdin);
	temp[i] =getch();
	printf("*");
	while(temp[i] != '\r')
	{
		i++;
		temp[i]=getch();
		if(temp[i] != '\r')
		{
			printf("*");
		}
	}
	temp[i]='\0';
	printf("\b\n");
	if(strcmp(temp,code))
	{
		printf("密码错误!\n");
		fclose(pFile);
		system("pause");
		return 0;
	}
	fclose(pFile);
	return 1;
}

/*  
*function: 在控制台指定的位置输出字符串  
*参数:buf,输出的字符串;startX、startY为控制台的X,Y坐标   
*/
char* ch="■"; 
HANDLE hd=GetStdHandle(STD_OUTPUT_HANDLE);
void printStr(char *buf, int startX, int startY,HANDLE hd)  
{  
     
    COORD pos; 
    pos.X = startX;  
    pos.Y = startY;  
    SetConsoleCursorPosition(hd, pos);      /*设置控制台光标输出的位置*/  
	printf("%s",buf);
}

void exe_init()//初始化界面
{
	int i=0;
	system("cls");
	printStr("正在加载--------0%%",30,10,hd);
	while(i<10)
	{
		printf("\b\b");
		printf("%d%%",i);
		Sleep(100);	
		i++;
	}
	while(i<100)
	{
		printf("\b\b\b");
		printf("%d%%",i);
		Sleep(100);	
		i++;
	}
	printf("\b\b\b\b");
		printf("100%%\n");
	printStr("加载成功!\n",30,12,hd);
	printStr("欢迎使用!\n",30,14,hd);
	system("pause");
}

void exit_interface()//初始化界面
{
	system("cls");
	system("color E0");
	printStr("感谢使用!\n",30,10,hd);
	Sleep(5000);
}

void Login_Menu()
{
	int chioce;
	do
	{
		system("cls");
		printf("1:登录系统\n");
		printf("2:修改系统密码\n");
		printf("0:退出\n");
		printf("请输入选择:");
		scanf("%d",&chioce);
		while(chioce<0||chioce>2)
		{
			printf("请重新选择:");
			scanf("%d",&chioce);
		}
		switch(chioce)
		{
		case 0:
			exit_interface();
			exit(0);
			break;
		case 1:
			if(Login())
				return ;
			break;
		case 2:
			Code_File_Read();
			break;
		}
	}while(chioce!=0);
}


typedef struct _Stu
{
	int num;
	string name;
	string sex;
	int house;
	int phone;
}Stu;

int Load_A_txt(Stu stu[])
{
	int i=0;
	char buff[100];
	ifstream infile;
	infile.open("A.txt");
	infile.getline(buff,'\r\n');
	while(!infile.eof())
	{
		infile>>stu[i].num>>stu[i].name>>stu[i].sex>>stu[i].house>>stu[i].phone;
		i++;
	}
	infile.close();
	return i-1;
}

void Save_A_txt(Stu stu[],int n)
{
	int i=0;
	ofstream outfile;
	outfile.open("A.txt");
	outfile<<"学号    姓名    性别    宿舍号码    电话号码"<<"\r\n";
	for(i=0;i<n;i++)
	{
		outfile<<stu[i].num<<" "<<stu[i].name<<" "<<stu[i].sex<<" "<<stu[i].house<<" "<<stu[i].phone<<"\r\n";
	}
	outfile.close();
}



void Print_Stu(Stu stu[],int n)
{
	int i;
	printf("%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","宿舍号码","电话号码");
	for(i=0;i<n;i++)
	{
		printf("%-10d",stu[i].num);
		printf("%-10s",stu[i].name.c_str());
		printf("%-10s",stu[i].sex.c_str());
		printf("%-10d",stu[i].house);
		printf("%-10d\n",stu[i].phone);
	}
}


typedef struct _Score
{
	int num;//学号
	char count[20];//课程编号
	char name[20];//课程名
	int score[6];//学分 平时成绩 实验成绩 卷面成绩 综合成绩 实得学分
}Score;


void Print_Data(Score sco[],int n)
{
	int i;
	printf("%-10s%-10s%-10s%-10s%-10s","学号","课程编号","课程名","学分","平时成绩");
	printf("%-10s%-10s%-10s%-10s\n","实验成绩","卷面成绩","综合成绩","实得学分");
	for(i=0;i<n;i++)
	{
		printf("%-10d",sco[i].num);
		printf("%-10s",sco[i].count);
		printf("%-10s",sco[i].name);
		printf("%-10d",sco[i].score[0]);
		printf("%-10d",sco[i].score[1]);
		printf("%-10d",sco[i].score[2]);
		printf("%-10d",sco[i].score[3]);
		printf("%-10d",sco[i].score[4]);
		printf("%-10d\n",sco[i].score[5]);
	}
}


int Main_Menu()
{
	int choice;
	system("cls");
	printf("1:数据录入\n");
	printf("2:查询数据\n");
	printf("3:删除学生信息\n");
	printf("4:显示所有学生信息\n");
	printf("5:显示所有数据信息\n");
	printf("0:退出\n");
	printf("请输入选择:");
	scanf("%d",&choice);
	while(choice>5||choice<0)
	{
		printf("请重新选择:");
		scanf("%d",&choice);
	}
	return choice;
}

int Add_Score_Info(Score sco[],int n)
{
	system("cls");
	printf("请输入学号:");
	scanf("%d",&sco[n].num);
	printf("请输入课程编号:");
	scanf("%s",&sco[n].count);
	printf("请输入课程名称:");
	scanf("%s",&sco[n].name);
	printf("请输入学分:");
	scanf("%d",&sco[n].score[0]);
	printf("请输入平时成绩:");
	scanf("%d",&sco[n].score[1]);
	printf("请输入实验成绩:");
	scanf("%d",&sco[n].score[2]);
	printf("请输入卷面成绩:");
	scanf("%d",&sco[n].score[3]);
	if(sco[n].score[2] == -1)
	{
		sco[n].score[4] = (sco[n].score[1]*0.3 + sco[n].score[3]*0.7);
	}
	else
	{
		sco[n].score[4] = (sco[n].score[1]*0.15 + sco[n].score[2]*0.15 + sco[n].score[3]*0.7);
	}
	if(sco[n].score[4]>=60)
	{
		sco[n].score[5]=sco[n].score[0];
	}
	else
	{
		sco[n].score[5]=0;
	}
	printf("录入成功!\n");

	system("pause");
	return n+1;
}

void Serach_Stu_Num(Stu stu[],int n)
{
	int i,temp;
	system("cls");
	printf("输入要查询的学号:");
	scanf("%d",&temp);
	for(i=0;i<n;i++)
	{
		if(temp == stu[i].num)
		{
			break;
		}
	}
	if(i==n)
	{
		printf("查无此号!\n");
	}
	else
	{
		Print_Stu(&stu[i],1);
	}
	system("pause");
}
void Serach_Stu_Name(Stu stu[],int n)
{
	int i;
	char temp[20];
	system("cls");
	printf("输入要查询的姓名:");
	scanf("%s",temp);
	for(i=0;i<n;i++)
	{
		if(temp == stu[i].name)
		{
			break;
		}
	}
	if(i==n)
	{
		printf("查无此人!\n");
	}
	else
	{
		Print_Stu(&stu[i],1);
	}
	system("pause");
}

void Del_Stu(Stu stu[],int *n,Score sco[],int* m)
{
	int i,temp,j;
	system("cls");
	printf("输入要删除的学号:");
	scanf("%d",&temp);
	for(i=0;i<*n;i++)
	{
		if(temp == stu[i].num)
		{
			break;
		}
	}
	if(i==*n)
	{
		printf("查无此号!\n");
		system("pause");
		return;
	}
	else
	{
		(*n)--;
		for(j=i;j<*n;j++)
		{
			stu[j]=stu[j+1];
		}
	}
	for(i=0;i<*m;)
	{
		if(temp == sco[i].num)
		{
			(*m)--;
			for(j=i;j<*m;j++)
			{
				sco[j]=sco[j+1];
			}
			continue;
		}
		i++;
	}
	printf("删除成功!\n");
	system("pause");
}


void Sreach_Score_Info(Stu stu[],int n,Score sco[],int m)
{
	int i,temp;
	system("cls");
	printf("输入要查询的学号:");
	scanf("%d",&temp);
	for(i=0;i<n;i++)
	{
		if(temp == stu[i].num)
		{
			break;
		}
	}
	if(i==n)
	{
		printf("查无此号!\n");
		system("pause");
		return;
	}
	else
	{
		printf("%-10s","学号:");
		printf("%-10d",stu[i].num);
		printf("%-10s","姓名:");
		printf("%-10s\n",stu[i].name.c_str());
	}
	int sum = 0;
	int total = 0;
	for(i=0;i<m;i++)
	{
		if(temp == sco[i].num)
		{
			printf("%-10s","课程编号:");
			printf("%-10s",sco[i].count);
			printf("%-10s","课程名称:");
			printf("%-10s",sco[i].name);
			printf("%-10s","综合成绩:");
			printf("%-10d",sco[i].score[4]);
			printf("%-10s","实得学分:");
			printf("%-10d\n",sco[i].score[5]);
			sum++;
			total += sco[i].score[5];
		}	
	}

	printf("%s%d%s%d\n","共修:",sum,"科,实得总学分为:",total);
	system("pause");
}

void Serach_Menu(Stu stu[],int n,Score sco[],int m)
{
	int choice;
	do
	{
		system("cls");
		printf("1:按学号查询基本信息\n");
		printf("2:按姓名查询基本信息\n");
		printf("3:按学号查询课程情况\n");
		printf("0:返回\n");
		printf("请输入选择:");
		scanf("%d",&choice);
		while(choice>3||choice<0)
		{
			printf("请重新选择:");
			scanf("%d",&choice);
		}

		switch(choice)
		{
		case 1:
			Serach_Stu_Num(stu,n);
			break;
		case 2:
			Serach_Stu_Name(stu,n);
			break;
		case 3:
			Sreach_Score_Info(stu,n,sco,m);
			break;
		}
	}while(choice!=0);
}

int Load_B_txt(Score stu[])
{
	int i=0;
	char buff[100];
	ifstream infile;
	infile.open("B.txt");
	while(!infile.eof())
	{
		infile>>stu[i].num>>stu[i].count>>stu[i].name>>stu[i].score[0]>>stu[i].score[1];
		infile>>stu[i].score[2]>>stu[i].score[3]>>stu[i].score[4]>>stu[i].score[5];
		i++;
	}
	infile.close();
	return i-1;
}


void Save_B_txt(Score stu[],int n)
{
	int i=0;
	ofstream outfile;
	outfile.open("B.txt");
	for(i=0;i<n;i++)
	{
		outfile<<stu[i].num<<" "<<stu[i].count<<" "<<stu[i].name<<" "<<stu[i].score[0]<<" ";
		outfile<<stu[i].score[1]<<" "<<stu[i].score[2]<<" "<<stu[i].score[3]<<" "<<stu[i].score[4]<<" "<<stu[i].score[5]<<"\r\n";
	}
	outfile.close();
}

int main()
{
	int choice;
	Stu stu[100];
	Score sco[100];
	int sco_NUM=0;
	int NUM=0;
	exe_init();
	Login_Menu();
	system("mode con: cols=100 lines=30");
	NUM = Load_A_txt(stu); 
	sco_NUM=Load_B_txt(sco);
	do
	{
		choice=Main_Menu();
		switch(choice)
		{
		case 1:
			sco_NUM=Add_Score_Info(sco,sco_NUM);
			break;
		case 2:
			Serach_Menu(stu,NUM,sco,sco_NUM);
			break;
		case 3:
			Del_Stu(stu,&NUM,sco,&sco_NUM);
			break;
		case 4:
			system("cls");
			Print_Stu(stu,NUM);
			system("pause");
			break;
		case 5:
			system("cls");
			Print_Data(sco,sco_NUM);
			system("pause");
			break;
		}
	}while(choice!=0);
	Save_A_txt(stu,NUM);
	Save_B_txt(sco,sco_NUM);
	exit_interface();
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值