学生信息管理系统

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 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++将系统数据和本地文件实现了对等同步,但还存在很大的不足,需要后期的不断完善。

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

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

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

C语言程序设计--班级档案管理系统

c语言设计,编程实现学生基本信息管理程序

在SQL server中查询每个学生的班级、学号、姓名、平均分,结果按平均分降序排列,平均分相同者按班级排列

python练习题

用SQL做了一个学生成绩管理的数据库,怎么查询成绩不及格的学生的学号和姓名啊

1. 从表Student中检索学生所在班级号,并消除重复行。 2. 查询课程名称中含有“技术”两个字的课程的全名