学生管理系统
使用下面的数据,用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;
}