언어 자료구조 알고리즘/Escort 자료구조와 STL

[자료구조와 STL] 5. vector 인데스 연산으로 사용하기 예제 코드

언제나휴일 2016. 4. 18. 09:53
반응형

 vector 인데스 연산으로 사용하기 예제 코드

  

//EHGlobal.h

#pragma once

#pragma warning(disable:4996)

#include <string>

using std::string;

#include <iostream>

using std::cout;

using std::cin;

using std::ostream;

using std::endl;

#include <conio.h>

#include <windows.h>

enum keydata

{

    NO_DEFINED,F1,F2,F3,F4,F5,F6,F7,ESC

};

 

//공통적으로 사용할 정적 메서드를 캡슐화한 클래스

class ehglobal

{

public:

    static void clrscr();//화면을 지우는 메서드

    static void timeflow(int millisecond); //원하는 시간동안 지연시키는 메서드

    static int getnum();//수를 입력받는 메서드

    static string getstr();//문자열을 입력받는 메서드

    static keydata getkey();//기능 키를 입력받는 메서드

private:

    ehglobal(void){ }//개체를 생성하지 못하게 하기 위해 private으로 접근 지정

    ~ehglobal(void){}

};

  

//EHGlobal.cpp

#include "ehglobal.h"

 

void ehglobal::clrscr()//화면을 지우는 메서드

{

    system("cls");

}

 

void ehglobal::timeflow(int millisecond) //원하는 시간동안 지연시키는 메서드

{

    Sleep(millisecond);

}

 

int ehglobal::getnum()//정수를 입력받는 메서드

{

    int num;

    char buf[255+1];

    cin.getline(buf,255); //버퍼에 입력받음

    cin.clear();//cin 내부 버퍼를 지움

    sscanf(buf,"%d",&num); //포맷에 맞게 버퍼에 내용을 정수로 변환

    return num;

}

 

string ehglobal::getstr()//문자열을 입력받는 메서드

{

    char buf[255+1];

    cin.getline(buf,255);

    cin.clear();

    return buf;

}

 

keydata ehglobal::getkey()//기능 키를 입력받는 메서드

{

    int key = getch();

 

    if(key == 27) //ESC를 누를 때의 key 값이 27

    {

        return ESC;

    }

    if(key == 0) //기능 키를 눌렀을 때는 getch의 반환값이 0

    {

        //어떤 기능 키를 눌렀는지 확인하려면 getch를 다시 호출해야 함

        //사용자에게 다시 키를 입력받는 것은 아님

        key = getch();

        switch(key) //입력한 키에 따라 약속된 값 반환

        {

        case 59: return F1;    case 60: return F2;

        case 61: return F3;    case 62: return F4;

        case 63: return F5;    case 64: return F6;

        case 65: return F7;

        }

    }

    return NO_DEFINED; //열거되지 않은 키를 눌렀을 때

}

 

//Stu.h

#pragma once

#include "EhGlobal.h"

class Stu

{

    const int num; //상수 멤버 변수

    string name;

public:

    Stu(int num,string name): num(num),name(name) //멤버 초기화 구문

    {

    }

    int GetNum()const{    return num;    }

    string GetName()const{   return name;    }

    friend ostream &operator<<(ostream &os,Stu *stu)

    {

        os<<"번호:"<<stu->num<<"이름"<<stu->name<<endl;

        return os;

    }

};

 

//StuManager.h

#pragma once

#include "Stu.h"

#include <vector>

using std::vector;

typedef vector<Stu *> StuCollection;

class StuManager

{

    StuCollection base; //학생을 보관할 컬렉션(vector)

    const int max_stu;  //최대 보관할 수 있는 학생 수(최대 학생 번호이기도 함)

public:

    StuManager(void);

    ~StuManager(void);

    void Run();

private:

    keydata SelectMenu();

    void AddStu();

    void RemoveStu();

    void SearchStuByNum();

    void SearchStuByName();

    void ListAll();

    int SetMaxStu();

};

 

//StuManager.cpp

#include "StuManager.h"

 

StuManager::StuManager(void): max_stu(SetMaxStu())//초기화 구문

