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

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

Войти
Регистрация
Восстановить пароль
 
Oleg_Brovko
8 / 8 / 1
Регистрация: 07.03.2012
Сообщений: 57
#1

Не происходит обмена значениями. В чем проблема? - C++

08.04.2012, 14:31. Просмотров 369. Ответов 5
Метки нет (Все метки)

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
42
#include <iostream>
 
using namespace std;
 
void change(int &a, int &b);
 
int main()
{
    int a=1,b=2;
 
    cout<<a<<endl;
    cout<<b<<endl;
 
    change(a,b);
 
    cout<<a<<endl;
    cout<<b<<endl;
 
 
 
 
    return 0;
 
 
 
}
 
void change(int &a, int &b)
{ 
    int* pa=&a;
    int* pb=&b;
    int* pc=NULL;
 
    pc=pa;
    pa=pb;
    pb=pc;
 
    a=*pb;
    b=*pa;
    
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 14:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не происходит обмена значениями. В чем проблема? (C++):

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

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

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

ПРоблема со значениями массива - C++
Пишу программу, в ней есть массив, значения которого задаются рандомно от 1 до 9. Когда вызывается функция, определяющая среднее значение,...

Не могу найти ошибку. Нужно написать функцию обмена значениями для 2 целых чисел. Вот мой код - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include&lt;iostream&gt; using namespace std; void F(int a, int b) { a = a + b; b = a -...

В чем проблема со следующим циклом? - C++
Возможно, в том что не указаны какие-то переменные? for (int Counter=0; Counter==10; ++Counter) cout &lt;&lt; Counter &lt;&lt;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.04.2012, 18:00 #2
Вы сами себя запутали с этими указателями. Давайте посмотрим, как всё это будет располагаться в памяти:
Пусть переменные a и b лежат в памяти последовательно, в адресах 0x100 и 0x104 соответственно. Пусть мы ввели 10 и 20. Память будет выглядеть так:
Код
|-----|-----|
|0x000|@@@@@|
|-----|-----|
|~~~~~|~~~~~|
|-----|-----|
|0x100|  10 |
|-----|-----|
|0x104|  20 |
|~~~~~|~~~~~|
При передаче ссылок в функцию передаются фактически указатели, т.е. функция "видит" тот же участок памяти. При инициализации указателей получаем:
Код
      |-----|-----|
pc -> |0x000|@@@@@|
      |-----|-----|
      |~~~~~|~~~~~|
      |-----|-----|
pa -> |0x100|  10 |
      |-----|-----|
pb -> |0x104|  20 |
      |~~~~~|~~~~~|
В результате 34-36 строк получаем:
Код
          |-----|-----|
          |0x000|@@@@@|
          |-----|-----|
          |~~~~~|~~~~~|
          |-----|-----|
pc, pb -> |0x100|  10 |
          |-----|-----|
pa     -> |0x104|  20 |
          |~~~~~|~~~~~|
Т.е. указатели мы и правда обменяли местами. Но теперь pa указывает на ячейку, в которой хранится 20 (значение b), а pb наоборот, на ячейку со значением 10 (значение a). Таким образом, в 38 строке мы в а записываем 10, т.е. то, что там уже и было. То же и в 39 строке с b.
Правильная реализация функции swap такая (и никаких указателей):
C++
1
2
3
4
5
6
7
void int_swap(int& a, int& b)
{
    int temp = a;
    
    a = b;
    b = temp;
}
1
Oleg_Brovko
8 / 8 / 1
Регистрация: 07.03.2012
Сообщений: 57
10.04.2012, 22:45  [ТС] #3
Спасибо большое! А можно ли реализовать как-то через указатели?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.04.2012, 22:47 #4
Oleg_Brovko,
C++
1
2
3
4
5
6
7
void int_ptr_swap(int *a, int *b)
{
    int temp = *a;
    
    *a = *b;
    *b = temp;
}
1
Oleg_Brovko
8 / 8 / 1
Регистрация: 07.03.2012
Сообщений: 57
10.04.2012, 22:49  [ТС] #5
Если знаешь - все просто. Спасибо!
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
10.04.2012, 23:39 #6
Для общего развития:
для обмена двух переменных одного типа в с++ есть функция swap, пример:
C++
1
2
3
4
5
int x=3;
int y=103;
swap(x,y);
cout<<x;//103
cout<<y;//3
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2012, 23:39
Привет! Вот еще темы с ответами:

Перевернуть строку. В чем проблема? - C++
#include &lt;iostream&gt; using namespace std; void swapstr(char* str) { for(int i=0; i&lt;strlen(str)/2-1;i++) { char...

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

выдает ошибку : cannot find -lbgi...в чем проблема? - C++
#include &lt;stdio.h&gt; int main() { int i,j,n,flag=0,sum1=0,sum2=0,sum3,sum4; printf(&quot;vvedite razmer massiva&quot;); ...

помогите не пойму в чем проблема компилятор не выдает ошибку,но не вычисляет произведение - C++
задача:1) Дан массив A. Вычислить произведение между первым и последним положительными элементами. Программа: #include &lt;iostream.h&gt; ...


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

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

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