Ветвления в C++

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
 setlocale(0, "");
 cout << "Вас приветствует Калькулятор!Выберите нужную функцию:" << endl;
 cout << "1-Калькулятор формул по Физике." << endl;
 cout << "2-Обычный калькулятор." << endl;
 cout << "3-Конвертер в систему СИ *В разработке*" << endl;
 int f1, p1, f2, r2, r1;
 cin >> f1;
 switch(f1) 
 {
     case 1 : p1 = 1; break; //Назначение Параметра1 главного меню
     case 2 : p1 = 2; break;
     case 3 : p1 = 3; break;
     default : cout << "Такой функции не существует! Попробуйте ещё раз!" << endl;
 }
 if (p1 = 1) { //Если выбран калькулятор формул по физике....
  cout << "Выберите нужный раздел Физики:" << endl;
  cout << "1-Плотность, Масса, Объём." << endl;
  cout << "2-Сила, Масса." << endl;
  cout << "3-Средняя скорость." << endl;
  cout << "4-Сила упругости, Rоэфициент жесткости, Удлиннение." << endl;
  cout << "5-Сила трения, МЮ , Масса * Ж." << endl;
  cout << "6-Сила Архимеда, Вес в воде, Вес в воздухе." << endl;
  cout << "7-Водоизмещение, Грузоподъёмность." << endl;
  cout << "8-Давление./n";
  cout << "9-Работа, Сила, Путь/Высота." << endl;
  cout << "10-Мощность, Работа, Время." << endl;
  cout << "11-КПД, Полезная работа, Затраченная работа." << endl;
  cin >> f2;
  switch(f2) //Назначение Функции2 на разделы Физики....
  {
      case 1 : r1 = 1; break;
      case 2 : r1 = 2; break;
      case 3 : r1 = 3; break;
      case 4 : r1 = 4; break;
      case 5 : r1 = 5; break;
      case 6 : r1 = 6; break;
      case 7 : r1 = 7; break;
      case 8 : r1 = 8; break;
      case 9 : r1 = 9; break;
      case 10 : r1 = 10; break;
      case 11 : r1 = 11; break;
      default : cout << "Такого раздела нет! Попробуйте ещё раз!" << endl;
  }
  if (r1 = 1) { //Если выбран первый раздел
      int pr1;
      float Po, v, m;
      cout << "1-Найти Массу через Плотность и Объём." << endl;
      cout << "2-Найти Плотность через Массу и Объём." << endl;
      cout << "3-Найти Объём через Массу и Плотность." << endl;
      cin >> pr1;
      switch(pr1) 
      { //Свич 1 раздела
          case 1 : cout << "Введите Плотность:"; cin >> Po; cout << "Введите Объём:"; cin >> v; cout << "Масса равна:" << Po * v << endl; break;
          case 2 : cout << "Введите Массу:"; cin >> m; cout << "Введите Объём:"; cin >> v; cout << "Плотность равна:" << m / v << endl; break;
          case 3 : cout << "Введите Массу:"; cin >> m; cout << "Введите Плотность:"; cin >> Po; cout << "Объём равен:" << m / Po << endl; break;
          default : cout << "Такого подраздела нет! Попробуйте ещё раз!" << endl;
      }
  } else if (r1 = 2) {
      int pr2;
      float m, F;
      cout << "1-Найти Силу через Массу" << endl;
      cout << "2-Найти Массу через Силу" << endl;
      cin >> pr2;
      switch(pr2)
      {
              case 1 : cout << "Введите Массу:"; cin >> m; cout << "Сила равна:" << m * 9.8 << endl; break;
              case 2 : cout << "Введите Силу:"; cin >> F; cout << "Масса равна:" << F / 9.8 << endl; break;
      }
  }
 }
 return 0;
}

Здравствуйте, нужна помощь в ветвлениях. Использовал switch и if....else. После открытия калькулятора по физике всё идёт нормально, но когда я уже в нём выбираю раздел для вычислений, при введении 2, открывается 1 раздел. Помогите пожалуйста.

Из твоего кода я понял, что из трех калькуляторов работает только один — по физике и в нем работают только два раздела 1-й и 2-й.
Вся соль в тоем коде в том, что вот в этом месте...

 if (r1 = 1) { //Если выбран первый раздел

ты не проверяешь значение переменной r1, а присваиваешь ей значение 1. Поэтому программа в любом случае выполнит последовательно этот оператор if, а затем следующий

 } else if (r1 = 2) {

в котором ты тоже присваиваешь этой же переменной значение 2, то есть переписав проверочные выражения так

 if (r1 == 1) { //Если выбран первый раздел

и так

 } else if (r1 == 2) {

у тебя все заработает.
По твоему коду у меня возникли замечания по поводу стиля, уж больно громоздко и прямолинейно. Такой калькулятор, как ты задумал, предполагает гибкий интерфейс. Если ты так дальше будешь прописывать каждый пункт, то программа будет очень громоздкой и ты никогда не сможешь посчитать «Силу и массу», если выберешь другой пункт. Нужно будет закрыть программу, потому что нет возвратов, (как вариант «выход» — из меню физического калькулятора в стартовое меню, а из стартового — выход из программы) и запустить ее вновь.
Наверное ты подошел к проблеме глобально, попробуй в каждом подразделе оставить по одному меню и сделать это качественно.
Много непонятных объявлений и инициализаций переменных.
В общем неупорядоченная неразбериха :)))
Дерзай!!!

Я тут немного посочинял и набросал такой себе калькулятор.
Защита «от дурака» минимальная — только на ввод неправильной цифры меню. Если введешь букву то программа уйдет в цикл.
Код тоже получился немного прямолинеен, но дает возможность сделать расчет в любом месте меню.
Упор делал на оператор switch и функции.

#include <iostream>
#include <cmath>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

const double sec = 0.2;     
/*****************------- МЕНЮ -------*******************/
static string start_menu[] = 
{   
    "***** ВАС ПРИВЕТСТВУЕТ СБОРНИК КАЛЬКУЛЯТОРОВ! *****\n",
    "Выберите нужный Вам калькулятор:\n",
    "1. Калькулятор формул по физике.",
    "2. Обычный калькулятор (в разработке).",
    "3. Конвертер в систему СИ (в разработке)",
    "0. Выход."
};
static string fisic_menu[] =
{
    "***** ФИЗИЧЕСКИЙ КАЛЬКУЛЯТОР *****\n",
    "Выберите нужный раздел:\n",
    "1. Плотность, масса, объём.",
    "2. Сила, масса.",
    "3. Средняя скорость.",
    "4. Сила упругости, коэффициент жесткости, удлиннение.",
    "5. Сила трения, МЮ , масса * Ж.",
    "6. Сила Архимеда, вес в воде, вес в воздухе.",
    "7. Водоизмещение, грузоподъёмность.",
    "8. Давление.",
    "9. Работа, сила, путь/высота.",
    "10. Мощность, работа, время.",
    "11. КПД, полезная работа, затраченная работа.",
    "0. Главное меню."
};
string dens_mass_vol[] =
{
    "***** ПЛОТНОСТЬ, МАССА, ОБЪЕМ *****\n",
    "1. Найти Массу через Плотность и Объём.",
    "2. Найти Плотность через Массу и Объём.",
    "3. Найти Объём через Массу и Плотность.",
    "0. Вернуться в физический калькулятор"
};
string force_mass[] =
{
    "*******     СИЛА, МАССА     ********\n",
    "1. Найти силу через массу",
    "2. Найти массу через силу",
    "0. Вернуться в физический калькулятор"
};
/************************----- ПРОТОТИПЫ ----****************************/
void MaintMenu();
int MainChoice();
void FisicMenu();
void FisicChoice();
void CommonCalc();
void ConvertToSi();
void DensMassVolMenu();
void DensMassVolChoice();
void MassByDensVol();
void DensByMassVol();
void VolByMassDens();
void ForceMassMenu();
void ForceMassChoice();
void ForceByMass();
void MassByForce();
void ArrowDely();
void Dely();

