Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/65: Рейтинг темы: голосов - 65, средняя оценка - 4.52
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
1

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

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

Author24 — интернет-сервис помощи студентам
был вот такой код:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2014, 14:26
Ответы с готовыми решениями:

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

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

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

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

73
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
26.03.2014, 14:32 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);
               
            }
        }
    }
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
26.03.2014, 14:33 3
VitekSR, какого типа pro?
0
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
26.03.2014, 14:48  [ТС] 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
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
26.03.2014, 14:51 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;
            }
        }
    }
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
26.03.2014, 14:59  [ТС] 6
нужно обязательно указать функцию swap

Добавлено через 1 минуту
может объявить функцию как то можно и вынести ее в начало кода, допустим перед main? или так нельзя?
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
26.03.2014, 15:06 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 - один из лучших вариантов
2
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
26.03.2014, 15:07 8
VitekSR, а пример от Игорюня вам не подходит?
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
26.03.2014, 15:08 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
}
1
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
26.03.2014, 15:08  [ТС] 10
я же скинул ошибки на пример от Игорюня
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
26.03.2014, 15:11 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 секунды
Сравните код Игорюня и свой
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
26.03.2014, 15:12 12
во-во
0
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
26.03.2014, 15:15 13
Лучший ответ Сообщение было отмечено VitekSR как решение

Решение

Если правильно понял что нужно, то вот:
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;
}
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
26.03.2014, 15:20 14
Цитата Сообщение от MastAKK Посмотреть сообщение
P.S. терпеть не могу использование третьей переменной. Имхо, с xor - один из лучших вариантов
а есть еще с + -
чем это третья переменная так не угодила, при современных то объемах памяти
0
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
26.03.2014, 15:23 15
ValeryS, + и - тоже недолюбливаю, может быть переполнение, а с xor это менее вероятно (почти невероятно)
ИМХО, если есть возможность экономить память - нужно это делать
0
0 / 1 / 4
Регистрация: 20.10.2013
Сообщений: 270
26.03.2014, 15:28  [ТС] 16
Спасибо some_name. Это то, что мне нужно!
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
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
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
26.03.2014, 15:43 18
ValeryS, ну, как говорится, на вкус и цвет
Вообще да, переполнение есть, но они меняются. Но меня напрягает сам факт переполнения.
А по-поводу логических операций - да, я что-то тупанул, переполнение вообще невозможно
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
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
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
26.03.2014, 17:22 20
Цитата Сообщение от MastAKK Посмотреть сообщение
Имхо, с xor - один из лучших вариантов
Попробуйте обменять два равных значения.
0
26.03.2014, 17:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2014, 17:22
Помогаю со студенческими работами здесь

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

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

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

не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек
#include &lt;iostream&gt; #include&lt;Windows.h&gt; using namespace std; struct NE{ int x; NE...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru