본문 바로가기
카테고리 없음

동적할당_성적표

by ByteBridge 2013. 2. 20.
반응형

#include <iostream>
#include <Windows.h>

using namespace std;

//< 메뉴 출력
void OutputMenu( void );
//< 메뉴 선택
int InputMenu( void );
//< 범위 검사
bool CheckScope( int nNumber, int nStart, int nEnd );
//< 데이터 입력
void InputData( int *pID, int *pKor, int *pEng, int *pMath, int *pTotal, float* pAvg, int& nCount );
//< 데이터 출력
void OutputData( int *pID, int *pKor, int *pEng, int *pMath, int *pTotal, float* pAvg, int nCount );
//< 데이터 찾기
bool FindData( int *pID, int *pKor, int *pEng, int *pMath, int *pTotal, float* pAvg, int nNowCount );
//< 종료
void EndGame( void );

//< 메모리 할당
//더블포인터를 사용할경우
void AllocMemInt( int** pDest , int nSize );
void AllocMemFloat( float** pDest , int nSize );
//포인터를 사용할경우
int* AllocMemIntReturn( int nSize );
float* AllocMemFloatReturn( int nSize );
//< 메모리 정리
void DeleteMemInt( int** pDest );
void DeleteMemFloat( float** pDest );

//< 보이드로 해제
void DeleteMemVoid( void** pDest );