int main()
{
    setlocale(LC_ALL, "Russian");

    int exit;
    exit = MainChoice();
    system("cls");
    cout << "До свидания!\n";
    cin.get();
    return exit;
}
void MainMenu()     // главное меню
{
    for (int i = 0; i < 6; ++i)
        cout << start_menu[i] << endl;
}
int MainChoice()        // навигация главного меню
{
    MainMenu();
    int choice;
    cin >> choice;
    while (choice != 0){
        switch(choice){
        case 1 : 
            system("cls");
            FisicMenu();        // вызов физ. калькулятора
            FisicChoice();
            break;
        case 2 : 
            system("cls");      // вызов обычного калькулятора
            CommonCalc();
            break;
        case 3 : 
            system("cls");      // вызов конвертера в единицы СИ
            ConvertToSi();
            break;
        default :
            system("cls");          
            ArrowDely();            // БАЛОВСТВО :)
            break;
        }
        MainMenu();
        cin >> choice;
    }
    return 0;
}
void FisicMenu()            // меню физ. калькулятора
{
    for (int i = 0; i < 14; ++i)
        cout << fisic_menu[i] << endl;
}
void FisicChoice()      //  навигация физ. калькулятора
{
    int choice;
    cin >> choice;
    while (choice != 0){
        switch(choice){
        case 1 : 
            system("cls");
            DensMassVolMenu();  // вызов меню раздела плотность, масса, объем
            DensMassVolChoice();        // вызов навигации раздела плотность, масса, объем
            break;
        case 2 : 
            system("cls");
            ForceMassMenu();        // вызов меню раздела сила, масса
            ForceMassChoice();  // вызов навигации раздела сила, масса
            break;
// сдесь только два кейса, так как у тебя есть только два расчета
// всего должно быть 11 кейсов
        default :
            system("cls");          
            ArrowDely();        // БАЛОВСТВО :)
            break;
        }
        FisicMenu();
        cin >> choice;
    }
    system("cls");
}
void CommonCalc()
{
    cout << "Извините, обычный калькулятор сейчас находиться на разработке\n";
    cout << "<Enter>";
    cin.get(); cin.get();
    system("cls");
}
void ConvertToSi()
{
    cout << "Извините, конвертер в единицы СИ сейчас находиться на разработке\n";
    cout << "<Enter>";
    cin.get(); cin.get();
    system("cls");
}
void DensMassVolMenu()  // меню раздела плотность, масса, объем
{
    for (int i = 0; i < 5; ++i)
        cout << dens_mass_vol[i] << endl;
}
void DensMassVolChoice()        // навигация раздела плотность, масса, объем
{
    int choice;
    cin >> choice;
    while (choice != 0){
        switch(choice){
        case 1 :
            system("cls");
            MassByDensVol();
            break;
        case 2 :
            system("cls");
            DensByMassVol();
            break;
        case 3 : 
            system("cls");
            VolByMassDens();
            break;
        default :
            system("cls");          
            ArrowDely();        // БАЛОВСТВО :)
            break;
        }
        DensMassVolMenu();
        cin >> choice;
    }
    system("cls");
}
/**************** расчеты раздела плотность, масса, объем ****************/
void MassByDensVol()
{
    float Po, v;
    cout << "Введите плотность: ";
    cin >> Po;
    cout << "Введите объём: ";
    cin >> v; 
    cout << "Масса равна: " << Po * v << endl;
    cout << "<Enter>"; cin.get(); cin.get(); system("cls");
}
void DensByMassVol()
{
    float v, m;
    cout << "Введите массу: ";
    cin >> m;
    cout << "Введите объём: ";
    cin >> v;
    cout << "Плотность равна: " << m / v << endl;
    cout << "<Enter>"; cin.get(); cin.get(); system("cls");
}
void VolByMassDens()
{
    float Po, m;
    cout << "Введите массу: ";
    cin >> m;
    cout << "Введите плотность: ";
    cin >> Po;
    cout << "Объём равен:" << m / Po << endl;
    cout << "<Enter>"; cin.get(); cin.get(); system("cls");
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void ForceMassMenu()        // меню раздела сила, масса
{
    for (int i = 0; i < 4; ++i)
        cout << force_mass[i] << endl;
}
void ForceMassChoice()  // навигация раздела сила, масса
{
    int choice;
    cin >> choice;
    while (choice != 0){
        switch(choice){
        case 1 :
            system("cls");
            ForceByMass();
            break;
        case 2 :
            system("cls");
            MassByForce();
            break;
        default :
            system("cls");          
            ArrowDely();        // БАЛОВСТВО :)
            break;
        }
        ForceMassMenu();
        cin >> choice;
    }
    system("cls");
}
/********************* расчеты раздела сила, масса *******************/
void ForceByMass()
{
    float m;
    cout << "Введите массу: ";
    cin >> m;
    cout << "Сила равна: " << m * 9.8 << endl;
    cout << "<Enter>"; cin.get(); cin.get(); system("cls");
}
void MassByForce()
{
    float F;
    cout << "Введите силу: ";
    cin >> F;
    cout << "Масса равна: " << F / 9.8 << endl;
    cout << "<Enter>"; cin.get(); cin.get(); system("cls");
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void ArrowDely()     // БАЛОВСТВО :)
{
    for (int j = 0; j < 3; ++j){
                cout << "Сделайте правильный выбор";
                for (int i = 0; i < 3; ++i){
                    cout << ">";
                    Dely();
                }
                if(j < 2)
                    system("cls");
            }
            cout << "<Enter>"; cin.get(); cin.get(); cout << endl;
}
void Dely()
{
    clock_t dely = sec * CLOCKS_PER_SEC;
    clock_t start = clock();
    while (clock() - start < dely)
        ;
}

Спасибо, Юрий. Я ещё только учусь и с функциями в упор не знаком. По моей книге я вот примерно вчера закончил циклы и ветвления. Просто я уже как-то писал такой же калькулятор, но используя только if...else , и мне посоветовали использовать switch. Ну вот как видите попытался) Я очень вам благодарен за исправления кода, но т.к функции не знаю, мне интересно как можно было обыграть эту идею, использовав только эти операторы. И ещё если у вас есть время, можете дать свой скайп или другое средство обмена сообщениями, для вопросов, если конечно можно.

:) Я сам только учусь.
Я представляю какое количество кода ты написал для такого калькулятора при помощи только if else :)
В общем, я немного переиграл код, по твоей просьбе смотри, что получилось. Я не стал прописывать каждый пункт меню. Оставил рабочими только первые пункты главного меню и физического калькуляторов ну и расчеты, на основе этого, я думаю, остальное ты допишешь сам.

