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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 233
26.03.2014, 14:26     Написать функцию swap #1
был вот такой код:
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
Посмотрите здесь:

C++ Написать функцию, которая могла бы передать значение в другую функцию
C++ Напишите функцию Swap(a, b), аргументами которой могут быть числа любого типа
Создать функцию SWAP, преобразующую заглавные буквы передаваемой ей строки в строчные и наоборот C++
C++ Написать функцию, которая вычисляет объем и площадь поверхности параллелепипеда, описать функцию IsSquare(K)
не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
26.03.2014, 14:32     Написать функцию swap #2
Эм...Как-то странно вы написали функцию.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void swap ( int & a, int & b);
{
   int t = a;
   a = b;
   b = t;
}
 
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);
               
            }
        }
    }
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
26.03.2014, 14:33     Написать функцию swap #3
VitekSR, какого типа pro?
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 233
26.03.2014, 14:48  [ТС]     Написать функцию swap #4
pro типа int

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void swap ( int & p[i].pro, int & p[j].pro);
{
    int t = p[i].pro;
    p[i].pro = p[j].pro;
    p[j].pro = t;
}
 
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);
               
            }
        }
    }
такие ошибки:
Ошибка 1 error C2057: требуется константное выражение c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 43
Ошибка 6 error C2078: слишком много инициализаторов c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 56
Ошибка 4 error C2143: синтаксическая ошибка: отсутствие "," перед "." c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 43
Ошибка 5 error C2182: swap: недопустимое использование типа "void" c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 56
Ошибка 3 error C2234: p: недопустимый массив ссылок c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 43
Ошибка 2 error C2466: невозможно выделить память для массива постоянного нулевого размера c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 43
7 IntelliSense: выражение должно иметь константное значение c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 43
9 IntelliSense: недопустимый неполный тип c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 56
8 IntelliSense: требуется круглая скобка ")" c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 43
10 IntelliSense: требуется круглая скобка ")" c:\users\виктор\documents\visual studio 2010\projects\тестлабы2(2семестр)\тестлабы2(2семестр)\тест.cpp 56
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
26.03.2014, 14:51     Написать функцию swap #5
Вот так будет хорошо:
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;
            }
        }
    }
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 233
26.03.2014, 14:59  [ТС]     Написать функцию swap #6
нужно обязательно указать функцию swap

Добавлено через 1 минуту
может объявить функцию как то можно и вынести ее в начало кода, допустим перед main? или так нельзя?
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
26.03.2014, 15:06     Написать функцию swap #7
Лично я бы сделал так
C++
1
2
3
4
5
6
template <typename T>
void swap(T& par1, T& par2){
   par1 = par1^par2;
   par2 = par2^par1;
   par1 = par1^par2;
}

Но если шаблоны ещё не знаете (что наверняка), то можно сделать так:
C++
1
2
3
4
5
void swap(int& par1, int& par2){
   par1 = par1^par2;
   par2 = par2^par1;
   par1 = par1^par2;
}
P.S. терпеть не могу использование третьей переменной. Имхо, с xor - один из лучших вариантов
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
26.03.2014, 15:07     Написать функцию swap #8
VitekSR, а пример от Игорюня вам не подходит?
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
26.03.2014, 15:08     Написать функцию swap #9
Полный простой код с template

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
template <typename T>
void swap(T& par1, T& par2){
   par1 = par1^par2;
   par2 = par2^par1;
   par1 = par1^par2;
}
 
int main(){
   int a = 1, b = 42;
   swap<int>(a, b);
   std::cout << a << " " << b; //вывод: 42 1
}

Без шаблонов
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
void swap(int& par1, int& par2){
   par1 = par1^par2;
   par2 = par2^par1;
   par1 = par1^par2;
}
 
