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

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

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

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

26.03.2014, 14:26. Просмотров 3447. Ответов 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;
            }
        }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 14:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать функцию swap (C++):

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

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

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

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

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

Написать функцию, которая, в зависимости от выбора пользователя вызывает соответствующую функцию - C++
Помогите, что то я не могу понять задачи, даже не знаю с чего начать)))) 5. Написать функцию, которая, в зависимости от выбора...

73
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 245
26.03.2014, 15:28  [ТС] #16
Спасибо some_name. Это то, что мне нужно!
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
26.03.2014, 15:38 #17
Цитата Сообщение от MastAKK Посмотреть сообщение
ValeryS, + и - тоже недолюбливаю, может быть переполнение,
и что???
смотри -2 и 3
a=0xFE
b=0x03

a=a+b;
b=a-b;
a=a-b;

a=0xFE+0x03=0x01(переполнение)
b=0x01-0x03=0xFE(переполнение)
a=0x01-0xFE=0x03(переполнение)
кругом переполнение а они поменялись
Цитата Сообщение от MastAKK Посмотреть сообщение
а с xor это менее вероятно (почти невероятно)
это не возможно покажи пример когда битовые операции вызовут переполнение
Цитата Сообщение от MastAKK Посмотреть сообщение
ИМХО, если есть возможность экономить память - нужно это делать
в зависимости от камня, иногда логические операции медленнее чем копирование
извечная дилемма скорость/память
0
MastAKK
145 / 136 / 12
Регистрация: 13.10.2012
Сообщений: 592
26.03.2014, 15:43 #18
ValeryS, ну, как говорится, на вкус и цвет
Вообще да, переполнение есть, но они меняются. Но меня напрягает сам факт переполнения.
А по-поводу логических операций - да, я что-то тупанул, переполнение вообще невозможно
1
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
26.03.2014, 15:54 #19
Цитата Сообщение от MastAKK Посмотреть сообщение
Но меня напрягает сам факт переполнения.
а зря, вполне штатная ситуация
например нужны значения переменной от нуля до 255
при int
вот так
C++
1
2
a++;
a%=256;
а при
unsigned char просто
C++
1
a++;
пример из жизни часы стрелочные
11 часов, добавили 3, переполнение, получилось 2
это частный случай деления по модулю
Цитата Сообщение от MastAKK Посмотреть сообщение
ну, как говорится, на вкус и цвет
пусть расцветает сто цветов

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

надеюсь согласен
2
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
26.03.2014, 17:22 #20
Цитата Сообщение от MastAKK Посмотреть сообщение
Имхо, с xor - один из лучших вариантов
Попробуйте обменять два равных значения.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
26.03.2014, 17:35 #21
Цитата Сообщение от gazlan Посмотреть сообщение
Попробуйте обменять два равных значения.
a=5 b=5
a=a^b 5^5=0
b=a^b 0^5=5
a=a^b 0^5=5

попробовал

Добавлено через 1 минуту
с минусами плюсами
a=a+b; 5+5=10
b=a-b; 10-5=5
a=a-b; 10-5=5
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
26.03.2014, 17:58 #22
Цитата Сообщение от ValeryS Посмотреть сообщение
попробовал
Угу. Запамятовал. Это не будет работать, если оба аргумента разделяют тот же самый адрес.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
26.03.2014, 18:21 #23
Цитата Сообщение от gazlan Посмотреть сообщение
Это не будет работать, если оба аргумента разделяют тот же самый адрес.
а зачем их тогда менять
0
gazlan
3133 / 1909 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
26.03.2014, 18:35 #24
Эта ситуация возможна, когда обмениваются элементы некоторого набора. Поэтому при использования XOR Swap() обязательна проверка на несовпадение адресов. Ссылку с ходу не дам, но парочка громких фэйлов, связанная с использованием этого трюка в DB точно была.

