c++课程设计:学生信息管理系统
实验步骤:
1.设计学生信息管理主界面,如下图所示。
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;
}