0 / 0 / 0
Регистрация: 01.07.2019
Сообщений: 20
1

Отсортировать 3 числа в порядке неубывания ( #define swap )

19.08.2019, 13:47. Показов 1840. Ответов 13

Всем привет, возможно ли через #define сделать что-то подобное?

C++
1
#define SWAP(x,y,z) ( if ( y > z ) swap(y,z); if ( x > y ) swap(x,y); if (y > z) swap(y,z))
Чтобы не писать постоянно в main этот код. Если да, то как? Потому что у меня компилятор выдает ошибку.
Либо же это можно сделать только через функцию?

Добавлено через 9 минут
Уже разобрался, скобки перед if были лишние, всем спасибо.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2019, 13:47
Ответы с готовыми решениями:

Отсортировать числа из файла в порядке неубывания используя stl
в текстовом файле записан набор целых чисел. отсортировать эти числа в порядке неубывания. ...

Отсортировать массив в порядке неубывания
Отсортируйте массив. Входные данные Первая строка входных данных содержит количество...

Отсортировать массив в порядке неубывания
Дан целочисленный массив, содержащий не менее 25 элементов. Отсор-тировать массив в порядке...

Ввести произвольную символьную цепочку.Отсортировать ее символы в порядке неубывания (по алфавиту)
ввести произвольную символьную цепочку.Отсортировать ее символы в порядке неубывания (по...

13
бах-бах и в продакшен!
2988 / 1605 / 564
Регистрация: 23.09.2014
Сообщений: 4,959
Записей в блоге: 4
19.08.2019, 13:56 2
Hikaru666,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
#define SWAP(x,y,z) if ( y > z ) \
    std::swap(y,z); if ( x > y ) \
    std::swap(x,y); if (y > z) std::swap(y,z);
    
#define LOG(v) std::cout << #v << " = " << v << "\n"
 
int main()
{   int x = 3,
        y = 1,
        z = 2;
        
    LOG(x);
    LOG(y);
    LOG(z);
    
    SWAP(x,y,z);
    
    LOG(x);
    LOG(y);
    LOG(z);
 
    std::cin.get();
}
1
303 / 215 / 74
Регистрация: 23.05.2011
Сообщений: 971
19.08.2019, 14:13 3
XLAT, потом кто-то пишет в коде:
C++
1
2
if(want_swap)
   SWAP(x,y,z);
И всё ломается.

Я бы макрос в операторные скобки положил:
C++
1
2
3
#define SWAP(x,y,z) do{if ( y > z ) \
 std::swap(y,z); if ( x > y ) \
 std::swap(x,y); if (y > z) std::swap(y,z);} while(false)
1
бах-бах и в продакшен!
2988 / 1605 / 564
Регистрация: 23.09.2014
Сообщений: 4,959
Записей в блоге: 4
19.08.2019, 14:22 4
Лучший ответ Сообщение было отмечено Hikaru666 как решение

Решение

Цитата Сообщение от New man Посмотреть сообщение
И всё ломается.
верно

Цитата Сообщение от New man Посмотреть сообщение
Я бы макрос в операторные скобки положил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
#define SWAP(x,y,z) {if ( y > z ) \
    std::swap(y,z);  if ( x > y ) \
    std::swap(x,y);  if ( y > z ) std::swap(y,z);}
    
#define LOG(v) std::cout << #v << " = " << v << "\n"
 