И, к слову, "наивный" метод с третьей переменной, обычно, эффективнее.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
26.03.2014, 18:59 #25
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вариант с прибитым гвоздями xor (или аналогичный) на современных машинах самый дурацкий. Т.к. вносит прямую зависимость операций, что препятствует эффективному параллельному выполнению внутри конвейера. Т.е. при мизерном выигрыше в памяти получаем замедление выполнения. Еще не стоит забывать, что обменивать так можно только целые числа. И еще, рекомендую чаще смотреть на ассемблерный код, который генерит ваш компилятор, не исключено, что он уже и так оптимизировал вариант с временной переменной, до варианта с xor. Во многих гайдланах к современным компиляторам к тому же написано, что не стоит заниматься ручной микрооптимизацией кода, т.к. это может заблокировать более эффективную и обширную оптимизацию компилятора.
Все это естественно не касается тех, кто пишет под встроенные системы, или около того. Там свои законы, и там оправданное применение xor-swap может найтись. Однако это не отменяет профилирования, а значит доказательства того, что именно этот вариант выигрывает по скорости в нашей задаче.
Юзать такое решение по-умолчанию, не очень хорошая идея, но знать про него безусловно полезно.
3
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
26.03.2014, 19:17 #26
Цитата Сообщение от DrOffset Посмотреть сообщение
но знать про него безусловно полезно.
В первую очередь полезно знать про нежелательность преждевременных оптимизаций, о чем уже, собственно, было сказано выше.
А варианты с ксорами сродни использованию сдвигов вместо деления/умножения на степень двойки. Часто они рассматриваются новичками как некоторое "хакерского" решение (которое якобы должно работать быстрее) без понимания сути происходящего.
2
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
26.03.2014, 19:57 #27
Цитата Сообщение от DrOffset Посмотреть сообщение
Еще не стоит забывать, что обменивать так можно только целые числа.
это почему еще

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void swapD(long long *a, long long *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
 
void swapF(int *a, int *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
.........................
float fA=10E30f;
float fB=10E-30f;
 
double dA=10E30;
double dB=10E-30;
 
 
swapD((long long*)&dA,(long long*)&dB);
swapF((int*)&fA,(int*)&fB);
прекрасно меняется

DrOffset, Tulosba, я с вами полностью согласен
а это я так, выпендриваюсь
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
26.03.2014, 20:02 #28
Цитата Сообщение от ValeryS Посмотреть сообщение
а это я так, выпендриваюсь
Зря. Потому что в стандартах С и С++ совершенно не гарантируется, что указатель будет целым числом. И это работает только потому, что на x86 указатели - целые. Но по стандарту твой код - UB.
1
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
26.03.2014, 20:11 #29
Цитата Сообщение от DrOffset Посмотреть сообщение
Потому что в стандартах С и С++ совершенно не гарантируется,
сошлюсь на Я. Гашека "Похождение бравого солдата Швейка"
"Много что не разрешается, но допускается"
Цитата Сообщение от DrOffset Посмотреть сообщение
что указатель будет целым числом. И это работает только потому, что на x86 указатели - целые.
а где ты указатели увидел?
я беру адрес и интерпретирую его содержимое по другому
UB. там может быть из за несовпадения размеров плавающих и целочисленных
0
DrOffset
26.03.2014, 20:18     Написать функцию swap
  #30

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
а где ты указатели увидел?
Да, сори - проглядел. Увидел параметры и перещелкнуло

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 20:18
Привет! Вот еще темы с ответами:

Написать функцию, которая могла бы передать значение в другую функцию - C++
как сделать функцию которая бы могла передать значеие в другую функцию ну к примеру a=4*b; где b=sin(fi);

не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек - C++
#include &lt;iostream&gt; #include&lt;Windows.h&gt; using namespace std; struct NE{ int x; NE *pnext,*ppor,*cur;}; class SPISOK { NE...

Написать функцию, которая, в зависимости от выбора пользователя вызывает функцию сложения, произведения - C++
Кто знает как можно решить эту задачу на С++? Написать функцию, которая, в зависимости от выбора пользователя вызывает функцию сложения,...

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


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

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

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