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, Супермодераторы



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

Сейчас этот форум просматривают: Dmitriy40


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

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