int main( void )
{
//< ID/국어/영어/수학/총점/평균
int nMaxCount = 0;
int nNowInputCount = 0;
int *pID = NULL;
int *pKor = NULL;
int *pEng = NULL;
int *pMath = NULL;
int *pTotal = NULL;
float *pAvg = NULL;

while( true )
{
//< 메뉴 출력
OutputMenu();

//< 메뉴 선택
int nSelectMenu = InputMenu();
//< 예외 처리
if( CheckScope(nSelectMenu, 1, 5 ) == true )
{
//< 입력/출력/찾기
switch( nSelectMenu )
{
case 1: //< 입력 
{
if( nMaxCount != 0 && nMaxCount != nNowInputCount )
{
InputData(pID,pKor,pEng,pMath,pTotal,pAvg,nNowInputCount);
}
else if( nMaxCount == 0 )
{
cout << "할당부터 해라 " << endl;
}
else
{
cout <<"현재인원 : " << nNowInputCount << endl;
cout <<"학생수 오버!!! " << endl;
}
}
break;
case 2: //< 출력
{
OutputData(pID,pKor,pEng,pMath,pTotal,pAvg,nNowInputCount);
}
break;
case 3: //< 찾기
{
FindData(pID,pKor,pEng,pMath,pTotal,pAvg,nNowInputCount);
}
break;
case 4: //< 추가
{
int nInputCount = 0;
cout << "현재 인원 : " << nNowInputCount << endl;
cout << "추가할 인원수 : ";
cin >> nInputCount;

//< 오류 
if( nInputCount <= 0 )
{
cout << "장난하냐? "<< endl;
}
else
{
nMaxCount += nInputCount;

//< 처음 이냐?
if( nMaxCount == 0 )
{
//< 처음은 그냥 할당
pID = AllocMemIntReturn(nMaxCount);
pKor = AllocMemIntReturn(nMaxCount);
pEng = AllocMemIntReturn(nMaxCount);
pMath = AllocMemIntReturn(nMaxCount);
pTotal = AllocMemIntReturn(nMaxCount);
pAvg = AllocMemFloatReturn(nMaxCount);
}
else
{
//< 처음이 아니다
//< 백업 데이터 설정
int *pBackUpID = AllocMemIntReturn(nMaxCount);
int *pBackUpKor = AllocMemIntReturn(nMaxCount);
int *pBackUpEng = AllocMemIntReturn(nMaxCount);
int *pBackUpMath = AllocMemIntReturn(nMaxCount);
int *pBackUpTotal = AllocMemIntReturn(nMaxCount);
float *pBackUpAvg = AllocMemFloatReturn(nMaxCount);

//< 데이터 옴기기
for( int i = 0 ; i < nNowInputCount ; i++ )
{
pBackUpID [i] = pID[i] ;
pBackUpKor [i] = pKor[i] ;
pBackUpEng [i] = pEng[i] ;
pBackUpMath [i] = pMath[i];
pBackUpTotal[i] = pTotal[i];
pBackUpAvg [i] = pAvg[i] ;
}
//< 기존 데이터 삭제
//< 보이드 버전
DeleteMemVoid((void**)&pAvg);
DeleteMemVoid((void**)&pTotal);
DeleteMemVoid((void**)&pMath);
DeleteMemVoid((void**)&pEng);
DeleteMemVoid((void**)&pKor);
DeleteMemVoid((void**)&pID);

//< 포인터 물기
pID = pBackUpID ;
pKor = pBackUpKor;
pEng = pBackUpEng ;
pMath = pBackUpMath ;
pTotal = pBackUpTotal;
pAvg = pBackUpAvg;

cout <<"공간 추가 완료" << endl << endl;
}
}
}
break;
case 5: //< 삭제
{
int nDelID = -1;
cout << "삭제 ID: ";
cin >> nDelID;

//< 오류 
if( nDelID < 0 )
{
cout << "장난하냐? "<< endl;
}
else
{
// nMaxCount += nInputCount;
//< 처음 이냐?
if( nNowInputCount == 0 )
{
cout <<"꺼져!!! 지울거 없다." << endl;
}
else
{
//< 찾자....
bool bFind = false;

for( int i = 0 ; i < nNowInputCount; i++ )
{
if( pID[i] == nDelID )
{
pID[i] = -1;
bFind = true;
break;
}
}
if( bFind == true )
{
nMaxCount--;
//< 백업 데이터 설정
int *pBackUpID = AllocMemIntReturn(nMaxCount);
int *pBackUpKor = AllocMemIntReturn(nMaxCount);
int *pBackUpEng = AllocMemIntReturn(nMaxCount);
int *pBackUpMath = AllocMemIntReturn(nMaxCount);
int *pBackUpTotal = AllocMemIntReturn(nMaxCount);
float *pBackUpAvg = AllocMemFloatReturn(nMaxCount);

//< 데이터 옴기기
for( int j = 0, i = 0 ; i < nNowInputCount ; i++ )
{
if( pID[i] != -1 )
{
pBackUpID [j] = pID[i] ;
pBackUpKor [j] = pKor[i] ;
pBackUpEng [j] = pEng[i] ;
pBackUpMath [j] = pMath[i];
pBackUpTotal[j] = pTotal[i];
pBackUpAvg [j] = pAvg[i] ;
j++;
}
}

//< 기존 데이터 삭제
//< 보이드 버전
DeleteMemVoid((void**)&pAvg);
DeleteMemVoid((void**)&pTotal);
DeleteMemVoid((void**)&pMath);
DeleteMemVoid((void**)&pEng);
DeleteMemVoid((void**)&pKor);
DeleteMemVoid((void**)&pID);

//< 포인터 물기
pID = pBackUpID ;
pKor = pBackUpKor;
pEng = pBackUpEng ;
pMath = pBackUpMath ;
pTotal = pBackUpTotal;
pAvg = pBackUpAvg;

//< 총정원 줄이기
nNowInputCount--;
cout <<"삭제완료" << endl << endl;
}
}

}
}
break;
}

Sleep(1000);
system("cls");
}
else
{
EndGame();
//< 프로그램 끝???
//< 메모리 정리
//DeleteMemFloat(&pAvg);
//DeleteMemInt(&pTotal);
//DeleteMemInt(&pMath);
//DeleteMemInt(&pEng);
//DeleteMemInt(&pKor);
//DeleteMemInt(&pID);

//< 보이드 버전
DeleteMemVoid((void**)&pAvg);
DeleteMemVoid((void**)&pTotal);
DeleteMemVoid((void**)&pMath);
DeleteMemVoid((void**)&pEng);
DeleteMemVoid((void**)&pKor);
DeleteMemVoid((void**)&pID);

//< 프로그램 종료
return 0;
}

}


return 0;
}