int main()
{   int x = 3,
        y = 1,
        z = 2;
        
    LOG(x);
    LOG(y);
    LOG(z);
    
    if(true)
        SWAP(x,y,z);
    
    LOG(x);
    LOG(y);
    LOG(z);
 
    std::cin.get();
}
1
Evg
Эксперт CАвтор FAQ
21193 / 8209 / 633
Регистрация: 30.03.2009
Сообщений: 22,522
Записей в блоге: 30
19.08.2019, 14:42 5
Чтобы не спотыкаться о многочисленные геморрои, которые может породить макрос, в Си++ изобрели inline-функции и шаблоны. В подобных случаях пользоваться лучше ими, а не макросами
1
бах-бах и в продакшен!
2988 / 1605 / 564
Регистрация: 23.09.2014
Сообщений: 4,959
Записей в блоге: 4
19.08.2019, 15:03 6
Цитата Сообщение от Evg Посмотреть сообщение
подобных случаях пользоваться лучше ими
согласен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class T>
inline void myswap(T& x, T& y, T& z)
{   T temp;
    if ( y > z ) 
    {   temp = y; y = z; z = temp;
    }   
        
    if ( x > y ) 
    {   temp = x; x = y; y = temp;
    }  
    
    if ( y > z )
    {   temp = y; y = z; z = temp;
    }
}
кроме того, как мне полагается это будет работать быстрее.
0
Evg
Эксперт CАвтор FAQ
21193 / 8209 / 633
Регистрация: 30.03.2009
Сообщений: 22,522
Записей в блоге: 30
19.08.2019, 15:04 7
Цитата Сообщение от XLAT Посмотреть сообщение
как мне полагается это будет работать быстрее
Быстрее точно не будет. Количество и состав операций - по сути те же самые (если не считать всяческие пересылки), поэтому после работы оптимизаций код получится по своей сути одинаковый
0
бах-бах и в продакшен!
2988 / 1605 / 564
Регистрация: 23.09.2014
Сообщений: 4,959
Записей в блоге: 4
19.08.2019, 15:14 8
Цитата Сообщение от Evg Посмотреть сообщение
Количество и состав операций - по сути те же самые
я полагаю, что при подстановке std::swap память под переменнаую temp будет выделена три раза.
0
Evg
Эксперт CАвтор FAQ
21193 / 8209 / 633
Регистрация: 30.03.2009
Сообщений: 22,522
Записей в блоге: 30
19.08.2019, 15:28 9
Цитата Сообщение от XLAT Посмотреть сообщение
я полагаю, что при подстановке std::swap память под переменнаую temp будет выделена три раза
Компилятор всё проинлайнит и всё прооптимизирует. Три вызова std::swap породят три временные переменные, но с непересекающимися временами жизни. Поэтому компилятор распределит под них один и тот же ресурс (регистр или память)
0
бах-бах и в продакшен!
2988 / 1605 / 564
Регистрация: 23.09.2014
Сообщений: 4,959
Записей в блоге: 4
19.08.2019, 15:33 10
Цитата Сообщение от Evg Посмотреть сообщение
регистр
да, всё так, вы верно рассуждаете.
0
303 / 215 / 74
Регистрация: 23.05.2011
Сообщений: 971
21.08.2019, 23:20 11
XLAT, такой код тоже ломается при
C++
1
2
3
if()
   SWAP(x,y,z);
else{}
А с do{}while(false) не ломается.

Цитата Сообщение от XLAT Посмотреть сообщение
я полагаю, что при подстановке std::swap память под переменнаую temp будет выделена три раза.
Ну, если это примитивный тип или тип, который не поддерживает move-семантику.
0
бах-бах и в продакшен!
2988 / 1605 / 564
Регистрация: 23.09.2014
Сообщений: 4,959
Записей в блоге: 4
21.08.2019, 23:54 12
Цитата Сообщение от New man Посмотреть сообщение
такой код тоже ломается
каким образом?

вот макрос:
C++
1
2
3
4
5
#define SWAP(x,y,z) { \
    if ( y > z ) std::swap(y,z); \
    if ( x > y ) std::swap(x,y); \
    if ( y > z ) std::swap(y,z); \
}
0
303 / 215 / 74
Регистрация: 23.05.2011
Сообщений: 971
22.08.2019, 22:52 13
XLAT, попробуй скомпилировать:
https://rextester.com/ZEO92211
0
С чаем беда...
Эксперт CЭксперт С++
9078 / 4610 / 1251
Регистрация: 18.10.2014
Сообщений: 10,339
22.08.2019, 23:50 14
Цитата Сообщение от XLAT Посмотреть сообщение
каким образом?
Попробуйте привязать else к своему if

C++
1
2
3
4
if(true)
  SWAP(x,y,z);
else
  ;
и посмотрите что получится.

Именно поэтому в макросе используется именно do { ... } while (0), а не { ... }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2019, 23:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Распечатать числа в порядке неубывания
Даны действительные числа A,B,C,D. Распечатайте их в порядке неубывания.

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

Вывести числа в порядке неубывания
Дано N целых чисел, которые требуется отсортировать в порядке неубывания. Среди чисел не будет...

Напечатать числа в порядке неубывания
Помогите пожалуйста написать программу: Даны целые числа a1, a2, ..., an. Напечатать числа в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.