#include <iostream>
#include <cmath>
#include <string>
#include <cstdlib>

using namespace std;

/*****************------- МЕНЮ -------*******************/
static string main_menu[] = 
{   
    "***** ВАС ПРИВЕТСТВУЕТ СБОРНИК КАЛЬКУЛЯТОРОВ! *****\n",
    "Выберите нужный Вам калькулятор:\n",
    "1. Калькулятор формул по физике.",
    "2. Обычный калькулятор (в разработке).",
    "3. Конвертер в систему СИ (в разработке)",
    "0. Выход."
};
static string fisic_menu[] =
{
    "***** ФИЗИЧЕСКИЙ КАЛЬКУЛЯТОР *****\n",
    "Выберите нужный раздел:\n",
    "1. Плотность, масса, объём.",
    "2. Сила, масса.",
    "3. Средняя скорость.",
    "4. Сила упругости, коэффициент жесткости, удлиннение.",
    "5. Сила трения, МЮ , масса * Ж.",
    "6. Сила Архимеда, вес в воде, вес в воздухе.",
    "7. Водоизмещение, грузоподъёмность.",
    "8. Давление.",
    "9. Работа, сила, путь/высота.",
    "10. Мощность, работа, время.",
    "11. КПД, полезная работа, затраченная работа.",
    "0. Главное меню."
};
string dens_mass_vol[] =
{
    "***** ПЛОТНОСТЬ, МАССА, ОБЪЕМ *****\n",
    "1. Найти Массу через Плотность и Объём.",
    "2. Найти Плотность через Массу и Объём.",
    "3. Найти Объём через Массу и Плотность.",
    "0. Вернуться в физический калькулятор"
};
string force_mass[] =
{
    "*******     СИЛА, МАССА     ********\n",
    "1. Найти силу через массу",
    "2. Найти массу через силу",
    "0. Вернуться в физический калькулятор"
};

int main()
{
    setlocale(LC_ALL, "Russian");

    int choice1 = true;
    while (choice1 != false)
    {
        system("cls");
        for (int i = 0; i < 6; ++i)     // отображение главного меню
        cout << main_menu[i] << endl;
        cin >> choice1;     // ввод выбора гл. меню
        if (1 == choice1){      // пункт 1 физический калькулятор
            int choice2 = true;         
            while (choice2 != 0){
                system("cls");
                for (int i = 0; i < 14; ++i)        // меню физ.калькулятора
                cout << fisic_menu[i] << endl;
                cin >> choice2;     // ввод выбора физ.калькулятора
                switch(choice2){
//////////////////////////   ПЕРВЫЙ КЕЙС ФИЗ. КАЛЬКУЛЯТОРА    ///////////////////////////   
                case 1 :
                    {
                        int choice3 = true;
                        while (choice3 != 0){
                            system("cls");
                            for (int i = 0; i < 5; ++i) // пункт 1 плотность, масса, объем
                            cout << dens_mass_vol[i] << endl;
                            cin >> choice3;
                            if (1 == choice3){      // расчет 1
                                system("cls");
                                float Po, v;
                                cout << "Введите плотность: ";
                                cin >> Po;
                                cout << "Введите объём: ";
                                cin >> v; 
                                cout << "Масса равна: " << Po * v << endl;
                                cout << "<Enter>"; cin.get(); cin.get(); system("cls");
                            }
                            else if (2 == choice3){ // расчет 2
                                system("cls");
                                float v, m;
                                cout << "Введите массу: ";
                                cin >> m;
                                cout << "Введите объём: ";
                                cin >> v;
                                cout << "Плотность равна: " << m / v << endl;
                                cout << "<Enter>"; cin.get(); cin.get(); system("cls");
                            }
                            else if (3 == choice3){ // расчет 3
                                system("cls");
                                float Po, m;
                                cout << "Введите массу: ";
                                cin >> m;
                                cout << "Введите плотность: ";
                                cin >> Po;
                                cout << "Объём равен:" << m / Po << endl;
                                cout << "<Enter>"; cin.get(); cin.get(); system("cls");
                            }
                            else if (choice3 != 0){
                                cout << "Сделайте правильный выбор>>>"; cout << "<Enter>";
                                cin.get(); cin.get();
                            }
                        }
                    }
                    break;
//////////////////////////////  КОНЕЦ ПЕРВОГО КЕЙСА /////////////////////////////////////
// дальше размещаются остальные кейсы физ. калькулятора
                default :
                    if (choice2 != 0){
                    system("cls");
                    cout << "Сделайте правильный выбор>>>"; cout << "<Enter>";
                    cin.get(); cin.get();
                    }
                    break;
                }
            }
        }
        else if (2 == choice1){
            system("cls");
            cout << "На разработке..."; cout << "<Enter>";
            cin.get(); cin.get(); system("cls");
        }
        else if (3 == choice1){
            system("cls");
            cout << "На разработке..."; cout << "<Enter>";
            cin.get(); cin.get(); system("cls");
        }
        else if (choice1 != 0){
            cout << "Сделайте правильный выбор>>>"; cout << "<Enter>";
            cin.get(); cin.get();
        }
    }

    return 0;
}

Как видишь прописав всего лишь одну ветвь кода получилось ровно половина от предыдущего (это при том, что я отбросил все лишнее).
В общем с классами получилось бы еще лучше, но с ними я пока тоже не знаком, так что вот мой e-mail alf1977@ukr.net если, что задавай вопросы.
Кстати какую литературу ты читаешь?

Такие меню можно делать одной строкой, а не массивом, и, следовательно, выводить одним оператором, а не циклом.

Понимаю это не производительно, просто небольшая интерпретация. Кстати, Алан, не подскажешь как в консольном окне сделать так, чтобы отображалось время выполнения программы?

Юрий, Сейчас читаю Лафоре.Р Объективно-ориентированное программирование.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.