//< 메뉴 출력
void 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 InputMenu( void )
{
int nSelectMenu;
//< 메뉴 선택
cin >> nSelectMenu;
//< 선택에 따른 처리 
return nSelectMenu;
}
//< 범위 검사
bool CheckScope( int nNumber, int nStart, int nEnd )
{
if( nStart <= nNumber && nNumber <= nEnd )
{
return true;
}

return false;
}
//< 데이터 입력
void InputData( int *pID, int *pKor, int *pEng, int *pMath, int *pTotal, float* pAvg, int& nCount )
{
if( pID == NULL || pKor == NULL || pEng == NULL || pMath == NULL || pTotal == NULL || pAvg == NULL || nCount < 0 )
{
cout <<"입력오류" << endl;
return ;
}

cout <<"ID : ";
cin >> pID[nCount];
cout <<"국어 : ";
cin >> pKor[nCount];
cout <<"영어 : ";
cin >> pEng[nCount];
cout <<"수학 : ";
cin >> pMath[nCount];

pTotal[nCount] = 
pKor[nCount] +
pEng[nCount] +
pMath[nCount];

pAvg[nCount] = pTotal[nCount]/ 3.0f;

//< 카운트 증가
nCount++;
}
//< 데이터 출력
void OutputData( int *pID, int *pKor, int *pEng, int *pMath, int *pTotal, float* pAvg, int nCount )
{
cout << endl;
cout << "ID\t국어\t영어\t수학\t총점\t평균" << endl;
for( int i = 0 ; i < nCount ; i++ )
{
cout << pID[i] << "\t" <<
pKor[i] << "\t" <<
pEng[i] << "\t" <<
pMath[i] << "\t" <<
pTotal[i] << "\t" <<
pAvg[i] << endl;

}
//<
Sleep(1000);
system("cls");
}
//< 데이터 찾기
bool FindData( int *pID, int *pKor, int *pEng, int *pMath, int *pTotal, float* pAvg, int nNowCount )
{
int nFindID = 0;
cout <<"찾을 ID 입력 : ";
cin >> nFindID;

for( int i = 0 ; i < nNowCount ; i++ )
{
if( pID[i] == nFindID )
{
cout <<"찾기 성공";
cout << endl;
cout << "ID\t국어\t영어\t수학\t총점\t평균" << endl;
cout << pID[i] << "\t" <<
pKor[i] << "\t" <<
pEng[i] << "\t" <<
pMath[i] << "\t" <<
pTotal[i] << "\t" <<
pAvg[i] << endl;
//<
Sleep(1000);
system("cls");
return true;
}
}

cout << "해당 아이디 없음" << endl;
Sleep(1000);
system("cls");
return false;
}

//< 종료
void EndGame( void )
{
cout <<"종료중";
for (int i = 0 ; i < 5 ; i++ )
{
cout <<".";
Sleep(300);
}
cout <<"완료!! 안녕히 가세요" << endl;
Sleep(1000);
}

//< 메모리 할당
void AllocMemInt( int** pDest , int nSize )
{
if( *pDest != NULL )
{
delete [] *pDest;
*pDest = NULL;
}
*pDest = new int[nSize];
}

void AllocMemFloat( float** pDest , int nSize )
{
if( *pDest != NULL )
{
delete [] *pDest;
*pDest = NULL;
}
*pDest = new float[nSize];
}

//< 메모리 리턴
int* AllocMemIntReturn( int nSize )
{
//< 에러 검사
if( nSize <= 0 )
{
return NULL;
}

//int* pDest = new int[nSize];
//return pDest;
return new int[nSize];
}

float* AllocMemFloatReturn( int nSize )
{
//< 에러 검사
if( nSize <= 0 )
{
return NULL;
}

return new float[nSize];
}

//< 메모리 정리
void DeleteMemInt( int** pDest )
{
if( *pDest != NULL )
{
delete [] *pDest;
*pDest = NULL;
}
}

void DeleteMemFloat( float** pDest )
{
if( *pDest != NULL )
{
delete [] *pDest;
*pDest = NULL;
}
}

//< 보이드로 해제
void DeleteMemVoid( void** pDest )
{
if( *pDest != NULL )
{
delete [] *pDest;
*pDest = NULL;
}
}

반응형