Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
#1

Обмен значениями двух переменных - C++

15.09.2013, 18:13. Просмотров 2888. Ответов 36
Метки нет (Все метки)

Нашёл на другом форуме занятную формулу обмена значений двух переменных(очевидно на с++):
b = – –a + (a=b)*0;
Проверил на числах 1 и 101, рез 101 и 101. Помогите, было бы круто, формула в одну строку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2013, 18:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обмен значениями двух переменных (C++):

Определить процедуру, осуществляющую обмен значениями двух переменных - C++
Составить программу, в результате которой величина а меняется значением с величиной b, а величина с с величиной d(Определить процедуру,...

Обмен значениями двух переменных А и В без использования вспомогательной переменной - C++
Сконструировать алгоритм обмена значениями двух переменных А и В без использования вспомогательной переменной

Обмен между значениями двух переменных, не используя при этом третьей переменной - C++
Подскажите как написать программу, которая производит обмен между значениями двух переменных, не используя при этом третьей переменной

Обмен значениями двух чисел через указатели и функцию - C++
Должны использоваться аргументы типа ( int * ) Вот код: #include <iostream> void exchange ( int * v1, int * v2 )...

Программа обмена значениями двух переменных a и b - C++
3.8 Составить программу обмена значениями двух переменных a и b. Разработать два варианта решения задачи – с исполь-зованием...

Обмен значениями - C++
Не понимаю, почему в двух последних случаях обмен значений переменных не происходит. #include <iostream> void swapr(int & a, int &...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
15.09.2013, 18:19 #2
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Помогите, было бы круто, формула в одну строку.
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
C++
1
2
3
a=a^b;
b=b^a;
a=a^b;
ну или арифметический вариант
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:21  [ТС] #3
Цитата Сообщение от ValeryS Посмотреть сообщение
что то сомнения она у меня вызывает похоже на неопределенное поведение
а чем тебя не устраивает классическое
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
Catstail
Модератор
22546 / 10951 / 1776
Регистрация: 12.02.2012
Сообщений: 18,087
15.09.2013, 18:24 #4
Цитата Сообщение от ValeryS Посмотреть сообщение
ну или арифметический вариант
- этот вариант может вызвать переполнение...
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
15.09.2013, 18:36 #5
Цитата Сообщение от Catstail Посмотреть сообщение
- этот вариант может вызвать переполнение...
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Задали придумать семь способов, 6 уже осилил, нужен седьмой.
ну этот то явно не годится или ты не так списал
Цитата Сообщение от Андрей1992 Посмотреть сообщение
b = – –a + (a=b)*0;
смотри 2 числа
сначала a=b поскольку в скобках
получилось два числа b
потом умножаем на 0
получаем
b= - -b+0;
b=b

Добавлено через 2 минуты
Цитата Сообщение от Андрей1992 Посмотреть сообщение
6 уже осилил, нужен седьмой.
покаж что осилил
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:39 #6
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Нашёл на другом форуме занятную формулу обмена значений двух переменных(очевидно на с++):
b = – –a + (a=b)*0;
Проверил на числах 1 и 101, рез 101 и 101. Помогите, было бы круто, формула в одну строку.
C++
1
2
3
#include <utility>
...
std::swap(a, b);
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:43  [ТС] #7
Цитата Сообщение от ValeryS Посмотреть сообщение
покаж что осилил
Доп. переменная
C++
1
2
3
с=a;
a=b;
b=c;
Сумма-разность
C++
1
2
3
a=a+b;
b=a-b;
a=a-b;
XOR
C++
1
2
3
a=a^b;
b=b^a;
a=a^b;
Сумма
C++
1
2
3
a=-(a+b);
b=-(a+b);
a=-(a+b);
Деление умножение
C++
1
2
3
a=a/b;
b=b*a;
a=b/a;
Какая-то абракадабра
C++
1
2
3
a=a+2*(b-a);
b=b-(a-b);
a=a-(a-b)/2;
Может не всё подходит не для всех типов, но это и не требуется, нужно чтобы для целых чисел подходило.
Catstail
Модератор
22546 / 10951 / 1776
Регистрация: 12.02.2012
Сообщений: 18,087
15.09.2013, 18:44 #8
Цитата Сообщение от ValeryS Посмотреть сообщение
может посему "исключающие ИЛИ" более надежен
да и более красив по моему
- безусловно! И более быстр.
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 18:46  [ТС] #9
Цитата Сообщение от Nekto Посмотреть сообщение
C++
1
2
3
#include <utility>
...
std::swap(a, b);
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
15.09.2013, 18:47 #10
Цитата Сообщение от Андрей1992 Посмотреть сообщение
способы нужны ещё такие, которые можно применить математически, а способности языка и компьютера всё таки не то.
Раздел форума не тот.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
15.09.2013, 18:53 #11
в порядке бреда
цикл через флаг переноса (поскольку в Си нет эмулируем)
для байта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned char a=5;
unsigned char b=7;
 
unsigned char bt1=a&0x01;
unsigned char bt2=b&0x01;
 
for(int i=0;i<8;i++)
{
 a=a>>1+0x80*bt2;
 b=b>>1+0x80*bt1;
 bt1=a&0x01;
 bt2=b&0x01;
}
для int цикл увеличить до 32 и умножать на 0x80000000
zer0mail
2332 / 1958 / 192
Регистрация: 03.07.2012
Сообщений: 7,021
Записей в блоге: 1
15.09.2013, 18:55 #12
Цитата Сообщение от Catstail Посмотреть сообщение
- безусловно! И более быстр.
Но не быстрее элементарного и универсального:
C++
1
2
3
x=a;
a=b;
b=x;
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 20:47  [ТС] #13
Всем спасибо, нашёл 7 способ.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
15.09.2013, 21:02 #14
Цитата Сообщение от Андрей1992 Посмотреть сообщение
Всем спасибо, нашёл 7 способ.
ну дак покаж
Андрей1992
0 / 0 / 1
Регистрация: 13.06.2012
Сообщений: 60
15.09.2013, 22:43  [ТС] #15
Цитата Сообщение от ValeryS Посмотреть сообщение
ну дак покаж
Ничего интересного, обычное извращение с арифметикой.
C++
1
2
3
a=a*10000+b;
b=a / 10000;
a=a % 10000;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 22:43
Привет! Вот еще темы с ответами:

Обмен переменных string - C++
Здравствуйте. Подскажите пожалуйста, как ПРАВИЛЬНО и КРАСИВО поменять местами две string-переменные? Делаю следующим образом: ...

Массивы (ввести данные целого типа, вывести на экран, выполните обмен значениями) - C++
Введите с клавиатуры данные в массив целого типа, выведите их на экран, затем выполните обмен значениями для первого и последнего элементов...

Составить программу обмена значениями трёх переменных - C++
Условия задачи такие: Составить программу обмена значениями трёх переменных величин a,b,c по след схеме: b присвоить значение c, a...

Вывести результат двух операций с использованием двух переменных - C++
Такие дела: надо ввести с клавиатуры 4 переменные, используя только 2 int, и посчитать результат двух выражений Есть такой вариант, но...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.09.2013, 22:43
Ответ Создать тему
Опции темы

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