⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stuinfomanager.cpp

📁 学生成绩管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//StuInfoManager.cpp
#include<stdlib.h>
#include<fstream>
#include"stuinfomanager.h"
#include<iomanip>
using namespace std;
//定义静态程序数据
char* StuInfoManager::subject_[] = {"语文","数学","英语","物理","化学"};

StuInfoManager::StuInfoManager(void)
{
	isModified = false;
	toRemvNodes = 0;
	start();
}

StuInfoManager::~StuInfoManager(void)
{
}

/*************************************
*  功能: 显示欢迎界面,并开始进行用户交互处理
*************************************/
void StuInfoManager::start()
{
	cout << "\n"
		 << "\t*****************************\n"
		 << "\t*          这是一个         *\n"
		 << "\t*       学生成绩管理程序    *\n"
		 << "\t*  可以对学生成绩进行管理   *\n"
		 << "\t*       欢迎使用管理程序    *\n"
		 << "\t*****************************\n"
		 << "\n" ;
	handleMenu();
}

/****************************************
*功能:显示程序管理菜单,返回用户选择的选项
*返回:用户选择的选项,是0-9之间的一个字符
****************************************/
char StuInfoManager::menuSelect()
{
	cout << "\n"
		 << "0.显示记录\n"
		 << "1.查询记录\n"
		 << "2.增加记录\n"
		 << "3.删除记录\n"
		 << "4.修改记录\n"
		 << "5.记录排序\n"
		 << "6.保存记录\n"
		 << "7.读取记录\n"
		 << "8.新建学生信息文件\n"
		 << "9.结束运行\n"
		 << "\n左边数字对应功能选择,请选0-9: ";

	string str;
	char choice;

	while (true)
	{
		cin >> str;
		cin.ignore(); //从 cin中将回车符提取出来
		choice = str[0];
		if(choice<'0' || choice>'9' )
			cout << "\n输入错误,重新选0-9: ";
		else 
			break;
	}
	return choice;
}

/*************************************************
* 功能:根据用户选择的项目调用相应的处理函数
**************************************************/
void StuInfoManager::handleMenu()
{
	while(true)
	{
		switch(menuSelect())
		{
		case '0':
			displayRecords();
			break;
		case '1':
			queryRecord();
			break;
		case '2':
			addRecord();
			break;
		case '3':
			removeRecord();
			break;
		case '4':
			modifyRecord();
			break;
		case '5':
			sortRecords();
			break;
		case '6':
			saveRecords();
			break;
		case '7':
			loadRecords();
			break;
		case '8':
			clear();
			addRecord();
			break;
		case '9':
			quit();
		}
	}
}

/****************************************
* 功能:打印显示记录信息时的表头
****************************************/
void StuInfoManager::dispTable()
{
	cout << "学号 姓名 性别";
	for  (int j=0;j<NUM_SUBJECT;j++)
		cout << '\t'<< subject_[j];
	cout << " 总分 平均分 名次 删除标志\n";
}

/********************************************
*功能:显示指定记录的信息
********************************************/
void StuInfoManager::dispRecord(Record* rec)
{
	//打印学生信息
	cout<<setw(4) << rec->number << setw(4) << rec->name << setw(4)<< rec->gender;
	for (int j=0;j<NUM_SUBJECT;j++)
		cout<<'\t'<<rec->score[j];
	cout.precision(3);
	cout<<setw(6)<<rec->sum<<setw(6)<<rec->average<<setw(6)<<rec->index;
	if (rec->toBeDeleted)
		cout << "\t*\n";
	else
		cout << '\n';
}

/*********************************
*功能:显示所有记录信息
*********************************/
void StuInfoManager::displayRecords()
{
	if (empty())
	{
		cout << "没有记录可以显示" << endl;
		return;
	}
	dispTable();
	int num = size();
	for (int i=0; i<num; i++)
	{
		dispRecord(recVec[i]);
		//打印满20个记录后停下来
		if (i%20==0 && i!=0)
		{
			cout << "输入任一个字符后继续.......\n";
			cin.get();
			cout << endl;
			dispTable();
		}
	}
	cout << "一共有" << size() << "条记录\n" << endl;
}

/**************************************************
*功能:首先检查记录是否已经保存,然后清空当前所有记录
*注意:这函数覆盖了基类中的函数
**************************************************/
void StuInfoManager::clear()
{
	char choi[5];
    if (toRemvNodes !=0)
	{
		cout << "现在还有被做了删除标记但还没有执行的记录,是否执行删除? (Y/N)";
		cin.getline(choi,5);
		if (choi[0]!='n' && choi[0]!='N' )
		{
			int num = removePerform();
			toRemvNodes = 0;
			cout << "一共删除了" << num << "条记录\n"
				<<"现在还剩下" << size() << "条记录" <<endl;
			if (num!=0)
				isModified = true;
		}
	}
	if (isModified) //已改动,未保存
	{
		cout<< "学生信息已改动,是否保存? (Y/N):";
		cin.getline(choi,5);
		if (choi[0]!='n' && choi[0]!='N')
			saveRecords();
	}
	StuInfoVec::clear();
	isModified= false;
}

