您的位置:首页 > 其它

学生信息管理系统

2016-06-30 15:37 316 查看
/*
* Copyright (c) 2016,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:main.cpp
* 作    者:赵志君
* 完成时间:2016年6月30日
* 版 本 号:v1.0
*
* 问题描述:学生信息管理系统
*/

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

#include <iostream>
#include <fstream>
using namespace std;

#define N 50   //数据量
int m = 0;

struct Student   ///结构体
{
int number;         //学号   结构: 年纪-班级-编号
char name[20];      //姓名
int age;            //年龄
char sex;           //性别
char birthday[20];  //出生日期
char address[20];   //地址
char tel[20];       //电话
char eMail[20];     //E-mail
}stu
;

void sift(int *grade,int *classGrade,int *number)    ///拆分学号
{
for(int j=0;j<m;j++)
{
int temp=stu[j].number,t=0;
for(int i=0;i<8;i++)   //学号倒置
{
t=temp%10+t*10;
temp=temp/10;
}
//分离出年级
grade[j]=0;
for(int i=0;i<4;i++)
{
grade[j]=grade[j]*10+t%10;
t=t/10;
}
//分离出班级
classGrade[j]=0;
for(int i=0;i<2;i++)
{
classGrade[j]=classGrade[j]*10+t%10;
t=t/10;
}
//分离出编号
number[j]=0;
for(int i=0;i<2;i++)
{
number[j]=number[j]*10+t%10;
t=t/10;
}
}
}

void rank_information()           ///信息按学号进行排序
{
Student temp;
for(int i=0; i<m-1; i++)
{
for(int j=i+1; j<m; j++)
{
if(stu[i].number>stu[j].number)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}

void showInfo(int i)          ///信息显示
{
printf("\n学号:%7d      姓名:%s\n",stu[i].number,stu[i].name);
printf("年龄:%-7d       性别:%c\n",stu[i].age,stu[i].sex);
printf("出生日期:%s\n",stu[i].birthday);
printf("地址:%s\n",stu[i].address);
printf("电话:%s\n",stu[i].tel);
printf("E-mail:%s\n",stu[i].eMail);
}

void save()           ///信息写入文件  先排序 后写入
{
rank_information();   //排序
ofstream outfile("Student.txt");
for(int i=0; i<m; i++)
{
outfile<<stu[i].number<<" "<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].sex
<<" "<<stu[i].birthday<<" "<<stu[i].address<<" "<<stu[i].tel<<" "<<stu[i].eMail;
if(i!=m-1)
outfile<<endl;
if(m==0)
break;
}
outfile.close();
}

void input_information()              ///信息录入
{
printf("注:学号必须输入,没有的信息请用“ 0 ”替代。\n");
printf("请输入要录入的学生信息\n  学号   姓名  年龄 性别  出生日期   地址        电话       E-mail\n");
scanf("%d %s %d %c %s %s %s %s",&stu[m].number,stu[m].name,&stu[m].age,&stu[m].sex,
stu[m].birthday,stu[m].address,stu[m].tel,stu[m].eMail);
if(m==0)
{
m++;
save();
printf("信息写入文件成功!\n");
printf("输入任意键继续:");
getch();
return;
}
for(int i=0; i<m; i++)
{
if(stu[i].number==stu[m].number)
{
printf("此学生已存在,请确认信息后再录入!\n");
return;
}
else if(i==m-1)
{
m++;
save();
printf("信息写入文件成功!\n");
printf("输入任意键继续:");
getch();
return;
}
}
}

void showInformation()                  ///筛选查询信息
{
int n,a,k1,k2,k3;
char ch[2],c,dizhi[10];
while(1)
{
system("cls");
printf("\n\t\t\t***************************************************************\n");
printf("\t\t\t*********         1.学号筛选       4.性别筛选         *********\n");
printf("\t\t\t*********         2.姓名筛选       5.地址筛选         *********\n");
printf("\t\t\t*********         3.年龄筛选       6.全部显示         *********\n");
printf("\t\t\t*********                   0.退出                    *********\n");
printf("\t\t\t***************************************************************\n");
printf("请输入您要筛选的方式:");
while(1)
{
scanf("%d",&n);
fflush(stdin);   //防输错
if(n>=0 && n<=7)
break;
printf("输入有误,请重新输入筛选方式:");
}
switch(n)
{
case 0:
return;
case 1:
system("cls");
printf("\n\t\t\t***************************************************************\n");
printf("\t\t\t*********         1.年级         5.年级+编号          *********\n");
printf("\t\t\t*********         2.班级         6.年级+班级+编号     *********\n");
printf("\t\t\t*********         3.编号         7.范围筛选           *********\n");
printf("\t\t\t*********         4.年级+班级    0.退出               *********\n");
printf("\t\t\t***************************************************************\n");
printf("请输入您要筛选的方式:");
while(1)
{
scanf("%d",&a);
fflush(stdin);   //防输错
if(n>=0 && n<=7)
break;
printf("输入有误,请重新输入筛选方式:");
}
int grade
,classGrade
,number
;
sift(grade,classGrade,number);
switch(a)
{
case 0:
break;
case 1:
printf("请输入您要筛选的年级:");
scanf("%d",&k1);
for(int i=0; i<m; i++)
{
if(grade[i]==k1)
{
showInfo(i);
}
}
break;
case 2:
printf("请输入您要筛选的班级:");
scanf("%d",&k1);
for(int i=0; i<m; i++)
{
if(classGrade[i]==k1)
{
showInfo(i);
}
}
break;
case 3:
printf("请输入您要筛选的编号:");
scanf("%d",&k1);
for(int i=0; i<m; i++)
{
if(number[i]==k1)
{
showInfo(i);
}
}
break;
case 4:
printf("请输入您要筛选的年级和班级:");
scanf("%d%d",&k1,&k2);
for(int i=0; i<m; i++)
{
if(grade[i]==k1 && classGrade[i]==k2)
{
showInfo(i);
}
}
break;
case 5:
printf("请输入您要筛选的年级和编号:");
scanf("%d%d",&k1,&k2);
for(int i=0; i<m; i++)
{
if(grade[i]==k1 && number[i]==k2)
{
showInfo(i);
}
}
break;
case 6:
printf("请输入您要筛选的年级、班级和编号:");
scanf("%d%d%d",&k1,&k2,&k3);
for(int i=0; i<m; i++)
{
if(grade[i]==k1 && classGrade[i]==k2 && number[i]==k3)
{
showInfo(i);
}
}
break;
case 7:
printf("请输入您要筛选的范围(a<b):");
scanf("%d%d",&k1,&k2);
for(int i=0; i<m; i++)
{
if(stu[i].number>=k1 && stu[i].number<=k2)
{
showInfo(i);
}
}
break;
default:
printf("指令错误!");
}
break;
case 2:
char ch[2];
printf("请输入您要筛选的姓氏:");
cin>>ch;
for(int i=0; i<m; i++)
{
if(ch[0]==stu[i].name[0] && ch[1]==stu[i].name[1])
showInfo(i);
}
break;
case 3:
system("cls");
printf("\n\t\t\t***************************************************************\n");
printf("\t\t\t*********        1.具体年龄        2.年龄范围         *********\n");
printf("\t\t\t***************************************************************\n");
printf("请输入您要筛选类型:");
scanf("%d",&k1);
if(k1==1)
{
printf("请输入您要筛选的年龄:");
scanf("%d",&k2);
for(int i=0; i<m; i++)
{
if(k2==stu[i].age)
showInfo(i);
}
}
else if(k1==2)
{
printf("请输入您要筛选的年龄范围(a<b):");
scanf("%d%d",&k2,&k3);
for(int i=0; i<m; i++)
{
if(stu[i].age>=k2 && stu[i].age<=k3)
showInfo(i);
}
}
break;
case 4:
printf("请输入您要筛选的性别:");
scanf("%c",&c);
for(int i=0; i<m; i++)
{
if(c==stu[i].sex)
{
showInfo(i);
}
}
break;
case 5:
printf("请输入您要筛选的地址:");
cin>>dizhi;
for(int i=0; i<m; i++)
{
if(!strcmp(dizhi,stu[i].address))
{
showInfo(i);
}
}
break;
case 6:
for(int i=0; i<m; i++)
{
showInfo(i);
}
break;
}
printf("输入任意键继续:");
getch();
}
}

void query()                    ///精准查询信息
{
int k,num;
char nam[20];
if(m>0)
{
system("cls");
printf("\n\t\t\t***************************************************************\n");
printf("\t\t\t*********         1.按学号查询       4.按邮箱查询     *********\n");
printf("\t\t\t*********         2.按姓名查询       0.退出           *********\n");
printf("\t\t\t*********         3.按电话查询                        *********\n");
printf("\t\t\t***************************************************************\n");
printf("请输入指令:");
while(1)
{
scanf("%d",&k);
fflush(stdin);   //防输错
if(k>=0 && k<=4)
break;
printf("输入指令有误,请重新输入指令:");
}
while(1)
{
if(k==0)
return;
else if(k==1)       //按学号查询学生信息
{
printf("请输入要查询的学号:");
scanf("%d",&num);
if(num==0)
return;
for(int i=0; i<m; i++)
{
if(stu[i].number==num)
{
showInfo(i);
printf("输入任意键继续:");
getch();
return;
}
else if(i==m-1)
printf("未查到该学生信息!\n");
}
}
else if(k==2)       //按姓名查询学生信息
{
printf("请输入要查询的学生姓名:");
scanf("%s",nam);
if(nam[0]=='0')
return;
for(int i=0; i<m; i++)
{
if(!strcmp(nam,stu[i].name))
{
showInfo(i);
printf("输入任意键继续:");
getch();
return;
}
else if(i==m-1)
printf("未查到该学生信息\n");
}
}
else if(k==3)       //按电话查询学生信息
{
printf("请输入要查询的学生电话:");
scanf("%s",nam);
if(nam[0]=='0')
return;
for(int i=0; i<m; i++)
{
if(!strcmp(nam,stu[i].tel))
{
showInfo(i);
printf("输入任意键继续:");
getch();
return;
}
else if(i==m-1)
printf("未查到该学生信息\n");
}
}
else if(k==4)       //按邮箱查询学生信息
{
printf("请输入要查询的学生邮箱:");
scanf("%s",nam);
if(nam[0]=='0')
return;
for(int i=0; i<m; i++)
{
if(!strcmp(nam,stu[i].eMail))
{
showInfo(i);
printf("输入任意键继续:");
getch();
return;
}
else if(i==m-1)
printf("未查到该学生信息\n");
}
}
else
printf("请输入正确的指令!");
}
}
else
printf("系统无数据!\n");
}

void delate()                  ///删除学生信息
{
int num,i,k;
printf("请输入您要删除的学生学号:");
scanf("%d",&num);
for(i=0; i<m; i++)
{
if(stu[i].number==num)
{
while(1)
{
showInfo(i);
printf("确认删除此学生信息?  1.确认   2.取消\n");
scanf("%d",&k);
if(k==1)
{
for(int j=i; j<m-1; j++)
stu[j]=stu[j+1];
m--;
save();
printf("学生信息删除成功!\n");
return;
}
else if(k==2)
break;
else
printf("请输入正确的指令!\n");
}
}
else if(i==m-1)
printf("不存在该学生信息!\n");
}
}

void information_changes()               ///学生信息的修改
{
int num,k;
char ch[20],s;
while(1)
{
printf("请输入您要修改的学生学号:");
scanf("%d",&num);
fflush(stdin);
if(num==0)
return;
for(int i=0; i<m; i++)
{
if(stu[i].number==num)
{
showInfo(i);
printf("1、学号       2、姓名    3、年龄    4、性别\n");
printf("5、出生日期   6、地址    7、电话    8、E-mail    0、退出\n");
printf("请输入您要修改的内容:");
while(1)
{
scanf("%d",&k);
fflush(stdin);   //防输错
if(k>=0 && k<=5)
break;
printf("输入指令有误,请重新");
printf("输入您的指令:");
}
switch(k)
{
case 0:
return;
case 1:
printf("请输入要修改的学号:");
scanf("%d",&num);
stu[i].number=num;
break;
case 2:
printf("请输入要修改的姓名:");
scanf("%s",ch);
strcpy(stu[i].name,ch);
break;
case 3:
printf("请输入要修改的年龄:");
scanf("%d",&num);
stu[i].age=num;
break;
case 4:
printf("请输入要修改的性别:");
scanf("%c",&s);
stu[i].sex=s;
break;
case 5:
printf("请输入要修改的出生日期:");
scanf("%s",ch);
strcpy(stu[i].birthday,ch);
break;
case 6:
printf("请输入要修改的地址:");
scanf("%s",ch);
strcpy(stu[i].address,ch);
break;
case 7:
printf("请输入要修改的电话:");
scanf("%s",ch);
strcpy(stu[i].tel,ch);
break;
case 8:
printf("请输入要修改的E-mail:");
scanf("%s",ch);
strcpy(stu[i].eMail,ch);
break;
}
if(k>=0 && k<=8)
{
printf("信息修改成功!\n");
save();
printf("输入任意键继续:");
getch();
}
return;
}
else if(i==m-1)
{
printf("不存在该学生信息!\n");
break;
}
}
}
}

int main()
{
int n,z=1;
ifstream infile("Student.txt");          ///文件内无内容会出错
if(!infile)
{
cout<<"没有数据文件!\n";
ofstream outfile("Student.txt");
outfile.close();
}
else
{
int i = 0;
while(!infile.eof())
{
infile>>stu[i].number>>stu[i].name>>stu[i].age>>stu[i].sex
>>stu[i].birthday>>stu[i].address>>stu[i].tel>>stu[i].eMail;
m++;
++i;
}
infile.close();
save();
}

while(1)            //主系统部分
{
if(z!=1)    //第一次不出现
{
system("cls");    //清空界面
}
printf("\n\t\t\t***************************************************************\n");
printf("\t\t\t************ Student Management Information System ************\n");
printf("\t\t\t***************************************************************\n");
printf("\t\t\t*********       1.输入信息           4.删除信息       *********\n");
printf("\t\t\t*********       2.筛选查找信息       5.修改信息       *********\n");
printf("\t\t\t*********       3.精准查找信息       0.退出系统       *********\n");
printf("\t\t\t***************************************************************\n");
printf("\t\t\t********************* 系统已有学生数: %2d *********************\n",m);
printf("\t\t\t***************************************************************\n");
printf("输入您的指令:");
z=2;//清屏
while(1)
{
scanf("%d",&n);
fflush(stdin);   //防输错
if(n>=0 && n<=5)
break;
printf("输入指令有误,请重新输入您的指令:");
}
switch(n)
{
case 0:
break;
case 1:
input_information();
break;
case 2:
showInformation();
break;
case 3:
query();
break;
case 4:
delate();
break;
case 5:
information_changes();
break;
default:
printf("请输入 0-5 命令\n");
}
if(n==0)
break;
}
return 0;
}


附:测试数据

20153123 孙芳 20 F 1996.9.1 上海 17853539999 sun123@163.com

20164101 张三 18 F 1998.7.1 烟台 17853535555 zhang123@163.com

20154101 王五 18 F 1993.8.1 济南 17853535555 wang123@163.com

20165215 赵子琳 22 M 1994.10.1 潍坊 17853537777 zhao123@163.com

20153223 秦含含 20 M 1996.9.1 北京 17853539999 qin123@163.com

20155215 刘志 22 M 1994.10.1 临沂 17853531111 liu123@163.com

20164105 张也 19 M 1992.8.1 大连 17853542222 zhang1234@163.com

20154116 孙超 16 1998.11.11 南京 17853543333 sun1234@qq.com

20154105 李四 19 M 1997.9.1 德州 17853536666 li123@163.com

心得体会:

    此程序最大的特点是运用C++将系统数据和本地文件实现了对等同步,但还存在很大的不足,需要后期的不断完善。

注:对错误指令的处理有待完善,错误数据无法检测。

        在文件为空时会在文件中产生乱码,影响数据分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: