每个学生的信息为:学号、姓名、性别、家庭住址、联系电话、语文、数学、外语三门单科成绩、考试平均成绩、考试名次、同学互评分、品德成绩、任课教师评分、综合测评评分、综合测评名次。考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%。要求完成以下功能:
输入学生信息、学号、姓名、性别、家庭住址、联系电话,按学号以从小到大的顺序存入文件中
插入或修改学生信息
删除学生信息
浏览学生信息
按考试科目录入学生成绩并且按公式:考试成绩=(语文+数学+外语)/3计算考试成绩,并计算考试名次
学生测评数据输入并计算综合测评分及名次
学生数据查询与修改
系统以菜单的形式工作,要求界面比较美观;有一定的容错能力,例如输入成绩不在合理范围内,系统应该有提示,要求重新输入。
因为学生测评系统中包含着大量的学生数据,故该系统必须要有着正确的账号及密码才可以登录进该测评系统。故需要设立一个登录界面才可以使得老师可以成功登录学生测评系统,而且为了防止暴力破解,该登录界面设置了3次输入失败后自行退出程序的操作。
A.密码输入成功
B.密码输入失败
首先该系统通过Judge类建立了一个容错机制,当输入信息为误时系统会自动进行死循环提示继续输入,直到输入正确为止。
学生数据的录入:该模块通过数据的录入进而实现内容的初始化,通过SR函数
void SR();//输入信息
将输入的学生信息存储到stud这个数组中
Student stud[50];
进而该数组通过学生类保存函数内容保存进文件中
void save(int);//保存信息
学生数据的删除、修改、显示都需要先通过学生类中的操作函数将学生信息读取到数组stud中,进而实现学生数据的删除,修改和显示
void read();//读取信息
学生数据的删除:该模块通过删除函数来将已经录入的学生信息进入删除,输入学号按照学号进行删除该信息
void SC();//删除信息
学生数据的修改:该模块通过修改函数来将已经录入的学生信息进行修改,输入学号后进行查找该信息在数组中的存储位置,通过创建备份文件来将与输入信息不一样的学生成员信息存储到备份文件中,并删除原文件,之后将备份文件改名未原文件。
void XG();//修改信息
学生数据的显示:该模块通过显示函数将已经录入的学生信息显示出来,主要通过学生类中的操作函数将数据通过数组的将信息打印出来
void show();//显示信息
无论使用哪种评测方式都需要将文件信息输入到stud数组中,才能够通过学生类中的一系列操作函数进行评测。
按考试成绩排名:通过学生类的操作函数将考试信息先求平均值储存进局部变量temp数组中,对该数组使用冒泡排序,从而实现成绩的由小到大的排序。在将每个人的名次对应并为数组中的ranking1赋值(该值为每个人按考试成绩排名的名次)
void PM1();//按考试成绩排名
int ranking1;//成绩名次
按综合测评排名:具体实现方式与与考试成绩排名类似,但它将名称存储在ranking2中。
int ranking2;//综合名次
按学号大小排名:先将学号信息存在一个一维数组中,对该一维数组进行冒泡排序。最后对应在一维数组中的次序,将stud中的学生信息进行交换。
按学号查询:通过数组的遍历,若信息可以与输入学号相对上,便将信息输出。否则系统自动输出没有查询到相关信息,进行进行下一步操作。
按姓名查询:与按学号查询类型。
依据分析的结果设计软件的逻辑架构,划分功能模块。给出功能结构图和程序总体流程图。
程序功能流程图如图3.1所示
学生测评系统进行了多种操作,其中在登录时我们需要进入登录子系统进行登录,从而进入学生测评系统,在此期间可以选择更改密码和进入评测系统两种选择,在进入测评系统后,我们还可以进行三个子系统的操作,分别是学生信息管理,学生数据评测,信息查询中心和退出测评系统等四个子系统,在此四个子系统分别有着对应的操作函数。其中学生信息管理有着录入,删除,修改,显示学生信息,学生数据评测有着按学号大小排序,按考试参加排序和按综合测评排序,信息查询中心有着按学号查询,按姓名查询,其中三个子系统均含有与学生测评系统的交互功能,可以实时返回学生测评系统。
程序总体流程图如图3.2和3.3所示
分模块给出每个功能模块进行详细设计,给出每个模块详细功能框架图、程序实现流程,每个模块用到函数接口(函数头部及功能介绍)等。
接口函数:Student();构造函数,由系统自动调用,用于文件的初始化
接口函数:main()主函数
整个学生测评系统由main()主函数开始,而main()主函数中只是包含account()登录界面的调用。所以进入main()主函数后直接进入第一个程序运行模块account()及管理员界面。由于防止暴力破解等一系列操作,故为该系统自动加入了三次密码错误自动退出程序的操作。
接口函数:Menu();进行调用学生测评系统的子系统,同时该学生测评系统之中下辖四个子系统。
学生信息管理子系统被学生测评系统调用出来,分为五大模块,该五大模块都需要使用文件流将信息存储到数组或者把信息从数组存储到文件上,从而实现信息的录入、修改、删除、显示。该子系统还要一个返回学生测评系统的模块实现了程序的交互功能。
接口函数:void save(int);此函数将信息存储在stud数组中,再通过输出流存储在文件上。本测评系统与文件相连最重要的函数便是save函数,它将本系统和文件1的信息紧紧连接在一起,作为一道桥梁,使得数组的信息和文件的信息得以同步进行更新。
接口函数:void SR();该函数将录入本次输入的学生信息,内嵌save保存函数,将信息保存到文件中。
接口函数:void SC();该函数内嵌read();读取信息函数,将文件中的信息读取到stud这个数组上。输入要删除的学号,遍历该数组,之后通过文件操作将信息删除。
接口函数:void SC();内嵌函数信息读取函数read();通过数组值的覆盖及一系列文件操作将信息修改。在修改途中还加入了容错机制及文件操作,修改途中还可以返回上一步的操作。在保存时系统还将自动进行提醒,是否保存,给予了操作者一定的灵活性。
学生数据评测是一个重要的子系统,它保证了学生信息的各项排序,其中有按学号排序,按考试成绩大小排序和按综合测评排序,各种各样的排序方法都围绕着一个最重要的方法-------冒泡排序。通过冒泡排序即双重嵌套循环,为学生的各项数据进行了排序。从而保证了教师可以通过各式各样的方法来进行检测学生的各项成绩。其中还调用了相当一部分文件操作,临时变量的建立,及各类算法保证了学生成绩,学号,测评的排名。为学生的各项成绩有了基本的排名。
接口函数:void PM1();内嵌函数read();进行读取信息,并将考试成绩存储到临时建立的数组temp中,并将temp数组进行冒泡排序,之后将名次存储到Student成员变量ranking1中,该变量存储的值便为学生考试成绩的排名,最后输出各项信息。
接口函数:void PM2();程序实现方法与按考试成绩排名类似,只不过在计算出来的成绩不同。
接口函数:void PM3();内嵌成员函数read();同时定义一个与学号信息相同类型的一维数组num1,将学号信息赋值给该一维数组,并对它进行冒泡排序,之后使用双重嵌套循环进行排名,最后输出所有信息。
其中包含了两大操作,其一为按学号查询,其二为按姓名查询。两种查询均与文件相关联,保证了信息的同步。
接口函数:void sn();内嵌成员函数read();将信息存储到数组stud中,输入要查询学生的学号,遍历该数组,若查到则输出该学生所有信息,未找到则输出未查询到相关信息。
接口函数:void sm();内嵌成员函数read();将信息存储到数组stud中,输入要查询学生的姓名,遍历该数组,若查到则输出该学生所有信息,未找到则输出未查询到相关信息。
在学生类之前建立了一个Judge判断类,学生类进行了公有继承Judge类,通过Judge类进行判断输入是否符合规则,其中包含了汉字判断,数子的判断等等,如果输入失败,系统则将进行循环操作,提醒操作者继续输入,直到输入正确为止。该容错系统大大的增强了本测评系统的灵活机制,为输入者的输入错误做了基本的系统保证,同时将本系统的持续化操作提供了可能。
在控制台中心,输入者会进行登录操作,该操作为本学生测评系统的第一道屏障,如果未通过登录操作,便不会进入登录界面,从而不能实现学生测评系统的一系列操作。
int main()
{
system("color 70");//将控制台背景改为亮白色
Account();//登录界面
}
int Account()
{
system("cls");
int tempt;
tempt=1;
while(tempt)
{
system("cls");
cout<<" 测评登陆系统"<<endl;
cout<<"***********************"<<endl;
cout<<" 1. 教师登陆 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 2. 退出系统"<<endl;
int option;
option=optionJudge(); //选择菜单按钮
switch (option) {
case 1:
login(id,input); //登陆控制
tempt=0;
break;
case 2:
break;
default:
cout<<"输入错误,请正确输入!"<<endl;
break;
}
if(option==2)
{
cout<<"退出成功!"<<endl;
break;
}
}
}
void Menu()
{
int option;//定义选项
int t=1;
while(t){
system("cls");
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"\t\t*****欢迎进入学生综合测评系统*****"<<endl;
cout<<"\t\t本系统可以存储学生的基本信息和各科成绩,并能计算出考试成绩,综合测评成绩和排名"<<endl;
cout<<"\t\t基本存储信息包括学号、姓名、性别、家庭住址、联系电话"<<endl;
cout<<"\t\t各科成绩包括语文、数学、外语三门单科成绩"<<endl;
cout<<"\t\t其它包括考试平均成绩、考试名次、同学互评分、品德成绩、任课教师评分、综合测评评分、综合测评名次"<<endl;
cout<<"\t\t考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t 1. 学生信息管理 "<<endl;
cout<<"\t\t 2. 学生数据测评 "<<endl;
cout<<"\t\t 3. 信息查询中心 "<<endl;
cout<<"\t\t 0. 退出程序 "<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t 请输入【0-3】 :"<<' ';
option=optionJudge();
switch(option) //输入编号调用相关函数
{
case 0: exit(0); //返回主界面
t=0;
break;
case 1: system("cls");
t=0;
Fire();
break;
case 2: system("cls");
t=0;
statistics();
break;
case 3: system("cls");
t=0;
inquiry();
break;
default:cout<<"请按规则输入 "<<endl;
system("pause");
system("cls");
break;
}
}
}
void Fire()//学生信息管理界面
{
Student xx;//定义类对象
system("cls");
int option;
int t=1;
while(t){
cout<<"\t\t\t***************学生信息管理***********"<<endl;
cout<<"\t\t\t*************************************"<<endl;
cout<<"\t\t\t 1.录入学生信息 "<<endl;
cout<<"\t\t\t 2.删除学生信息 "<<endl;
cout<<"\t\t\t 3.修改学生信息 "<<endl;
cout<<"\t\t\t 4.显示学生信息 "<<endl;
cout<<"\t\t\t 0.返回主菜单 "<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 请输入 【0-4】 :"<<' ';
option=optionJudge();//调用判断函数判断是否符合规则
switch(option)//判断输入的选项调用相关函数
{
case 0: system("cls");
t=0;
Menu();
break;
case 1: system("cls");
t=0;
xx.SR();
break;
case 2: system("cls");
t=0;
xx.SC();
break;
case 3: system("cls");
t=0;
xx.XG();
break;
case 4: system("cls");
t=0;
xx.show();
break;
default:cout<<"输入有误!"<<endl;
system("pause");
system("cls");
Fire();
break;
}
}
}
void statistics()//学生数据测评
{
Student xx;//定义类对象
system("cls");//清屏
int option;//定义选项
int t=1;
while (t)
{
cout<<"\t\t\t****************学生数据测评***********"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 1.按学号大小排名 "<<endl;
cout<<"\t\t\t 2.按考试成绩排名 "<<endl;
cout<<"\t\t\t 3.按综合测评排名 "<<endl;
cout<<"\t\t\t 0.返回主菜单 "<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 请输入【0-3】 :"<<' ';
option=optionJudge();//判断输入的选项是否符合规则
switch(option)//判断输入的选项调用相关函数
{
case 2:
system("cls");
t=0;
xx.PM1();
break;
case 3:
system("cls");
t=0;
xx.PM2();
break;
case 1:
system("cls");
t=0;
xx.PM3();
break;
case 0:
system("cls");
t=0;
Menu();
break;
default:
cout<<"输入有误!"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
system("pause");
system("cls");
statistics();
break;
}
}
}
void inquiry()//信息查询中心
{
Student xx;//定义类对
system("cls");
int option;//定义选项
int t=1;
while (t)
{
cout<<"\t\t\t**************信息查询中心*************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t 学生查询管理 "<<endl;
cout<<"\t\t\t 1.按学号查询 "<<endl;
cout<<"\t\t\t 2.按姓名查询 "<<endl;
cout<<"\t\t\t 0.返回主菜单 "<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 请输入【0-2】 :"<<' ';
option=optionJudge();//判断输入的选项是否符合规则
switch(option)//判断输入的选项调用相关函数
{
case 1: system("cls");
t=0;
xx.sn();
break;
case 2: system("cls");
t=0;
xx.sm();
break;
case 0: system("cls");
t=0;
Menu();
break;
default:cout<<"输入有误!"<<endl;
system("pause");
system("cls");
inquiry();
break;
}
}
}
测试数据,运行界面、测试输出的结果分析。
B. 删除学生信息(如图6.3)
(3)学生数据评测
A. 按学号大小排序(如图6.6)
大型项目,需要确定好程序的流程及分支。每个程序界面都需要需要确定好上一步及下一步操作。
模块化设计非常重要,每一个模块通过直接的相互调用来实现程序的运作。程序通过多个模块之间的交互进而实现程序整体的灵活性。
写一个模块就要debug一个模块,不能等到所有模块写好后,再进行程序之间的调试。那样的bug太多,不利于程序的调试。而且很难发现其中的小错误。
在写程序之前一定要做好程序流程方面的问题,要先规划好程序的流程,再进行程序的写和调试。
我们明白做任何事之前都要对事情有个大体的规划,列好框架,处理好主次关系,然后按计划,有序地进行。
编程是个细心活。都说细节决定成败,这次我们算是有很深刻的体会。一个拼写错误 的符号,有时会白白浪费我们一个下午的时间。而这其中也慢慢地磨练了我们的耐心。
#include
#include //文件的输入输出
#include
#include //说明:是I/O流控制头文件,就像C里面的格式化输出一样
#include
#include
#include
using namespace std;
int press;
int choose;
const int n=50; //全局变量,设为一次输入多少条信息
void Menu();
void Fire(); //学生信息管理系统界面
void statistics(); //学生数据评测
void inquiry(); //信息查询中心
void HX(); //划线函数
int optionJudge(); //选项格式判断
string id="004936"; //登录界面ID
string password="111111"; //初始密码
string input;
int Account(); //登录界面
void login(string a ,string b); //判断密码是否正确
void reset_password(string n);//重置密码
class Judge//构建判断数据类
{
public:
string SexJudge();//性别的判断
string TelJudge();//电话号码的判断
double GradeJudge();//分数判断
int NumJudge2();//查询、删除、修改学号判断
string chineseJudge();//文字的判断
};
class Student:public Judge
{
private:
int num; //学号
string name; //姓名
string sex;//性别
string address;//地址
string phone;//电话
double chinese;//语文成绩
double english;//英语成绩
double math;//数学成绩
double average;//考试成绩
double txhp;//grade1同学互评
double pdcj;//grade2品德成绩
double rkls;//grade3任课老师
double zhcp;//综合测评
int ranking1;//成绩名次
int ranking2;//综合名次
int ranking3;//学号大小
public:
Student();
//~Student();
void read();//读取信息
void reads();//为学号唯一性读取信息
void show();//显示信息
void save(int);//保存信息
void SR();//输入信息
void SC();//删除信息
void XG();//修改信息
void sn();//按学号搜索
void sm();//按姓名搜索
void PM1();//按考试成绩排名
void PM2();//按综合测评排名
void PM3();//按学号排名
int NumJudge();//学号的判断
};
Student stud[50];
Student::Student()
{
ifstream infile;
infile.open("学生综合测评系统.txt");//判断文件是否打开成功
if(!infile)
{
cout<<endl<<endl<<"............ 无法检测到文件正在初始化..........."<<endl;
Sleep(3000);
//sleep(0)并非是真的要线程挂起0毫秒,意义在于这次调用Tread.Sleep(0)的当前进程确实被冻结了一下,让其它进程有机会优先执行。
//sleep(0)使你的进程暂时放弃CPU,也就是释放一些未用的时间片给其它进程或进程使用,就相当于一个让位动作。
ofstream outfile("学生综合测评系统.txt"); //创建文件
outfile.close();//关闭文件
}
infile.close();
}
int main()
{
system("color 70");//将控制台背景改为亮白色
Account();//登录界面
}
void Menu()
{
int option;//定义选项
int t=1;
while(t){
system("cls");
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"\t\t*****欢迎进入学生综合测评系统*****"<<endl;
cout<<"\t\t本系统可以存储学生的基本信息和各科成绩,并能计算出考试成绩,综合测评成绩和排名"<<endl;
cout<<"\t\t基本存储信息包括学号、姓名、性别、家庭住址、联系电话"<<endl;
cout<<"\t\t各科成绩包括语文、数学、外语三门单科成绩"<<endl;
cout<<"\t\t其它包括考试平均成绩、考试名次、同学互评分、品德成绩、任课教师评分、综合测评评分、综合测评名次"<<endl;
cout<<"\t\t考试平均成绩、同学互评分、品德成绩、任课教师评分分别占综合测评总分的60%,10%,10%,20%"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t 1. 学生信息管理 "<<endl;
cout<<"\t\t 2. 学生数据测评 "<<endl;
cout<<"\t\t 3. 信息查询中心 "<<endl;
cout<<"\t\t 0. 退出程序 "<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t********************************"<<endl;
cout<<"\t\t 请输入【0-3】 :"<<' ';
option=optionJudge();
switch(option) //输入编号调用相关函数
{
case 0: exit(0); //返回主界面
t=0;
break;
case 1: system("cls");
t=0;
Fire();
break;
case 2: system("cls");
t=0;
statistics();
break;
case 3: system("cls");
t=0;
inquiry();
break;
default:cout<<"请按规则输入 "<<endl;
system("pause");
system("cls");
break;
}
}
}
void Fire()//学生信息管理界面
{
Student xx;//定义类对象
system("cls");
int option;
int t=1;
while(t){
cout<<"\t\t\t***************学生信息管理***********"<<endl;
cout<<"\t\t\t*************************************"<<endl;
cout<<"\t\t\t 1.录入学生信息 "<<endl;
cout<<"\t\t\t 2.删除学生信息 "<<endl;
cout<<"\t\t\t 3.修改学生信息 "<<endl;
cout<<"\t\t\t 4.显示学生信息 "<<endl;
cout<<"\t\t\t 0.返回主菜单 "<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 请输入 【0-4】 :"<<' ';
option=optionJudge();//调用判断函数判断是否符合规则
switch(option)//判断输入的选项调用相关函数
{
case 0: system("cls");
t=0;
Menu();
break;
case 1: system("cls");
t=0;
xx.SR();
break;
case 2: system("cls");
t=0;
xx.SC();
break;
case 3: system("cls");
t=0;
xx.XG();
break;
case 4: system("cls");
t=0;
xx.show();
break;
default:cout<<"输入有误!"<<endl;
system("pause");
system("cls");
Fire();
break;
}
}
}
void statistics()//学生数据测评
{
Student xx;//定义类对象
system("cls");//清屏
int option;//定义选项
int t=1;
while (t)
{
cout<<"\t\t\t****************学生数据测评***********"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 1.按学号大小排名 "<<endl;
cout<<"\t\t\t 2.按考试成绩排名 "<<endl;
cout<<"\t\t\t 3.按综合测评排名 "<<endl;
cout<<"\t\t\t 0.返回主菜单 "<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 请输入【0-3】 :"<<' ';
option=optionJudge();//判断输入的选项是否符合规则
switch(option)//判断输入的选项调用相关函数
{
case 2: system("cls");
t=0;
xx.PM1();
break;
case 3: system("cls");
t=0;
xx.PM2();
break;
case 1: system("cls");
t=0;
xx.PM3();
break;
case 0: system("cls");
t=0;
Menu();
break;
default:cout<<"输入有误!"<<endl;
system("pause");
system("cls");
statistics();
break;
}
}
}
void inquiry()//信息查询中心
{
Student xx;//定义类对
system("cls");
int option;//定义选项
int t=1;
while (t)
{
cout<<"\t\t\t**************信息查询中心*************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t 学生查询管理 "<<endl;
cout<<"\t\t\t 1.按学号查询 "<<endl;
cout<<"\t\t\t 2.按姓名查询 "<<endl;
cout<<"\t\t\t 0.返回主菜单 "<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t\t**************************************"<<endl;
cout<<"\t\t 请输入【0-2】 :"<<' ';
option=optionJudge();//判断输入的选项是否符合规则
switch(option)//判断输入的选项调用相关函数
{
case 1: system("cls");
t=0;
xx.sn();
break;
case 2: system("cls");
t=0;
xx.sm();
break;
case 0: system("cls");
t=0;
Menu();
break;
default:cout<<"输入有误!"<<endl;
system("pause");
system("cls");
inquiry();
break;
}
}
}
void Student::read()//读取信息函数,将信息读取到Student类数组中,便于操作
{
cout<<"正在读取文件......"<<endl;
Sleep(1000);
ifstream infile;
infile.open("学生综合测评系统.txt",ios::in); //打开文件
int i=0;
do//将信息赋值给类成员变量直到文件末尾
{
infile>>stud[i].num>>stud[i].name>>stud[i].sex>>stud[i].address>>stud[i].phone>>stud[i].chinese>>stud[i].english>>stud[i].math>>stud[i].txhp>>stud[i].pdcj>>stud[i].rkls;
i++;
}
while(!infile.eof()); //直到文件尾
infile.close();//关闭文件
system("cls");//清屏
cout<<" 读取成功 !"<<endl;
cout<<endl;
}
void Student::show()//显示信息函数
{
int i=0,j=0;
string names;//定义姓名
system("cls");//清屏
read();//调用读取信息函数
ifstream infile("学生综合测评系统.txt",ios::in); //打开文件
cout<<" 学号 "<<"姓名"<<" 性别 "<<" 地 址 "<<"电 话"<<" 语文 "
<<" 英语"<<" 数学"<<" 同学互评"<<" 品德成绩"<<" 教师评分 "<<endl;//输出信息目录
HX();
for(i=0;i<n;i++)//输出文件里的信息
{
if(stud[i].num!=0&&stud[i].chinese!=0)//当学号和语文不为0时输出信息
{
names=stud[i].name;
if(names.length()!=0)//当姓名不为空时输出
{
cout<<stud[i].num; cout.width(7); //输出学号
cout<<stud[i].name; cout.width(5); //输出名字
cout<<stud[i].sex;cout.width(20);//输出性别
cout<<stud[i].address; cout.width(12);//输出地址
cout<<stud[i].phone; cout.width(6); //输出学号
cout<<stud[i].chinese; cout.width(6);//输出语文
cout<<stud[i].english;cout.width(6); //输出英语
cout<<stud[i].math;cout.width(7);//输出数学
cout<<stud[i].txhp; cout.width(9); //输出同学互评分
cout<<stud[i].pdcj;cout.width(8); //输出品德成绩
cout<<stud[i].rkls<<endl;//输出任课老师评分
HX();//调用划线函数
j++;//判断函有多少信息
}
}
}
cout<<"当前共有"<<j<<"条信息"<<endl;
cout<<"输入0重新进入,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的选项是否符合规定
infile.close();//关闭文件
switch(choose)
{
case 0: show();
break;//重新进入该函数
default:Fire();
break;//返回上一级
}
}
void Student::save(int m)//保存信息函数
{
ofstream outfile("学生综合测评系统.txt",ios::app); //创建文件,向文件末尾插入数据
if(!outfile)
{
cout<<"文件打开失败!"<<endl;
}
for(int i=m;i<m+1;i++)//将录入的信息保存到文件里
{
outfile<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].sex<<" "<<stud[i].address<<" "
<<stud[i].phone<<" "<<stud[i].chinese<<" "<<stud[i].english<<" "<<stud[i].math<<" "
<<stud[i].txhp<<" "<<stud[i].pdcj<<" "<<stud[i].rkls<<endl;
}
outfile.close();//关闭文件
cout<<"正在保存......"<<endl;
Sleep(1000);//提示保存成功
}
void Student::SR()//输入信息函数
{
int m;
system("cls");//清屏
ofstream outfile("学生综合测评系统.txt",ios::app); //打开文件读取信息
if(!outfile)
{
cout<<"文件打开失败!"<<endl;
}
outfile.close();//关闭文件
cout<<"每次最多输入49条信息"<<endl;
cout<<"你将输入多少信息?";
m=GradeJudge();//输入信息调用判断函数判断是否符合规定
for(int a=0;a<m;a++)//当输入m条信息后退出循环
{
system("cls");
cout<<" 请输入第 "<<a+1<<"个学生资料 :"<<endl;
cout<<"(以下信息请输入五位数字)"<<endl;
cout<<" 学 号: "<<' ';stud[a].num=NumJudge();
cout<<"(以下信息请输入汉字)"<<endl;
cout<<" 姓 名: "<<' ';stud[a].name=chineseJudge();
cout<<" 性 别: "<<' ';stud[a].sex=SexJudge();
cout<<" 地 址: "<<' ';stud[a].address=chineseJudge();
cout<<"(以下信息请输入11位手机号码)"<<endl;
cout<<" 电 话: "<<' ';stud[a].phone=TelJudge();
cout<<"(以下分数为百分制)"<<endl;
cout<<" 语文成绩: "<<' ';stud[a].chinese=GradeJudge();
cout<<" 英语成绩: "<<' ';stud[a].english=GradeJudge();
cout<<" 数学成绩: "<<' ';stud[a].math=GradeJudge();
cout<<" 同学互评: "<<' ';stud[a].txhp=GradeJudge();
cout<<" 品德成绩: "<<' ';stud[a].pdcj=GradeJudge();
cout<<" 教师评分: "<<' ';stud[a].rkls=GradeJudge();
cout<<"输入完毕!"<<endl;
save(a);//调用保存函数
cout<<" 第"<<a+1<<"为同学信息保存成功 !"<<endl;Sleep(500);
}
cout<<"输入0重新进入,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的信息是否符合规定
switch(choose)
{
case 0: SR();
break;//重新进入该函数
default:Fire();
break;//返回上一级
}
}
//按照学号进行删除,以学号为唯一条件
void Student::SC()//删除信息函数
{
system("cls");//清屏
read(); //调用读取信息函数
int q=0;
ofstream outfile("学生综合测评系统备份.txt",ios::app); //创建备份文件
if(!outfile)
{
cout<<"文件打开失败!"<<endl;
}
int nums;//定义与学号同类型的变量
int i=0;
cout<<" 请输入你要删除的学生学号:"<<endl;
nums=NumJudge2();//调用判断函数判断输入的信息是否符合规定
for(i=0;i<n;i++)
{
if(stud[i].num==nums)//若找到与之相同的数据提示找到
{
cout<<"已找到学号为:"<<stud[i].num<<"姓名为"<<stud[i].name<<"同学的信息"<<endl;
break;
}
}
if(i>=n)
cout<<"未找到相关信息!"<<endl;
else
{
cout<<"输入0开始删除,其他【1-9】数字取消删除";
int x;
x=optionJudge();//调用判断函数判断输入的信息是否符合规定
switch(x)
{
case 0:
{
q=1;
for(i=0;i<n;i++)
{
if(stud[i].num!=nums&&stud[i].num!=0)//与被修改的学号不同的数据全部存入备份文件
{
outfile<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].sex<<" "<<stud[i].address<<" "
<<stud[i].phone<<" "<<stud[i].chinese<<" "<<stud[i].english<<" "<<stud[i].math<<" "
<<stud[i].txhp<<" "<<stud[i].pdcj<<" "<<stud[i].rkls<<endl;
}
}i=n;break;
}
default:cout<<"取消成功!"<<endl;break;
}
}
outfile.close();
if(q==1)//如果找到信息执行该语句
{
remove("学生综合测评系统.txt");//删除原文件
if(rename("学生综合测评系统备份.txt","学生综合测评系统.txt")==0)//备份文件改名为原文件
cout<<"删除成功!"<<endl;//如果rename函数返回0则提示修改成功
else
cout<<"删除异常,请退出程序后重试!";//返回非0提示失败
}
cout<<"输入0重新进入,输入【1-9】数字返回上一步:";
choose=optionJudge();//调用判断函数判断输入的信息是否符合规定
switch(choose)
{
case 0: SC();
break;//继续该操作
default:Fire();
break;//返回上一级
};
}
void Student::XG()//修改信息函数
{
int q=0;
system("cls");//清屏
read(); //调用读取信息函数
ofstream outfile("学生综合测评系统备份.txt",ios::app); //创建备份文件
if(!outfile)
{
cout<<"文件打开失败!"<<endl;
}
int numx;
int i;
cout<<" 请输入你要修改的学生学号 :"<<endl;
numx=NumJudge2();//检查输入的学号是否符合规则
for(i=0;i<n;i++)
if(stud[i].num==numx)//当找到与之相符的函数时输出所有相关函数
{
q=2;
cout<<" 学号 "<<"姓名"<<" 性别 "<<" 地 址 "<<"电 话"<<" 语文 "<<" 英语"<<" 数学"<<" 同学互评"<<" 品德成绩"<<" 教师评分 "<<endl;
HX();
cout<<stud[i].num; cout.width(7); //输出学号
cout<<stud[i].name; cout.width(5); //输出姓名
cout<<stud[i].sex;cout.width(20);//输出性别
cout<<stud[i].address; cout.width(12);//输出地址
cout<<stud[i].phone; cout.width(6); //输出电话
cout<<stud[i].chinese; cout.width(6);//输出语文
cout<<stud[i].english;cout.width(6); //输出英语
cout<<stud[i].math;cout.width(6);//输出数学
cout<<stud[i].txhp; cout.width(8);//输出同学互评分
cout<<stud[i].pdcj;cout.width(8); //输出品德成绩
cout<<stud[i].rkls<<endl;//输出任课老师评分
HX();
break;
}
if(stud[i].num!=numx)//如果没有找到提示为找到相关信息
{
cout<<"没有找到相关信息!"<<endl;
outfile.close();
}
if(i<n)//找到信息执行该语句输入新的信息
{
cout<<"重要信息已修改,请修改学号"<<endl;
cout<<" 请输入新的信息 :"<<endl;
cout<<" 学 号: "<<' ';stud[i].num=NumJudge() ;
cout<<" 姓 名: "<<' ';stud[i].name=chineseJudge();
cout<<" 性 别: "<<' ';stud[i].sex=SexJudge();
cout<<" 住 址: "<<' ';stud[i].address=chineseJudge();
cout<<" 电 话: "<<' ';stud[i].phone=TelJudge();
cout<<" 语文成绩: "<<' ';stud[i].chinese=GradeJudge();
cout<<" 英语成绩: "<<' ';stud[i].english=GradeJudge();
cout<<" 数学成绩: "<<' ';stud[i].math=GradeJudge();
cout<<" 同学互评: "<<' ';stud[i].txhp=GradeJudge();
cout<<" 品德成绩: "<<' ';stud[i].pdcj=GradeJudge();
cout<<" 教师评分: "<<' ';cin>>stud[i].rkls;
cout<<" 修改成功,是否保存 ?"<<endl;
cout<<"【0-9】0为保存,其他为取消:";
press=optionJudge();
switch(press)
{
case 0 :
{
for(i=0;i<n;i++)
{
if(stud[i].num!=numx&&stud[i].num!=0)//与被修改的信息不相等的全部放入备份文件
{
q=1;
outfile<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].sex<<" "<<stud[i].address<<" "
<<stud[i].phone<<" "<<stud[i].chinese<<" "<<stud[i].english<<" "<<stud[i].math<<" "
<<stud[i].txhp<<" "<<stud[i].pdcj<<" "<<stud[i].rkls<<endl;
}
else
continue;
}break;
}
default: cout<<"取消成功!"<<endl;;break;
}
outfile.close();
if(q==1)//放入备份文件成功后执行该语句
{
remove("学生综合测评系统.txt");//删除原文件
if(rename("学生综合测评系统备份.txt","学生综合测评系统.txt")==0)//备份文件改名为原文件名
cout<<"修改成功!"<<endl;//若rename返回0提示修改成功
else
{
cout<<"操作异常,请退出程序后重试! ";//返回非0修改异常
remove("学生综合测评系统备份.txt");//删除备份文件
}
}
}
cout<<"输入0重新进入,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的信息是否符合规定
switch(choose)
{
case 0: XG();
break;//继续该操作
default:Fire();
break;//返回上级
}
}
void Student::PM1()//按考试成绩排名
{
system("cls");//清屏
read();//调用读取信息函数
cout<<"排序中......"<<endl;
Sleep(1000);
system("cls");
double temp[n];
for(int a=0;a<50;a++)//计算每个考试成绩的平均数并赋值给成员变量average,average赋值给temp
{
stud[a].average=(stud[a].chinese+stud[a].english+stud[a].math)/3;
temp[a]=stud[a].average;
}
double t;
for(int j=0;j<n;j++)//temp 中的考试成绩按从大到小冒泡排序
{
for(int k=0;k<n-1-j;k++)
{
if(temp[k]<temp[k+1])
{
t=temp[k];
temp[k]=temp[k+1];
temp[k+1]=t;
}
}
}
for(int q=0;q<n;q++)// 判定考试成绩名次
{
for(int p=0;p<n;p++)
{
if(stud[p].average==temp[q])
stud[p].ranking1=q+1;
}
}
//解决
/*std::*/cout<<"排序成功!"<</*std::*/endl;
/*std::*/cout<<" 学号 "<<" 姓名"<<" 考试成绩 "<<"考试成绩排名 "<</*std::*/endl;
for(int b=0;b<n;b++)
{
if(stud[b].num!=0&&stud[b].average!=0)//输出信息和名次
{
HX();
cout<<stud[b].num; cout.width(10);//输出学号
cout<<stud[b].name;cout.width(10); //输出姓名
cout<<stud[b].average;cout.width(10);//输出考试成绩
cout<<stud[b].ranking1<<endl;//输出名次
HX();//调用划线函数
}
}
cout<<"输入0查看综合排名,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的信息是否符合规定
switch(choose)
{
case 0: PM2();
break;//调用按综合测评排名
default:statistics();
break;//返回上一级
}
}
void Student::PM2()//按综合测评排名
{
system("cls");//清屏
read();//调用读取信息函数
cout<<"排序中......"<<endl;Sleep(1000);system("cls");
double temp[n]; //定义与分数相同类型的变量
for(int a=0;a<n;a++)//按规则计算综合测评分数
{
stud[a].zhcp=((stud[a].chinese+stud[a].english+stud[a].math)/3)*0.6+ stud[a].txhp*0.1+stud[a].pdcj*0.1+stud[a].rkls*0.2;
temp[a]=stud[a].zhcp;//综合测评分数赋值给temp
}
double t;
for(int j=0;j<n;j++)//temp 中的综合测评成绩按从大到小冒泡排序
{
for(int k=0;k<n-1-j;k++)
{
if(temp[k]<temp[k+1])
{
t=temp[k];
temp[k]=temp[k+1];
temp[k+1]=t;
}
}
}
for(int q=0;q<n;q++)// 判定综合测评成绩名次
{
for(int p=0;p<n;p++)
{
if(stud[p].zhcp==temp[q])
stud[p].ranking2=q+1;
}
}
cout<<"排序成功!"<<endl;
cout<<" 学号 "<<" 姓名 "<<" 综合测评成绩"<<" 综合测评排名 "<<endl;
int l=0;
for(int b=0;b<n;b++)
{
if(stud[b].num!=0&&stud[b].zhcp!=0)//输出信息
{
HX();
cout<<stud[b].num; cout.width(10); //输出学号
cout<<stud[b].name; cout.width(10); //输出姓名
cout<<stud[b].zhcp; cout.width(10); //输出综合测评成绩
cout<<stud[b].ranking2<<endl;//输出排名
HX();//调用划线函数
}
}
cout<<"输入0查看成绩排名,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的选项是否符合规定
switch(choose)
{
case 0: PM1();
break;//按考试成绩排名
default:statistics();
break;//返回上一级
}
}
void Student::PM3()//按学号排名
{
read();//调用读取信息函数
cout<<"排序中......"<<endl;
Sleep(1000);
system("cls");
int num1[n];//定义与相同类型的变量
for(int x=0;x<n;x++)//将num的数据赋值给num1
{
num1[x]=stud[x].num;
}
int y;
for(int z=0;z<n;z++)//按冒泡法将num1的数据从小到大排名
{
for(int p=0;p<n-1-z;p++)
{
if(num1[p]>num1[p+1])
{
y=num1[p]; num1[p]=num1[p+1]; num1[p+1]=y;
}
}
}
int tempnum; //定义学号
string tempname;//定义姓名
string tempsex;//定义性别
string tempaddress;//定义地址
string tempphone;//定义电话
for(int a=0;a<n;a++)
{
for(int b=0;b<n;b++)
{
if(stud[b].num==num1[a])//当num中第n个数据与temp第一个数据想等时,num第n个与第一个相互赋值
{
tempnum=stud[b].num;tempname=stud[b].name; tempsex=stud[b].sex;
tempaddress=stud[b].address; tempphone=stud[b].phone;
stud[b].num=stud[a].num;stud[b].name=stud[a].name;stud[b].sex=stud[a].sex;
stud[b].address=stud[a].address; stud[b].phone=stud[a].phone;
stud[a].num=tempnum;stud[a].name=tempname;stud[a].sex=tempsex;
stud[a].address=tempaddress;stud[a].phone=tempphone;
}
}
}
cout<<"排序成功!"<<endl;
cout<<" 学号 "<<"姓名"<<" 性别 "<<" 地 址 "<<"电 话"<<endl;//输出目录
for(int i=0;i<n;i++)
{
if(stud[i].num!=0/*&&(tempsex.length!=0)*/)//输出信息
{
HX();cout<<stud[i].num;cout.width(7); //输出学号
cout<<stud[i].name; cout.width(5); //输出姓名
cout<<stud[i].sex;cout.width(20);//输出性别
cout<<stud[i].address; cout.width(12);//输出地址
cout<<stud[i].phone<<endl;HX();//输出电话
}
}
cout<<"输入0查看成绩排名,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的选项是否符合规定
switch(choose)
{
case 0: PM1();
break;//调用按成绩排名函数
default:statistics();
break;//返回上一级
}
}
void Student::sn()//按学号查询函数
{
read(); //调用读取信息函数
system("cls");//清屏
int numc;//定义与学号相同类型的变量
cout<<" 请输入你要查询的学号 :"<<' ';
numc=NumJudge2();//判断是否符合规则
int i;
for(i=0;i<n ;i++)
{
if(stud[i].num==numc)//找到相同学号输出所有信息
{
cout<<"学号为"<<stud[i].num<<"的学生的信息:"<<endl;
cout<<"学 号 :"<<stud[i].num<<endl;//输出学号
cout<<"姓 名 :"<<stud[i].name<<endl;//输出姓名
cout<<"性 别 :"<<stud[i].sex<<endl;//输出性别
cout<<"地 址 :"<<stud[i].address<<endl;//输出地址
cout<<"电 话 :"<<stud[i].phone<<endl;//输出电话
cout<<"英语成绩 :"<<stud[i].english<<endl;//输出英语成绩
cout<<"语文成绩 :"<<stud[i].chinese<<endl;//输出语文成绩
cout<<"高数成绩 :"<<stud[i].math<<endl;//输出数学成绩
cout<<"同学互评 :"<<stud[i].txhp<<endl;//输出同学互评分
cout<<"品德成绩 :"<<stud[i].pdcj<<endl;//输出品德成绩
cout<<"教师评分:"<<stud[i].rkls<<endl;//输出教室评分
break;
}
}
if(i>=n)
cout<<"没有找到相关信息!"<<endl;
cout<<"输入0重新进入,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的选项是否符合规定
switch(choose)
{
case 0: sn();
break;//重新进入该函数
default:inquiry();
break;//返回上一级
}
}
void Student::sm()
{
read();
system("cls");
string namec;//定义与姓名相同类型的变量
cout<<" 请输入你要查询的姓名 :"<<' ';
namec=chineseJudge();//判断是否符合规则
int i;
for(i=0;i<n;i++)
if(stud[i].name==namec)//有相同姓名输出所有相关信息
{
cout<<" 姓名为 "<<stud[i].name<<"的学生的相关信息:"<<endl;
cout<<"学 号 :"<<stud[i].num<<endl;//输出学号
cout<<"姓 名 :"<<stud[i].name<<endl;//输出姓名
cout<<"性 别 :"<<stud[i].sex<<endl;//输出性别
cout<<"地 址 :"<<stud[i].address<<endl;//输出地址
cout<<"电 话 :"<<stud[i].phone<<endl;//输出电话
cout<<"语文成绩 :"<<stud[i].chinese<<endl;//输出语文成绩
cout<<"英语成绩 :"<<stud[i].english<<endl;//输出英语成绩
cout<<"数学成绩"<<stud[i].math<<endl;//输出数学成绩
cout<<"同学互评 :"<<stud[i].txhp<<endl;//输出同学互评分
cout<<"品德成绩 :"<<stud[i].pdcj<<endl;//输出品德成绩
cout<<"任课教师评分:"<<stud[i].rkls<<endl;//输出任课老师评分
break;
}
if(stud[i].name!=namec)//如果没有找到与之相同的姓名输出无相关信息
cout<<"没有找到相关信息"<<endl;
cout<<"输入0重新进入,输入【1-9】数字返回上一步:";
choose=optionJudge();//判断输入的选项是否符合规定
switch(choose)
{
case 0: sm();
break;//重新进入该函数
default:inquiry();
break;//返回上一级
}
}
void Student::reads()//判断学号唯一性的读取信息函数,用于,判断输入时学号的正确
{
ifstream infile;
infile.open("学生综合测评系统.txt",ios::in|ios::out); //打开文件,既可以输入也可以输出
if(!infile)//判断打开是否成功
{
cout<<"文件打开失败!"<<endl;
exit(1);
}
int i=0;
do//将数据赋值给类成员变量
{
infile>>stud[i].num>>stud[i].name>>stud[i].sex>>stud[i].address>>stud[i].phone>>stud[i].chinese>>stud[i].english>>stud[i].math>>stud[i].txhp>>stud[i].pdcj>>stud[i].rkls;
i++;
}while(!infile.eof()); //直到文件尾
infile.close();//关闭文件
}
void HX()//划线函数
{
cout<<"--------------------------------------------------------------------------------------------------"<<endl;
}
string Judge::SexJudge()//性别的判断
{
string sex;//定义性别
while(1)
{
cin>>sex;
if(sex=="男"||sex=="女")//判断是否符合规定
break;
else//错误提示重新输入
cout<<"请按规则重新输入:";
}
return sex;//返回正确的性别
}
int Student::NumJudge()//学号的判断
{
int k,nump;//定义学号
reads();//调用读取信息函数
fstream infile;
infile.open("学生综合测评系统.txt",ios::in|ios::out); //打开文件
if(!infile)//判断文件是否存在
{
k=11;
}
do
{
char a[10];//定义学号
int b,t=0,i,j=0,ot=1,c=0;
while(1)
{
j=0;
cin>>a;//获取学号
b=strlen(a);
for(i=0;i<b;i++)
{
if(a[i]<'0'||a[i]>'9')//判断是否有字符
j++;
}
if(j!=0||b!=5)//如果有字符提示重新输入
cout<<"请按设定规则重新输入:";
else
break;//否则跳出循环
}
for(i=b;i>0;i--)//将char类型的转化成int类型的
{
ot=1;
for(j=0;j<i-1;j++)
ot*=10;
t+=(ot*(a[c]-48));
c++;
}
nump=t;
for(k=0;k<=9;k++)
{
if(stud[k].num==nump)//判断文件中是否已经存在该信息
{
cout<<"该学号已经存在请重新输入"<<endl;//存在提示重新输入
b=1;
break;
}
else
continue;
}
}while(k<10);//当文件存在时进入该循环
infile.close();//关闭文件
return nump;//返回正确学号
}
double Judge::GradeJudge()//分数判断
{
char a[10];//定义分数
int b,t=0,i,j=0,ot=1,c=0;
do
{
while(1)
{
j=0;
cin>>a;
b=strlen(a);//获取长度
for(i=0;i<b;i++)
{
if(a[i]<'0'||a[i]>'9')//判断是否有字符
j++;
}
if(j!=0||b<1||b>3)
cout<<"请按设定规则重新输入:";//存在字符提示重新输入
else
if(b>3)
cout<<"请按设定规则重新输入:";//长度过长提示重新输入
else
break;
}
for(i=b;i>0;i--)//将char类型的转化成int类型的
{
ot=1;
for(j=0;j<i-1;j++)
ot*=10;
t+=(ot*(a[c]-48));
c++;
}
if(t>100)
cout<<"请按设定规则重新输入:";//判断是否超过长度
}while(t>100);
return t;//返回正确分数
}
string Judge::TelJudge()//电话格式判断
{
string tel;//定义电话
while(1)
{
cin>>tel;
if(tel.size()==11)//判断是否为十一位
break;
else
cout<<"请输入11位手机号码:";//错误提示重新输入
}
return tel;
}
int Judge::NumJudge2()//学号格式判断
{
char a[10];
int b,t=0,i,j=0,ot=1,c=0;
while(1)
{
j=0;
cin>>a;
b=strlen(a);//判断长度
for(i=0;i<b;i++)
{
if(a[i]<'0'||a[i]>'9')//是否含有字符
j++;
}
if(j!=0||b!=5)//格式错误提示重新输入
cout<<"错误请重新输入!";
else
break;//否则跳出循环
}
for(i=b;i>0;i--)//将char转化成int
{
ot=1;
for(j=0;j<i-1;j++)
ot*=10;
t+=(ot*(a[c]-48));
c++;
}
return t;//返回正确学号
}
/*在ANSI C标准中一个汉字由两个字节组成,判断一个字符是否为汉字是就是判断第一个字节的最高为是否为1,可以通过char a[i]&Ox80来进行比较*/
string Judge::chineseJudge()//汉字判断
{
int i,m=1;
char c;
string chinesep;//定义汉字
do
{
cin>>chinesep;//获取汉字
i=0;
while(c=chinesep[i])
{
if((c&0x80)&&(chinesep[i]&0x80))//判断是否为汉字
m=0;
else
{
m=1;
cout<<"请按规定格式输入(汉字):";//否则提示重新输入
break;
}
i++;
}
}while(m);
return chinesep;//返回汉字
}
// 字符‘O’的ascil码值为48,数字0的值为0,所以‘O’和0差48,以此类推,一个字符转换对应的值,就要减去48
int optionJudge()//选项格式判断
{
char a[20];//定义选项
int b,t=0,i,j=0,ot=1,c=0;
while(1)
{
j=0;
cin>>a;
b=strlen(a);//获取长度
for(i=0;i<b;i++)
{
if(a[i]<'0'||a[i]>'9')//判断是否含有字符
j++;
}
if(j!=0||b!=1)
cout<<"请按规则输入:";//含有字符提示重新输入
else
break;//否则跳出循环
}
for(i=b;i>0;i--)//将char类型转换成int类型
{
ot=1;
for(j=0;j<i-1;j++) //此循环用于补齐循环的个十百千等位数
ot*=10;
t+=(ot*(a[c]-48));
c++;
}
return t;//返回选项
}
int Account()
{
system("cls");
int tempt;
tempt=1;
while(tempt)
{
system("cls");
cout<<" 测评登陆系统"<<endl;
cout<<"***********************"<<endl;
cout<<" 1. 教师登陆 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 2. 退出系统"<<endl;
int option;
option=optionJudge(); //选择菜单按钮
switch (option) {
case 1:
login(id,input); //登陆控制
tempt=0;
break;
case 2:
break;
default:
cout<<"输入错误,请正确输入!"<<endl;
break;
}
if(option==2)
{
cout<<"退出成功!"<<endl;
break;
}
}
}
void login(string a,string b)
{
cout<<" 教师登陆系统"<<endl;
cout<<"******************"<<endl;
cout<<"账号:" <<flush;
cin>>a;
cout<<"密码:"<<flush;
for(int i=3;i>=0;i--)
{
cin>>b;
if (a=="004936" && b==password)
{
cout<<"登陆成功!"<<endl;
cout<<"请选择以下操作"<<endl;
cout<<"*************"<<endl;
cout<<"*************"<<endl;
cout<<"******1.进入测评系统******"<<endl;
cout<<"******2.重置密码 ******"<<endl;
int temp;
temp=optionJudge();
switch(temp){
case 1:
cout<<"菜单进入中"<<endl;
Menu();
break;
case 2:
reset_password(id); //重置密码
cout<<"*******请选择以下操作*******"<<endl;
cout<<"*******1.进入操作界面*******"<<endl;
cout<<"*******2.退出测评系统*******"<<endl;
int ttt;
ttt=1;
while(ttt)
{
int tt;
cin>>tt;
switch(tt)
{
case 1 :
cout<<"***进入系统中***"<<endl;
Menu();
ttt=0;
break;
case 2 :
exit(0);
ttt=0;
break;
default:
cout<<"errors"<<endl;
}
}
break;
}
}
else
if(i!=0)
{
cout<<"密码错误,请重新输入(你还有"<<i<<"次输入机会"<<endl;
cout<<"密码:"<<flush;
}
else
cout<<" 3次输入错误,此账号已冻结!"<<endl;
}
}
void reset_password(string n)
{
string name;
string old_password;
cout<<" 帐号:"<<flush;
cin>>name;
cout<<"旧密码:"<<flush;
cin>>old_password;
if(old_password==password && name==n)
{
cout<<"请输入新密码:"<<flush;
cin>>password;
cout<<"密码重置成功"<<endl;
}
else
cout<<"重置密码失败!"<<endl;
}