{

    base.resize(max_stu,0);

}

int StuManager::SetMaxStu()

{

    cout<<"최대 관리할 학생 수를 입력하세요"<<endl;

    return ehglobal::getnum();

}

StuManager::~StuManager(void)

{

    for(int i = 0; i<max_stu; i++)

    {

        if(base[i]) //실제 학생이 보관된 곳인지 확인

        {

            delete base[i];

        }

    }

}

void StuManager::Run()

{

    int key=0;

 

    while((key = SelectMenu())!= ESC)

    {

        switch(key)

        {

        case F1: AddStu(); break;

        case F2: RemoveStu(); break;

        case F3: SearchStuByNum(); break;

        case F4: SearchStuByName(); break;

        case F5: ListAll(); break;

        default: cout<<"잘못된 메뉴를 선택하였습니다."<<endl;

        }

 

        cout<<"아무키나 누르세요"<<endl;

        ehglobal::getkey();

    }

}

 

keydata StuManager::SelectMenu()

{

    ehglobal::clrscr();

    cout<<"메뉴 [ESC]:종료"<<endl;

    cout<<"[F1]:학생 추가 [F2]:학생 삭제 [F3]:번호로 검색"

    cout<<" [F4]:이름으로 검색 [F5]:전체 보기"<<endl;

    cout<<"메뉴를 선택하세요"<<endl;

    return ehglobal::getkey();

}

 

void StuManager::AddStu()

{

    int num = 0;

    cout<<"추가할 학생 번호를 입력하세요. 1~"<<max_stu<<endl;

    num = ehglobal::getnum();

    if((num<=0)||(num>max_stu))

    {

        cout<<"범위를 벗어났습니다."<<endl;

        return;

    }

    if(base[num-1]) //실제 학생이 보관되었는지 확인

    {

        cout<<"이미 보관된 학생이 있습니다."<<endl;

        return;

    }

    string name = "";

    cout<<"이름을 입력하세요"<<endl;

    name = ehglobal::getstr();

    base[num-1] = new Stu(num,name);

}

void StuManager::RemoveStu()

{

    int num = 0;

    cout<<"삭제할 학생 번호를 입력하세요. 1~"<<max_stu<<endl;

    num = ehglobal::getnum();

    if((num<=0)||(num>max_stu))

    {

        cout<<"범위를 벗어났습니다."<<endl;

        return;

    }

 

    if(base[num-1]==0) //실제 학생이 보관되었는지 확인

    {

        cout<<"보관된 학생이 없습니다."<<endl;

        return;

    }

 

    delete base[num-1];

    base[num-1] = 0; //초기값 0으로 다시 설정

}

void StuManager::SearchStuByNum()

{

    int num = 0;

    cout<<"검색할 학생 번호를 입력하세요. 1~"<<max_stu<<endl;

    num = ehglobal::getnum();

 

    if((num<=0)||(num>max_stu))

    {

        cout<<"범위를 벗어났습니다."<<endl;

        return;

    }

 

    if(base[num-1]==0) //실제 학생이 보관되었는지 확인

    {

        cout<<num<<"번 학생은 보관되지 않았습니다."<<endl;

        return;

    }

    cout<<base[num-1]<<endl;

}

 

 

 

void StuManager::SearchStuByName()

{

    string name="";

 

    cout<<"검색할 학생 이름을 입력하세요."<<endl;

    name = ehglobal::getstr();

 

    for(int i = 0; i<max_stu; i++)

    {

        if(base[i]) //실제 학생이 보관되었는지 확인

        {

            if(base[i]->GetName() == name)

            {

                cout<<base[i]<<endl;

                return;

            }

        }

    }

    cout<<name<<" 학생은 보관되지 않았습니다."<<endl;

}

void StuManager::ListAll()

{

    for(int i = 0; i<max_stu; i++)

    {

        if(base[i]) //실제 학생이 보관되었는지 확인

        {

            cout<<base[i]<<endl;

        }

    }

}

  

//Demo.cpp

#include "StuManager.h"

void main()

{

    StuManager *sm = new StuManager();

    sm->Run();

    delete sm;

}

 

반응형