C++/디딤돌 C++

학생 클래스 (캡슐화 실습) [디딤돌 C++]

언제나휴일 2016. 4. 14. 12:29
반응형

학생 클래스 (캡슐화 실습) [디딤돌 C++]

언제나 휴일 티스토리


학생 클래스 (캡슐화 실습) [디딤돌 C++]


학생 클래스 (캡슐화 실습) [디딤돌 C++]



학생 클래스 (캡슐화 실습).zip



Student.h

//Student.h

#pragma once

#include <string>

#include <iostream>

using namespace std;

 

enum SIndex //과목 열거형

{

    KOREAN, ENGLISH, MATH, MAX_SUBJECT

};

 

class Student//학생 클래스

{

    static int last_num;//정적 멤버 필드   

    const int num;//상수화 멤버 필드

    string name;

    int scores[MAX_SUBJECT];

    static const string titles[MAX_SUBJECT];//과목명 - 정적 멤버 필드

public:

    static int GetStuCount();//정적 메서드   

    Student(string name);//생성자 초기화   

    bool SetScore(int sindex,int score);//성적 설정자

    int GetScore(int sindex)const;//성적 접근자

    int GetTotal()const;//총점 접근자

    double GetAverage()const;    //평균 접근자

    bool AvailSIndex(int sindex)const;//성적 인덱스가 유효한지 판별

   void View()const; //정보 출력

private:

    bool SetScore(int sindex,int score,int); //성적 설정자

};

 

Student.cpp

//Student.cpp

#include "Student.h"

 

const string Student::titles[MAX_SUBJECT]={"국어","영어","수학"};

 

int Student::last_num;

int Student::GetStuCount()//정적 메서드

{

    return last_num;

}

Student::Student(string name):num(++last_num)//생성자 초기화

{

    this->name = name;

    //성적 초기화

    for(int si = 0; si<MAX_SUBJECT; si++)

    {

        SetScore(si,-1, 0);

    }

}

bool Student::SetScore(int sindex,int score)//성적 설정자(설정하기)

{

    if(AvailSIndex(sindex))//과목 번호가 유효할

    {

        return SetScore(sindex,score,0);//성적 설정

    }   

    return false;

}

int Student::GetScore(int sindex)const//성적 접근자(가져오기)

{

    if(AvailSIndex(sindex))//과목 번호가 유효할

    {

        return scores[sindex];

    }

    return -1;

}

int Student::GetTotal()const//합계 접근자(가져오기)

{

    int sum=0;

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

    {

        if(scores[i] != -1)//성적이 입력 상태일 때만

        {

            sum +=scores[i];//합계에 더함

        }

    }

    return sum;

}

double Student::GetAverage()const//평균 접근자(가져오기)

{

    return GetTotal()/(double)(MAX_SUBJECT);

}      

bool Student::AvailSIndex(int sindex)const//과목 인덱스가 유효한지 판별

{

    return (sindex>=0)&&(sindex<MAX_SUBJECT);

}

void Student::View()const

{

    cout<<"번호:"<<num<<" 이름:"<<name<<endl;

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

    {

        if(scores[i]==-1)

        {

            cout<<titles[i]<<": 입력 "<<endl;

        }

        else

        {

            cout<<titles[i]<<":"<<scores[i]<<endl;

        }

    }

    cout<<"총점:"<<GetTotal()<<" 평균:"<<GetAverage()<<endl;

    cout<<"++++++++++++++++++++++++"<<endl;

}

bool Student::SetScore(int sindex,int score,int)//성적 설정자(설정하기)

{

    if((score<0)||(score>100))//성적이 범위를 벗어나면

    {

        scores[sindex] = -1;

        return false;

    }

    scores[sindex] = score;

    return true;

}

 

Program.cpp

//Program.cpp

#include "Student.h"

int main()

{

    Student *arr[3];

    //학생 개체 생성

    arr[0] = new Student("홍길동");

    arr[1] = new Student("강감찬");

    arr[2] = new Student("이순신");

   

    //학생 목록 출력

    cout<<"현재 학생 :"<<Student::GetStuCount()<<endl;

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

    {

        arr[i]->View();

    }

   

    arr[0]->SetScore(0,90);//정상

    arr[0]->SetScore(1,80);//정상

    arr[0]->SetScore(3,90);//설정 오류

 

    arr[1]->SetScore(0,100);//정상

    arr[1]->SetScore(1,180);//설정 오류

    arr[1]->SetScore(2,80);//정상

 

    arr[2]->SetScore(0,80);//정상

    arr[2]->SetScore(1,90);//정상

    arr[2]->SetScore(2,90);//잘못

   

    //학생 목록 출력

    cout<<"현재 학생 :"<<Student::GetStuCount()<<endl;

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

    {

        arr[i]->View();

    }

   

    //학생 개체 소멸

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

    {

        delete arr[i];

    }

   

    return 0;

}

 

* 디딤돌 C++  20. 캡슐화 실습에서

디딤돌 C++ 소개 바로가기

반응형