#include <iostream>
#include <Windows.h>
using namespace std;
//< 학생 구조체 선언
struct tagstudent
{
//< 멤버변수
int nID;
int nKor;
int nEng;
int nMath;
int nTotal;
float fAvg;
//< 멤버함수
//< 데이터 입력
void InputData( void );
//< 데이터 출력
void OutputData( void );
//< ID확인
bool IsCompareID( int nDestID );
//< 아이디 삭제
void DeleteID( void );
};
//< 학생 관리 구조체
typedef struct tagClassInfo
{
//< 현재 최대치 학생
int nMaxCount ;
//< 입력된 학생수
int nNowInputCount ;
//< 학생 데이터
tagstudent* pStudentData;
//< 구조체 함수
//< 생성자
tagClassInfo();
//< 소멸자
~tagClassInfo();
//< 메뉴 출력
void OutputMenu( void );
//< 메뉴 선택
int InputMenu( void );
//< 범위 검사
bool CheckScope( int nNumber, int nStart, int nEnd );
//< 데이터 입력
void InputData( void );
//< 데이터 출력
void OutputData( void );
//< 종료
void EndGame( void );
//< 데이터 찾기
bool FindData( void );
//< 정원 추가
void AddData( void );
//< 정원 삭제
void DeleteData( void );
}CLASSINFO,*LPCLASSINFO;
//< 메인 시작
int main( void )
{
//< ID/국어/영어/수학/총점/평균
CLASSINFO sInfo;
while( true )
{
//< 메뉴 출력
sInfo.OutputMenu();
//< 메뉴 선택
int nSelectMenu = sInfo.InputMenu();
//< 예외 처리
if( sInfo.CheckScope(nSelectMenu, 1, 5 ) == true )
{
//< 입력/출력/찾기
switch( nSelectMenu )
{
case 1: //< 입력
{
//< 데이터 입력
sInfo.InputData();
}
break;
case 2: //< 출력
{
sInfo.OutputData();
}
break;
case 3: //< 찾기
{
sInfo.FindData();
}
break;
case 4: //< 추가
{
sInfo.AddData();
}
break;
case 5: //< 삭제
{
sInfo.DeleteData();
}
break;
}
Sleep(1000);
system("cls");
}
else
{
sInfo.EndGame();
return 0;
}
}
return 0;
}
//< 구조체 분할
//////////////////////////////////////////////////////////////////////////
//< student구조체 분할
//< 데이터 입력
void tagstudent::InputData( void )
{
//< 데이터 입력
cout <<"ID : ";
cin >> nID;
cout <<"국어 : ";
cin >> nKor;
cout <<"영어 : ";
cin >> nEng;
cout <<"수학 : ";
cin >> nMath;
nTotal = nKor + nEng + nMath;
fAvg = nTotal / 3.0f;
}
//< 데이터 출력
void tagstudent::OutputData( void )
{
cout << endl;
cout << nID<< "\t" <<
nKor<< "\t" <<
nEng<< "\t" <<
nMath<< "\t" <<
nTotal<< "\t" <<
fAvg<< endl;
}
//< ID확인
bool tagstudent::IsCompareID( int nDestID )
{
if( nID == nDestID )
{
return true;
}
return false;
}
void tagstudent::DeleteID( void )
{
nID = -1;
}
//////////////////////////////////////////////////////////////////////////
//< tagClassInfo 구조체 분할
tagClassInfo::tagClassInfo()
{
nMaxCount = 0;
nNowInputCount = 0;
pStudentData = NULL;
}
//< 소멸자
tagClassInfo::~tagClassInfo()
{
if( pStudentData != NULL )
{
delete [] pStudentData;
pStudentData = NULL;
}
}
//< 메뉴 출력
void tagClassInfo::OutputMenu( void )
{
//< 메뉴 출력
int nSelectMenu = 0;
cout << "1. 입력 " << endl;
cout << "2. 출력 " << endl;
cout << "3. 찾기 " << endl;
cout << "4. 학생정원 추가" << endl;
cout << "5. 학생 삭제" << endl;
cout << "0. 종료 " << endl;
cout << "선택 : ";
}
//< 메뉴 선택
int tagClassInfo::InputMenu( void )
{
int nSelectMenu;
//< 메뉴 선택
cin >> nSelectMenu;
//< 선택에 따른 처리
return nSelectMenu;
}
//< 범위 검사
bool tagClassInfo::CheckScope( int nNumber, int nStart, int nEnd )
{
if( nStart <= nNumber && nNumber <= nEnd )
{
return true;
}
return false;
}
//< 데이터 입력
void tagClassInfo::InputData( void )
{
if( nMaxCount != 0 && nMaxCount != nNowInputCount )
{
//< 데이터 입력 체크
if( pStudentData != NULL )
{
pStudentData[nNowInputCount].InputData();
nNowInputCount++;
}
}
else if( nMaxCount == 0 )
{
cout << "할당부터 해라 " << endl;
}
else
{
cout <<"현재인원 : " << nNowInputCount << endl;
cout <<"학생수 오버!!! " << endl;
}
}
//< 데이터 출력
void tagClassInfo::OutputData( void )
{
if( pStudentData != NULL )
{
cout << endl;
cout << "ID\t국어\t영어\t수학\t총점\t평균" << endl;
for( int i = 0 ; i < nNowInputCount ; i++ )
{
pStudentData[i].OutputData();
}
}
else
{
cout << "할당 부터 해라!!" <<endl;
}
//<
Sleep(1000);
system("cls");
}
//< 종료
void tagClassInfo::EndGame( void )
{
cout <<"종료중";
for (int i = 0 ; i < 5 ; i++ )
{
cout <<".";
Sleep(300);
}
cout <<"완료!! 안녕히 가세요" << endl;
Sleep(1000);
}
//< 데이터 찾기
bool tagClassInfo::FindData( void )
{
if( pStudentData != NULL )
{
int nFindID = 0;
cout <<"찾을 ID 입력 : ";
cin >> nFindID;
for( int i = 0 ; i < nNowInputCount ; i++ )
{
if( pStudentData[i].IsCompareID( nFindID ) == true )
{
cout <<"찾기 성공";
cout << endl;
cout << "ID\t국어\t영어\t수학\t총점\t평균" << endl;
pStudentData[i].OutputData();
//<
Sleep(1000);
system("cls");
return true;
}
}
cout << "해당 아이디 없음" << endl;
Sleep(1000);
system("cls");
return false;
}
else
{
cout << "할당 부터 해라!!" <<endl;
return false;
}
return true;
}
//< 정원 추가
void tagClassInfo::AddData( void )
{
int nInputCount = 0;
cout << "현재 인원 : " << nNowInputCount << endl;
cout << "추가할 인원수 : ";
cin >> nInputCount;
//< 오류
if( nInputCount <= 0 )
{
cout << "장난하냐? "<< endl;
}
else
{
nMaxCount += nInputCount;
//< 처음 이냐?
if( nMaxCount == 0 )
{
//< 처음은 그냥 할당
pStudentData = new tagstudent[nMaxCount];
}
else
{
//< 처음이 아니다
//< 백업 데이터 설정
tagstudent* pBackUp = new tagstudent[nMaxCount];
//< 데이터 초기화
memset( pBackUp, 0, sizeof( tagstudent) * nMaxCount );
//< 데이터 옴기기
memmove( pBackUp , pStudentData, sizeof(tagstudent) * nNowInputCount );
//< 기존 데이터 삭제
delete [] pStudentData;
pStudentData = NULL;
//< 포인터 물기
pStudentData = pBackUp;
cout <<"공간 추가 완료" << endl << endl;
}
}
}
//< 정원 삭제
void tagClassInfo::DeleteData( void )
{
if( pStudentData != NULL )
{
int nDelID = -1;
cout << "삭제 ID: ";
cin >> nDelID;
//< 오류
if( nDelID < 0 )
{
cout << "장난하냐? "<< endl;
}
else
{
if( nNowInputCount == 0 )
{
cout <<"꺼져!!! 지울거 없다." << endl;
}
else
{
//< 찾자....
bool bFind = false;
for( int i = 0 ; i < nNowInputCount; i++ )
{
if( pStudentData[i].IsCompareID( nDelID ) == true )
{
bFind = true;
break;
}
}
if( bFind == true )
{
nMaxCount--;
//< 백업 데이터 설정
tagstudent* pBackUp = new tagstudent[nMaxCount];
//< 데이터 초기화
memset( pBackUp, 0, sizeof( tagstudent) * nMaxCount );
//< 데이터 옴기기
for( int j = 0, i = 0 ; i < nNowInputCount ; i++ )
{
if( pStudentData[i].IsCompareID( nDelID ) != true )
{
memmove( &pBackUp[j] , &pStudentData[i], sizeof( tagstudent ) );
j++;
}
}
//< 기존 데이터 삭제
delete [] pStudentData;
pStudentData = NULL;
//< 포인터 물기
pStudentData = pBackUp;
//< 총정원 줄이기
nNowInputCount--;
cout <<"삭제완료" << endl << endl;
}
}
}
}
else
{
cout <<"허허허,,,???" << endl;
}
}