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; } |
'언어 자료구조 알고리즘 > Escort 자료구조와 STL' 카테고리의 다른 글
[자료구조와 STL] 11. vector 만들기 소스 코드 (0) | 2016.04.18 |
---|---|
[자료구조와 STL] 10. vector 만들기 (0) | 2016.04.18 |
[자료구조와 STL] 9.vector를 이용하여 특정 키 순으로 보관하기 예제 코드 (0) | 2016.04.18 |
[자료구조와 STL] 8. 3 vector를 이용하여 특정 키 순으로 보관하기 (0) | 2016.04.18 |
[자료구조와 STL] 7.vector에 자료를 차례대로 보관하기 예제 코드 (0) | 2016.04.18 |
[자료구조와 STL] 6.vector에 자료를 차례대로 보관하기 (0) | 2016.04.18 |
[자료구조와 STL] 4. vector 인덱스 연산을 통해 사용하기 (0) | 2016.04.18 |
[자료구조와 STL] 3. vector (배열) (0) | 2016.04.18 |
[자료구조와 STL] 2. 공통적으로 사용하는 것들 (0) | 2016.04.18 |
[자료구조와 STL] 1. STL 소개 (0) | 2016.04.18 |