Как использовать типы перечисления в C ++? - PullRequest
2 голосов
/ 08 апреля 2010

Я не понимаю, как использовать типы перечисления. Я понимаю, что они есть, но я не совсем понимаю их цель.

Я создал программу, которая вводит три стороны треугольника и выводит, являются ли они равнобедренными, разносторонними или равносторонними. Я предполагаю включить тип перечисления где-нибудь, но не понимаю, где и как их использовать. Любая помощь будет оценена.

#include <iostream>

using namespace std;

enum triangleType {scalene, isosceles, equilateral, noTriangle};

triangleType triangleShape(double x, double y, double z);
void printTriangleShape(triangleType shape);

int main()
{
    double x, y, z;
    triangleType scalene, isosceles, equilateral, noTriangle;

    cout << "Please enter the three sides of a triangle:" << endl;
    cout << "Enter side 1: ";
    cin >> x;
    cout << endl;
    cout << "Enter side 2: ";
    cin >> y;
    cout << endl;
    cout << "Enter side 3: ";
    cin >> z;
    cout << endl;

    triangleType t = triangleShape(x, y, z); 
printTriangleShape(t);

    return 0;
}

triangleType triangleShape(double x, double y, double z)
{
   triangleType scalene, isoceles, equilateral, noTriangle;
    if (((x+y) > z) && ((x+z) > y) && ((y+z) > x))
    {
        cout << "You have a triangle!" << endl;
            if (x == y && y == z)
               return equilateral;
            else if (x == y || x == z || y == z)
                 return isosceles;
            else
               return scalene;
    }
    else if ((x+y) <= z || ((x+z) <= y) || ((y+z) <= x))
        return noTriangle;  
} 
void printTriangleShape(triangleType shape)
{
    switch (shape)
    {
    case scalene: cout << "Your triangle is Scalene!" << endl;
        break;
    case isosceles: cout << "Your triangle is an isosceles!" << endl;
        break;
    case equilateral: cout << "Your triangle is an equilateral!" << endl;
        break;

    }
}

Ответы [ 5 ]

7 голосов
/ 08 апреля 2010

Это значение, и вы, вероятно, хотите вернуть его из своей функции.

Попытка:

triangleType triangleShape(double x, double y, double z) {
  if (...) {
    return scalene;
  } else if (...) {
    return isosceles.
  } else if (...) {
    return equilateral
  } else {
    return noTriangle;
  } 
}

Обратите внимание, вы можете распечатать результат, но он будет печататься как целое число: scalene = 0, isosceles = 1, ...

Изменить, для печати вы можете сделать это:

void printTriangleShape(triangleType shape) {
   switch (shape) {
     case scalene:
       cout << "Your triangle is Scalene!" << endl;
       break;
     case isosceles:
       cout << "Your triangle is isosceles!" << endl;
       break;
     ...;
   }
}
1 голос
/ 09 апреля 2010

В C перечислениях облегчают отладку, потому что часто отладчики печатают значение имени, а не числовое значение. Они также позволяют компилятору определять места, где он может определить, что недопустимое значение сохраняется в переменной enum.

В C ++ есть и еще одно преимущество, заключающееся в том, что вы можете использовать типы enum в перегрузках. Например, вы могли бы:

ostream & operator<<(ostream & ostr, triangleType t) {
     string s;
     switch (t) {
          case scalene:
             s = "scalene";
             break;
          case isosceles:
             s = "isosclese";
             break;
          case equilateral:
             s = "equilateral";
             break;
          case noTriangle:
             s = "noTriangle";
             break;
          default:
             s = "error bad triangle type";
             break;
       }
       return cout << s;
}

, а затем в основном сделать

cout << "Your triangle is" << t << endl;
0 голосов
/ 08 апреля 2010

Перечисление - это новый тип в c ++. Использование этого типа создает дополнительную безопасность типов, поскольку вам разрешено использовать только значения, определенные для этого перечисления. Значения перечисления будут нумероваться автоматически, если вы сами не укажете значение, которое редко требуется. Пример:

enum Color { Red, Green, Blue }; // Red = 0, Green = 1, Blue = 2
enum Shape { Circle, Square };   // Circle = 0, Square = 1

int printColor(Color c)
{
    // do something with the color here, for example print it.
    switch(c)
    {
        case Red:
            cout << "Red";
            break;
        case Green:
            cout << "Green";
            break;
        case Blue:
            cout << "Blue";
            break;
    }
}

int main(int argc, char* argv[])
{
    printColor(Red); // works
    printColor(0);   // will give an error or warning in C++.
                     // However, C does less type checking and allows this.

    printColor(Circle);
                     // error, the type is wrong even if the values are identical.
}

Вы получаете дополнительную безопасность типов в вызове printColor(0) - c ++ выполняет здесь дополнительную проверку типов, поэтому вы не можете ошибочно ввести неверный номер в вызов. Конечно, вы можете достичь того же результата, используя #define для значений, или даже поместить их напрямую, но в этом случае компилятор не сможет предупредить вас, если вы введете недопустимые значения.

0 голосов
/ 08 апреля 2010

Идея состоит в том, чтобы заменить использование чисел (1,2,3 ...), которые не объясняют их значения, тегами, которые имеют значение (красный, зеленый, синий ...). Числа, используемые в коде, значение которого понимают только вы, называются «магическими числами», и их следует избегать, поскольку это мешает другим понять ваш код.

0 голосов
/ 08 апреля 2010

Перечисление может использоваться для идентификации «типов» объектов, как в вашем случае.

Например, ваш метод в форме треугольника может вернуть triangleType, и таким образом вы можете выполнить все cout << "..." в вашем основном методе и отделить логику отображения от объекта треугольника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...