int main(){
   int a = 1, b = 42;
   swap(a, b);
   std::cout << a << " " << b; //вывод: 42 1
}
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 233
26.03.2014, 15:08  [ТС]     Написать функцию swap #10
я же скинул ошибки на пример от Игорюня
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
26.03.2014, 15:11     Написать функцию swap #11
Цитата Сообщение от VitekSR Посмотреть сообщение
я же скинул ошибки на пример от Игорюня
Таки у вас неправильно код переписан:
C++
1
void swap ( int & p[i].pro, int & p[j].pro);
1) p[i].pro тут НЕ НУЖЕН. Замените на просто имя переменной любое:
C++
1
void swap ( int & par1, int & par2)
2) У вас ; после закрывающей скобки, уберите её

Добавлено через 54 секунды
Сравните код Игорюня и свой
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
26.03.2014, 15:12     Написать функцию swap #12
во-во
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,419
26.03.2014, 15:15     Написать функцию swap #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если правильно понял что нужно, то вот:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include <iostream>
 
struct MyType{
    int pro;    
};
 
void swap ( int & a, int & b)
{
    int t = a;
    a = b;
    b = t;
}
 
int main(){
 
    const int length = 5;
 
    MyType p[length];
        
    //initialization array
    for(int i = 0; i < length; ++i){         
        std::cout<<(p[i].pro = rand()%length)<<"  ";
    }
    std::cout<<std::endl;
    //sorting
    for(int i = 0; i < length - 1; ++i){
        for(int j = i + 1; j < length; ++j){
            if(p[i].pro < p[j].pro){
                swap (p[i].pro, p[j].pro);
            }
        }
    } 
    //out
    for(int i = 0; i < length; ++i){         
        std::cout<<p[i].pro<<"  ";
    }
 
    system("pause");
    return 0;
}
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
26.03.2014, 15:20     Написать функцию swap #14
Цитата Сообщение от MastAKK Посмотреть сообщение
P.S. терпеть не могу использование третьей переменной. Имхо, с xor - один из лучших вариантов
а есть еще с + -
чем это третья переменная так не угодила, при современных то объемах памяти
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
26.03.2014, 15:23     Написать функцию swap #15
ValeryS, + и - тоже недолюбливаю, может быть переполнение, а с xor это менее вероятно (почти невероятно)
ИМХО, если есть возможность экономить память - нужно это делать
VitekSR
0 / 1 / 0
Регистрация: 20.10.2013
Сообщений: 233
26.03.2014, 15:28  [ТС]     Написать функцию swap #16
Спасибо some_name. Это то, что мне нужно!
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
26.03.2014, 15:38     Написать функцию swap #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 Посмотреть сообщение
ИМХО, если есть возможность экономить память - нужно это делать
в зависимости от камня, иногда логические операции медленнее чем копирование
извечная дилемма скорость/память
MastAKK
 Аватар для MastAKK
144 / 135 / 12
Регистрация: 13.10.2012
Сообщений: 586
Записей в блоге: 1
26.03.2014, 15:43     Написать функцию swap #18
ValeryS, ну, как говорится, на вкус и цвет
Вообще да, переполнение есть, но они меняются. Но меня напрягает сам факт переполнения.
А по-поводу логических операций - да, я что-то тупанул, переполнение вообще невозможно
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
26.03.2014, 15:54     Написать функцию swap #19
Цитата Сообщение от MastAKK Посмотреть сообщение
Но меня напрягает сам факт переполнения.
а зря, вполне штатная ситуация
например нужны значения переменной от нуля до 255
при int
вот так
C++
1
2
a++;
a%=256;
а при
unsigned char просто
C++
1
a++;
пример из жизни часы стрелочные
11 часов, добавили 3, переполнение, получилось 2
это частный случай деления по модулю
Цитата Сообщение от MastAKK Посмотреть сообщение
ну, как говорится, на вкус и цвет
пусть расцветает сто цветов

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

надеюсь согласен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2014, 17:22     Написать функцию swap
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,921
Записей в блоге: 1
26.03.2014, 17:22     Написать функцию swap #20
Цитата Сообщение от MastAKK Посмотреть сообщение
Имхо, с xor - один из лучших вариантов
Попробуйте обменять два равных значения.
Yandex
Объявления
26.03.2014, 17:22     Написать функцию swap
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru