c++课程设计:学生信息管理系统

实验步骤:

1.设计学生信息管理主界面,如下图所示。

c++课程设计:学生信息管理系统

2.实现学生信息导入   "学生信息导入",   "学生信息显示",   "学生信息添加",   "学生信息查找",   "学生信息保存",    "    退出    "等功能模块。

 

实验代码:

#include <fstream>
#include <iostream>
using namespace std;
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <stdlib.h>
#define FILENAME "student.txt"

#define   NR(x)   (sizeof(x)/sizeof(x[0]))
#define  TITLE  "学生信息管理系统"
#define  AUTHOR "作者:信息工程学院学生制作"
#define  DATE   "日期:2020年7月21日"
#define  SIZE   100
#define   NR(x)   (sizeof(x)/sizeof(x[0]))

enum 
{
    UP = 72,
    DOWN = 80 ,
    LEFT = 75 ,
    RIGHT = 77 ,
    ENTER = 13 ,
    ESC = 27 ,
};

char *menu[] = 
{
    "--学生信息添加--",
    "--学生信息查找--",
    "--学生信息打印--",
    "--学生信息保存--",
    "--学生信息导入--",
    "--    退出    --",
};

char *menu2[] = 
{
    "学生信息导入",
    "学生信息显示",
    "学生信息添加",
    "学生信息查找",
    "学生信息保存",
    "    退出    ",
};
 
//定义结构体
CONSOLE_CURSOR_INFO cci; 
//定义默认的坐标位置      
COORD pos = {0,0};

