1、南邮级软件设计资料分数统计想拿优秀的看过来可以通过方向键和Enter键选择菜单注释和命名都很明白已测试基本没有什么Bug我还封装了一个可以用方向键选择的菜单的类,可以很方便的使用相应的代码和文件名列在下面,用visual c+添加到工程里即可运行有什么问题请私信一、 ChoiceMenu.h#ifndef CHOICEMENU#define CHOICEMENU#include #include #include #include ConsoleTools.husing namespace std;#define DEFAULT_MENUITEM_WIDTH 40struct ChoiceMe
2、nuStruct;typedef struct ChoiceMenuStruct ChoiceMenuStruct;typedef void (*PMenuHandleFunction)(const ChoiceMenuStruct* mainmenu);/菜单项结构typedef struct ChoiceMenuItemInfo string content; /选择菜单后发生的动作 PMenuHandleFunction func; /这项由程序处理,不需要填写 string _menuitems_content_for_show; ChoiceMenuItemInfo;/菜单的结构及类
3、型struct ChoiceMenuStruct vector menuitems; ChoiceMenuItemInfo title; unsigned int MenuItemWidth=DEFAULT_MENUITEM_WIDTH; /菜单项宽度(英文字符个数) /标题风格 WORD TitleTextColor= FOREGROUND_RED; WORD ItemTextColorDefault; WORD ItemTextColorSelected; /以下不需要填写 /表格间的分割线 string _MidSeperateLine; string _TopSeperateLine;
4、 string _BotSeperateLine; string _BlankLine; string _BlankLineWithSep; ;void ShowChoiceMenu(ChoiceMenuStruct& mainmenu);void SelectPos(ChoiceMenuStruct& mainmenu, signed int index, signed int lastindex);#endif二、 ConsoleTools.h#include /字符缓冲区的默认大小#define BUFFERSIZE_SMALL 10#define BUFFERSIZE_MID 40#d
5、efine BUFFERSIZE_BIG 100/控制台背景#define BLACK 0#define BLUE 1#define GREEN 2#define LAKEBLUE 3#define RED 4#define PURPLE 5#define YELLO 6#define WHITE 7#define GRAY 8#define LIGHTBLUE 9#define LIGHTGREEN A#define LIGHTLIGHTGREEN B#define LIGHTRED C#define LIGHTPURPLE D#define LIGHTYELLOW E#define LIG
6、HTWHITE Ftypedef char COLORTYPE;void setConsoleBackground(COLORTYPE color);/控制台字体格式#define FOREGROUND_BLUE 0x0001#define FOREGROUND_GREEN 0x0002#define FOREGROUND_RED 0x0004#define FOREGROUND_INTENSITY 0x0008#define BACKGROUND_BLUE 0x0010 #define BACKGROUND_GREEN 0x0020 #define BACKGROUND_RED 0x0040
7、#define BACKGROUND_INTENSITY 0x0080#define DEFAULT_BACK_FOR_GROUND 0x0007BOOL SetConsoleColor(WORD wAttributes);BOOL SetCurPos(COORD pos);/控制台大小信息#define CONSOLE_ROW_COUNT 25#define CONSOLE_CLUM_COUNT 80三、menu.h#include ChoiceMenu.h#include StudentGradeInformation.hextern ChoiceMenuStruct cms;extern
8、 int nowselect;extern StudentGradeInformation infStu;void menu_main();四、StudentGradeInformation.h#ifndef STUDENTGRADEINFORMATION#define STUDENTGRADEINFORMATION#include #include using namespace std;#define DEFAULT_DATA_FILENAME default.dattypedef struct StudentInfo string name; int score; StudentInfo
9、;enum ReadOperationType OVERRIDE, /覆盖 APPEND_OVERRIDE, /添加,重复项覆盖 APPEND_PRESERVE /添加,重复项保留;enum ReadError NONE, OPENFILEERROR, BADDATA;#define MAX_SCORE 100#define MIN_SCORE 0#define BAD_SCORE -1class StudentGradeInformationpublic: StudentGradeInformation(); ReadError readfromfile(string path = DEFA
10、ULT_DATA_FILENAME, ReadOperationType type = OVERRIDE); void sort(); void clear(); bool save(); void add(StudentInfo data); /调用之前需要排序 void setSortType(bool isReverse); /逆序排列 vector:iterator find(string name); bool remove(string name); vector:iterator end(); vector datas;private: bool reverse;#endif五、
11、ChoiceMenu.cpp#include ChoiceMenu.h#include ConsoleTools.h#include #include #include string ExpandMenuItemContent(string menuitem,unsigned int width,bool withvsep=true) int n = menuitem.size(); int r = (width - n-4) / 2; int l = width-r-n-4; if (withvsep) return string() + string(r, ) + menuitem + s
12、tring(l, ) + string(); else return string(r+2, ) + menuitem + string(l+2, ); string RepeatUnicondeChar(string stritem,unsigned int n) string result; for (unsigned int i = 0; i n; i+) result += stritem; return result;/水平居中void ShowInHCenter(string str,WORD textColor=DEFAULT_BACK_FOR_GROUND) size_t n
13、= str.size(); cout string(CONSOLE_CLUM_COUNT - n) / 2, ); SetConsoleColor(textColor); coutstr endl; SetConsoleColor(DEFAULT_BACK_FOR_GROUND);void ShowChoiceMenu(ChoiceMenuStruct& mainmenu) system(cls); if (mainmenu._BotSeperateLine.empty() mainmenu.title._menuitems_content_for_show = ExpandMenuItemC
14、ontent(mainmenu.title.content, mainmenu.MenuItemWidth,false); for (size_t i = 0; i mainmenu.menuitems.size(); i+) mainmenu.menuitemsi._menuitems_content_for_show = ExpandMenuItemContent(mainmenu.menuitemsi.content, mainmenu.MenuItemWidth,false); mainmenu._TopSeperateLine = string() + RepeatUnicondeC
15、har(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
16、= ExpandMenuItemContent(string(), mainmenu.MenuItemWidth,false); mainmenu._BlankLineWithSep = ExpandMenuItemContent(string(), mainmenu.MenuItemWidth); /显示在窗口正中央 cout string(CONSOLE_ROW_COUNT - (mainmenu.menuitems.size() * 2 + 4) / 2, n); /ShowInHCenter(mainmenu._TopSeperateLine); ShowInHCenter(mainm
17、enu._BlankLine,mainmenu.TitleTextColor); ShowInHCenter(mainmenu.title._menuitems_content_for_show, mainmenu.TitleTextColor); ShowInHCenter(mainmenu._BlankLine, mainmenu.TitleTextColor); for (size_t i = 0; i mainmenu.menuitems.size(); i+) ShowInHCenter(mainmenu._BlankLine, mainmenu.ItemTextColorDefau
18、lt); ShowInHCenter(mainmenu.menuitemsi._menuitems_content_for_show,mainmenu.ItemTextColorDefault); ShowInHCenter(mainmenu._BlankLine, mainmenu.ItemTextColorDefault);void SelectPos(ChoiceMenuStruct& mainmenu, signed int index,signed int lastindex) int pos = (CONSOLE_ROW_COUNT - (mainmenu.menuitems.si
19、ze() * 2 + 4) / 2+2 + index * 2; int lastpos = (CONSOLE_ROW_COUNT - (mainmenu.menuitems.size() * 2 + 4) / 2 + 2 + lastindex * 2; SetCurPos(COORD 0, lastpos ); /ShowInHCenter(mainmenu._BlankLine, mainmenu.ItemTextColorSelected); ShowInHCenter(mainmenu.menuitemslastindex - 1._menuitems_content_for_sho
20、w, mainmenu.ItemTextColorDefault); /ShowInHCenter(mainmenu._BlankLine, mainmenu.ItemTextColorSelected); SetCurPos(COORD 0, pos ); /ShowInHCenter(mainmenu._BlankLine, mainmenu.ItemTextColorSelected); ShowInHCenter(mainmenu.menuitemsindex - 1._menuitems_content_for_show, mainmenu.ItemTextColorSelected
21、); /ShowInHCenter(mainmenu._BlankLine, mainmenu.ItemTextColorSelected); SetCurPos(COORD 0,CONSOLE_ROW_COUNT );六、ConsoleTools.cpp#include ConsoleTools.h#include #include /设置控制台背景void setConsoleBackground(COLORTYPE color) char bufferBUFFERSIZE_SMALL; sprintf(buffer, color %c0, color); system(buffer);/
22、设置颜色BOOL SetConsoleColor(WORD wAttributes) HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if (hConsole = INVALID_HANDLE_VALUE) return false; return SetConsoleTextAttribute(hConsole,wAttributes);/设置光标位置BOOL SetCurPos(COORD pos) HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPo
23、sition(hConsole, pos); return true;七、main.cpp#include #include ChoiceMenu.h#include menus.hint main() menu_main(); return 0;八、menus.cpp#include menus.h#include #include #include StudentGradeInformation.h#include #include ChoiceMenuStruct cms;int nowselect;StudentGradeInformation infStu;void Event_qu
24、it(const ChoiceMenuStruct* mainmenu);void Event_add(const ChoiceMenuStruct* mainmenu);void Event_view(const ChoiceMenuStruct* mainmenu);void Event_remove(const ChoiceMenuStruct* mainmenu);void Event_save(const ChoiceMenuStruct* mainmenu);void Event_import(const ChoiceMenuStruct* mainmenu);void menu_
25、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(ChoiceMenuItemInf
26、o 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_b
27、ack(ChoiceMenuItemInfo 5.退出程序, Event_quit ); ShowChoiceMenu(cms); SelectPos(cms, 1, 1); int lastselect = nowselect; /处理键盘 while (true) char a = _getch(); /数字键 if (a0 & a= 1 & (size_t)(a - 0) 1) nowselect-; else nowselect = (int)cms.menuitems.size(); SelectPos(cms, nowselect, lastselect); break; case 80: lastselect = nowselect; if (lastselect (int)cms.menuitems.size() nowselect+; else nowselect = 1; SelectPos(cms, nowselect, lastselect); break; continue; /回车键 if (a = 13) cms.menuitemsnowselect-1.fun
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1