C++/디딤돌 자료구조와 알고리즘 with C++

STL vector 인덱스 사용 [C++ 소스]

언제나휴일 2016. 6. 10. 22:30
반응형

STL vector 인덱스 사용 [C++ 소스]


인덱스로 사용.zip





"본문 내용"은 언제나 휴일 본 사이트에 있습니다.


//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,F8,F9,F10,ESC

};

 

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

class ehglobal

{

public:

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

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

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

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

    static int 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();

    sscanf(buf,"%d",&num);

    return num;

}


//Genre.h

#pragma once

#include "ehglobal.h"

class Genre

{

    string name;

    const int num;

public:

    Genre(int num,string name);

    int GetNum()const;

    string GetName()const;

    void View()const;

};


//Genre.cpp

#include "Genre.h"

 

Genre::Genre(int num,string name):num(num)

{

    this->name = name;

}

int Genre::GetNum()const

{

    return num;

}

string Genre::GetName()const

{

    return name;

}

void Genre::View()const

{

    cout<<"장르 No."<<num<<장르명:"<<name<<endl;

}


//App.h

#pragma once

#include "Genre.h"

#include "ehglobal.h"

#include <vector>

#include <algorithm>

using std::vector;

using std::find;

using std::find_if;

 

typedef vector<Genre *> Genres;

typedef Genres::iterator GIter;

typedef Genres::const_iterator GCIter;

 

 

class App

{

    Genres genres;

    int max_genres;//최대 장르 번호

public:

    App(void);

    ~App(void);

    void Run();

private:

    int SelectMenu();

    void AddGenre(); //장르 추가

    void RemoveGenreByNum();//번호로 장르 삭제

    void RemoveGenreByName();//이름으로 장르 삭제

    void FindGenreByNum()const; //번호로 장르 검색

    void FindGenreByName()const; //이름으로 장르 검색

    void ListGenre()const; //장르 목록 보기

};


//App.cpp

#include "App.h"

 

class EqualerByName

{

    string name;

public:

    EqualerByName(string name)

    {

        this->name = name;

    }

    bool operator()(const Genre *genre)const

    {

        if(genre==0)

        {

            return false;

        }

        return name.compare(genre->GetName())==0;

    }

};

 

App::App(void)

{

    cout<<"최대 장르 번호:";

    max_genres = ehglobal::getnum();

    genres.resize(max_genres,0);//max_genres 만큼 0으로 보관(설정)

}

 

 

App::~App(void)

{

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

    {

        if(genres[i])

        {

            delete genres[i];

        }

    }

}

 

void App::Run()

{

    int key=NO_DEFINED;

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

    {

        switch(key)

        {

        case F1: AddGenre(); break;

        case F2: RemoveGenreByNum(); break;

        case F3: RemoveGenreByName(); break;

        case F4: FindGenreByNum(); break;

        case F5: FindGenreByName(); break;

        case F6: ListGenre(); break;

        default: cout<<"잘못 선택하셨습니다."<<endl; break;

        }

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

        ehglobal::getkey();

    }

}

 

int App::SelectMenu()

{

    ehglobal::clrscr();//콘솔 화면을 지우기

    cout<<"장르 관리 프로그램 [ESC]: 종료"<<endl;

    cout<<"F1: 장르 추가 F2: 번호로 장르 삭제 F3: 이름으로 장르 삭제"<<endl;

    cout<<"F4: 번호로 장르 검색 F5: 이름으로 장르 검색 F6: 장르 목록 보기"<<endl;

 

    return ehglobal::getkey();//사용자가 입력한 기능 키 반환

}

 

void App::AddGenre() //장르 추가

{

    int num=0;

    cout<<"추가할 장르 번호(1~"<<max_genres<<"):";

    num = ehglobal::getnum();

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

    {

        cout<<"유효한 장르 번호가 아닙니다."<<endl;

        return;

    }

    if(genres[num-1])//보관한 값이 유효하면(0이 아니면)

    {

        cout<<"이미 있습니다."<<endl;

        return;

    }

    cout<<"추가할 장르명:";

    string name = ehglobal::getstr();//장르명 입력

    Genre *genre = new Genre(num,name); //장르 생성

    genres[num-1] = genre;//변경

}

 

 

 

void App::RemoveGenreByNum()//번호로 장르 삭제

{

    int num=0;

    cout<<"삭제할 장르 번호(1~"<<max_genres<<"):";

    num = ehglobal::getnum();

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

    {

        cout<<"유효한 장르 번호가 아닙니다."<<endl;

        return;

    }

    if(genres[num-1]==0)//보관한 값이 0이면

    {

        cout<<"없습니다."<<endl;

        return;

    }

   

    delete genres[num-1];

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

}

 

void App::RemoveGenreByName()//이름으로 장르 삭제

{

    string name;

    cout<<"삭제할 장르명:";

    name = ehglobal::getstr();

    EqualerByName ebname(name);

 

    GIter seek = find_if(genres.begin(), genres.end(), ebname);

    if(seek != genres.end())

    {

        Genre *genre = (*seek);

        int num = genre->GetNum();       

        delete genre;

        genres[num-1] = 0;

        cout<<"삭제하였습니다."<<endl;

    }

    else

    {

        cout<<"존재하지 않는 장르명입니다."<<endl;

    }

}

void App::FindGenreByNum()const //번호로 장르 검색

{

    int num=0;

    cout<<"검색할 장르 번호(1~"<<max_genres<<"):";

    num = ehglobal::getnum();

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

    {

        cout<<"유효한 장르 번호가 아닙니다."<<endl;

        return;

    }

    if(genres[num-1]==0)//보관한 값이 0이면

    {

        cout<<"없습니다."<<endl;

        return;

    }

    genres[num-1]->View();

}

void App::FindGenreByName()const //이름으로 장르 검색

{

    string name;

    cout<<"검색할 장르명:";

    name = ehglobal::getstr();

    EqualerByName ebname(name);

 

    GCIter seek = find_if(genres.begin(), genres.end(), ebname);

    if(seek != genres.end())

    {

        Genre *genre = (*seek);

        genre->View();

    }

    else

    {

        cout<<"존재하지 않는 장르명입니다."<<endl;

    }

}

void App::ListGenre()const //장르 목록 보기

{   

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

    {

        if(genres[i])

        {

            genres[i]->View();

        }

    }

}


//Program.cpp

#include "App.h"

int main()

{

    App *app = new App();

    app->Run();

    delete app;

    return 0;

}



프로그래밍 언어 및 기술 학습, 무료 동영상 강의 언제나 휴일

반응형