/***********************************************
*功能:查询指定记录
***************************************/
void StuInfoManager::queryRecord()
{
	if (empty())
	{
		cout << "记录是空表,退出查询操作!" << endl;
		return;
	}
	char choi[5];
	int type;
	char pattern[20];
	while(true)
	{
		//选择获取所需要查询的记录方式
		cout << "请输入查询的方式; (直接输入回车则结束查询) \n"
			 << "1.按学号\n"
			 << "2.按姓名\n"
			 << "3.按名次\n";
		cin.getline(choi,5);
		//直接输入回车则结束查询
		if (choi[0] == '\0') break;
		if (choi[0] == '1')
		{
			cout << "请输入欲查询的学生的学号: ";
			type = 0;
		} else if (choi[0] == '2' )
		{ 
			cout << "请输入欲查询学生的姓名: ";
			type = 1;
		}else
		{
			cout<< "请输入欲查询的学生的名次:";
			type=2;
		}
		cin.getline(pattern,20);
		int findCount = 0;
		//找到匹配的记录
		Iterator it = findRecord(pattern,type,first());
		Iterator it_end = pastEnd();
		dispTable();
		while (it != it_end)
		{
			findCount++;
			dispRecord(*it);
			//取下一条匹配的记录
			it = findRecord(pattern,type,++it);
		}
		cout << "一共找到了" << findCount << "条记录\n" << endl;
	}
}
/***********************************************
*找出总分为sum在当前所有记录中按升序排序的位置
*参数:sum, 欲找位置的总分
*返回:sum在当前所有记录中按升序排序的位置
*结果:原有记录中"名次"项也会依需要相应改变
**************************************************/
int StuInfoManager::getIndex(float sum)
{
	int ncount = 0; //总分大于sum的人数
	Iterator it;
	Iterator it_end = pastEnd();
	for (it = first(); it!=it_end; it++)
	{
		if ((*it)->sum < sum)
		{
			(*it)->index++;//总分小于sum的记录名次增1
		} else if ((*it)->sum >sum)
		{
			ncount++;
		}
	}
	return ncount+1;
}

/*****************************************
*功能:向当前学生信息追加新的记录
*注意:该函数重载了基类中的函数
******************************************/
void StuInfoManager::addRecord()
{
	if (empty())
		cout << "原来没有记录,现在建立新表" << endl;
	else
		cout << "下面在当前表的末尾增加新的信息" << endl;
	char choi[5];
	char name[20];
	Record* rec;
	float sum;
	int j;
	int ncount = 0; //记录增加了的记录数
	while(true)
	{
		cout << "您将要添加一组信息,确定吗? (Y/N):";
		cin.getline(choi,5);
		if (choi[0] == 'n' || choi[0] == 'N') //不再添加新的信息
			break;
		rec = new Record;
		cout << "请输入学号: " << flush;
		cin >> rec->number;
		cin.ignore();
		printf("请输入姓名: ");
		cin.getline(name,20);
		rec->name = name;
		printf("请输入性别 (0为女,1为男): ");
		cin.getline(choi,5);
		if (choi[0] == '0')
			rec->gender = "女";
		else 
			rec->gender = "男";
		sum = 0;
		for (j=0; j<NUM_SUBJECT; j++)
		{
			cout << "请输入" << subject_[j] << "成绩";
			cin >> rec->score[j];
			sum +=rec->score[j];
		}
		cin.ignore();
		rec->sum = sum;
		rec->average = sum/NUM_SUBJECT;
		rec->index = getIndex(sum);
		StuInfoVec::addRecord(rec);
		ncount++;
	}
	cout << "一共新增了" << ncount << "条记录\n"
		 << "现在一共有" << size() << "条记录" << endl;
	if (ncount != 0)
		isModified = true; //记录已经改动,未保存
}
/********************************************************
*功能:进入"删除记录"子菜单,选择执行相应的功能
*注意:该函数重载了基类中的函数
********************************************************/
void StuInfoManager::removeRecord()
{
	if(empty())
	{
		cout << "记录已经空,退出删除操作!" << endl;
		return;
	}
	cout << "1.标记待删除的记录\n"
		 << "2.执行标记\n"
		 << "3.取消指定记录的删除标记\n"
		 << "4.取消全部删除标记"<< endl;
	string str;
	do
	{
		cout << "请选择您要进行的操作(1-4): ";
		cin >> str;
	}while (str[0]<'1' || str[0]>'4');
	cin.ignore();

	switch (str[0])
	{
	case '1':
		removeNote(true);
		break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -