Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Ввести 3 числа, вывод - от меньшего по порядку.


Автор: EpIvIaK 25.11.2013, 17:55
Стыдно, но такое просто упражнение застало врасплох. Надо ввести 3 числа в ввод, чтоб вывелось от меньшего к большему по порядку. 
Если ввод 4, 10, 4, - чтоб вывелось 4, 4, 10.
Куча ифов - нельзя. А то я уже делал так. Массивы тоже нельзя. 
Я не студент, это задание из книги просто - вот туплю что-то. Подскажите пожалуйста (не прошу за меня делать, ибо повторюсь я не студент, хочу научиться головой понимать).

Автор: bsa 25.11.2013, 21:18
Цитата(EpIvIaK @  25.11.2013,  18:55 Найти цитируемый пост)
Куча ифов - нельзя.

куча - сколько?
Что вообще можно?

Автор: EpIvIaK 25.11.2013, 22:44
Вот так нельзя (так я выполнил, правда не довёл до конца, не учтя если что-то будет равно друг другу):

Код
int main(){
    setlocale (LC_CTYPE, "Russian");

    int A, B, C, D;
    A = 0;
    while (A != 666){
    cout << "Введите 3 числа: \n";
    cin >> A; 
    cin >> B; 
    cin >> C;

    if (A < B && A < C && B < C) {cout << A << " " << B << " " << C;}
    else if (A < B && A < C && C < B) {cout << A << " " << C << " " << B << "\n";}
    else if (B < A && B < C && A < C) {cout << B << " " << A << " " << C << "\n";}
    else if (B < A && B < C && C < A) {cout << B << " " << C << " " << A << "\n";}
    else if (C < A && C < B && A < B) {cout << C << " " << A << " " << B << "\n";}
    else if (C < A && C < B && B < A) {cout << C << " " << B << " " << A << "\n";}
    }
    cin >> D;
    return 0;
    }



Аргумент почему нельзя - типа индо-быдло код.
Надо найти более элегантный способ используя лишь Ифы те же, или циклы, короче без фишек а-ля sort, ибо цель даже не в решение задачи любой ценой - а именно смекалка элегантного решения, без артилерии.. Как сказал корректировщик задания многозначительно - "никто не говорил не делать ифами, но нужно сделать ими хорошо, а не так по-индусски". Конкретнее не уточнял, давал ещё намёк - что я зациклен на переменных, а ведь итог там - ЧИСЛА. Пока не врубился что к чему.

Модератор: не забываем пользоваться кнопочкой "Код"

Автор: feodorv 25.11.2013, 23:46
Мда, а какое минимальное число сравнений нужно, чтобы отсортировать 3 числа? По-моему, три и нужно:
Код

if( a > b ) swap( a, b);
if( b > c ) swap( b, c);
if( a > b ) swap( a, b);
cout << a << " " << b << " " << c << endl;


PS Можно вообще без if-ов с помощью ?: smile 

Автор: EpIvIaK 26.11.2013, 14:20
Спасибо! Дело в том, что я ещё не знаком с этим - swap.

Как и с ?:.

И если Страуструп не знакомил с этим до этих упражнений, то видимо он предлагает всё сделать примерно как я выше.

А того парня который мне помогает тоже не понимаю, как я сделал выше - не устраивает, а как ещё непонятно, ибо подобные операторы и понятия ещё не пройдены. Нестыковка какая-то. 

П.С - да работает, спасибо. Хотя как Вы поняли - некоторые моменты терзают меня, если я не проходил подобное, то значит надо сделать как-то ещё, или вариант хуже - просят того и сделать так - как я пока не умею технически, а такие притормажения замороченые пользы не дают.

Автор: feodorv 26.11.2013, 14:53
Цитата(EpIvIaK @  26.11.2013,  15:20 Найти цитируемый пост)
я ещё не знаком с этим - swap

swap просто меняет местами значения двух переменных, что-то вроде такого:
Код
void swap( int &a, int &b)
{
  int tmp = a;
  a = b;
  b = tmp;
}

Можно обойтись и без вызовов swap, но тогда придётся писать в таком стиле:
Код
if( a > b ) d = a, a = b, b = d;
if( b > c ) d = b, b = c, c = d;
if( a > b ) d = a, a = b, b = d;

Что уже отдаёт индусятиной)))

Автор: baldina 26.11.2013, 16:47
Цитата(EpIvIaK @  25.11.2013,  17:55 Найти цитируемый пост)
Куча ифов - нельзя. А то я уже делал так. Массивы тоже нельзя. 

ну что же совсем ничего нельзя-то! ифы - дерево принятия решений, массивы - сортировка.
feodorv предложил закамуфлированный массив с закамуфлированным деревом.
?: это тот же иф по сути. с его помощью можно дерево решений построить
Код

 a < b ? 
  b < c ? 
    std::cout << a << b << c
  : 
    a < c ? 
      std::cout << a << c << b
    :
      std::cout << c << a << b
 :
  a < c ? 
    std::cout << b << a << c
  :
    b < c ? 
     std::cout << b << c << a
    :
     std::cout << c << b << a
 ;


Добавлено через 44 секунды
Цитата(feodorv @  26.11.2013,  14:53 Найти цитируемый пост)
отдаёт индусятиной

в учебных целях позволительно

Добавлено через 8 минут и 17 секунд
если ?: нельзя, можно на if заменить. они, как и в ?:, будут повторяться, т.к. попарных сравнений только 3
Код

if (a < b)  {
  if (b < c) {
    std::cout << a << b << c;
  } 
  else if (a < c) { 
      std::cout << a << c << b
   } else {
      std::cout << c << a << b
  }
} 
else if (a < c) {
    std::cout << b << a << c;
} 
else if (b < c) {
     std::cout << b << c << a;
} else {
     std::cout << c << b << a;
}

Автор: EpIvIaK 26.11.2013, 20:34
Благодарю за информацию!
Да он потом облегчил задание, сказав, что числа надо вывести не от меньшего к большему, а просто выяснить меньшее.

Но когда дело дойдёт до основной задачи, буду готов.

А с облегчёнными вариантом он помог, ещё и объясняю в каком направление учит мыслить, вот:

(16:20:06) burillo.burillo: предположим, у тебя есть три ведра))) в одном вода темная, в другом - посветлее, в третьем - прозрачная))) как получить самую прозрачную воду?

(16:25:37) burillo.burillo: берешь четвертое ведро изначально оно пустое, поэтому ты просто заливаешь туда воду из первого ведра потом подходишь ко второму и смотришь - если вода в нем прозрачнее, чем у тебя - выливаешь на.уй воду из своего ведра и вливаешь туда воду из второго ведра потом также подходишь к третьему ведру и также смотришь, перозрачнее ли там вода чем у тебя в ведре, или нет и если прозрачнее, то опять же - выливаешь на.уй воду из своего ведра и вливаешь туда воду из третьего ведра))) и возвращаешь четвертое ведро))) потому что в задаче не было условия вернуть ТО САМОЕ ведро, в котором самая прозрачная вода задача состоит в том, чтобы вернуть ведро с самой прозрачной водой

(16:26:48) burillo.burillo: вот об этом я тебе и говорю - ты пытаешься переменным придать какую то ценность и пытаешься определить, какая из переменных тебе нужна а на переменные то на самом деле по.уй - тебя интересуют ЗНАЧЕНИЯ, которые содержатся в этих переменных


(16:28:25) burillo.burillo: то есть - неважно из какого ведра ты вернул воду, главное чтобы она была самая прозрачная))) то бишь:
int a, b, c, lowest;
cin >> a >> b >> c;
lowest = a;
if (b < lowest)
    lowest = b;
if (c < lowest)
    lowest = c;

все))) вот она вся твоя задача с ведрами


==========

Короче сказал учить математику, булеву алгебру, да и английский заодно. 
До создания игр а-ля Бомбермэн или Змейка ещё годы.  smile 







Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)