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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 244
#1

Написать функцию swap - C++

26.03.2014, 14:26. Просмотров 3278. Ответов 73
Метки нет (Все метки)

был вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
for(i = 0; i < n - 1; i++)
    {
        for(j = i + 1; j < n; j++)
        {
            if(p[i].pro < p[j].pro)
            {
            swap (p[i], p[j]);
            }
        }
    }
нужно теперь написать функцию swap, вот мои наброски, но почему то ничего не получается, помогите:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i = 0; i < n - 1; i++)
    {
        for(j = i + 1; j < n; j++)
        {
            if(p[i].pro < p[j].pro)
            {
                void swap (p[i].pro, p[j].pro);
                int t = p[i].pro;
                p[i].pro = p[j].pro;
                p[j].pro = t;
            }
        }
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 14:26     Написать функцию swap
Посмотрите здесь:

Заменить функцию swap - C++
У меня есть программа. Я задаю массив, потом мне выводится массив, в котором удаляются все повторяющиеся элементы. Как можно заменить...

Чем можно заменить функцию swap? - C++
Чем можно заменить функцию swap? Она на моем компиляторе не работает. Библиотеку iostream включал.

Массив: Описать функцию swap(A,B), меняющую местами максимальные элементы матриц А и В. - C++
Надо исправить программу чтобы заработала. У самой уже ничего не получается=(( Описать функцию swap(A,B), меняющую местами максимальные...

Создать функцию SWAP, преобразующую заглавные буквы передаваемой ей строки в строчные и наоборот - C++
Создать функцию SWAP, преобразующую заглавные буквы передаваемой ей строки в строчные и наоборот. С помощью этой функции преобразовать...

Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа - C++
Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа. Функция меняет значения своих аргументов и не возвращает...

Написать встроенную функцию min () и обычную функцию imin (), которые возвращают меньшее из двух целых значений - C++
Написать встроенную функцию min () и обычную функцию imin (), которые возвращают меньшее из двух целых значений.

swap - C++
Ф-ция swap, ее написание/подключение. В общем объясните и расскажите как ее подключить и т.д. Спасибо.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
26.03.2014, 20:19     Написать функцию swap #31
Обсуждение в MSDN: Stupid Coding Tricks
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
26.03.2014, 20:22     Написать функцию swap #32
gazlan,
я так понял что там неоднозначность из-за точек следования
недавно где то тема такая пролетала и именно с такой конструкцией
C++
1
a ^= b ^= a ^= b;
gazlan
3130 / 1905 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
26.03.2014, 20:29     Написать функцию swap #33
Цитата Сообщение от ValeryS Посмотреть сообщение
неоднозначность из-за точек следования
Там еще и интересные комментарии к статье :-)
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,790
27.03.2014, 16:00     Написать функцию swap #34
Цитата Сообщение от gazlan Посмотреть сообщение
Обсуждение в MSDN: Stupid Coding Tricks
"During a lunch interview, ... wrote on a napkin: a ^= b ^= a ^= b;"
("За завтраком... написал на салфетке ..." )
Прочитал 1-ю строчку и подумал, стоит ли читать дальше?
Автор заметки "Stupid Coding Tricks", видимо, плохо понимает, о чём пишет. Он путает
1) порядок выполнения операций ^=
этот порядок задан однозначно, т.к. a ^= b ^= a ^= b; эквивалентно a ^= (b ^= (a ^= b) );
2) порядок вычисления аргументов (сначала a, потом b или наоборот). Здесь, действительно C++ не даёт никаких гарантий.

Добавлено через 1 час 22 минуты
Здесь (см.пример на C++) ( Алгоритм обмена при помощи исключающего ИЛИ ) (см.пример на C++) объясняется, почему неправильна запись x ^= (y ^= (x ^= y));
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
27.03.2014, 16:08     Написать функцию swap #35
Цитата Сообщение от Alex5 Посмотреть сообщение
Здесь (см.пример на C++)
я не могу найти, где то здесь на форуме, месяца два назад,человек писал, что всегда пользовался
вот такой записью
C++
1
a ^= b ^= a ^= b;
и все работало, но стоило изменить аргументы, то ли с указателя на ссылку то ли наоборот, и все рухнуло
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,790
27.03.2014, 21:22     Написать функцию swap #36
Цитата Сообщение от ValeryS Посмотреть сообщение
месяца два назад,человек писал
Да, в начале февраля рассматривалась эта тема:
Цитата Сообщение от Pershin Посмотреть сообщение
вторая запись перестает работать, если вынести обмен в функцию
Хотелось бы разобраться. Компилятор gcc 4.6.3.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2015, 15:42     Написать функцию swap #37
Ксор переполняет каждый бит и гарантированно. В данной задаче это не критично, так как переполнение строго парно и исправляет само себя, но беда ксора в неприменимости к большинству типов.

