2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Программирование разветвляющихся алгоритмов [Упр. C++]
Сообщение11.04.2016, 18:48 


26/03/16
40
Даны переменные x,y,z. Проверить, являются ли они сторонами прямоугольного треугольника. Вывести сообщение, если из них невозможно составить треугольник. Это мое решение. Помогите, пожалуйста, ввести цикл, чтобы программа повторялась.
Код:
#include <iostream>

using namespace std;

int main()
{
    setlocale (0, "");
    float x,y,z;
    cout << "Введите стороны треугольника:" << endl;
    cin >> x >> y >> z;
    if (x<0||y<0||z<0)
    {
    cout << "Введены некорректные данные" << endl;
   return(0);
   }
       if (x + y > z && x + z > y && y + z > x)
      {
       cout << "Треугольник" << endl;
       }
   else
      {
       cout << "Не треугольник" << endl;
       return(0);
       }
          if (x*x + y*y == z*z || x*x + z*z ==  y*y || y*y + z*z == x*x)
        {
          cout << "Прямоугольный треугольник" << endl;
        }
   else
         {
          cout << "Не прямоугольный треугольник" << endl;
          }
    return(0);
    system("pause");
}

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение11.04.2016, 19:07 
Заслуженный участник


27/04/09
28128
Псевдокод для куска кода, повторяющегося, пока пользователь не решит, что ему надоело:

Используется синтаксис C++
bool repeat = true;
while (repeat) {
    код
    вопрос к пользователю
    получение ответа
    repeat = пользователю не надоело;
}

С учётом уровня конкретности вопроса трудно угадать, что в этом псевдокоде может потребовать разъяснений.

(Для распространённых языков типа C++ лучше используйте тег syntax, а не code — в последнем нет подсветки, да и начальные пробелы он иногда по непонятным причинам ест. Можно не набирать тег вручную, а просто нажать на список Выберите язык и, собственно, выбрать.)

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение11.04.2016, 19:11 
Заслуженный участник


09/05/12
25179
diman19rus в сообщении #1114188 писал(а):
Помогите, пожалуйста, ввести цикл, чтобы программа повторялась.
Куда повторялась?

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение11.04.2016, 19:47 


26/03/16
40
Например, после того, как я ввел некорректные данные, программа не должна закрываться, а возвращать в начало

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение11.04.2016, 19:50 
Заслуженный участник


09/05/12
25179
diman19rus в сообщении #1114211 писал(а):
Например, после того, как я ввел некорректные данные, программа не должна закрываться, а возвращать в начало
Либо все переписать по схеме, предложенной arseniiv, либо совершить богопротивное деяние и воспользоваться условным переходом по метке. :-)

Но вообще-то поведение программы надо планировать заранее.

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение11.04.2016, 19:56 


26/03/16
40
Что за условный переход?

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение11.04.2016, 20:04 
Заслуженный участник


09/05/12
25179
diman19rus в сообщении #1114215 писал(а):
Что за условный переход?
Если то-то, то переход по ссылке. Но лучше так не делать.

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение12.04.2016, 02:01 
Заслуженный участник


27/04/09
28128

(Только для тех, кто совсем не слышал о холиварах на тему goto.)

Обычно goto реабилитируют, только если надо выскочить из двух или больше циклов сразу. Тогда альтернатива ему — куча условий по одному на каждый покидаемый цикл и как минимум один дополнительный флаг. Не всегда так страшно, как малюют. Особенно если в языке есть специальный оператор для такого выпрыгивания (циклы можно пометить или глубину вложения указать числом).

Pphantom в сообщении #1114214 писал(а):
Либо все переписать по схеме, предложенной arseniiv
Да, появится continue или даже мелкие циклики, если позаботиться о том, чтобы пользователь не перевводил правильные первое значение, если ввёл неправильно второе (типа подсказка для автора :-)).

diman19rus, если у вас действительно не очень хорошо с control flow, просто возьмите любую книжку с введением в C++ и почитайте в начале всё подряд. Например, до функций — кажется, обычно после них уже управляющие конструкции, кроме работы с исключениями и подобных откладываемых вещей, не рассматриваются.

Кстати, я поначалу совсем не заметил этих return(0). С ними две проблемы, раз уж пока ещё в теме не описаны:
• Скобки совершенно лишние: return — это не функция. Пробелом отделить хватит.
• Ноль возвращать, если программа завершилась ненормально, не стоит. Написать другое число — первый шаг к лёгкому написанию корректно взаимодействующей с окружением консольной программы, если такая понадобится (второй шаг — завести enum для кодов ошибок).

 Профиль  
                  
 
 Re: Программирование разветвляющихся алгоритмов
Сообщение12.04.2016, 09:45 


05/09/12
2587
Мне не нравится
Используется синтаксис C++
float x,y,z;
....
if (x*x + y*y == z*z || x*x + z*z ==  y*y || y*y + z*z == x*x)


И ввод данных удобно выносить в отдельные функции:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <cmath>
using namespace std;

void read(string s, float &x) {
    cout << s << endl;
    cin >> x;
    if (x<0) {
        cout << "Введены некорректные данные" << endl;
        read(s, x);
    }
}

bool tst(float x, float y, float z) {return abs(x*x+y*y-z*z) < 1E-10;}

int main() {
   
    setlocale (0, "");
    float x, y, z;
   
    read("1-я сторона: ", x);
    read("2-я сторона: ", y);
    read("3-я сторона: ", z);
   
    bool t = x+y>z && x+z>y && y+z>x;
   
    cout << (t ? "Т" : "Не т") << "реугольник" << endl;
   
    if (t) cout << (tst(x,y,z) || tst(x,z,y) || tst(y,z,x) ? "П" : "Не п")
        << "рямоугольный треугольник" << endl;
   
    system("pause");
    return 0;
}

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group