c++ 초보자라 궁금한 게 많습니다.

조회수 543회
//#include <iostream>
#include <string>
using namespace std;

class Ingredient {
    string name[6] = { "김치", "계란", "햄", "감자", "치즈", "참치" };
public:
    Ingredient();
    void getName();
    string setName() { return name[6]; }
};

Ingredient::Ingredient()
{
    cout << "재료들 ";
}

void Ingredient::getName()
{
    cout << ": ";
    for (int i = 0; i < 6; i++)
    {
        cout << name[i] << " ";
    }
    cout << endl;
}

class Combin : public Ingredient
{
    string names[15] = { "김치 부침개", "부대찌개", "감자 수제비", "볶음밥", "참치 찌개", "오므라이스", "그라탕", "치즈볼", "참치마요덮밥", "감자 크로켓",
    "샌드위치", "라이스버거", "감자튀김", "감자국", "참치김밥"};
public:
    Combin();
    string calc(string name);
};


Combin::Combin()
{
    cout << "중 마음에 드는 것 2가지를 골라주세요 : ";
}

string Combin::calc(string name)
{
    string n, a;
    cin >> n >> a;
    for (int i = 0; i < 6; i++)
    {
        if (n == setName() && a == setName())
        {
            cout << name[i] << name[i]<< endl;
        }
    }

    {
        for (int i = 0; i < 6; i++)
        {
            if (name[0] && name[i + 1])
                cout << names[i];
        }

        for (int i = 0; i < 4; i++)
        {
            if (name[1] && name[i + 2])
                cout << names[i + 6];
        }

        for (int i = 0; i < 3; i++)
        {
            if (name[2] && name[i + 3])
                cout << names[i + 10];
        }

        for (int i = 0; i < 2; i++)
        {
            if (name[3] && name[i + 4])
                cout << names[i + 12];
        }

        if (name[4] && name[5])
            cout << names[14];
    }
    return 0;
}

int main()
{
    string d;
    Ingredient i;
    i.getName();
    Combin c;
    c.calc(d);
}

여기 이렇게 코드가 있는데 저의 목적은 name[6]에서 재료들을 2개 고르고 그 값들을 받아서 names[15]에 있는 요리 중 하나가 나오게 하는 게 목적입니다. 하지만 그 전에 오류가 나는데 뭐가 문제인지를 몰라서 헤매고 있습니다. 도와주세요.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 오류 메시지가 나오는 게 있으면 그것도 같이 올려주세요~ 엽토군 2019.11.21 18:30
  • 주어진 코드는 무엇을 하는 코드인지도 모르겠고...질문을 할 때 "입력은 이러하고 예상한 결과는 무엇인데 예상된 결과가 아닌 이상한 결과 혹은 에러가 발생하는데 원인이 무엇인지요?" 라는 구체적인 정보를 알려주셔야 합니다. 코드를 보니 무슨 목적으로 작성한 것이지 예측이 되지 않습니다. 정영훈 2019.11.22 04:00

1 답변

  • //#include <iostream> // cin, cout은 iostream에 정의되어 있다.
    #include <string>
    using namespace std;
    
    class Ingredient {
        string name[6] = { "김치", "계란", "햄", "감자", "치즈", "참치" };  // vector를 안다면 vector<string> name을 사용하는것이 더 좋다. 아니면 array<string, len> name을 사용하거나.
     /* 생성자에서 초기화하는 것이 더 바람직함.
    Ingredient::Ingredient(): name( { "김치", "계란", "햄", "감자", "치즈", "참치" }) {};
    */
    public:
        Ingredient();
        void getName(); // 함수이름을 printNames로 바꾸는 것이 더 적절할 듯.
        string setName() { return name[6]; } //함수이름을 getName으로 바꾸는 것이 더 적절할 듯
        // string& getName(int index) {return name[index];} 으로 바꾸는 것이 좋다.
    
    
    };
    
    Ingredient::Ingredient()
    {
        cout << "재료들 ";
    }
    
    void Ingredient::getName()
    {
        cout << ": ";
        for (int i = 0; i < 6; i++) // 리터럴을 사용하지 말고 상수로 사용하는 것이 바람직함
        {
            cout << name[i] << " ";
        }
        cout << endl;
    }
    
    class Combin : public Ingredient
    {
        string names[15] = { "김치 부침개", "부대찌개", "감자 수제비", "볶음밥", "참치 찌개", "오므라이스", "그라탕", "치즈볼", "참치마요덮밥", "감자 크로켓",
        "샌드위치", "라이스버거", "감자튀김", "감자국", "참치김밥"};
    public:
        Combin();
        string calc(string name);
    };
    
    
    Combin::Combin()
    {
        cout << "중 마음에 드는 것 2가지를 골라주세요 : ";
    }
    
    string Combin::calc(string name)
    {
        string n, a; // 이름을 ingredient_1, ingredient_2 이런식으로  무엇을 저장하는 지 알 수 있게 하는게 더 좋다. 
                    //저장한 값을 바꾸지 않을 거면 const를 사용하는 것이 바람직함.
        cin >> n >> a;
        for (int i = 0; i < 6; i++)
        {
            if (n == setName() && a == setName())
            {
                cout << name[i] << name[i]<< endl; //string name인지 아니면 Ingrediant로 부터 상속받은 string name[6] 인지 모호하다.
            }
        }
    
        {
            for (int i = 0; i < 6; i++)
            { // name은 Ingrediant의 private member이므로 Combin에서 접근 불가.
            // 만일 접근하게 하고 싶다면 protected사용 할 것! 아니면 accessor인 string& getName(int index)를 만들어서  사용하거나.
                if (name[0] && name[i + 1]) //  && 연산자는 피연산자가 bool 타입이다. 따라서 n == name[0] && a == name[i + 1]
                    cout << names[i];
    
            }
    
            for (int i = 0; i < 4; i++)
            {
                if (name[1] && name[i + 2])
                    cout << names[i + 6];
            }
    
            for (int i = 0; i < 3; i++)
            {
                if (name[2] && name[i + 3])
                    cout << names[i + 10];
            }
    
            for (int i = 0; i < 2; i++)
            {
                if (name[3] && name[i + 4])
                    cout << names[i + 12];
            }
    
            if (name[4] && name[5])
                cout << names[14];
        }
        return 0; // error의 원인, return을 string으로 하면 string으로 return해야함.
    }
    
    int main()
    {
        string d;
        Ingredient i;
        i.getName();
        Combin c;
        c.calc(d); 
    }
    

    사실 더 적을 것이 많은데 하나하나 다 적으려다가 너무 많은 것 같아서 일단 이정도 했습니다. 팁을 드리자면 단계별로 테스트 하면서 구현하는 것이 좋습니다.

    예를 들자면 Ingrediant class의 생성자하고 다음꺼 구현하고 하는 방식입니다. 이렇게 하면 테스트 범위가 줄어들어서 오류의 개수도 줄어들고 디버깅도 쉬워집니다.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)