void showmenu(HANDLE hOut ,char **menu , int size , int index)
{
    int i ; 
    system("cls");    
    //设置显示的文本的颜色 
    SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | 0x8); 
    //初始化控制台显示的X,Y轴的坐标 
    pos.X = 30;
    pos.Y = 0 ;
    //设置显示到控制台终端的具体位置 
    SetConsoleCursorPosition(hOut,pos);    
    //调用printf在控制台对应的位置上输出 
    //printf("%s",TITLE);
    
    pos.X = 32;
    pos.Y = 1 ;
    SetConsoleCursorPosition(hOut,pos);    
    //printf("%s",AUTHOR);
    cout<<"AUTHOR"<<endl;
    pos.X = 30;
    pos.Y = 2 ;
    SetConsoleCursorPosition(hOut,pos);    
    //printf("%s",DATE);
    for(i = 0 ; i < size ; i++)
    {
        //如果i==index表示在当前选项的位置,默认初始化显示是第一项,显示为红色,
        //当按下上下按键选择的时候,光标会移动,也就看到了列表选择的现象 
        if(i == index)
        {
            //红色 
            SetConsoleTextAttribute(hOut, FOREGROUND_RED | 0x8); 
            pos.X = 30;
            pos.Y = 5+i;
            //设置光标坐标
            SetConsoleCursorPosition(hOut,pos);    
            printf("%s",menu[i]);
        }
        //否则显示为白色 
        else
        {
            //白色 
            SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 
            pos.X = 30;
            pos.Y = 5+i;
            //设置光标坐标
            SetConsoleCursorPosition(hOut,pos);    //设置光标坐标
            printf("%s",menu[i]);
        }
    }
    //刷新标准输出缓冲区 
    fflush(stdout);
}
void showmenu2(HANDLE hOut ,char **menu , int size , int index)
{
    int i ; 
    system("cls");    
    //设置显示的文本的颜色 
    SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | 0x8); 

    //初始化控制台显示的X,Y轴的坐标 
    pos.X = 32;
    pos.Y = 0 ;    
    SetConsoleCursorPosition(hOut,pos);   
    cout<<TITLE<<endl;
    
    pos.X = 32;
    pos.Y = 1 ;
    SetConsoleCursorPosition(hOut,pos);    
    cout<<AUTHOR<<endl;

    pos.X = 32;
    pos.Y = 2 ;
    SetConsoleCursorPosition(hOut,pos);    
    cout<<DATE<<endl;

    for(i = 0 ; i < size ; i++)
    {
        //如果i==index表示在当前选项的位置,默认初始化显示是第一项,显示为红色,
        //当按下上下按键选择的时候,光标会移动,也就看到了列表选择的现象 
        if(i == index)
        {
            //红色 
            SetConsoleTextAttribute(hOut, FOREGROUND_RED | 0x8); 
            pos.X = 4+i*16;
            pos.Y = 4;
            //设置光标坐标
            SetConsoleCursorPosition(hOut,pos);    
            printf("%s",menu2[i]);
        }
        //否则显示为白色 
        else
        {
            //白色 
            SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 
            
            pos.X = 4+i*16;
            pos.Y = 4;
            //设置光标坐标
            SetConsoleCursorPosition(hOut,pos);    //设置光标坐标
            printf("%s",menu2[i]);
        }
    }
    //刷新标准输出缓冲区 
    fflush(stdout);
}
//获取用户输入的接口 (上下移动)
int  get_userinput(int *index , int size)  
{
    int ch ;
    ch = getch();
    switch(ch)
    {
        //上 
        //如果选择上,那么光标向上移动 
        case UP : if(*index > 0)  *index -= 1 ;  break; 
        //下 
        //如果选择下,那么光标向下移动 
        case DOWN :if(*index < size -1)  *index += 1 ;  break;
        //左 
        case LEFT: 
        case 97:return 0 ;
        //右 
        case RIGHT:return 0 ;
        //回车 
        case ENTER: return ENTER ;
        //ESC
        case ESC: return ESC ;
    }
    return 0 ;
}
//获取用户输入的接口2 (左右移动)
int  get_userinput2(int *index , int size)
{
    int ch ;
    ch = getch();
    switch(ch)
    {
        //上 
        //如果选择上,那么光标向上移动 
        case UP :  return 0 ;
        //下 
        //如果选择下,那么光标向下移动 
        case DOWN :return 0 ;
        //左 
        case LEFT: 
        case 97:if(*index > 0)  *index -= 1 ;  break;
        //右 
        case RIGHT:if(*index < size -1)  *index += 1 ;  break;
        //回车 
        case ENTER: return ENTER ;
        //ESC
        case ESC: return ESC ;
    }
    return 0 ;
}

class Student    //定义一个学生类
{
public:    
    int id;
    char name[20];    
    int score;
    void showStudent()
    {        
        cout<<"id:"<<id<<'\t'<<"name:"<<name<<'\t'<<"score:"<<score<<endl;
    }
    void clear()
    {
        strcpy(name,"");
        id=-1;
        score=-1;
    }
};
struct Stu
{
public:    
    char name[20];
    int id;
    int score;
};

    Student aa[SIZE];
    int count;


int readstutxt(char *filename, Student aa[],int *num)    //读取TXT文档中的学生信息
{   
    ifstream infile(filename);    //打开已存在的输入文件a1.txt
    if(!infile) { cout<<"输入文件不存在,请先建立输入文件!\n";     return -1;    }    

    char namestr[255];    
    char idstr[255];
    char scorestr[255];

    char countstr[255];
    int mycount;

    infile.getline(countstr,255);  //从输入文件读入一行字符串
    sscanf(countstr,"count=%d",&mycount);

    

    for(int i=0;i<SIZE;i++)
        aa[i].clear();
    for(int i=0;i<mycount;i++)
    {              
        infile.getline(idstr,255);  //从输入文件读入一行字符串
        sscanf(idstr,"id=%d",&aa[i].id);

        infile.getline(namestr,255);  //从输入文件读入一行字符串
        sscanf(namestr,"name=%s",&aa[i].name);
        infile.getline(scorestr,255);  //从输入文件读入一行字符串
        sscanf(scorestr,"score=%d",&aa[i].score);        
    }     
    *num=mycount;

     infile.close();     //关闭输入文件
     return 1;
}

