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

📄 stuinfomanager.cpp

📁 自己上学时编译的一个学生管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>
#include <fstream>
#include "StuInfoManager.h"
using namespace std ;
char* StuInfoManager::subject_[] = {"A","B","C", "D", "E"};
StuInfoManager::StuInfoManager(void)
     {
       isModified = false;
       toRemvNodes = 0;
       start();
       }
StuInfoManager::~StuInfoManager(void){}                                     
void StuInfoManager::start(){
     cout << endl
	     << "\t*************************************************" << endl
		 << "\t*                              *" << endl
		 << "\t*                    这是一个                   *" << endl
		 << "\t*                学生成绩管理程序               *" << endl
		 << "\t*             可以对学生成绩进行管理            *" << endl
		 << "\t*                              *" << endl
		 << "\t*                              *" << endl
		 << "\t*              欢迎使用管理程序!                *" << endl
		 << "\t*************************************************"<<endl
		 << endl;
     handleMenu();
     }
char StuInfoManager::menuSelect()
{
     cout<<"0"<<"显示记录"<<endl
         <<"1"<<"查询记录"<<endl
         <<"2"<<"添加记录"<<endl
         <<"3"<<"删除记录"<<endl
         <<"4"<<"修改记录"<<endl
         <<"5"<<"记录排序"<<endl
         <<"6"<<"保存记录"<<endl
         <<"7"<<"读取记录"<<endl
         <<"8"<<"新建学生信息"<<endl
         <<"9"<<"结束运行"
         <<endl;
     string str;
     char choice;
     while(true)
     {   
         cin>>str;
         cin.ignore();
         choice =str[0];
         if(choice<'0'||choice>'9')
         cout<< endl <<"输入错误,重新输入0到9之间的数字";
         else 
           break;
           }
           return choice;
           } 
void StuInfoManager::handleMenu(){
      while (true)
      {char c;
      c= menuSelect();
      switch(c){ 
              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<<"学号\t姓名\t性别" ;
     for(int j=0 ;j<NUM_SUBJECT;j++)
        cout<<'\t'<<subject_[j];
        cout<<"\t总分\t平均分\t名次\t删除标记\n";
        }
void StuInfoManager::dispRecord( Record* rec)
{//打印学生信息
  cout<<rec->number<<'\t'<<rec->name<<'\t'<<rec->gender;
  for(int j=0;j<NUM_SUBJECT;j++)
    cout<<'\t'<<rec->score[j];
    cout.precision(3);
    cout<<'\t'<<rec->sum<<'\t'<<rec->average<<'\t'<<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]);
      if(i%20==0&&i!=0)
      {cout<<"请输入字符继续"<<endl;
       cin.get();
       cout<<endl;
       dispTable();
   }
}
    cout<<"共有"<<size()<< " 条记录 " << 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<<"条记录"<<endl
     <<"现在还剩下"<<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"<<endl
                <<"1.按学号\n"<<endl
                <<"2.按姓名\n"<<endl
                <<"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;
          }
}         
int StuInfoManager::getIndex(float sum){
       int ncount =0;
       Iterator it;
       Iterator it_end = pastEnd();
       for(it=first(); it!=it_end;it++)
       { if((*it)->sum<sum)
         {
                           (*it)->index++;
                           }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; 
        cout << "请输入性别(1.男0.女):"<<endl; 
        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"<<endl
             <<"现在共有"<<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;
        case '2':
           {int num = removePerform();
            toRemvNodes ='0';
            cout<<"一共删除了"<<num<<"条记录\n"
                <<"现载还剩下"<<size()<<"条记录"<<endl;
                if(num != 0)
                  isModified =true;
                  }
                 break;
         case'3':
                 removeNote(false);
                 break;
         case'4':
         {    
              Iterator it;
              Iterator it_end = pastEnd();
              for(it=first();it!=it_end;it++)
                (*it)->toBeDeleted = false;
                toRemvNodes = 0;
                cout<<"所有删除的标记已被取消"<<endl;
                }

⌨️ 快捷键说明

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