Member 14072628 Ответов: 2

В чем заключается ошибка в данном коде ?


#include<iostream>
#include<string>
int main()
{
	std::string name;
	int a;
	std::cout<<"welcome please enter you name below"<<std::endl;
	std::cin>>name;
	std::cout<<"hey ";
	std::cout<<name<<std::endl;
	std::cout<<"//choose a for submision//"<<std::endl;
	std::cout<<"//choose b for factorial//"<<std::endl;
	std::cout<<"you choosed : ";
    std::cin>>a;
    switch (a)
    {
    case (1):
    int limit, result=0;
    std::cout<<"enter num = ";
    std::cin>>limit;
    for(int x=1;x<=limit;x++)
    {
    	result=result+x;
    }
    std::cout<<"sum of number= "<<result;
    break ;
    case (2):
    int fact=1,l;
    std::cout<<"enter limit";
    std::cin>>l;
    for(int i=1;i<=l;i++)
    {
    	fact=fact*i;
    }
    std::cout<<fact;
    break;
    }
}


Что я уже пробовал:

Каждый раз, когда я компилирую его, показывают
<stdin>:27:5: ошибка: не удается перейти от оператора switch к этой метке case
дело (2):
^
<stdin>:18:16: Примечание: переход обходит инициализацию переменной
int limit, result=0;
^
1 ошибка генерируется.

Не знаете, что делать? Пожалуйста, помогите мне.

2 Ответов

Рейтинг:
20

CPallini

Вы должны дать простор своим случаям переключения

#include<iostream>
#include<string>
int main()
{
  std::string name;
  int a;
  std::cout<<"welcome please enter you name below"<<std::endl;
  std::cin>>name;
  std::cout<<"hey ";
  std::cout<<name<<std::endl;
  std::cout<<"//choose 1 for submision//"<<std::endl;
  std::cout<<"//choose 2 for factorial//"<<std::endl;
  std::cout<<"you choosed : ";
  std::cin>>a;
  switch (a)
  {
  case 1:
    {
      int limit, result=0;
      std::cout<<"enter num = ";
      std::cin>>limit;
      for(int x=1;x<=limit;x++)
      {
        result=result+x;
      }
      std::cout<<"sum of number= "<<result;
    }
    break ;
  case 2:
    {
      int fact=1,l;
      std::cout<<"enter limit";
      std::cin>>l;
      for(int i=1;i<=l;i++)
      {
        fact=fact*i;
      }
      std::cout<<fact;
    }
    break;
  }
}


В современном мире C++ вы могли бы написать
#include <iostream>
#include <functional>
#include <array>
#include <tuple>
using namespace std;

int main()
{
  array< tuple < string,  function<int (int, int)> >, 2 > af =
  {{
    { "sum", plus<int>() },
    { "factorial", multiplies<int>() }
  }};

  cout << "please enter ";
  for ( size_t n=0; n<af.size(); ++n)
    cout << (n+1) << " for " << get<0>(af[n]) << " ";
  cout << "\n";

  size_t choice;
  cin >> choice;
  --choice;
  if ( choice >= af.size())
  {
    cerr << "invalid choice\n";
    return -1;
  }

  const  auto & [ name, fun ] = af[choice];

  cout << "plaese enter the limit\n";
  size_t limit;
  cin >> limit;

  size_t result = 1;
  for (size_t n=2; n<=limit; ++n)
    result = fun(result, n);

  cout << "result of " << name << " is " << result << endl;

}


Member 14072628

спасибо, что сработало. Но может быть, вы где-то ошиблись, чтобы я мог исправиться.

CPallini

Более подробную информацию смотрите здесь:
https://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement

Рейтинг:
2

OriginalGriff

Поставьте фигурные скобки вокруг вашего кода обращения:

#include<iostream>
#include<string>
int main()
{
	std::string name;
	int a;
	std::cout<<"welcome please enter you name below"<<std::endl;
	std::cin>>name;
	std::cout<<"hey ";
	std::cout<<name<<std::endl;
	std::cout<<"//choose a for submision//"<<std::endl;
	std::cout<<"//choose b for factorial//"<<std::endl;
	std::cout<<"you choosed : ";
    std::cin>>a;
    switch (a)
    {
        case 1:
        {
            int limit, result=0;
            std::cout<<"enter num = ";
            std::cin>>limit;
            for(int x=1;x<=limit;x++)
            {
            	result=result+x;
            }
            std::cout<<"sum of number= "<<result;
            break ;
        }
        case 2:
        {
            int fact=1,l;
            std::cout<<"enter limit";
            std::cin>>l;
            for(int i=1;i<=l;i++)
            {
            	fact=fact*i;
            }
            std::cout<<fact;
            break;
        }
    }
}


Цитата:
ошибка <stdin>:27:12: error: не удается перейти от оператора switch к этому случаю label case (2): ^ <stdin>:18:24: Примечание: прыжок обходит инициализацию переменной int limit, результат=0; ^ 1 генерируется ошибка.


Я не понимаю этого с моим компилятором, так что попробуйте переместить break вне фигурных скобок:
#include<iostream>
#include<string>
int main()
{
	std::string name;
	int a;
	std::cout<<"welcome please enter you name below"<<std::endl;
	std::cin>>name;
	std::cout<<"hey ";
	std::cout<<name<<std::endl;
	std::cout<<"//choose a for submision//"<<std::endl;
	std::cout<<"//choose b for factorial//"<<std::endl;
	std::cout<<"you choosed : ";
    std::cin>>a;
    switch (a)
    {
        case 1:
        {
            int limit, result=0;
            std::cout<<"enter num = ";
            std::cin>>limit;
            for(int x=1;x<=limit;x++)
            {
            	result=result+x;
            }
            std::cout<<"sum of number= "<<result;
        }
        break;
        case 2:
        {
            int fact=1,l;
            std::cout<<"enter limit";
            std::cin>>l;
            for(int i=1;i<=l;i++)
            {
            	fact=fact*i;
            }
            std::cout<<fact;
        }
        break;
    }
}
Некрасиво, и не должно быть нужно - какой компилятор вы используете?


Member 14072628

все еще не работает:)

OriginalGriff

"Это не работает", вероятно, самый бесполезный отчет о проблеме, который мы получаем - и мы получаем его много. Она ничего не говорит нам о том, что происходит или когда это происходит.
Итак, расскажите нам, что он делает, чего вы не ожидали, или не делает, что вы сделали.
Расскажите нам, что вы сделали, чтобы это произошло.
Сообщайте нам о любых сообщениях об ошибках. Скажи нам, где они!

Member 14072628

ошибка: <stdin>:27:12: ошибка: невозможно перейти от оператора switch к этой метке case
дело (2):
^
<stdin>:18:24: Примечание: переход обходит инициализацию переменной
int limit, result=0;
^
1 ошибка генерируется.

OriginalGriff

Ответ обновлен.