功能要求:
(1)信息维护:
要求:学生信息数据要以文件的形式保存,能实现学生信息数据的维护。此模块包括子模块有:增加学生信息、删除学生信息、修改学生信息
(2)信息查询:
要求:查询时可实现按姓名查询、按学号查询
(3)成绩统计:
要求:A 输入任意的一个课程名(如数学)和一个分数段(如60–70),统计出在此分数段的学生情况。
(4)排序:能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果
代码:
Student.h
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <iomanip>
using namespace std;
class score{ // 成绩类
public:
string s_name; // 姓名
double s_score; // 成绩
};
class Student { // 学生类
public:
string name; // 姓名
string num; // 学号
double Chinese; // 语文
double Math; // 数学
double English; // 英语
double sum; // 总成绩
};
void Increase(); // 增加学生信息
void Delete(); // 删除学生信息
void Modify(); // 修改学生信息
void Inquire(); // 查询学生信息(姓名 学号)
void Display(); // 显示所有学生信息
void Statis(); // 统计学生信息(据课程名和分数段)
void Rank(); // 排序(升序 降序)
void menus(); // 主目录
void menusa(); // 信息维护目录
void menusb(); // 信息查询目录
#endif
main.cpp
#include <iostream>
#include "Student.h"
#include<Windows.h>
using namespace std;
void gotoxy(int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
int main() {
SetConsoleTitle("学生成绩管理系统");//窗口名称
menus();
system("pause");
return 0;
}
Increase.cpp
#include "Student.h"
void Increase() // 增加学生信息
{
ofstream fout("information.txt", ios::app); //打开文件,如不存在则创建新文件
if (!fout)
{
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
fstream fin("information.txt");
if (!fin) {
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
char x = 'Y';
while (x == 'Y' || x == 'y') {
Student* nw;
nw = new Student;
Student* nw_1;
nw_1 = new Student;
bool flag=true;
system("cls"); //清屏函数
cout << "\t*********** -----信息录入模式----- *********** \n";
cout << endl << endl;
cout << "\t\t请输入学生的姓名:"; cin >> nw->name;
cout << "\t\t请输入学生的学号:"; cin >> nw->num;
while(fin >> nw_1->name >> nw_1->num >> nw_1->Chinese >> nw_1->Math >> nw_1->English >> nw_1->sum){ // 查重(学号)
if(nw->num.compare(nw_1->num)){
continue;
}
flag=false;
cout << endl;
cout << "\t此学号已有学生存在,学生信息为:"<<endl;
cout <<" ---------------------------------------------- "<<endl;
cout << left <<"\t name:"<< setw(8)<<nw_1->name;
cout << left <<"\t num:"<< setw(8)<< nw_1->num;
cout << left <<"\t sum:"<< setw(8) <<nw_1->sum ;
cout << left <<"\n\t Chinese:"<< setw(4)<< nw_1->Chinese;
cout << left <<"\t Math:"<< setw(4) <<nw_1->Math;
cout << left <<"\t English:"<< setw(4) << nw_1->English;
cout <<"\n ----------------------------------------------"<<endl;
cout << endl;
cout << "\t是否继续录入学生信息(Y/N):";
cin >> x;
cout << endl;
}
if(flag==true){
cout << "\t\t请输入语文课程的成绩:"; cin >> nw->Chinese;
while (nw->Chinese < 0 || nw->Chinese > 100)
{
cout << "\t您输入的数据不合法,提示[0-100],请重新输入" << endl;
cin >> nw->Chinese;
}
cout << "\t\t请输入数学课程的成绩:"; cin >> nw->Math;
while (nw->Math < 0 || nw->Math > 100)
{
cout << "\t您输入的数据不合法,提示[0-100],请重新输入" << endl;
cin >> nw->Math;
}
cout << "\t\t请输入英语课程的成绩:"; cin >> nw->English;
while (nw->English < 0 || nw->English > 100)
{
cout << "\t您输入的数据不合法,提示[0-100],请重新输入" << endl;
cin >> nw->English;
}
nw->sum = nw->Chinese + nw->Math + nw->English; // 计算sum
fout << nw->name << " " << nw->num << " " << nw->Chinese << " ";
fout << nw->Math << " " << nw->English << " " << nw->sum << endl; // 写入文件
cout<<"\t -----------------------------------------------"<<endl;
cout<<left<<"\t name:"<< setw(10)<<nw->name;
cout<<left<<"num:"<< setw(8)<<nw->num;
cout<<left<<"sum:"<< setw(11)<<nw->sum<<endl;
cout<<left<<"\t Chinese:"<< setw(7)<<nw->Chinese;
cout<<left<<"Math:"<< setw(7)<<nw->Math;
cout<<left<<"English:"<< setw(7)<<nw->English<<endl;
cout<<"\t -----------------------------------------------"<<endl;
cout << "\t学生信息录入成功,是否继续录入学生信息(Y/N):";
cin >> x;
cout << endl;
delete nw;
}
}
fout.close();
if (x == 'N' || x == 'n') {
menusa();
}
}
Delete.cpp
/*
实现:找到所要删除的学生信息,把不是所要删除的信息拷贝到临时文件,最后删除原文件,将临时文件改名为原文件名。
*/
#include "Student.h"
void Delete() // 删除
{
int order; // 用户指令
char x = 'Y'; // 判断条件
string tmp;
/********************************/
while (x == 'Y' || x == 'y')
{
ifstream fin("information.txt");
ofstream fout("information2.txt");
if (!fin)
{
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
if (!fout)
{
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
system("cls"); //清屏函数
cout << "\t************ -----信息删除模式----- ************ \n";
cout << endl;
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——按姓名删除 * \n";
cout << "\t* 2——按学号删除 * \n";
cout << "\t* 0——返回上一级菜单 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(0-2):";
cin >> order;
while ((order < 0) || (order > 2))
{
cout << "\t\t您要输入的编号是(0-2):";
cin >> order;
}
if (order == 0) menusa();
if (order == 1) {
cout << "\t\t请输入姓名:"; cin >> tmp;
}
else if (order == 2) {
cout << "\t\t请输入学号:"; cin >> tmp;
}
/*********查找姓名或学号**********/
Student* nw;
nw = new Student;
bool flag = false; // 判断学生信息是否找到
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum)
{
if((tmp.compare(nw->name)) && (tmp.compare(nw->num))) // 如果找到相等的信息,返回0,则if不执行;若未找到相等信息,返回1,执行if,则将信息依次写入临时文件
{
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " " << nw->sum << endl;
continue; // 跳出本次 while 循环
}
flag = true;
cout <<" \t------------------------------------------------\n";
cout << left << "\t name:"<< setw(11) <<nw->name
<< left << "num:"<< setw(9) <<nw->num
<< "sum:"<< setw(8) <<nw->sum
<< left << "\n\t Chinese:"<< setw(8) <<nw->Chinese
<< left << "Math:"<< setw(8) <<nw->Math
<< left << "English:"<< setw(8) <<nw->English<<endl;
cout <<" \t------------------------------------------------\n";
// 防止用户输入错误
cout << "\t\t确认删除?(Y/N) "; cin >> x;
if (x == 'N' || x == 'n')
{
cout << "\t\t取消删除成功!"<< endl;
fout << nw->name << " " << nw->num << " " << nw->Chinese << " " << nw->Math << " " << nw->English << " "
<< nw->sum << endl;
continue;
}
cout << "\t\t数据删除成功!"<< endl;
}
delete nw;
/*******************************************/
if (!flag){
cout << "\n\t\t未找到该信息!";
}
fin.close();
fout.close();
remove("information.txt"); // 删除原文件
rename("information2.txt", "information.txt"); // 将临时文件改名为原文件
cout << "\n\t是否继续删除?(Y/N)(否)则返回上级目录";
cin >> x;
if(x=='n'||x=='N'){
menusa();
}
if(x=='y'||x=='Y'){
continue;
}
}
system("pause");
}
Modify.cpp
/*
实现:算法与删除算法类似
*/
#include "Student.h"
void Modify() {
int order; // 用户指令
string tmp; // 查找内容
char x = 'y';
/********************************/
while(x=='y'||x=='Y'){
ifstream fin("information.txt");
if (!fin)
{
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
ofstream fout("information2.txt");
if (!fout)
{
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
/************查找学生信息***********/
system("cls"); //清屏函数
cout << "\t ************ -----信息修改模式----- ************ \n";
cout << endl;
cout << "\t *----------------------------------------------* \n";
cout << "\t *-------------按关键字查找学生信息-------------* \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t * 1——学生姓名 * \n";
cout << "\t * 2——学生学号 * \n";
cout << "\t * 0——返回上一级菜单 * \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(0-2):";
cin >> order;
while ((order < 0) || (order > 2))
{
cout << "\t\t您要输入的编号是(0-2):";
cin >> order;
}
if (order == 0) menusa();
if (order == 1) {
cout << "\t\t请输入姓名:"; cin >> tmp;
}
else if (order == 2) {
cout << "\t\t请输入学号:"; cin >> tmp;
}
/*******************************/
/**********修改学生信息*********/
Student *nw;
nw = new Student;
bool flag=false;
while(fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum){
if(tmp.compare(nw->name) && tmp.compare(nw->num)){
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " " << nw->sum << endl;
continue; // 跳出本次 while 循环
}
flag=true;
system("cls");
cout <<" \t ------------------------------------------------\n";
cout << left << "\t name:"<< setw(11) <<nw->name
<< left << "num:"<< setw(9) <<nw->num
<< "sum:"<< setw(8) <<nw->sum
<< left << "\n\t Chinese:"<< setw(8) <<nw->Chinese
<< left << "Math:"<< setw(8) <<nw->Math
<< left << "English:"<< setw(8) <<nw->English<<endl;
cout <<" \t ------------------------------------------------\n";
cout << "\t *----------------------------------------------* \n";
cout << "\t *------------请选择要修改的信息类型------------* \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t * 1——姓名 * \n";
cout << "\t * 2——学号 * \n";
cout << "\t * 3——语文成绩 * \n";
cout << "\t * 4——数学成绩 * \n";
cout << "\t * 5——英语成绩 * \n";
cout << "\t * 0——返回上一级菜单 * \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(0-5):";
cin >> order;
while(order<0||order>5){
cout << "\t\t您要输入的编号是(0-5):";
cin >> order;
}
if(order==0) menusa();
if(order==1){ //修改姓名
string name1;
cout << "\t\t您想修改为:"; cin >> name1;
cout << "\t\t确认修改(Y/N)";cin >> x;
if(x=='n'|| x=='N'){
cout << "\n\t\t取消修改成功!";
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}else{
fout << name1 << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}
}else if(order==2){ //修改学号
string num1;
cout << "\t\t您想修改为:"; cin >> num1;
cout << "\t\t确认修改(Y/N)";cin >> x;
if(x=='n'|| x=='N'){
cout << "\n\t\t取消修改成功!";
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}else{
fout << nw->name << " " << num1 << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}
}else if(order==3){ //修改语文成绩
double C;
cout << "\t\t您想修改为:"; cin >> C;
while(C<0 || C>100){
cout << "\t 您输入的数据不合法,提示[0-100],请重新输入:" ;
cin >> C;
}
cout << "\t\t确认修改(Y/N)";cin >> x;
if(x=='n'|| x=='N'){
cout << "\n\t\t取消修改成功!";
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}else{
nw->sum=C+nw->Math+nw->English;
fout << nw->name << " " << nw->num << " " << C << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}
}else if(order==4){ //修改数学成绩
double M;
cout << "\t\t您想修改为:"; cin >> M;
while(M<0 || M>100){
cout << "\t 您输入的数据不合法,提示[0-100],请重新输入:" ;
cin >> M;
}
cout << "\t\t确认修改(Y/N)";cin >> x;
if(x=='n'|| x=='N'){
cout << "\n\t\t取消修改成功!";
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}else{
nw->sum=nw->Chinese+M+nw->English;
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< M << " " << nw->English << " "<< nw->sum << endl;
}
}else if(order==5){ //修改英语成绩
double E;
cout << "\t\t您想修改为:"; cin >> E;
while(E<0 || E>100){
cout << "\t您输入的数据不合法,提示[0-100],请重新输入:" ;
cin >> E;
}
cout << "\t\t确认修改(Y/N)";cin >> x;
if(x=='n'|| x=='N'){
cout << "\n\t\t取消修改成功!";
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << nw->English << " "<< nw->sum << endl;
}else{
nw->sum=nw->Chinese+nw->Math+E;
fout << nw->name << " " << nw->num << " " << nw->Chinese << " "
<< nw->Math << " " << E << " "<< nw->sum << endl;
}
}
}
delete nw;
/*******************************/
if(!flag){
cout << "\n\t\t未找到学生信息";
}
fin.close();
fout.close();
remove("information.txt"); // 删除原文件
rename("information2.txt","information.txt"); // 将临时文件改名为原文件
cout << "\n\t 是否继续修改?(Y/N)(否)则返回上级目录:";
cin >> x;
if(x=='n'||x=='N'){
menusa();
}
if(x=='y'||x=='Y'){
continue;
}
}
system("pause");
}
Inquire.cpp
#include "Student.h"
void Inquire() {
int order; // 用户指令
string tmp; // 查找内容
char x = 'y';
while(x=='y'||x=='Y'){
fstream fin("information.txt");
if (!fin)
{
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
/************查找学生信息***********/
system("cls"); //清屏函数
cout << "\t************ -----信息查询模式----- ************ \n";
cout << endl;
cout << "\t*----------------------------------------------* \n";
cout << "\t*-------------按关键字查找学生信息-------------* \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——学生姓名 * \n";
cout << "\t* 2——学生学号 * \n";
cout << "\t* 0——返回上一级菜单 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(0-2):";
cin >> order;
while ((order < 0) || (order > 2))
{
cout << "\t\t您要输入的编号是(0-2):";
cin >> order;
}
if (order == 0) menusb();
if (order == 1) {
cout << "\t\t请输入姓名:"; cin >> tmp;
}
else if (order == 2) {
cout << "\t\t请输入学号:"; cin >> tmp;
}
Student *nw;
nw = new Student;
bool flag=false;
while(fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum){
if(tmp.compare(nw->name) && tmp.compare(nw->num)){
continue; // 跳出本次 while 循环
}
flag=true;
cout <<" ------------------------------------------------ "<<endl;
cout << left <<"\t 姓名:"<< setw(8)<<nw->name
<< left <<" 学号:"<< setw(8)<< nw->num
<< " 总分:"<< setw(8)<<nw->sum
<< left <<"\n\t 语文成绩:"<< setw(5)<< nw->Chinese
<< left <<"数学成绩:"<< setw(4) << nw->Math
<< left <<" 英语成绩:" << setw(4)<< nw->English <<endl;
cout <<" ------------------------------------------------ "<<endl;
}
delete nw;
/********************************/
if(!flag){
cout << "\t\t未找到学生信息"<< endl;
}
fin.close();
cout << "\n\t是否继续查询?(Y/N)(否)则返回上级目录";
cin >> x;
if(x=='n'||x=='N'){
menusb();
}
if(x=='y'||x=='Y'){
continue;
}
}
system("pause");
}
Display.cpp
#include "Student.h"
void Display() { //显示所有学生信息
system("cls"); //清屏函数
cout << "\t **************************************" << endl;
cout << "\t 全部学生信息 " << endl;
cout << "\t **************************************" << endl;
ifstream out("information.txt");
if (!out) {
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
Student* nw;
nw = new Student;
int number = 0;
while (out >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
number++;
cout <<" ---------------------------------------------- "<<endl;
cout << left << " 序号:"<< setw(7)<<number;
cout << left <<" name:"<< setw(4)<<nw->name;
cout << left <<" num:"<< setw(8)<< nw->num;
cout << left <<"\n Chinese:"<< setw(4)<< nw->Chinese;
cout << left <<" Math:"<< setw(4) <<nw->Math;
cout << left <<" English:"<< setw(4) << nw->English;
cout <<" sum:"<< nw->sum ;
cout <<"\n ----------------------------------------------"<<endl;
}
delete nw;
out.close();
cout << endl;
char y;
while (1) {
cout << "\t\t输入(Y/y)返回上级目录:" ;
cin >> y;
if (y == 'Y' || y == 'y') {
menusb();
break;
}
else {
cout << "\t\t没有此选项,请重新选择(Y/N):";
}
}
}
Statis.cpp
#include "Student.h"
bool R_compStudent(score x,score y);
void Statis() {
char x = 'Y';
string order; // 用户指令
double score_begin; // 下界
double score_end; // 上界
bool flag=false; // 判断有无
while(x=='y'||x=='Y'){
system("cls");
cout << "\t ************ -----成绩统计模式----- ************ \n";
cout << "\t 提示:(1) 输入格式:math 或 数学(sum 或 总成绩) \n";
cout << "\t (2) 输入0返回主界面 \n";
cout << endl;
Student* nw;
nw = new Student;
vector<score> vec; // score类的向量
score my_score; // score类的对象
double my_aver=0; // 平均成绩
ifstream fin("information.txt");
if(!fin){
cout << "\t\t数据文件打开失败" << endl;
system("pause");
exit(0);
}
ofstream fout("information2.txt");
if (!fout){
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
ifstream my_fin("information2.txt");
if (!my_fin){
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
cout << "\t\t您要统计的学科是:";
while(cin >> order){
if(order=="0") menus();
/*****************统计过程*****************/
if(order == "chinese" || order == "语文"){ // 语文成绩
cout << "\t\t请输入分数段下限:";
cin >> score_begin;
cout << "\t\t请输入分数段上限:";
cin >> score_end;
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
if(nw->Chinese>=score_begin && nw->Chinese<=score_end){
fout << nw->name << " " << nw->Chinese << endl;
flag=true;
}
}
while (my_fin >> nw->name >> nw->Chinese ) {
my_score.s_name=nw->name;
my_score.s_score=nw->Chinese;
vec.push_back(my_score);
}
if(flag==true){
cout << "\n\t 姓名 语文成绩\n";
sort(vec.begin(),vec.end(),R_compStudent);
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
my_aver+=svit->s_score;
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) <<"\t "<< svit->s_score << endl;
}
cout << endl;
cout << "\t\t此分数段共有学生:" << vec.size() << "人" << endl;
cout << "\t\t此分段学生平均分:" << my_aver/vec.size() << "分"<< endl;
}
break;
}else if(order == "math" || order == "数学"){ // 数学成绩
cout << "\t\t请输入分数段下限:";
cin >> score_begin;
cout << "\t\t请输入分数段上限:";
cin >> score_end;
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
if(nw->Math>=score_begin && nw->Math<=score_end){
fout << nw->name << " " << nw->Math << endl;
flag=true;
}
}
while (my_fin >> nw->name >> nw->Math ) {
my_score.s_name=nw->name;
my_score.s_score=nw->Math;
vec.push_back(my_score);
}
if(flag==true){
cout << "\n\t 姓名 数学成绩\n";
sort(vec.begin(),vec.end(),R_compStudent);
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
my_aver+=svit->s_score;
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) << "\t "<<svit->s_score << endl;
}
cout << endl;
cout << "\t\t此分数段共有学生:" << vec.size() << "人" << endl;
cout << "\t\t此分段学生平均分:" << my_aver/vec.size() << "分"<< endl;
}
break;
}else if(order == "english" || order == "英语"){ // 英语成绩
cout << "\t\t请输入分数段下限:";
cin >> score_begin;
cout << "\t\t请输入分数段上限:";
cin >> score_end;
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
if(nw->English>=score_begin && nw->English<=score_end){
fout << nw->name << " " << nw->English << endl;
flag=true;
}
}
while (my_fin >> nw->name >> nw->English ) {
my_score.s_name=nw->name;
my_score.s_score=nw->English;
vec.push_back(my_score);
}
if(flag==true){
cout << "\n\t 姓名 英语成绩\n";
sort(vec.begin(),vec.end(),R_compStudent);
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
my_aver+=svit->s_score;
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) << "\t "<<svit->s_score << endl;
}
cout << endl;
cout << "\t此分数段共有学生:" << vec.size() << "人" << endl;
cout << "\t此分段学生平均分:" << my_aver/vec.size() << "分"<< endl;
}
break;
}else if(order == "sum" || order == "总成绩"){ // 总成绩
cout << "\t\t请输入分数段下限:";
cin >> score_begin;
cout << "\t\t请输入分数段上限:";
cin >> score_end;
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
if(nw->sum>=score_begin && nw->sum<=score_end){
fout << nw->name << " " << nw->sum << endl;
flag=true;
}
}
while (my_fin >> nw->name >> nw->sum ) {
my_score.s_name=nw->name;
my_score.s_score=nw->sum;
vec.push_back(my_score);
}
if(flag==true){
cout << "\n\t 姓名 总成绩\n";
sort(vec.begin(),vec.end(),R_compStudent);
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
my_aver+=svit->s_score;
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) << "\t "<<svit->s_score << endl;
}
cout << endl;
cout << "\t\t此分数段共有学生:" << vec.size() << "人" << endl;
cout << "\t\t此分段学生平均分:" << my_aver/vec.size() << "分"<< endl;
}
break;
}else{
cout << "\t没有此学科,请重新选择您要统计的学科:";
}
}
/**********************************************/
if(!flag){
cout << "\n\t\t该成绩段内无学生信息";
}
delete nw;
fin.close();
fout.close();
my_fin.close();
remove("information2.txt");
cout << "\n\t是否继续对其他课程统计?(Y/N)(否)则返回上级目录:";
cin >> x;
if(x=='n'||x=='N'){
menus();
}
if(x=='y'||x=='Y'){
continue;
}
}
}
Rank.cpp
/*
实现: 通过vector向量和sort函数实现。
*/
#include "Student.h"
bool R_compStudent(score x,score y); // 升序
bool D_compStudent(score x,score y); // 降序
void Rank() {
char x = 'Y';
int order; // 用户指令
while(x=='y'||x=='Y'){
Student* nw;
nw = new Student;
vector<score> vec; // score类的向量
score my_score; // score类的对象
ifstream fin("information.txt");
if(!fin){
cout << "\t\t数据文件打开失败" << endl;
system("pause");
exit(0);
}
ofstream fout("information2.txt");
if (!fout){
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
ifstream my_fin("information2.txt");
if (!my_fin){
cout << "\t\t数据文件打开失败!" << endl;
system("pause");
exit(0);
}
system("cls"); //清屏函数
cout << "\t************ -----成绩排序模式----- ************ \n";
cout << endl;
cout << "\t*----------------------------------------------* \n";
cout << "\t*-------------请选择所要排序的学科-------------* \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——语文 * \n";
cout << "\t* 2——数学 * \n";
cout << "\t* 3——英语 * \n";
cout << "\t* 4——总成绩 * \n";
cout << "\t* 0——返回主菜单 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(0-4):";
cin >> order;
while ((order < 0) || (order > 4))
{
cout << "\t\t您要输入的编号是(0-4):";
cin >> order;
}
if(order==0) menus();
/*****************排序过程*****************/
if(order==1){ // 语文成绩
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
fout << nw->name << " " << nw->Chinese << endl;
}
while (my_fin >> nw->name >> nw->Chinese ) {
my_score.s_name=nw->name;
my_score.s_score=nw->Chinese;
vec.push_back(my_score);
}
system("cls");
cout << "\t*----------------------------------------------* \n";
cout << "\t*----------------请选择排序方式----------------* \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——升序 * \n";
cout << "\t* 2——降序 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(1-2):";
int s_order;
cin >> s_order;
while ((s_order < 1) || (s_order > 2))
{
cout << "\t\t您要输入的编号是(1-2):";
cin >> s_order;
}
if(s_order==1){
sort(vec.begin(),vec.end(),R_compStudent);
}else if(s_order==2){
sort(vec.begin(),vec.end(),D_compStudent);
}
cout << "\n\t 姓名\t 语文成绩\n";
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) <<"\t "<< svit->s_score << endl;
}
}else if(order==2){ // 数学成绩
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
fout << nw->name << " " << nw->Math << endl;
}
while (my_fin >> nw->name >> nw->Math ) {
my_score.s_name=nw->name;
my_score.s_score=nw->Math;
vec.push_back(my_score);
}
system("cls");
cout << "\t*----------------------------------------------* \n";
cout << "\t*----------------请选择排序方式----------------* \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——升序 * \n";
cout << "\t* 2——降序 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(1-2):";
int s_order;
cin >> s_order;
while ((s_order < 1) || (s_order > 2))
{
cout << "\t\t您要输入的编号是(1-2):";
cin >> s_order;
}
if(s_order==1){
sort(vec.begin(),vec.end(),R_compStudent);
}else if(s_order==2){
sort(vec.begin(),vec.end(),D_compStudent);
}
cout << "\n\t 姓名\t 数学成绩\n";
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) << "\t "<<svit->s_score << endl;
}
}else if(order==3){ // 英语成绩
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
fout << nw->name << " " << nw->English << endl;
}
while (my_fin >> nw->name >> nw->English ) {
my_score.s_name=nw->name;
my_score.s_score=nw->English;
vec.push_back(my_score);
}
system("cls");
cout << "\t*----------------------------------------------* \n";
cout << "\t*----------------请选择排序方式----------------* \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——升序 * \n";
cout << "\t* 2——降序 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(1-2):";
int s_order;
cin >> s_order;
while ((s_order < 1) || (s_order > 2))
{
cout << "\t\t您要输入的编号是(1-2):";
cin >> s_order;
}
if(s_order==1){
sort(vec.begin(),vec.end(),R_compStudent);
}else if(s_order==2){
sort(vec.begin(),vec.end(),D_compStudent);
}
cout << "\n\t 姓名\t 英语成绩\n";
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) <<"\t "<< svit->s_score << endl;
}
}else if(order==4){ // 总成绩
while (fin >> nw->name >> nw->num >> nw->Chinese >> nw->Math >> nw->English >> nw->sum) {
fout << nw->name << " " << nw->sum << endl;
}
while (my_fin >> nw->name >> nw->sum ) {
my_score.s_name=nw->name;
my_score.s_score=nw->sum;
vec.push_back(my_score);
}
system("cls");
cout << "\t*----------------------------------------------* \n";
cout << "\t*----------------请选择排序方式----------------* \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t* 1——升序 * \n";
cout << "\t* 2——降序 * \n";
cout << "\t*----------------------------------------------* \n";
cout << "\t\t您要输入的编号是(1-2):";
int s_order;
cin >> s_order;
while ((s_order < 1) || (s_order > 2))
{
cout << "\t\t您要输入的编号是(1-2):";
cin >> s_order;
}
if(s_order==1){
sort(vec.begin(),vec.end(),R_compStudent);
}else if(s_order==2){
sort(vec.begin(),vec.end(),D_compStudent);
}
cout << "\n\t 姓名\t 总成绩\n";
vector<score>::iterator svit;
for(svit=vec.begin();svit<vec.end();svit++){
cout << left << setw(8) <<"\t "<< svit->s_name;
cout << left << setw(8) <<"\t "<< svit->s_score << endl;
}
}
/**********************************************/
vec.clear();
delete nw;
fin.close();
fout.close();
my_fin.close();
remove("information2.txt");
cout << "\n\t是否继续对其他课程排序?(Y/N)(否)则返回上级目录:";
cin >> x;
if(x=='n'||x=='N'){
menus();
}
if(x=='y'||x=='Y'){
continue;
}
}
}
bool R_compStudent(score x,score y){ // 升序
if(x.s_score < y.s_score) return true;
else return false;
}
bool D_compStudent(score x,score y){ // 降序
if(x.s_score <= y.s_score) return false;
else return true;
}
menus.cpp
#include "Student.h"
void menus() {
system("cls"); //清屏函数
cout << "\t ************** -----欢迎使用----- ****************\n";
cout << "\t ************ -学生成绩管理系统v1.0- **************\n";
cout << "\t ********** -请输入您要操作的指令<0-4>- ***********\n";
cout << "\t *------------------------------------------------*\n";
cout << "\t * 1——信息维护 *\n";
cout << "\t * 2——信息查询 *\n";
cout << "\t * 3——成绩统计 *\n";
cout << "\t * 4——成绩排序 *\n";
cout << "\t * 0——退出系统 *\n";
cout << "\t *------------------------------------------------*\n";
cout << "\t\t你要输入的编号是(0-4):";
int x; // 用户命令
cin >> x;
while (1) {
if (x == 0) break;
switch (x) {
case 1: menusa(); break; // 信息维护菜单
case 2: menusb(); break; // 信息查询菜单
case 3: Statis(); break; // 统计学生信息(据课程名和分数段)
case 4: Rank(); break; // 排序(升序 降序)
default:
cout << "\t\t没有此选项,请重新选择:" ;
cin >> x;
}
}
system("pause");
exit(0);
}
menusa.cpp
#include "Student.h"
void menusa() { // 信息维护菜单
system("cls"); //清屏函数
cout << "\t ************ -----信息维护模式----- ************ \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t * 1——增加学生信息 * \n";
cout << "\t * 2——删除学生信息 * \n";
cout << "\t * 3——修改学生信息 * \n";
cout << "\t * 0——返回主菜单 * \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t\t你要输入的编号是(0-3):";
int number; // 用户命令
cin >> number;
while (1) {
if (number == 0) {
menus();
break;
}
switch (number) {
case 1: Increase(); break; // 增加
case 2: Delete(); break; // 删除
case 3: Modify(); break; // 修改
default:
cout << "\t\t没有此选项,请重新选择:" ;
cin >> number;
}
}
}
menusb.cpp
#include "Student.h"
void menusb() {
system("cls"); //清屏函数
cout << "\t ************ -----信息查询模式----- ************ \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t * 1——查询学生信息 * \n";
cout << "\t * 2——显示全部学生信息 * \n";
cout << "\t * 0——返回主菜单 * \n";
cout << "\t *----------------------------------------------* \n";
cout << "\t\t你要输入的编号是(0-2):";
int number; // 用户命令
cin >> number;
while (1) {
if (number == 0) {
menus();
break;
}
switch (number) {
case 1: Inquire(); break; // 查询学生信息(姓名 学号)
case 2: Display(); break; // 显示全部
default:
cout << "\t\t没有此选项,请重新选择:" ;
cin >> number;
}
}
}