目录
一 题目内容
制作一个简易评分系统,要求:
- 用户输入用户名及口令,然后在已有的用户名及口令中检查是否合法,合法进入查询界面;对于不合法的用户或口令最多出错3次,超出3次后自动退出程序;
- 在评委所打的分数中,去掉一个最高分,去掉一个最低分,得出各选手的平均分,然后按平均分进行排序,得出各选手的名次;
- 设计出菜单,使用户能够设置评委的人数并输入姓名,设置选手的人数,并能将最后的得分及名次情况能够保存到文件中记录下来。
二 效果展示
1.用户密码输入
2.设置评委
3.设置选手
4.评委打分
5.查询成绩
三 设计思路
界面设计
基于要求,有如下设计思路:使用自带的窗口控制台实现用户名与口令即密码的输入,在已有的账号密码文档中查找匹配,若匹配成功则进入由使用EasyX图形库设计的交互图形界面。首页分为设置评委、设置选手、评委打分、查询成绩、退出系统五个功能键,在设置评委、设置选手、评委打分界面输入的数据会写入相应的文档保存,而查询成绩则会从保存成绩的文档中读出排名数据,并显示在窗口控制台中,退出系统界面则会调用结束程序强行退出。
界面的设计思路如下图所示:
算法框架
用户密码
用strcmp()函数对输入台输入与打开文件后用getline()函数读出的用户密码进行匹对,匹配则进入主界面,否则直接退出窗口。
EasyX图形库
使用initgraph()函数显示图形化界面,但发现显示的界面一直闪烁,所以使用 BeginBatchDraw()、FlushBatchDraw()、EndBatchDraw()函数即双缓冲技术来防止闪烁。使用InputBox()函数来弹出输出框,使用getMsg()函数来监听鼠标与键盘输入的信息,当鼠标点击确定键时将输入框中的内容经过输入流函数处理后写入文件保存。
评委评分
使用EasyX库提供的InputBox()函数弹出的输出框,依次输入多个评委对选手们的评分,用输入流函数将输入字符串转化为数组容器,运用push_back()及earse()函数删除数组的首和尾元素,取平均值后写进选手信息数组,再通过sort()函数根据选手的成绩对选手进行排序,最后写入文件。
四 C++代码
一共有 6 个.cpp 和 5 个.h文件
Button.h
//通过预编译的方式去掉Unicode字符集
#ifdef UNICODE
#undef UNICODE
#endif // UNICODE
#include<easyx.h>
#include <iostream>
#include<string>
#include "Window.h"
using namespace std;
class Button
{
public:
Button();
Button(const string & text = "button",int x=0, int y=0, int w=100, int h=30);
//virtual ~Button() {} //虚函数
int width(); //宽度
int height(); //高度
void setFixedSize(int w, int h); //绘制表格的宽和高
int x(); //坐标
int y();
void move(int x, int y); //移动坐标
void show() ;//绘制按键
void show_box();//绘制输入框
bool isin(); //判断鼠标是否在当前按钮上
bool isClicked();//判断鼠标是否点击了按键
void eventLoop(const ExMessage &msg);
string box_title;//输入框文本
string box_text;
string m_text; //按键名字
private:
int m_x;
int m_y;
int m_w;
int m_h;
ExMessage m_msg;
COLORREF cur_color ;
COLORREF normal_color = RGB(232, 192, 86);
COLORREF hover_color = BLUE;
};
Button.cpp
#include "Button.h"
Button::Button()
{
}
Button::Button(const string& text, int x, int y, int w, int h): m_x(x), m_y(y), m_w(w), m_h(h),m_text(text){}
int Button::width()
{
return m_w;
}
int Button::height()
{
return m_h;
}
void Button::setFixedSize(int w, int h)
{
this->m_w = w;
this->m_h = h;
}
int Button::x()
{
return m_x;
}
int Button::y()
{
return m_y;
}
void Button::move(int x, int y)
{
this->m_x = x;
this->m_y = y;
}
void Button::show()
{
setfillcolor(cur_color); //按键颜色
::fillroundrect(m_x, m_y, m_x + m_w, m_y + m_h, 10, 10); //按键大小
settextcolor(WHITE);
settextstyle(30, 0, "宋体");
//把文字居中显示在按钮中间
int tx = m_x + (m_w - textwidth(m_text.c_str())) / 2;
int ty = m_y + (m_h - textheight(m_text.c_str())) / 2;
::outtextxy(tx, ty, m_text.c_str()); //显示
//cout << m_text;
}
void Button::show_box()
{
setfillcolor(cur_color); //按键颜色
::fillroundrect(m_x, m_y, m_x + m_w, m_y + m_h, 10, 10); //按键大小
settextcolor(WHITE);
settextstyle(36, 0, "楷体");
//把文字居中显示在按钮中间
int tx = m_x + (m_w - textwidth(m_text.c_str())) / 2;
int ty = m_y + (m_h - textheight(m_text.c_str())) / 2;
::outtextxy(tx, ty, m_text.c_str()); //显示
//点击自己弹出对话框
if (isClicked())
{
char buf[128];
InputBox(buf, 128, box_text.data(), box_title.data());
if (buf[0] != '\0')
m_text = buf;
}
}
bool Button::isin()
{
m_msg = Window::getMsg();
if (m_msg.x >= m_x && m_msg.x < m_x + m_w && m_msg.y >= m_y && m_msg.y <= m_y + m_h)
{
return true;
}
return false;
}
bool Button::isClicked()
{
if (isin()) //鼠标在上面
{
m_msg = Window::getMsg();
if (m_msg.message == WM_LBUTTONDOWN) //左击
{
return true;
}
}
return false;
}
void Button::eventLoop(const ExMessage& msg)
{
m_msg = msg;
if (!isin()) //如果鼠标没有在按钮上
cur_color = normal_color;
else
cur_color = hover_color;
}
Func.h
#pragma once
//通过预编译的方式去掉Unicode字符集
#ifdef UNICODE
#undef UNICODE
#endif // UNICODE
#include<easyx.h>
#include <iostream>
#include<string>
#include "Window.h"
#include "Button.h"
#include <vector>
#include <fstream>
#include <sstream>
#include "Players.h"
#include "Judges.h"
using namespace std;
class Func
{
enum Operator { //枚举
O1,
O2,
O3,
O4,
O5,
Menu
};
public:
Func(); //初始化
int menu(); //界面
void run(); //启动
void ToScore(); //评委打分
void add1(); //设置评委
void add2(); //设置选手
void display(); //展示最终成绩
void drawBackground(); //绘制背景
void enevtLoop(); //鼠标点击
void readFile(string& fileName,int opt); //读文件 opt:1为选手,2为评委
void saveFile(string& fileName,int opt); //保存文件
string fileName1= "./image/Players1.txt";
string fileName2= "./image/Players2.txt";
string fileName3 = "./image/Judges1.txt";
string fileName4 = "./image/Judges2.txt";
private:
int op;
ExMessage m_msg;
IMAGE m_img; //创建一个加载图像的变量
vector<Button*> menu_btn; //首页菜单5按键
vector<Button*> add_btn; //添加按键0、输入框1
vector<Button*> add2_btn; //添加按键0、输入框1
vector<Button*> need_btn; //需要评委的人数
vector<Button*> score_btn; //打分框
vector<Button*> return_btn; //每个界面都有的返回按键
void fromString( string& str, vector<float> &vec_score);
//读取文件 保存信息(选手)
string m_header;
vector<Players> vec_ply;
//读取文件 保存信息(评委)
string mm_header;
vector<Judges> vec_jud;
int cnt_judges; //目前评委人数
int cnt_players; //目前选手人数
int need_judges;//需要评委的人数
vector<float> vec_score; //每个选手的得分
};
Func.cpp
#include "Func.h"
#include <algorithm>
bool dis_flag = true; //只显示一次
bool need_flag = true;//需要人数输入完毕
int play_cnt; //打完分的人数
bool judge_over; //已完成打分标识
bool need_add_flag=false; //是否添加评委
static bool cmp(Players x, Players y) {
return x.grade > y.grade;
}
Func::Func()
{
//readFile(fileName4, 2);
//cout << "数量" << vec_jud.size();
cnt_judges = vec_jud.size();
::loadimage(&m_img, "./image/pic.jpg", 960, 640); //导入背景图片
//界面按键初始化
menu_btn.push_back(new Button("设置评委"));
menu_btn.push_back(new Button("设置选手"));
menu_btn.push_back(new Button("评委打分"));
menu_btn.push_back(new Button("查询成绩"));
menu_btn.push_back(new Button("退出系统"));
for (int i = 0; i < menu_btn.size(); i++)
{
menu_btn[i]->setFixedSize(250, 50); //按键大小
//按键布局
int bx = (960- menu_btn[i]->width()) / 2;
int vp = (640 - menu_btn.size() * menu_btn[i]->height()) / 2;
int by = vp+ + i * (menu_btn[i]->height()+20);
menu_btn[i]->move(bx, by);
}
//-----------------添加评委、初始化---------------------------
readFile(fileName4, 2);
cnt_judges = vec_jud.size();
for (auto& val : vec_jud) //显示出来
cout << val.formatInfo();
//------------------评委打分、初始化-----------------------
judge_over = false;
play_cnt = 0; //已完成打分的选手
need_flag = true;//需要输入需要评委人数
//-------------------------------------------------------------
//------------------返回键初始化----------------------------------
return_btn.push_back(new Button("返回")); //确定人数按键
return_btn[0]->setFixedSize(100, 50); //按键大小
//-------------------------------------------------------------
}
int Func::menu()
{
//readFile(fileName4, 2);
//cnt_judges = vec_jud.size();
for (int i = 0; i < menu_btn.size(); i++)
{
menu_btn[i]->show();
menu_btn[i]->eventLoop(m_msg);
if (menu_btn[i]->isClicked())
{
return i;
}
}
return Menu;
}
void Func::run() //界面运行
{
op = Menu; //初始化选中菜单
Window::beginDraw();
/* dis_flag = true;*/
while (true)
{
drawBackground(); //绘制背景
if (Window::hasMsg()) //如果有消息
{
m_msg = Window::getMsg();
switch (m_msg.message) //看是何种消息
{
case WM_KEYDOWN: //按键按下
if (m_msg.vkcode == VK_ESCAPE) //按ESC退出操作,返回主界面
{
op = Menu;
}
break;
default: //鼠标操作
break;
}
}
switch (op)
{
case Menu:
op = menu(); break;
case Func::O1:
add1();
break;
case Func::O2:
add2(); break;
case Func::O3:
ToScore(); break;
case Func::O4:
display(); break;
default:
exit(0);break;
}
Window::flushDraw();
Window::getMsg().message = 0;
}
Window::endDraw();
}
void Func::ToScore()
{
float fin_score = 0;
if (judge_over) {
cout << "已完成打分" << endl;
op = 1;
}
//-------------------------共有返回键
return_btn[0]->show();
return_btn[0]->eventLoop(m_msg);
return_btn[0]->move(800, 50);
if (return_btn[0]->isClicked() )
op = Menu;
//---------------------------------------
outtextxy(50, 50, "评委打分");
string str = "目前已有位" + to_string(vec_jud.size()) + "评委";
outtextxy(300, 50, str.c_str());
const char* title = "请输入需要的评委的数目";
settextstyle(36, 0, "楷体");
if (need_flag)outtextxy((960 - textwidth(title)) / 2, 150, title);
need_btn.push_back(new Button("人数确定")); //确定人数按键
need_btn[0]->setFixedSize(200, 50); //按键大小
if(need_flag) need_btn[0]->show(); //还没输入
need_btn[0]->eventLoop(m_msg);
need_btn[0]->move(750, 270);
need_btn.push_back(new Button("")); //输入框
need_btn[1]->setFixedSize(450, 50); //按键大小
if (need_flag) need_btn[1]->show_box();//还没输入
need_btn[1]->eventLoop(m_msg);
need_btn[1]->move(250, 270);
need_btn[1]->box_title = "请输入需要的评委的数目";
need_btn[1]->box_text = "输入人数不大于现有评委数";
auto str1 = need_btn[1]->m_text;
if (need_btn[0]->isClicked() && !str1.empty())
{
need_judges = stoi(need_btn[1]->m_text);
if (need_judges > vec_jud.size())
{
cout << "评委不够,请添加评委" << endl;
/*need_judges = 1;*/
need_add_flag = true;
need_flag = true;
op = 0;
}
else cout << "succes\n现在需要 " << need_judges << " 位评委\n";
need_btn[1]->m_text.clear();
need_flag = false; //输入完毕
}
/* 输入得分*/
string title1 = " 请" + to_string(need_judges) +"个评委对第" + to_string(play_cnt + 1) + "个选手进行评分";
settextstyle(36, 0, "楷体");
if (!need_flag)outtextxy((960 - textwidth(title)) / 2, 150, title1.c_str());
score_btn.push_back(new Button("得分确定")); //确定得分按键
score_btn[0]->setFixedSize(200, 50); //按键大小
if (!need_flag) score_btn[0]->show();
score_btn[0]->eventLoop(m_msg);
score_btn[0]->move(750, 270);
score_btn.push_back(new Button("")); //输入框
score_btn[1]->setFixedSize(450, 50); //按键大小
if (!need_flag) score_btn[1]->show_box();
score_btn[1]->eventLoop(m_msg);
score_btn[1]->move(250, 270);
score_btn[1]->box_title = "请输入第 "+to_string(play_cnt +1) + " 个选手的得分";
score_btn[1]->box_text = "按评委编号大小依次输入 " + to_string(need_judges) + " 个得分(用空格隔开)";
auto str2 = score_btn[1]->m_text;
if (score_btn[0]->isClicked() && !str2.empty())
{
//need_judges = stoi(score_btn[1]->m_text);
vec_score.clear();
fromString(str2, vec_score);//调用流函数,把得分字符串分开
//cout << "用数字表示,能表示说明正确分离开" << endl;
//for (auto& val : vec_score) //显示出来
// cout << val<<endl;
play_cnt++;
cout <<endl<< "第 " << play_cnt << " 个选手的得分分别是:\n"<< score_btn[1]->m_text<<endl;
score_btn[1]->m_text.clear();
//去掉最高分,最低分,取平均值(大于2时)
//--------------------------------------------------------------------------------------------------------
if (vec_score.size() > 2)
{
sort(vec_score.begin(), vec_score.end()); //排序
vec_score.pop_back(); //删除最后一个
vec_score.erase(vec_score.begin()); //删除第一个
cout << "去掉最高、最低分后的得分"<<endl;
for (auto& val : vec_score) //去掉最高、最低分后
cout << val<<endl;
}
//评分小于等于2,直接取平均值
fin_score=0;
int fin_size = vec_score.size();
for (auto& val : vec_score)
{
fin_score += val;
}
fin_score = fin_score / fin_size;
cout<<"最终得分为:"<< fin_score << endl;
/*vec_ply[play_cnt-1].grade = fin_score;*/
vec_ply.push_back(Players(play_cnt, fin_score, 0));
cout << vec_ply.size() << endl;
//----------------------------------------------------------------------------------------------------------
//排序也在这一并写完
sort(vec_ply.begin(), vec_ply.end(), cmp);
int idx = 0;
for (auto& val : vec_ply)
{
idx++;
val.number = idx;
}
if (cnt_players == play_cnt) //不小于
{
cout << endl << "\n评委已完成打分\n" << endl;
play_cnt = 0; //统统清0
judge_over = true;
saveFile(fileName2, 1);
op = Menu;
}
//----------------------------------------------------------------------------------------------------------
}
}
//static bool cmp(Players x, Players y) {
// return x.grade > y.grade;
//}
void Func::add1()
{
//-------------------------共有返回键
return_btn[0]->show();
return_btn[0]->eventLoop(m_msg);
return_btn[0]->move(800, 50);
if (return_btn[0]->isClicked())
op = Menu;
//---------------------------------------
if (need_add_flag && need_judges == cnt_judges) //需要添加评委 且添加完毕
{
op = 2; //跳回评分界面
need_add_flag = false;
}
outtextxy(50, 50, "设置评委");
string str = "目前已有" + to_string(cnt_judges) + "位评委";
outtextxy(300, 50, str.c_str());
const char* title = "请输入评委的< 编号 姓名 >";
settextstyle(36, 0, "楷体");
outtextxy((960 - textwidth(title)) / 2, 150, title);
add_btn.push_back(new Button("添加")); //添加评委按键
add_btn[0]->setFixedSize(100, 50); //按键大小
add_btn[0]->show();
add_btn[0]->eventLoop(m_msg);
add_btn[0]->move(750, 270);
//if (add_btn[0]->isClicked()) cout << "success"; //测试
add_btn.push_back(new Button("")); //添加评委输入框
add_btn[1]->setFixedSize(450, 50); //按键大小
add_btn[1]->show_box();
add_btn[1]->eventLoop(m_msg);
add_btn[1]->move(250, 270);
add_btn[1]->box_title = "请输入评委的信息";
add_btn[1]->box_text = "请按照\n< 编号 姓名 >\n的顺序输入评委的信息";
auto str1 = add_btn[1]->m_text;
if (add_btn[0]->isClicked() && !str1.empty())
{
vec_jud.push_back(Judges::fromString(str1));
add_btn[1]->m_text.clear();
cout << "succes\n现在有 "<< vec_jud.size()<<" 位评委\n";
cnt_judges++;
saveFile(fileName4, 2); //保存
cout <<"编号\t姓名" << endl;
for (auto& val : vec_jud) //显示出来
cout<< val.formatInfo();
}
}
void Func::add2()
{
//-------------------------共有返回键
return_btn[0]->show();
return_btn[0]->eventLoop(m_msg);
return_btn[0]->move(800, 50);
if (return_btn[0]->isClicked())
op = Menu;
//---------------------------------------
outtextxy(50, 50, "设置选手");
string str = "目前已有" + to_string(cnt_players) + "位选手";
outtextxy(300, 50, str.c_str());
const char* title = "如要重新开始评分 请输入选手的数量";
settextstyle(36, 0, "楷体");
outtextxy((960 - textwidth(title)) / 2, 150, title);
add2_btn.push_back(new Button("确定")); //添加选手按键
add2_btn[0]->setFixedSize(100, 50); //按键大小
add2_btn[0]->show();
add2_btn[0]->eventLoop(m_msg);
add2_btn[0]->move(750, 270);
add2_btn.push_back(new Button("")); //添加输入框
add2_btn[1]->setFixedSize(450, 50); //按键大小
add2_btn[1]->show_box();
add2_btn[1]->eventLoop(m_msg);
add2_btn[1]->move(250, 270);
add2_btn[1]->box_title = "请输入选手的数量";
add2_btn[1]->box_text = "请输入选手的数量";
auto str2 = add2_btn[1]->m_text;
if (add2_btn[0]->isClicked() && !str2.empty())
{
judge_over = false; //重新开始打分
cnt_players = stoi(str2);
vec_ply.clear();
//for (int i = 1; i <= cnt_players; i++)
//{
// Players p(i,0,0);
// vec_ply.push_back(p);
//}
add2_btn[1]->m_text.clear();
//saveFile(fileName2, 1); //保存
//cnt_players = vec_ply.size();
//cout << "\nsucces\n现在有 " << vec_ply.size() << " 位选手\n";
cout << "\nsucces\n现在有 " << cnt_players << " 位选手\n";
}
}
void Func::display()
{
/*outtextxy(50, 50, "展示成绩");*/
cout << "\n选手成绩展示" << endl;
string temp1;
ifstream fin("./image/Players2.txt", ios::in);
while (getline(fin, temp1))
{
cout << temp1 << endl;
}
op = Menu;
}
void Func::drawBackground()
{
::putimage(0, 0, &m_img);//在窗口中打印图像
}
void Func::enevtLoop()
{
}
void Func::readFile(string& fileName,int opt)
{
fstream read(fileName, ios::in);
if (!read.is_open()) //打开失败
{
cout << "打开失败\n";
return;
}
else cout << "打开成功\n";
//读取表头
char buf[1024] = { 0 };
read.getline(buf, 1024);
if (opt == 1) m_header = buf;
else mm_header = buf;
//读取数据
while (!read.eof()) //没有读到结尾
{
char data[1024] = { 0 };
read.getline(data, 1024);
if (strlen(data) == 0) //跳过空行
break;
//格式化读取
if (opt == 1)
{
Players ply;
stringstream ss(data);
ss >> ply.id >> ply.grade >> ply.number;
vec_ply.push_back(ply);
}
else
{
Judges jud;
stringstream ss(data);
ss >> jud.id >> jud.name ;
vec_jud.push_back(jud);
}
}
read.close();
}
void Func::saveFile(string& fileName,int opt)
{
fstream write(fileName, ios::out | ios::trunc); //写或创建
if (!write.is_open()) //打开失败
{
cerr << fileName << "file open failed" << endl;
return;
}
/*else cout << "写打开成功" << endl;*/
if (opt == 1) //写选手信息
{
char buf[] = "编号\t得分\t名次\n"; //写表头
write.write(buf,sizeof(buf));
for (auto& val : vec_ply) //写数据
{
string info = val.formatInfo(); //格式化写入
write.write(info.c_str(), info.size());
//cout<< val.formatInfo();
}
}
else //写评委信息
{
char buf[] = "编号\t姓名\n"; //写表头
write.write(buf, sizeof(buf));
for (auto& val : vec_jud)
{
string info = val.formatInfo(); //格式化写入
write.write(info.c_str(), info.size());
//cout<< val.formatInfo();
}
}
write.close();
}
void Func::fromString( string& str,vector<float> &vec_score) //输入流字符串转数组
{
int word;
stringstream ss(str);
while (ss >> word) { //>>遇到空格返回整型给word
vec_score.push_back(word);
}
return;
}
Judges.h
#pragma once
//通过预编译的方式去掉Unicode字符集
#ifdef UNICODE
#undef UNICODE
#endif // UNICODE
#include<string>
#include <iostream>
using namespace std;
class Judges
{
public:
Judges();
Judges(int id, string& name);
string formatInfo(); //格式化数据
static Judges fromString(const string& str); //根据字符串构造评委的类
int id; //编号
string name; //名字
//float ToScore; //给分
};
Judges.cpp
#include "Judges.h"
#include <sstream>
Judges::Judges()
{
}
Judges::Judges(int id, string& name): id(id), name(name)
{
}
string Judges::formatInfo()
{
stringstream ss;
ss << id << "\t" << name << endl;
return ss.str();
}
Judges Judges::fromString(const string& str)
{
Judges jud;
stringstream ss(str);
ss >> jud.id >> jud.name;
return jud;
}
Players.h
#pragma once
//通过预编译的方式去掉Unicode字符集
#ifdef UNICODE
#undef UNICODE
#endif // UNICODE
#include<string>
#include <iostream>
using namespace std;
class Players
{
public:
Players();
Players(int id, float grade, int number);
string formatInfo(); //格式化数据
int id; //编号
float grade; //得分
int number; //名次
};
Players.cpp
#include "Players.h"
#include <sstream>
Players::Players()
{
}
Players::Players(int id, float grade, int number) : id(id), grade(grade), number(number)
{
}
string Players::formatInfo()
{
std::stringstream ss;
ss << id << "\t" << grade << "\t" << number << endl;
return ss.str();
}
Window.h
#pragma once
//通过预编译的方式去掉Unicode字符集
#ifdef UNICODE
#undef UNICODE
#endif // UNICODE
#include<easyx.h>
#include<string>
using namespace std;
class Window
{
public:
Window(int w, int h, int flag); //将窗口的建立定义为一个构造函数
void setWindowTilte(const string& tilte);
int exec();
//按键操作和鼠标操作
//判断有没有消息
inline static bool hasMsg() { return ::peekmessage(&m_msg,EX_KEY | EX_MOUSE); }
inline static ExMessage& getMsg() { return m_msg; }
//防止闪烁,运用双缓冲
static void beginDraw();
static void flushDraw();
static void endDraw();
HWND m_handle; //窗口句柄
private:
inline static ExMessage m_msg; //消息 C++17以上才能用此内联,否则要开头定义一下
};
Window.cpp
#include "Window.h"
#include<iostream>
Window::Window(int w, int h, int flag)
{
m_handle = ::initgraph(w, h, flag);
}
void Window::setWindowTilte(const string& title)
{
::SetWindowText(m_handle, title.c_str());
}
int Window::exec()
{
return getchar();
}
//双缓冲技术,防闪烁
void Window::beginDraw()
{
::BeginBatchDraw();
}
void Window::flushDraw()
{
::FlushBatchDraw();
}
void Window::endDraw()
{
::EndBatchDraw();
}
main.cpp
#include<iostream>
#include"Func.h"
#include"Window.h"
using namespace std;
bool login_flag ;
char UsrName[20] ;
char Psword[20];
int UsrInfo_flag; //账号密码匹配情况
int error_cnt=0; //输入密码错误的次数
int error_name = 0; //输入用户名错误的次数
void login() {
string temp1;
string temp2;
int existname = 0;
int sucess = 0;
int i = 0;
ifstream fin("./image/UsrInfo.txt", ios::in);
while (getline(fin, temp1))
{
getline(fin, temp2);//一次读进去两行,分别是用户名和密码
if (!strcmp(UsrName, temp1.c_str())) {//有这个用户名了,接下来看看密码是不是相符的
existname = 1;
if (!strcmp(Psword, temp2.c_str())) {//相符
sucess = 1;
break;
}
}
}
fin.close();
//cout << temp1 << " " << temp2; //测试
if (!existname) {
UsrInfo_flag=2;//没有账户名
}
else {
if (sucess) UsrInfo_flag= 1;
else UsrInfo_flag= 3;//用户名和密码不匹配
}
switch (UsrInfo_flag)
{
case 1:
cout << "登录成功" << endl; login_flag = true;
break;
case 3:
cout << "密码错误" << endl; error_cnt++;
cout << "已输入错误" << error_cnt << "次,当连续输错3次将退出程序\n";
break;
case 2:
cout << "没有此用户名,请重新输入" << endl;
error_name++;
cout << "已输入错误" << error_name << "次,当输错5次将退出程序\n";
break;
default:
break;
}
}
int main() {
//login_flag = true;
login_flag = false;
while (UsrInfo_flag==0 || UsrInfo_flag !=1 ) //第一次输入或输入正确
{
cout << "请输入您的账号:";
cin >> UsrName;
cout << "请输入您的密码:";
cin >> Psword;
login();
if (error_cnt == 3 || error_name==5) exit(0);
}
Window w(960, 640, EX_SHOWCONSOLE);
w.setWindowTilte("简易评分系统");
if (login_flag)
{
Func f;
f.run();
}
return w.exec();
}
五 操作视频
简易评分系统操作演示(EasyX版)
六 资源下载(如有需要)
https://download.youkuaiyun.com/download/weixin_57706322/88771040?spm=1001.2014.3001.5503