void stu_load(HANDLE hOut)    //调用  readstutxt函数实现学生信息载入
{
    system("cls");

    cout<<"学生信息载入\n";
    cout<<"确实要从文件中载入学生信息吗?(Y/N):\n";
    char ch;
    cin.get(ch);
    if(ch=='Y' || ch=='y')
    {
        readstutxt("stu.txt", aa, &count);
        cout<<"学生信息已经载入"<<endl;
    }
    cin.get();

    cin.get();

}
void stu_show(HANDLE hOut)  //显示学生信息
{
    system("cls");

    cout<<"学生信息显示\n";
    cout<<"----------------------------------------------------"<<endl;
    for(int i=0;i<count;i++)  
        aa[i].showStudent();
     cout<<"----------------------------------------------------"<<endl;
     cout<<"count="<<count<<endl;

    cin.get();
}

void stu_add(HANDLE hOut)  //添加学生信息
{
    system("cls");
    

    cout<<"学生信息添加\n";
    cout<<"----------------------------------------------------"<<endl;
    cout<<"请输入学生学号:\n";
    cin>>aa[count].id;
    cin.get();
    cout<<"请输入学生姓名:\n";
    cin.getline(aa[count].name,20);
    cout<<"请输入学生成绩:\n";
    cin>>aa[count].score;
    cin.get();

     cout<<"----------------------------------------------------"<<endl;
     
     count++;

    cin.get();
}

void  stu_search(HANDLE hOut)   //搜素学生信息
{
    system("cls");
    cout <<"搜索的学生信息\n";
    cout<<"----------------------------------------------------"<<endl;
    cout<<"请输入学生学号:\n";
    cin>>aa[count].id;
    cin.get();
    
    cout<<"学生信息显示\n";
    cout<<"----------------------------------------------------"<<endl;
    for(int i=0;i<count;i++)  
        aa[i].showStudent();
     cout<<"----------------------------------------------------"<<endl;
     cout<<"count="<<count<<endl;
    cin.get();

}

void stu_save(HANDLE hOut)   //保存学生信息
{
    system("cls");
    cout <<"学生信息保存\n";
    cout<<"----------------------------------------------------"<<endl;
    
    ofstream ofs;
    ofs.open(FILENAME,ios::out);
    for(int i=0;i<count;i++)  
       ofs<<"aa[i].showStudent()";    
     ofs.close();
}
int main()
{
    for(int i=0;i<SIZE;i++)
        aa[i].clear();

    int i;
    int ret ;
    int index = 0 ;
    HANDLE hOut;
    //SetConsoleTitleA(TITLE);
    //获取当前的句柄---设置为标准输出句柄 
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    //获取光标信息
    GetConsoleCursorInfo(hOut, &cci); 
    //设置光标大小   
    cci.dwSize = 1; 
    //设置光标不可见 FALSE   
    cci.bVisible =  0; 
    //设置(应用)光标信息
    SetConsoleCursorInfo(hOut, &cci);
    while(1)
    {
        showmenu2(hOut ,menu , NR(menu) ,  index);
        ret = get_userinput2(&index , NR(menu));

        if(ret == ESC)
            break ;
        if(ret == ENTER)
        {
            switch(index)
            {    
                case 0:  stu_load(hOut); break ;    //学生信息导入
                case 1:  stu_show(hOut); break ;      //学生信息显示
                case 2:  stu_add(hOut) ; break ;      //学生信息添加
                case 3:  stu_search(hOut);break ;   //学生信息查找            
                case 4:  stu_save(hOut); break ;     //学生信息保存
                case 5:  system("cls");return 0 ;   //退出学生信息管理系统
            }
        }
    }
    return 0;
}
 

相关文章:

猜你喜欢
相关资源
相似解决方案