2 ai352387597 ai352387597 于 2013.06.18 22:08 提问

c++写的一个简单学生信息管理系统,求助。
c#

编译不报错,就是运行不出来

#include<iostream.h>
#include<stdio.h>
#include<string.h>
class student//定义学生信息类
{public:
    char name[20];
    char num[10];
    char banji[20];
    int math,english,chinese,computer;
    int sum;
    double ave;

    void input();
    void output();
    void score();


    void book(student sh[],int m);
};
void student::book(student grade[],int m)// 类外声明
{
    int l=10;
    for(int i=1;i<=l;i++)
    {
        cin>>student::name[20]>>student::num[10]>>student::banji>>student::math>>student::english>>student::chinese>>student::computer;
        strcpy(grade[i].name,student::name);
        strcpy(grade[i].num,student::num);
        grade[i].math=student::math;
        grade[i].english=student::english;
        grade[i].chinese=student::chinese;
        grade[i].computer=student::computer;
        grade[i].sum=student::math+student::english+student::chinese+student::computer;
        grade[i].ave=grade[i].sum/4;
    }
}
void student::score()//显示学生信息
{

cout<<name;
cout<<"             ";cout<<num;
if(math>=0)
    {cout<<"        ";cout<<math;}
else
cout<<"        无";
    if(english>=0)
    {cout<<"           ";cout<<english;}
    else
cout<<"            无";
    if(computer>=0)
    {cout<<"        ";cout<<computer;}
    else
cout<<"        无";
        if(chinese>=0)
    {cout<<"          ";cout<<chinese;}
        else
cout<<"          无";
        cout<<"        "<<ave<<endl;

}
void change(student sh[],int i)//修改学生信息
{
    char name1[20];
    int j,k,m;
    cout<<"              请输入要修改的学生姓名:"<<endl;
    cin>>name1;
    for(j=1;j<=i;j++)
    {
        if(strcmp(sh[j].name,name1)!=0)//判断ASCLL码大小
                k=-1;
            else
            {   k=j;break;}
    }
            if(k==-1)
            {
                cout<<"                   对不起,没有该学生的信息....."<<endl;
            cout<<"                      请按任意键进入主菜单......."<<endl;
            getchar();
            }
            else
            {
                sh[k].math=sh[k].english=sh[k].computer=sh[k].chinese=-1;
    int a,b;//a是各科成绩,b是存储选课数目
    sh[k].sum=0;//初始化sum
    char project[10];
    cout<<"                 请输入学生姓名:"<<endl;
    cin>>sh[k].name;
    cout<<"                 请输入学生学号:"<<endl;
    cin>>sh[k].name;

    cout<<"                 请输入学生选课数:"<<endl;
    while(cin>>m)
    {
        if(m>4)
            cout<<"对不起,请输入课程数1~4范围内:  请重新输入"<<endl;
        else
            break;
    }
    b=m;

    while(m--)
    {
        cout<<"             请输入课程名称:"<<endl;
        cin>>project;
        if(strcmp(project,"数学")==0)
        {
            cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
            sh[k].math=a;
            sh[k].sum+=sh[k].math;
        }

        else

         if(strcmp(project,"英语")==0)
         {
             cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
             sh[k].english=a;
             sh[k].sum+=sh[k].english;
        }

         else

             if(strcmp(project,"语文")==0)
             {
                 cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
                 sh[k].chinese=a;
                 sh[k].sum+=sh[k].chinese;
         }

             else

                 if(strcmp(project,"计算机")==0)
                 {
                     cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
                     sh[k].computer=a;
                     sh[k].sum+=sh[k].computer;
                 }

                 else
                 {
                     m++;
                     cout<<"             对不起,您输入的课程不存在,请重新输入"<<endl;
                 }


    }
    sh[k].ave=(double)sh[k].sum/b;
            }


}
void find(student sh[],int i)//查找学生信息
{
    int nn;  
    int h=1,he;

    char name2[20],num2[10];
    while(h!=0)
    {

        cout<<" 按姓名查询请输入1  "<<endl;
        cout<<" 按学号查询请输入2  "<<endl;
        cin>>nn;
        if(nn==1||nn==2)
            h=0;
        else
        {cout<<"            对不起,您输入的数字有误,请重新输入....."<<endl;h=1;}
    }

    if(nn==1)
    {
        cout<<"             请输入要查找的学生姓名:"<<endl;
        cin>>name2;
        for(nn=1;nn<i;nn++)
        {
            if(strcmp(sh[nn].name,name2)!=0)
                he=0;
            else
            {he=nn;break;}
        }
            if(he==0)
                cout<<"                   对不起,没有该学生的信息....."<<endl;
            else
            {
                cout<<"姓名    学号    数学成绩    英语成绩    计算机成绩    语文成绩   平均成绩"<<endl;
                sh[h].score();
            }



    }
    else
    {
        cout<<"             请输入要查找的学生学号:"<<endl;
        cin>>num2;
        for(nn=1;nn<i;nn++)
        {   if(strcmp(sh[nn].num,num2)!=0)
                he=0;
            else
            {   he=nn;break;}
        }
        if(he==0)
            cout<<"                   对不起,没有该学生的信息....."<<endl;
        else
                sh[h].score();
    }
        cout<<"             请按任意键继续......"<<endl;
        getchar();


}
void del(student sh[],int i)//删除学生信息
{

    char name3[20];int h,bat;
    cout<<"             请输入您想要删除的学生姓名: "<<endl;
    cin>>name3;
    for(h=1;h<=i;h++)
        if(strcmp(sh[h].name,name3)==0)
            bat=h;
        for(h=bat;h<i;h++)
            sh[h]=sh[h+1];
        cout<<"删除成功.....请按任意键继续操作..."<<endl;
        getchar();
        i--;


}
void student::input()    //输入学生信息                        
{
    int a,b,n;
    sum=0;
    char project[10];
    cout<<"                 请输入学生姓名:"<<endl;
    cin>>name;
    cout<<"                 请输入学生学号:"<<endl;
    cin>>num;
    cout<<"                 请输入学生选课数:"<<endl;
    while(true)
    {  cin>>n;
        if(n>4)
            cout<<"对不起,请输入课程数1~4范围内:  请重新输入"<<endl;
        else
        {b=n;
        break;}
    }

    while(n--)
    {
        cout<<"             请输入课程名称:"<<endl;
        cin>>project;
        if(strcmp(project,"数学")==0)
        {
            cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
            math=a;
            sum+=math;
        }
        else
         if(strcmp(project,"英语")==0)
         {
             cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
             english=a;
             sum+=english;
         }
         else
             if(strcmp(project,"语文")==0)
             {
                 cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
                 chinese=a;
                 sum+=chinese;
             }
             else
                 if(strcmp(project,"计算机")==0)
                 {
                     cout<<"             请输入该课程成绩:"<<endl;
        cin>>a;
                     computer=a;
                     sum+=computer;
                 }
                 else
                 {
                     n++;
                     cout<<"             对不起,您输入的课程不存在,请重新输入"<<endl;
                 }


    }
    ave=(double)sum/b;
    output();
}
void  student::output()//输出学生信息
{
    char con;
    cout<<"             您输入的学生信息为:"<<endl;
    cout<<"           姓名:";cout<<name<<endl;
    cout<<"           学号:";cout<<num<<endl;
    if(math>=0)
    {cout<<"           数学成绩:";cout<<math<<endl;}
    if(english>=0)
    {cout<<"           英语成绩:";cout<<english<<endl;}
    if(computer>=0)
    {cout<<"           计算机成绩:";cout<<computer<<endl;}
        if(chinese>=0)
        {   cout<<"           语文成绩:";cout<<chinese<<endl;}
        cout<<"             确定请按Y,重新输入请按N..."<<endl;
        cin>>con;
        if(con=='Y'||con=='y')
        {
            cout<<"             恭喜您输入成功!"<<endl;
            cout<<"             请按任意键继续......"<<endl;
        }
        else
        {math=english=computer=chinese=-1;
            input();}

        getchar();
}
void welcom()
{

cout<<"     请根据相应的数字选择     "<<endl;
cout<<"  【1】---------输入学生信息  "<<endl;
cout<<"  【2】---------修改学生信息   "<<endl;
cout<<"  【3】---------查看学生信息  "<<endl;
cout<<"  【4】---------删除学生信息  "<<endl;
cout<<"  【5】---------查找学生信息    "<<endl;
cout<<"  【0】---------退出系统    "<<endl;

}
int main()
{int a,i,j;
    i=10;
    int n=0;
    int m=10;
    student grade[1000];
    student bb;
    bb.book(grade,1000);

    cout<<"              你好,欢迎使用学生信息管理系统    "<<endl;

    cout<<"                 请按任意键继续......."<<endl;

    getchar();
    while(n=0)
    {
        welcom();
        cout<<"      请输入相应数字.................."<<endl;
        cin>>a;
        switch(a)
        {

        case 0:cout<<"              谢谢您的使用!再见...."<<endl;n=1;break;
        case 1:{++i;grade[i].input();break;}
        case 2:change(grade,i);break;
        case 3:
            {   cout<<"姓名    学号    数学成绩    英语成绩    计算机成绩    语文成绩   平均成绩"<<endl;
                for(j=1;j<=i;j++)
                    grade[j].score();
                   cout<<"             请按任意键继续......"<<endl;
                    getchar();
                        break;
            }
        case 4:del(grade,i);break;
        case 5:find(grade,i);break;
        default :cout<<"输入有误,请重新输入!!按任意键继续:"<<endl;getchar();break;
        }
    }
    return 0;

}

