南邮级软件设计资料分数统计想拿优秀的看过来.docx
《南邮级软件设计资料分数统计想拿优秀的看过来.docx》由会员分享,可在线阅读,更多相关《南邮级软件设计资料分数统计想拿优秀的看过来.docx(25页珍藏版)》请在冰豆网上搜索。
南邮级软件设计资料分数统计想拿优秀的看过来
可以通过方向键和Enter键选择菜单
注释和命名都很明白
已测试基本没有什么Bug
我还封装了一个可以用方向键选择的菜单的类,可以很方便的使用
相应的代码和文件名列在下面,用visualc++添加到工程里即可运行
有什么问题请私信
一、ChoiceMenu.h
#ifndefCHOICEMENU
#defineCHOICEMENU
#include
#include
#include
#include"ConsoleTools.h"
usingnamespacestd;
#defineDEFAULT_MENUITEM_WIDTH40
structChoiceMenuStruct;
typedefstructChoiceMenuStructChoiceMenuStruct;
typedefvoid(*PMenuHandleFunction)(constChoiceMenuStruct*mainmenu);
//菜单项结构
typedefstructChoiceMenuItemInfo
{
stringcontent;
//选择菜单后发生的动作
PMenuHandleFunctionfunc;
//这项由程序处理,不需要填写
string_menuitems_content_for_show;
}ChoiceMenuItemInfo;
//菜单的结构及类型
structChoiceMenuStruct
{
vectormenuitems;
ChoiceMenuItemInfotitle;
unsignedintMenuItemWidth=DEFAULT_MENUITEM_WIDTH;//菜单项宽度(英文字符个数)
//标题风格
WORDTitleTextColor=FOREGROUND_RED;
WORDItemTextColorDefault;
WORDItemTextColorSelected;
//以下不需要填写
//表格间的分割线
string_MidSeperateLine;
string_TopSeperateLine;
string_BotSeperateLine;
string_BlankLine;
string_BlankLineWithSep;
};
voidShowChoiceMenu(ChoiceMenuStruct&mainmenu);
voidSelectPos(ChoiceMenuStruct&mainmenu,signedintindex,signedintlastindex);
#endif
二、ConsoleTools.h
#include
//字符缓冲区的默认大小
#defineBUFFERSIZE_SMALL10
#defineBUFFERSIZE_MID40
#defineBUFFERSIZE_BIG100
//控制台背景
#defineBLACK'0'
#defineBLUE'1'
#defineGREEN'2'
#defineLAKEBLUE'3'
#defineRED'4'
#definePURPLE'5'
#defineYELLO'6'
#defineWHITE'7'
#defineGRAY'8'
#defineLIGHTBLUE'9'
#defineLIGHTGREEN'A'
#defineLIGHTLIGHTGREEN'B'
#defineLIGHTRED'C'
#defineLIGHTPURPLE'D'
#defineLIGHTYELLOW'E'
#defineLIGHTWHITE'F'
typedefcharCOLORTYPE;
voidsetConsoleBackground(COLORTYPEcolor);
//控制台字体格式
#defineFOREGROUND_BLUE0x0001
#defineFOREGROUND_GREEN0x0002
#defineFOREGROUND_RED0x0004
#defineFOREGROUND_INTENSITY0x0008
#defineBACKGROUND_BLUE0x0010
#defineBACKGROUND_GREEN0x0020
#defineBACKGROUND_RED0x0040
#defineBACKGROUND_INTENSITY0x0080
#defineDEFAULT_BACK_FOR_GROUND0x0007
BOOLSetConsoleColor(WORDwAttributes);
BOOLSetCurPos(COORDpos);
//控制台大小信息
#defineCONSOLE_ROW_COUNT25
#defineCONSOLE_CLUM_COUNT80
三、menu.h
#include"ChoiceMenu.h"
#include"StudentGradeInformation.h"
externChoiceMenuStructcms;
externintnowselect;
externStudentGradeInformationinfStu;
voidmenu_main();
四、StudentGradeInformation.h
#ifndefSTUDENTGRADEINFORMATION
#defineSTUDENTGRADEINFORMATION
#include
#include
usingnamespacestd;
#defineDEFAULT_DATA_FILENAME"default.dat"
typedefstructStudentInfo
{
stringname;
intscore;
}StudentInfo;
enumReadOperationType
{
OVERRIDE,//覆盖
APPEND_OVERRIDE,//添加,重复项覆盖
APPEND_PRESERVE//添加,重复项保留
};
enumReadError
{
NONE,
OPENFILEERROR,
BADDATA
};
#defineMAX_SCORE100
#defineMIN_SCORE0
#defineBAD_SCORE-1
classStudentGradeInformation
{
public:
StudentGradeInformation();
ReadErrorreadfromfile(stringpath=DEFAULT_DATA_FILENAME,ReadOperationTypetype=OVERRIDE);
voidsort();
voidclear();
boolsave();
voidadd(StudentInfodata);//调用之前需要排序
voidsetSortType(boolisReverse);//逆序排列
vector:
:
iteratorfind(stringname);
boolremove(stringname);
vector:
:
iteratorend();
vectordatas;
private:
boolreverse;
};
#endif
五、ChoiceMenu.cpp
#include"ChoiceMenu.h"
#include"ConsoleTools.h"
#include
#include
#include
stringExpandMenuItemContent(stringmenuitem,unsignedintwidth,boolwithvsep=true)
{
intn=menuitem.size();
intr=(width-n-4)/2;
intl=width-r-n-4;
if(withvsep)
{
returnstring("│")+string(r,'')+menuitem+string(l,'')+string("│");
}
else
{
returnstring(r+2,'')+menuitem+string(l+2,'');
}
}
stringRepeatUnicondeChar(stringstritem,unsignedintn)
{
stringresult;
for(unsignedinti=0;i{
result+=stritem;
}
returnresult;
}
//水平居中
voidShowInHCenter(stringstr,WORDtextColor=DEFAULT_BACK_FOR_GROUND)
{
size_tn=str.size();
cout<SetConsoleColor(textColor);
cout<SetConsoleColor(DEFAULT_BACK_FOR_GROUND);
}
voidShowChoiceMenu(ChoiceMenuStruct&mainmenu)
{
system("cls");
if(mainmenu._BotSeperateLine.empty())
{
mainmenu.title._menuitems_content_for_show=
ExpandMenuItemContent(mainmenu.title.content,mainmenu.MenuItemWidth,false);
for(size_ti=0;i{
mainmenu.menuitems[i]._menuitems_content_for_show=
ExpandMenuItemContent(mainmenu.menuitems[i].content,mainmenu.MenuItemWidth,false);
}
mainmenu._TopSeperateLine=
string("┌")+RepeatUnicondeChar(string("─"),mainmenu.MenuItemWidth/2-2)+string("┐");
mainmenu._MidSeperateLine=
string("├")+RepeatUnicondeChar(string("─"),mainmenu.MenuItemWidth/2-2)+string("┤");
mainmenu._BotSeperateLine=
string("└")+RepeatUnicondeChar(string("─"),mainmenu.MenuItemWidth/2-2)+string("┘");
mainmenu._BlankLine=ExpandMenuItemContent(string(""),mainmenu.MenuItemWidth,false);
mainmenu._BlankLineWithSep=ExpandMenuItemContent(string(""),mainmenu.MenuItemWidth);
}
//显示在窗口正中央
cout<//ShowInHCenter(mainmenu._TopSeperateLine);
ShowInHCenter(mainmenu._BlankLine,mainmenu.TitleTextColor);
ShowInHCenter(mainmenu.title._menuitems_content_for_show,mainmenu.TitleTextColor);
ShowInHCenter(mainmenu._BlankLine,mainmenu.TitleTextColor);
for(size_ti=0;i{
ShowInHCenter(mainmenu._BlankLine,mainmenu.ItemTextColorDefault);
ShowInHCenter(mainmenu.menuitems[i]._menuitems_content_for_show,mainmenu.ItemTextColorDefault);
}
ShowInHCenter(mainmenu._BlankLine,mainmenu.ItemTextColorDefault);
}
voidSelectPos(ChoiceMenuStruct&mainmenu,signedintindex,signedintlastindex)
{
intpos=(CONSOLE_ROW_COUNT-(mainmenu.menuitems.size()*2+4))/2+2+index*2;
intlastpos=(CONSOLE_ROW_COUNT-(mainmenu.menuitems.size()*2+4))/2+2+lastindex*2;
SetCurPos(COORD{0,lastpos});
//ShowInHCenter(mainmenu._BlankLine,mainmenu.ItemTextColorSelected);
ShowInHCenter(mainmenu.menuitems[lastindex-1]._menuitems_content_for_show,mainmenu.ItemTextColorDefault);
//ShowInHCenter(mainmenu._BlankLine,mainmenu.ItemTextColorSelected);
SetCurPos(COORD{0,pos});
//ShowInHCenter(mainmenu._BlankLine,mainmenu.ItemTextColorSelected);
ShowInHCenter(mainmenu.menuitems[index-1]._menuitems_content_for_show,mainmenu.ItemTextColorSelected);
//ShowInHCenter(mainmenu._BlankLine,mainmenu.ItemTextColorSelected);
SetCurPos(COORD{0,CONSOLE_ROW_COUNT});
}
六、ConsoleTools.cpp
#include"ConsoleTools.h"
#include
#include
//设置控制台背景
voidsetConsoleBackground(COLORTYPEcolor)
{
charbuffer[BUFFERSIZE_SMALL];
sprintf(buffer,"color%c0",color);
system(buffer);
}
//设置颜色
BOOLSetConsoleColor(WORDwAttributes)
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
if(hConsole==INVALID_HANDLE_VALUE)
returnfalse;
returnSetConsoleTextAttribute(hConsole,wAttributes);
}
//设置光标位置
BOOLSetCurPos(COORDpos)
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole,pos);
returntrue;
}
七、main.cpp
#include
#include"ChoiceMenu.h"
#include"menus.h"
intmain()
{
menu_main();
return0;
}
八、menus.cpp
#include"menus.h"
#include
#include
#include"StudentGradeInformation.h"
#include
#include
ChoiceMenuStructcms;
intnowselect;
StudentGradeInformationinfStu;
voidEvent_quit(constChoiceMenuStruct*mainmenu);
voidEvent_add(constChoiceMenuStruct*mainmenu);
voidEvent_view(constChoiceMenuStruct*mainmenu);
voidEvent_remove(constChoiceMenuStruct*mainmenu);
voidEvent_save(constChoiceMenuStruct*mainmenu);
voidEvent_import(constChoiceMenuStruct*mainmenu);
voidmenu_main()
{
nowselect=1;
cms.TitleTextColor=BACKGROUND_BLUE|BACKGROUND_GREEN;
cms.ItemTextColorDefault=BACKGROUND_INTENSITY;
cms.ItemTextColorSelected=BACKGROUND_BLUE|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED;
cms.title.content="欢迎使用学生成绩管理系统";
cms.menuitems.push_back(ChoiceMenuItemInfo{"1.添加纪录",Event_add});
cms.menuitems.push_back(ChoiceMenuItemInfo{"2.查看排名",Event_view});
cms.menuitems.push_back(ChoiceMenuItemInfo{"3.删除记录",Event_remove});
//cms.menuitems.push_back(ChoiceMenuItemInfo{"4.导入记录",NULL});
cms.menuitems.push_back(ChoiceMenuItemInfo{"4.保存记录",Event_save});
cms.menuitems.push_back(ChoiceMenuItemInfo{"5.退出程序",Event_quit});
ShowChoiceMenu(cms);
SelectPos(cms,1,1);
intlastselect=nowselect;
//处理键盘
while(true)
{
chara=_getch();
//数字键
if(a>'0'&&a<='9'&&(int)(a-'0')>=1&&(size_t)(a-'0')<=cms.menuitems.size())
{
lastselect=nowselect;
nowselect=a-'0';
SelectPos(cms,nowselect,lastselect);
cms.menuitems[nowselect-1].func(&cms);
continue;
}
//方向键
if(a==-32)
{
charb=_getch();
switch(b)
{
case72:
lastselect=nowselect;
if(lastselect>1)nowselect--;
elsenowselect=(int)cms.menuitems.size();
SelectPos(cms,nowselect,lastselect);
break;
case80:
lastselect=nowselect;
if(lastselect<(int)cms.menuitems.size())nowselect++;
elsenowselect=1;
SelectPos(cms,nowselect,lastselect);
break;
}
continue;
}
//回车键
if(a==13)
{
cms.menuitems[nowselect-1].fun