Java vs Ruby vs C++: 성적표 프로그램

Tags:

자바와 루비 버젼은 여기에 있습니다. 별 의미는 없고 Accelerated C++을 읽다가 만들어 보고 싶다는 생각에.. C++은 초보이기 때문에 잘못 짠 부분이 있을 수도 있습니다.

subject.hpp

#ifndef __SUBJECT
#define __SUBJECT

#include <iostream>
#include <string>

class Subject
{
private:

    std::string name;
    int score;

public:
    Subject() { }

    Subject(std::string name, int score):name(name), score(score) { }

    std::string getName() const
    {
        return name;
    }

    void setName(std::string name)
    {
        this->name = name;
    }

    int getScore() const
    {
        return score;
    }

    void setScore(int score)
    {
        this->score = score;
    }
};

#endif

subject.cpp

#include "subject.hpp"

subject_compare.hpp

#ifndef __SUBJECT_COMPARE
#define __SUBJECT_COMPARE

#include "subject.hpp"

#include <functional>

struct SubjectCompare: public std::binary_function<Subject, Subject, bool>
{
    bool operator()(const Subject& lhs, const Subject& rhs)
    {
        return lhs.getScore() - rhs.getScore();
    }
};

#endif

score_card.hpp

#ifndef __score_card
#define __score_card

#include "subject.hpp"

#include <iostream>
#include <string>
#include <vector>

class ScoreCard
{
private:
    std::string studentName;
    std::vector<Subject> subjectArray;

public:
    ScoreCard(std::string studentName, std::vector<Subject> subjectArray):studentName(studentName), subjectArray(subjectArray) { }

    double getTotal() const;

    double getAverage() const;

    std::string getStudentName() const
    {
        return studentName;
    }

    const Subject findBestSubject() const;
};

#endif

score_card.cpp

#include "score_card.hpp"
#include "subject.hpp"
#include "subject_compare.hpp"

#include <iostream>
#include <string>
#include <numeric>
#include <iterator>
#include <algorithm>

using namespace std;

static double subject_score_sum(double d, const Subject& s)
{
    return s.getScore() + d;
}

double ScoreCard::getTotal() const
{
    return accumulate(subjectArray.begin(), subjectArray.end(), 0.0, subject_score_sum);
}

double ScoreCard::getAverage() const
{
    return getTotal() / subjectArray.size();
}

const Subject ScoreCard::findBestSubject() const
{
    return *max_element(subjectArray.begin(), subjectArray.end(), SubjectCompare());
}

scorecardmain.cpp

#include "subject.hpp"
#include "score_card.hpp"

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<Subject> sub = vector<Subject>();
    sub.push_back(Subject("Math", 90));
    sub.push_back(Subject("English", 86));
    sub.push_back(Subject("Physics", 88));
    sub.push_back(Subject("Biology", 97));


    ScoreCard sCard = ScoreCard("철수", sub);

    cout << sCard.getStudentName() << " 학생의 총점은 " << sCard.getTotal() << "입니다." << endl;
    cout << sCard.getStudentName() << " 학생의 평균점수는 " << sCard.getAverage() << "입니다." << endl;
    cout << "제일 잘한 과목은 " << sCard.findBestSubject().getName() << "로 " << sCard.findBestSubject().getScore() << "입니다." << endl;

    return EXIT_SUCCESS;
}

소감 및 총평. 역시 C++은 sucks 하군요. 역시 Ruby가 좋군요. 역시 자바는 배워놓으면 안까먹는군요 ㅎㅎ

C++의 장점.
– 성능을 위한 여러가지 배려나 inforamtion hiding을 위한 다양한 배려가 돋보임.

이 짧은 코드에서 드러나는 C++의 단점
(1) #ifndef,#define,#endif 시리즈는 정말 짜증납니다. 왜왜왜왜왜왜왜왜왜왜왜왜왜 MS의 #pragma once 와 같은 멋진 키워드가 표준에 안들어 오는걸까요.
(2) 왜왜왜왜왜왜왜왜왜왜왜 functor는 그 자리에서 곧바로 익명클래스로 만들어서 넘길 수 없는겁니까..
(3) binary_function 라니;; 물론 언어의 한계지만, 언어 차원으로 이런 predicate을 흡수할 수는 없는건지. 정말 싫어요;;