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

구조체(멤버함수) 를이용한 성적관리

by ByteBridge 2013. 2. 21.
반응형


#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;

}

}

반응형