1个回答

wangyaninglm
wangyaninglm   Ds   Rxr 2015.01.17 13:43
 #include<iostream> 
#include<stdlib.h> 
#include<fstream> 
#include<stdio.h> 
#include"StuInfoVec.h" 
#include"StuInfoMananger.h" 

using namespace std; 

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

/*********************************************************** 
* 功能:显示成绩管理程序菜单,返回用户选择的选项 
* 返回:用户选择的选项,是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<< "学号\t姓名\t性别"; 
 cout<<'\t'<<"高数"; 
cout<<'\t'<<"语文"; 
cout<<'\t'<<"英语"; 
cout<<'\t'<<"物理"; 
cout<<'\t'<<"体育"; 
 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]); 

 //打印满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<<"条记录"<<endl; 

 } 

 /************************************************************** 
 * 找出总分为sum在当前所有记录中升序排序的位置 
 * 参数:sum,欲找位置的总分 
 * 返回:sum在当前所有记录中按升序排序的位置 
 * 结果:原有记录中"名次"项也会依需要相应改变 
 *************************************************************/ 
 int StuInfoManager::getIndex(float sum) 
 { 
 int acount=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) 
 { 
 acount++; 
 } 
 } 
 int a=acount+1; 
 return a; 
 } 

 /******************************************** 
 * 功能:向当前学生信息追加新的记录 
 * 该函数重载了基类中的函数 
 *******************************************/ 
 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.ingnore(); 
 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;  
 cout<< "请输入" <<"高数"<< "成绩:"; 
 cin>>rec->score[0]; 
 sum+=rec->score[0]; 
 cout<< "请输入" <<"语文"<< "成绩:"; 
 cin>>rec->score[1]; 
 sum+=rec->score[1]; 
 cout<< "请输入" <<"英语"<< "成绩:"; 
 cin>>rec->score[2]; 
 sum+=rec->score[2]; 
 cout<< "请输入" <<"物理"<< "成绩:"; 
 cin>>rec->score[3]; 
 sum+=rec->score[3];  
 cout<< "请输入" <<"体育"<< "成绩:"; 
 cin>>rec->score[4]; 
 sum+=rec->score[4]; 
 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; 
 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; 
 } 
 } 
 } 

 /*************************************************************** 
 * 功能:标记指定记录为"待删除"或取消该标记 
 * 参数:isToRemove,为true表示标记指定记录为"待删除" 
 * 为false表示取消指定记录为"待删除"标记 
 ****************************************************************/ 
 void StuInfoManager::removeNote(bool isToRemove) 
 { 
 if(empty()) 
 { 
 cout<< "当前没有任何记录-_=" <<endl; 
 return; 
 } 

 if (!isToRemove && toRemvNodes==0) 
 { 
 cout<< "当前没有被做了删除记录标记的项目-_=" <<endl; 
 return; 
 } 
 char choi[5]; 
 char pattern[20]; 
 int type; 
 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); 

 //找到匹配的记录 
 bool gotMatch = false; 
 Iterator it = findRecord(pattern,type,first()); 
 Iterator it_end = pastEnd(); 
 while (it != it_end) 
 { 
 //如果要取消标记而当前记录没有被标记,或者是要做标记而 
 //当前记录已被标记,则继续下一条记录 
 if ((!isToRemove && !(*it)->;toBeDeleted) || 
 (isToRemove && (*it)->;toBeDeleted)) 
 { 
 it = findRecord(pattern,type,++it); 
 continue; 
 } 
 getMatch = true; 
 cout<< "找到一条匹配的记录:\n"; 
 dispTable(); 
 dispRecord(*it); 
 cout<< "确定要改变这条记录的标记吗?[y/n]"; 
 cin.getline(choi,5); 

 if (choi[0]!='n' && choi[0]!='N') 
 (*it)->;toBeDeleted = !(*it)->;toBeDeleted; 
 if (isToRemove) 
 toRemvNodes++; 
 else 
 toRemvNodes--; 

 //取下一条匹配的记录 
 it = findRecord(pattern,type,++it); 
 } 
 if (!gotMatch) 
 cout<< "没有找到匹配的记录-_=" <<endl; 
 else 
 { 
 if (toRemvNodes != 0) 
 cout<< "当前有" << toRemvNodes 
 << "条记录被做了删除标记" <<endl; 
 else 
 cout<< "现在已经没有被做了删除标记的记录了-_=\n"; 
 } 
 } 
 } 

 /******************************************** 
 *功能:修改指定学生的信息 
 *******************************************/ 
 void StuInfoManager::modifyRecord() 
 { 
 if(empty()) 
 { 
 cout<< "没有可供修改的记录-_=" <<endl; 
 return; 
 } 

 char choi[5]; 
 char pattern[20]; 
 char name[20]; 
 int type; 
 string str; 
 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); 

 //找到匹配的记录 
 Iterator it = findRecord(pattern,type,first()); 
 Iterator it_end = pastEnd(); 
 if (it == it_end) 
 { 
 cout<< "没有匹配的记录-_=" <<end; 
 continue; 
 } 

 while (it != it_end) 
 { 

 cout<< "找到一条匹配的记录:\n"; 
 dispTable(); 
 dispRecord(*it); 
 cout<< "确定要改变这条记录的标记吗?[y/n]"; 
 cin.getline(choi,5); 

 //修改该记录 
 if (choi[0]!='n' && choi[0]!='N') 
 { 
 int ncount = 0; // 总分大于sum的人数 
 int tmpi =(*it)->;index; //记录当前修改的记录的名次 
 cout<< "下面请重新输入该学生的信息:\n"; 
 cout<< "请输入学号:"; 
 cin>>(*it)->number; 
 cin.ignore(); 

 cout<< "请输入姓名:"; 
 cin.getline(name,20); 
 (*it)->name = name; 

 printf("请输入性别(0为女,1为男):";); 
 cin>>str; 
 cin.ignore(); 

 if (str[0] == '0') 
 (*it)->gender = "女"; 
 else 
 (*it)->gender = "男"; 

 float sum=0; 
 for (j=0;j<NUM_SUBJECT; j++) 

{ 
 cout<< "请输入" <<subject_[j] << "成绩:"; 
 cin>>(*it)->score[j]; 
 sum+=(*it)->score[j]; 
 } 
 cin.ignore(); 
 (*it)->;sum = sum; 
 (*it)->;average = sum/NUM_SUBJECT; 

 //修改其他记录的名次、 
 //将原来名次排在被修改记录之后,而其sum大于等于 
 //修改后记录的sum的记录的名次减1, 
 //将原来名次排在被修改记录之前或相同,而其sum小于 
 //修改后记录的sum的记录的名次增1 

 ncount = 0; 
 Iterator it1; 
 for (it1=first(); it1!=it_end; it1++) 
 { 
 if (it1==it) continue; 

 if (*it1)->index>;tmpi && (*it1)->sum>=sum) 
 (*it1)->index--; 

 else if ((*it)->index<=tmpi && (*it1)->sum<sum) 
 (*it1)->index++; 

 if ((*it1)->sum>sum) 
 ncount++; 
 } 
 //nocut是总分比当前学生的总分大的学生的个数 
 //当前学生的名次是nocunt+1 
 (*it)->index=ncount+1; 
 isModified = true; 
 } 
 // 取下一条匹配的记录 
 it = findRecord(pattern,type,++it); 
 } 
 cout<< "已找完所有的记录\n" <<endl; 
 } 
 } 

 /********************************************** 
 * 功能:按照学号、姓名或名次对记录进行排序 
 * 结果:各个记录在数组中存储的位置会发生变化 
 *********************************************/ 
 void StuInfoManager::sortRecords() 
 { 
 if (empty()) 
 { 
 cout<< "没有可供排序的方式!" <<endl; 
 return; 
 } 
 string str; 
 cout<< "请输入您希望进行排序的方式:\n" 
 << "1. 按学号进行升序排序\n" 
 << "2. 按学号进行降序排序\n" 
 << "3. 按姓名进行升序排序\n" 
 << "4. 按姓名进行降序排序\n" 
 << "5. 按名次进行升序排序\n" 
 << "6. 按名次进行降序排序\n" 
 << "7. 按错了,我并不想进行排序" <<endl; 
 cin>>str; 
 cin.ignore(); 
 if (str[0]<'1' || str[0]>;'6') return; 
 //进行排序 
 int i,j; 
 int numStus=size(); 
 for (i=0;i<numStus-1;i++) 
 { 
 for (j=i+1; j<numStus; j++) 
 { 
 if ((str[0]=='1' && 
 recVec->;number>;recVec[j]->;number) || 
 (str[0]=='2'&& 
 recVec->number<recVec[j]->number) || 
 (str[0]=='3' && recVec->name>recVec[j]->name) || 
 (str[0]=='4' && recVec->name<recVec[j]->name) || 
 (str[0]=='5' && recVec->index>recVec[j]->index) || 
 (str[0]=='6' && recVec->index<recVec[j]->index))  
 { 
 swap(recVec,recVec[j]); //这是STL的一个函数 
 } 
 } 
 } 
 cout<< "排序已经完成" <<endl; 
 isModified = true; 
 } 
 /************************************************* 
 * 功能:将学生信息保存到指定文件 
 * 注意:该函数重载了基类中的函数 
 ************************************************/ 
 void StuInfoManager::saveRecords() 
 { 
 if (empty()) 
 { 
 cout<< "没有记录可存-_=" <<endl; 
 return; 
 } 
 char name[40]; 
 string fname; 
 cout<< "请输入要存入的文件名(直接回车选择文件sname):"; 
 cin.getline(name,40); 
 fname = name; 
 if (fname.empty()) 
 fname = "sname"; 
 ofstream of(fname.c_str(),ios_base:ut); 
 if (!of) 
 { 
 cout<< "不能存入文件-_=" <<endl; 
 return; 
 } 
 StuInfoVec::saveRecords(of); 
 of.close(); 
 cout << size() << "条记录已经存入文件,请继续操作。" <<endl; 
 isModified = false; 
 } 
 /****************************************************** 
 * 功能:从指定文件读取记录追加到当前记录末尾 
 * 注意:该函数重载了基类中的函数 
 *****************************************************/ 
 void StuInfoManager::loadRecords() 
 { 
 char choi[5]; 
 if (!empty()) 
 { 
 cout<< "请选择是要覆盖现有记录(y),还是要将读取的" 
 <<"记录添加到现有记录之后(n)?\n" 
 <<"直接回车则覆盖现有记录\n"; 
 cin.getline(choi,5); 
 if (choi[0]=='n' || choi[0]=='N') 
 { //将读取的记录添加到现有记录之后 
 isModified = true; 
 } 
 else 
 { 
 clear(); 
 } 
 } 
 string fname; 
 char fname1[40]; 
 cout<< "请输入要读取的文件名(直接回车选择文件sname)"; 
 cin.getline(fname1,40); 
 fname = fname1; 
 if (fname.empty()) 
 fname = "sname"; 
 ifstream ifs(fname.c_str(),ios_base::in); 
 if (!ifs) 
 { 
 cout<< "打不开文件!请重新选择" <<endl; 
 return; 
 } 
 int num = StuInfoVec::loadRecords(ifs); 
 ifs.close(); 
 cout<< "取入" << num <<"条记录。\n" 
 << "现在一共有" << size() << "条记录" << endl; 
 } 
 void StuInfoManager::quit() 
 {
 clear(); 
 cout << "退出操作,再见^_^" <<endl; 
 delete this; 
 exit(0); 
 }
Csdn user default icon
上传中...
上传图片
插入图片