Добавлено через 2 минуты
Цитата Сообщение от gazlan Посмотреть сообщение
Попробуйте обменять два равных значения.
C++
1
2
3
a^=b; // Здесь a обнуляется
b^=a; // Ксор с нолём равен второму операнду, b сохраняет значение
a^=b; // Ксор с нолём равен второму операнду, a восстанавливает значение
Добавлено через 1 минуту
Цитата Сообщение от gazlan Посмотреть сообщение
Угу. Запамятовал. Это не будет работать, если оба аргумента разделяют тот же самый адрес.
Тогда сама задача обмена стоять не должна.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
это почему еще
C++
1
void swapD(long long *a, long long *b)
А ничего, что полное имя long long вообще то long long int?

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
void swapF(int *a, int *b)
Указатель есть целое специального вида, предназначенное для хранения адреса функции, или другого данного, то есть для хранения номер байта (трайта).
Нужны комментарии?

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
swapF((int*)&fA,(int*)&fB);
А это только при совпадении размеров. И приведение в данном контексте - грязный хак.
MrGluck
Модератор
Эксперт CЭксперт С++
7178 / 4344 / 634
Регистрация: 29.11.2010
Сообщений: 11,817
14.03.2015, 17:14     Написать функцию swap #38
Цитата Сообщение от MastAKK Посмотреть сообщение
par1 = par1^par2;
Хреновый вариант. Если менять переменные с одним и тем же адресом он их обнулит.

А для шаблонов - попробуйте передать в swap пользовательский тип. Не вышло? Всё дело в том, что данный алгоритм подходит только для типов, у которых определён operator^.

