C ++ Beginner: сочетания клавиш на коммутаторе - PullRequest
0 голосов
/ 30 апреля 2020

Я пытался написать этот код для упражнения, которое представляет и позволяет пользователю выбрать напиток, введя число, соответствующее выбранному напитку (1 - 5). Затем он распечатывает с указанием того, какой напиток они выбрали, и сообщение об ошибке, если они вводят что-либо за пределами 1-5.

Ниже приведен код функции:

#include <vector>

std::string Vending (){
int num;
std::vector<std::string> beverage ={"Coke", "Sprite", "Water", "Pepsi", "7-Up"};
std::cin >> num;
switch (num){
  case (1) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (2) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (3) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (4) :
  std::cout << "You have chosen " << beverage[num-1];
  break;
  case (5) :
  std::cout << "You have chosen " << beverage[num-1];
  break;

default :
 std::cout << "Error, choice was not valid, here is your money back.\n";
 break;
}
}

Программа работает нормально, но мне просто интересно, есть ли способ сделать switch() короче, скажем, поместив диапазон в кейс, например case(//range from 1-5) вместо записи каждого кейса индивидуально для каждого номера кейса.

Любые советы будут оценены! :)

Ответы [ 2 ]

4 голосов
/ 30 апреля 2020

Оператор if был бы более уместным здесь, поскольку блоки switch не предназначены для работы в диапазоне.

Если вы должны использовать switch, и стремятся написать переносимый C ++ (поэтому диапазон g cc switch не является опцией), тогда вы могли бы написать

switch (num){
case 1: case 2: case 3: case 4: case 5:
    std::cout << "You have chosen " << beverage[num-1];
    break;
default :
     std::cout << "Error, choice was not valid, here is your money back.\n";
}

Но это было бы далеко более естественно для напишите

if (num >= 1 && num <= beverage.size()){
    std::cout << "You have chosen " << beverage.at(num - 1);
} else {
    std::cout << "Error, choice was not valid, here is your money back.\n";
}

, который имеет дополнительный бонус, что я не указал количество напитков. Использование at также помогает защититься от неопределенного поведения, поскольку всегда выполняется проверка векторных границ (даже если оператор в настоящее время защищен if).

3 голосов
/ 30 апреля 2020

Вам вообще не нужен switch или какой-либо другой выбор, просто некоторые базовые c проверки, что вход находится в диапазоне, а затем вы печатаете его:

if (num > 0 && num <= beverage.size())
{
    std::cout << "You have chosen " << beverage[num-1];
}
else
{
    std::cout << "Error, choice was not valid, here is your money back.\n";
}
...