C++ 에서 클래스 안에 배열에 접근하는 방법

조회수 9150회

아래는 코드의 일부입니다. 아래 클래스의 값들로부터 평균을 만드는 코드를 추가하려고 합니다. 일단 제가 궁금한 부분은 제목과 같이, 클래스 안의 배열에 접근하는 방법입니다. 예를 들어 'Tom' 이 포함된 첫 번째 배열의 2번째 항목인 '41'에 접근하고자 할때 student0 이라고 하면 되는걸까요? 아니면 어떻게 접근해야 할까요..?

    Student student[10] = {
        Student("Tom", 41, 85, 72), Student("Ami", 38, 80, 69),
        Student("Cathy", 65, 68, 96), Student("Mike", 22, 49, 67),
        Student("John", 51, 61, 63), Student("Alex", 87, 66, 24),
        Student("Alice", 80, 83, 71), Student("Bob", 60, 64, 52),
        Student("Colin", 90, 60, 49), Student("Dave", 31, 23, 99)};

    for(int i=0; i<10; i++) {
        int average[i] = ((student[i][1] + student[i][2] + student[i][3] / 3));
    }

아래는 현재까지 작성한 코드입니다.

class Student {
private:
    char name[15];
    int scnce, eng, math;
    int average;
public:
    Student(char * _name, int _scnce, int _eng, int _math);
    Student();
    void GetAverage();
    void ShowInfo();
   Student::Student(char * _name, int _scnce, int _eng,int _math) 
    : scnce(_scnce), eng(_eng), math(_math) {strcpy_s(name, _name);
}


void Student::GetAverage() {
    for (int i = 0; i<10; i+ +) {
        int average[i] = stu[i]._scnce + stu[i]._eng + stu._math / 3;
    }
}
void Student::ShowInfo() {

    cout << name << "\t" << average << "\t" << scnce << "\t" << eng << "\t" << math << endl;
}

int main() {
    Student stu[] = {
        Student("1.Tom", 41, 85, 72), Student("2.Ami", 38, 80, 69),
        Student("3.Cathy", 65, 68, 96), Student("4.Mike", 22, 49, 67),
        Student("5.John", 51, 61, 63), Student("6.Alex", 87, 66, 24),
        Student("7.Alice", 80, 83, 71), Student("8.Bob", 60, 64, 52),
        Student("9.Colin", 90, 60, 49), Student("10.Dave", 31, 23, 99) };
    cout << "name" << "\t" << "average" << "\t" << "science" << "\t" << "english" << "\t" << "math" << endl;
    for (int i = 0; i<10; i++)
        stu[i].ShowInfo();
    return 0;
}


};

추가질문입니다. name 다음에 ": " 콜론(?) 문자를 부이면 출력결과가 이미지처럼 열이 안 맞고 오른쪽으로 열이 밀리는 건 어떻게 해결할까요.?

이미지

  • (•́ ✖ •̀)
    알 수 없는 사용자

4 답변

  • 배열에는 현재 객체들이 들어가있는 상태입니다. 객체에서는 이 값들을 얻을 수 있는 getter가 있어야할겁니다. 필드를 public로 하면 안되겠죠. 다시말해서 클래서에는 int getValue(){ return value;} 같은 함수가 있어야 합니다.

    배열의 요소를 접근한다는 것은 다시 말해서 배열에 저장된 객체를 참조한다는 것 입니다. student[1].getValue() 를 통해서 값을 리턴받겠죠?

    아니면 평균을 리턴하는 매소드가 있으면 효율면에서 더 이득이 있을겁니다.

    만약 자료형만 있는 클래스라면 구조체로 바꾸셔도 무방할겁니다...

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 멤버함수로 평균을 가져오는 함수를 만들려고 하는데 그 안에 클래스 객체가 필요한 경우 어떻게 해야할까요? 클래스 객체 선언은 main 함수에서 Student stu= {Student("Kim", 80, 45) , Student("Lee", 50, 65) }; 처럼 코드의 아래 부분에서 할텐데 어찌 해야할까요? 알 수 없는 사용자 2016.9.10 21:03
    • 일단 현재 코드 본문 하단에 추가하였습니다. 알 수 없는 사용자 2016.9.10 21:14
  • 객체에 대해 조금 더 이해가 필요할듯 싶습니다.

    각 객체마다 가지는 값은 서로 다릅니다. 학생 클래스마다 갖는 성적이 모두 다르단 말이지요...

    선언을 그렇게 하고 있으니까요. 학생클래스가 값을 공유하고 싶다면 static 속성을 줘야합니다

    statc string schoolName = "A" 이런 개념에서요

    여튼

    평균을 반환하는 매소드는 반환값을 int로 하고(필요하면 float) return (scnce+eng+math)/3 이겠습니다.

    메인에서는

    for (int i = 0; i<10; i++) stu[i].getavg();

    이렇게 되겠지요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 음.. 그러면 메인함수에서 클래스로부터 객체를 만들때 static Student stu[] = {...} 식이 되는건가요..? 알 수 없는 사용자 2016.9.10 21:58
  • for (int i = 0; i < 10; i++) average = (scnce + math + eng) / 3; 이걸 하신 이유가 무엇이지요?

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 명확한 이유는 잘 모르겠습니다. main 함수에서 stu객체를 안의 내용이 각각 처음에 선언한 name, scnce, math , eng 변수 안에 들어갔기 때문? 이라고 보면 되는걸까요 알 수 없는 사용자 2016.9.11 10:16
    • 본인이 짜신거 아닌가요? 명확한 이유를 모르겠다고 하시니;; 알 수 없는 사용자 2016.9.11 10:28
    • 올린 코드의 메인함수에서 ShowInfo와 GetAverage 의 순서를 바꾸니 작동을 하네요!! ShowInfo 안에 average가 포함되는데도 불구하고 뒤에서 호출되서 그랬나봅니다. 제가 입문자다보니 코드가 작동함에 있어 명확한 이유는 잘 모릅니다..ㅠㅠ 확신이 없다해야할지도 모르겠고요. 알 수 없는 사용자 2016.9.11 23:01
    • 그렇군요 가능하면 디버깅 기능을 익혀서 프로그램이 돌아가는 순서와 값을 확인해보는 연습도 좋습니다 알 수 없는 사용자 2016.9.12 09:28
    • 감사합니다. 디버깅 기능도 공부리스트에 올려서 공부해봐야겠군요. ㅎㅎ 알 수 없는 사용자 2016.9.12 10:56
  • 현재 여기서 막혔습니다.. 평균값이 안 되네요 ㅠ

    Student::Student(char * _name, int _scnce, int _eng,int _math) 
        : scnce(_scnce), eng(_eng), math(_math) {strcpy_s(name, _name);
    }
    
    int Student::GetAverage() {
        for (int i = 0; i < 10; i++)
            average = (scnce + math + eng) / 3;
        return average;
    }
    
    void Student::ShowInfo(int num) {
    
        cout << num << "."<< name << "\t" << average << "\t" << scnce << "\t" << eng << "\t" << math << endl;
    }
    
    int main() {
        static Student stu[] = {
            Student("Tom", 41, 85, 72), Student("Ami", 38, 80, 69),
            Student("Cathy", 65, 68, 96), Student("Mike", 22, 49, 67),
            Student("John", 51, 61, 63), Student("Alex", 87, 66, 24),
            Student("Alice", 80, 83, 71), Student("Bob", 60, 64, 52),
            Student("Colin", 90, 60, 49), Student("Dave", 31, 23, 99) };
        cout << "name" << "\t" << "average" << "\t" << "science" << "\t" << "english" << "\t" << "math" << endl;
        for (int i = 0; i < 10; i++) {
            stu[i].ShowInfo(i + 1);
            stu[i].GetAverage();
        }
        return 0;
    }
    
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • stu[i].ShowInfo( i + 1 ); 에서 아마 오류 날겁니다. 생성자에서 average = (int)(scnce + eng + math)/3; 를 지정해주셔야 ShowInfo를 불러올때 오류가 안날 겁니다. 왜냐하면 average는 GetAverage()함수를 불러올때 초기화가 되기 때문에 ShowInfo(int)를 먼저 사용하면 쓰레기 값이 출렵됩니다. 알 수 없는 사용자 2016.9.15 18:35

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)