Добавлено через 2 минуты
Мой вариант (С++11)
C++
1
2
3
4
5
6
7
template <typename T>
void swap(T &a, T &b)
{
    T tmp(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}
Стоит отметить, что явно указывать тип у шаблонной функции при вызове не требуется.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2015, 17:54     Написать функцию swap #39
Цитата Сообщение от MrGluck Посмотреть сообщение
реновый вариант. Если менять переменные с одним и тем же адресом он их обнулит.
При совпадении адресов имеет одну переменную и задача обмена её местами просто не может существовать.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
14.03.2015, 18:06     Написать функцию swap #40
Цитата Сообщение от taras atavin Посмотреть сообщение
А ничего, что полное имя long long вообще то long long int?
вообще то int допускается опускать
long long тоже самое, что и long long int
short тоже самое, что и short int
Цитата Сообщение от taras atavin Посмотреть сообщение
А это только при совпадении размеров. И приведение в данном контексте - грязный хак.
а я где то утверждал обратное?
Цитата Сообщение от ValeryS Посмотреть сообщение
я беру адрес и интерпретирую его содержимое по другому
UB. там может быть из за несовпадения размеров плавающих и целочисленных
Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
Нужны комментарии?
желательно
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2015, 18:32     Написать функцию swap #41
Цитата Сообщение от ValeryS Посмотреть сообщение
вообще то int допускается опускать
long long тоже самое, что и long long int
опускать и подразумевать. Дробным он от этого не становится.

Добавлено через 5 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
а я где то утверждал обратное?
Вы утверждали, что ксор меняет местами действительные переменные, а на самом деле в Вашем примере ксор меняет местами целые коды переменных. Действительных? Эйси. Но путём грязного хака и благодаря совпадению разрядностей фактического действительного и встроенного целого типов. Функция то работает с целыми переменными. А попробуйте ксором поменять местами непосредственно действительные переменные без приведения.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
желательно
Указатель тоже целый, даже если его нельзя присвоить ни одному другому целому и ни какое другое целое нельзя присвоить указателю. Соответственно возможность поменять местами ксором два указателя - не аргумент. Не важно, что гарантирует и чего не гарантирует стандарт, указатель есть переменная, или константа, хранящая адрес, а адрес есть номер байта, он концептуально целый. Можно обвешать его флагами как автобус с послами всего Евросоюза, можно прицепить к нему размер адресуемой памяти, можно накрутить любые фокусы со сдвигами и базированием, базы сложить в каталог страниц виртуальной памяти, но всё это лишь упаковка, а в основе всё тот же номер байта.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
14.03.2015, 20:21     Написать функцию swap #42
Цитата Сообщение от taras atavin Посмотреть сообщение
опускать и подразумевать. Дробным он от этого не становится.
я и не работал с дробными
еще раз, я привел плавающие к виду целого и поменял бит в бит
Цитата Сообщение от taras atavin Посмотреть сообщение
Но путём грязного хака
а я не отрицаю
Цитата Сообщение от taras atavin Посмотреть сообщение
благодаря совпадению разрядностей фактического действительного и встроенного целого типов.
Не совпадению, а знанию платформы на которой я работаю, где-нибудь на AVRке я бы применил другой "грязный хак", знание и пользование две разных вещи
Цитата Сообщение от taras atavin Посмотреть сообщение
Функция то работает с целыми переменными.
наконец то догадался
Цитата Сообщение от taras atavin Посмотреть сообщение
Указатель тоже целый, даже если его нельзя присвоить ни одному другому целому и ни какое другое целое нельзя присвоить указателю. Соответственно возможность поменять местами ксором два указателя - не аргумент.
где я меняю указатели? и можно ли их поменять?
в функции идет разыменование к тому типу который мне нужен
Цитата Сообщение от taras atavin Посмотреть сообщение
А попробуйте ксором поменять местами непосредственно действительные переменные без приведения.
на ассемблере пожалуйста, а Си не дает

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
и ни какое другое целое нельзя присвоить указателю.
т.е я вот так не могу написать
C++
1
char*  a=0x40000000;
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.03.2015, 20:28     Написать функцию swap #43
Цитата Сообщение от ValeryS Посмотреть сообщение
наконец то догадался
Не догадался, а прочитал в прототипе и не наконецто, а сразу.

Добавлено через 39 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
на ассемблере пожалуйста, а Си не дает
О чём собственно и речь.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
и ни какое другое целое нельзя присвоить указателю.
т.е я вот так не могу написать
Код C++
1
char* a=0x40000000;
На c++ можете. Но указатель остаётся целым даже в том случае, когда так писать нельзя и дело не в стандарте языка, а в самой концепции адресации однородной памяти.
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,269
Завершенные тесты: 3
14.03.2015, 20:30     Написать функцию swap #44
Ого, так хором можно такие вещи вытворять... Ничего себе. Ребят, лень тему всю читать, также можно поступать с числами с плав. запятой?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2015, 20:35     Написать функцию swap
Еще ссылки по теме:

swap - C++
max, swap, min входят в &lt;iostream&gt; это стандартные функции?

swap - C++
Cи подчеркивает swap и говорит что он не определен! в данном случаи а это массив, а i и j индексы элементов swap(a,i,j)

Функция swap() - C++
А что выгоднее с точке зрения быстродействия - использование стандартной функции или &quot;ручной&quot; обмен через промежуточную...

Функция swap - C++
Доброго времени суток! Задался вопросом о реализации алгоритмов обмена двух переменных, но кроме этих ничего другого придумать не...

Объясните о swap() - C++
Есть такое задание: Описать процедуру Minmax(x,y) записывающую в переменную Х минимальное из значений Х и Y, а в переменную Y –...


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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
14.03.2015, 20:35     Написать функцию swap #45
Цитата Сообщение от tnk500 Посмотреть сообщение
также можно поступать с числами с плав. запятой?
вообще то нет
но попытайся, вдруг что получится
Цитата Сообщение от tnk500 Посмотреть сообщение
Ребят, лень тему всю читать,
почитал бы, такой вопрос бы не возник
Цитата Сообщение от taras atavin Посмотреть сообщение
На c++ можете. Но указатель остаётся целым даже в том случае, когда так писать нельзя
я присваиваю адрес,
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
char*a=0x40000000;
в данном случае на Винде, адрес начала исполняемого модуля
а адрес и есть целое число, очень трудно представить себе дробный адресс
Yandex
Объявления
14.03.2015, 20:35     Написать функцию swap
Ответ Создать тему
Опции темы

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