Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

функция

12K
24 сентября 2009 года
horror
26 / / 22.11.2006
Здравствуйте!

Не подскажите есть ли в любом языке программирования функция меняющая значения двух переменных местами:
a=b
b=с
с=a
То есть без использования вспомогательной переменной (понятно что в вспомогательной функции она и так используется)
Прошу не говорить, что такую функцию легко написать и прочее.
9
25 сентября 2009 года
Lerkin
3.0K / / 25.03.2003
Чаще всего, она называется swap.
297
25 сентября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: horror
без использования вспомогательной переменной (понятно что в вспомогательной функции она и так используется)


Обменять значения переменных можно и без вспомогательной переменной: ссылка

87
25 сентября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: horror
Не подскажите есть ли в любом языке программирования функция меняющая значения двух переменных местами



Что значит в любом? Надо про конкретный говорить. В одном языке так делается, например:

a, b = b, a

12K
26 сентября 2009 года
horror
26 / / 22.11.2006
Благодарю всех! Очень помогли!
5
26 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Kogrom
Что значит в любом? Надо про конкретный говорить. В одном языке так делается, например:

a, b = b, a


а в другом

 
Код:
a <-> b
311
27 сентября 2009 года
plastictown
309 / / 08.01.2006
Если речь идет о числах, то так:

 
Код:
a=a+b;
b=a-b;
a=a-b;
87
30 сентября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: plastictown
Если речь идет о числах, то так



я решил попытать данную функцию:

Код:
#include <iostream>
#include <limits>
#include <typeinfo>

using namespace std;

template<typename T> void NumSwap(T& x, T& y)
{
    x += y;
    y = x - y;
    x -= y;
}

template<typename T> void test(size_t n, bool showAllGoods = false)
{
    T min = numeric_limits<T>::min();
    T max = numeric_limits<T>::max();
    T step = max / static_cast<T>(n);
    cout << typeid(T).name() << " => ";
    for(T i = min, j = max; j >= step; i += step, j -= step)
    {
        T a = i;
        T b = j;
        NumSwap(a, b);

        if(showAllGoods)
            cout << i << ", " << j << ", " << a << ", " << b << endl;

        if((a == j) && (b == i)) continue;
        cout << "bad test for: "
           << i << ", " << j << ", " << a << ", " << b << endl;
        return;
    }
    cout << "good test" << endl;
}

int main()
{
    test<int>(20);
    test<unsigned int>(20);
    test<char>(10, true);
    test<float>(20);
    test<double>(20);
    return 0;
}


С float и double не проходит при использовании моего компилятора. Прошло бы, если бы я внес допустимую погрешность, но это будет не корректно.
297
30 сентября 2009 года
koodeer
1.2K / / 02.05.2009
Насчёт алгоритма
 
Код:
a=a+b;
b=a-b;
a=a-b;
В статье Wiki по этой ссылке (она же приведена чуть ранее), прямо сказано, что этот алгоритм применяется для целых типов. При этом может возникать переполнение, что также ограничивает его применение.
87
30 сентября 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: koodeer
этот алгоритм применяется для целых типов. При этом может возникать переполнение, что также ограничивает его применение.



Мало ли чего сказано - я пытаюсь вначале понять, потом еще и потестировать на случай, если понял неправильно. Для чисел с плавающей запятой метод тоже подходит, если допустимо некоторое смещение.

Переполнение будет вредить, если оно будет вызывать исключение или прерывание. В ином случае все будет работать как и без переполнения.

Кстати, мой тест симметричен и этот момент упускает. Надо ввести дополнительные циклы...

276
30 сентября 2009 года
Rebbit
1.1K / / 01.08.2005
В статье Wiki по этой ссылке (она же приведена чуть ранее), прямо сказано, что этот алгоритм применяется для целых типов. При этом может возникать переполнение, что также ограничивает его применение.[/quote]
Ну и для тех кто не потрудился тицнуть по ссылке - там есть и лутшее решение с XOR которое подойдет в любом случае если переменные одинаковой длинны.
3
30 сентября 2009 года
Green
4.8K / / 20.01.2000
Цитата: Rebbit

Ну и для тех кто не потрудился тицнуть по ссылке - там есть и лутшее решение с XOR которое подойдет в любом случае если переменные одинаковой длинны.


Неа... "в любом случае" не подойдет, даже если одинаковой длины.

297
30 сентября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: Green
Неа... "в любом случае" не подойдет, даже если одинаковой длины.


;) Green уже второго человека поймал на неприменимости xor для любого случая (первый раз в этой теме).

14
30 сентября 2009 года
Phodopus
3.3K / / 19.06.2008
Справедливости ради нужно отметить что в задании четко сказано - двух переменных. Тоесть двух разных переменных. Уже после этого стоит добавлять "одинаковой длины" и "в любом случае". Поэтому считаю что слова Rebbit следует воспринимать как "в любом случае, если две переменные одинаковой длины, если речь идет о числах", что является верным ответом. Или нет?
276
30 сентября 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: Phodopus
Справедливости ради нужно отметить что в задании четко сказано - двух переменных. Тоесть двух разных переменных. Уже после этого стоит добавлять "одинаковой длины" и "в любом случае". Поэтому считаю что слова Rebbit следует воспринимать как "в любом случае, если две переменные одинаковой длины, если речь идет о числах", что является верным ответом. Или нет?


Спасибо конечно за поддержку, но в даном случае признаю свою ошибку и щитаю что лутше недобдеть чем перебдеть. Ибо наличие такой функции в библиотеке может привести к трудноотслеживаемим и редко возникающим ошибкам.

14
30 сентября 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Rebbit
в даном случае признаю свою ошибку


Ну, в общем-то ты единственный кто мог точно ответить на мой вопрос :). А с остальным, конечно, согласен. Просто порой при таких задачках нужна не сама функция а нужно то "что хочет преподаватель", посему важен и общий контекст в котором возник вопрос.

3
30 сентября 2009 года
Green
4.8K / / 20.01.2000
Цитата: Phodopus
Справедливости ради нужно отметить что в задании четко сказано - двух переменных. Тоесть двух разных переменных. Уже после этого стоит добавлять "одинаковой длины" и "в любом случае". Поэтому считаю что слова Rebbit следует воспринимать как "в любом случае, если две переменные одинаковой длины, если речь идет о числах", что является верным ответом. Или нет?


А что значит "переменные одинаковой длины"?
int и char[4] - это переменные одинаковой длины?

Что значит "если речь идет о числах"?
float - это ведь тоже число?

14
30 сентября 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата: Green
А что значит "переменные одинаковой длины"?
int и char[4] - это переменные одинаковой длины?


Согласен, нехорошо сформулировано. Правда и std::swap() такое не меняет.

Цитата: Green

Что значит "если речь идет о числах"?
float - это ведь тоже число?


Да, это не Rebbit-а формулировка. Поэтому я в итоге и сказал что точно ответить как он это понял может только он :).

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог