学生信息管理系统

Posted 南笙一梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学生信息管理系统相关的知识,希望对你有一定的参考价值。

/* 
 * 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[N];

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[N],classGrade[N],number[N];
            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 [email protected]
20164101 张三 18 F 1998.7.1 烟台 17853535555 [email protected]
20154101 王五 18 F 1993.8.1 济南 17853535555 [email protected]
20165215 赵子琳 22 M 1994.10.1 潍坊 17853537777 [email protected]
20153223 秦含含 20 M 1996.9.1 北京 17853539999 [email protected]
20155215 刘志 22 M 1994.10.1 临沂 17853531111 [email protected]
20164105 张也 19 M 1992.8.1 大连 17853542222 [email protected]
20154116 孙超 16 1998.11.11 南京 17853543333 [email protected]
20154105 李四 19 M 1997.9.1 德州 17853536666 [email protected]


心得体会:

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

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

        在文件为空时会在文件中产生乱码,影响数据分析。

以上是关于学生信息管理系统的主要内容,如果未能解决你的问题,请参考以下文章

学生管理系统

学生管理系统(Python实现)

学生管理系统(Python实现)

关于java Swing 的学生管理信息系统的问题

c语言编写学生信息管理系统

学生个人信息管理系统