С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 116

Поменять местами две переменные

28.04.2017, 00:56. Показов 7755. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Текста будет много. Простите.)

У меня, казалось бы, очень простой вопрос: как поменять местами две переменные?
Вроде бы ответ прост. Используй дополнительную переменную, либо побитовую операцию. Но, недавно я начал смотреть гарвардский курс "Основы программирования CS50". Там они изучают программирование на языке С. В 10-11 лекциях они разбирали указатели. Во время лекции показали простенькую программу, которая содержала ошибку. Я написал такую же программу на Java и она выдает такой же результат как и в лекции. Вот программа:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Main {
 
    public static void main(String[] args) {
    // write your code here
        int n = 1;
        int m = 2;
 
        System.out.println("Data processing...");
        swap(n, m);
        System.out.println("Data processing completed. Result:");
        System.out.println("n = " + n);
        System.out.println("m = " + m);
    }
 
    static void swap(int n, int m) {
        n = n^m;
        m = n^m;
        n = n^m;
        System.out.println("n = " + n);
        System.out.println("m = " + m);
    }
}
Результат выполнения программы таков:

Data processing...
n = 2
m = 1
Data processing completed. Result:
n = 1
m = 2


Как видите: в методе переменные поменялись местами, но в главной функции все как было, так и осталось.
В лекции решением данной проблемы было использование указателей. Но судя по моим поискам(может я плохо искал), в Java нет указателей, либо они реализованы как то иначе, во всяком случае у меня не получилось сделать так же как в лекции. Вместо этого я нашел другой способ(на мой взгляд слегка кривой). Способ заключается в создании отдельного класса с переменной. Вот код:
Java
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
public class Main {
 
    public static void main(String[] args) {
    // write your code here
        int x =1;
        int y = 2;
        Ciphers c = new Ciphers();
        c.x = x;
        c.y = y;
 
        System.out.println("Data processing...");
        swap(c);
        x = c.x;
        y = c.y;
        System.out.println("Data processing completed. Result:");
        System.out.println("x = " + x);
        System.out.println("y = " + y);
    }
 
    static void swap(Ciphers c) {
        c.x = c.x^c.y;
        c.y = c.x^c.y;
        c.x = c.x^c.y;
        System.out.println("c.x = " + c.x);
        System.out.println("c.x = " + c.y);
    }
 
    public static class Ciphers
    {
        int x;
        int y;
    }
}
Результат работы:

Data processing...
c.x = 2
c.x = 1
Data processing completed. Result:
x = 2
y = 1


Теперь все работает. Но мне кажется, что это все таки слегка громоздкое решение...
Можно ли как-то решить эту задачу, чтобы в методе значения менялись, но не используя посредник в виде переменной в отдельном классе, а так же глобальной переменной?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2017, 00:56
Ответы с готовыми решениями:

Поменять местами 2 переменные не используя третью
Здравствуйте. Задача такова поменять местами 2 переменные не используя третью 4 способами : 2 арифметическими и 2 побитовыми. Я нашел 2...

Как сравнить две переменные в session.createQuery
при формировании результирующего списка поиска нужно сравнивать 2 переменные даты. Первая из них search3 приходит в виде строки из клиента...

Поменять две переменные местами
Возможно ли вывести значения переменных наоборот? Типо есть две переменные типов int - a и b, внутри них input'ы. И нужно вывести на экран...

5
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
28.04.2017, 06:53
Цитата Сообщение от Eugen167 Посмотреть сообщение
Можно ли как-то решить эту задачу, чтобы в методе значения менялись, но не используя посредник в виде переменной в отдельном классе, а так же глобальной переменной?
Нет. И не нужно извращаться, оставь байты Сишникам.
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 116
28.04.2017, 08:51  [ТС]
korvin_, в смысле?
Цитата Сообщение от korvin_ Посмотреть сообщение
Нет. И не нужно извращаться, оставь байты Сишникам.
Вы хотите сказать, что когда я в Java создаю инициализирую переменную, то память под нее не выделяется?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
28.04.2017, 09:43
Цитата Сообщение от Eugen167 Посмотреть сообщение
Вы хотите сказать, что когда я в Java создаю инициализирую переменную, то память под нее не выделяется?
Я хочу сказать, что заморачиваться такими низкоуровневыми вещами не нужно. Java не C и такой код там редко где пишут.

Java
1
2
3
4
public interface Swapable<T> {
 
    T swapped();
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public final class IntPoint implements Swapable<IntPoint> {
    
    public final int x;
    public final int y;
    
    public IntPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    @Override
    public IntPoint swapped() {
        return new IntPoint(y, x);
    }
 
    @Override
    public String toString() {
        return "IntPoint{" + "x=" + x + ", y=" + y + '}';
    }
}
Java
1
2
3
4
5
6
7
8
9
10
public final class Swap {
 
    public static void main(String[] args) {
        final IntPoint a = new IntPoint(1, 2);
        System.out.println("Data: " + a);
        System.out.println("Data processing...");
        final IntPoint b = a.swapped();
        System.out.println("Data processing completed. Result: " + b);
    }
}
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
28.04.2017, 10:16
Цитата Сообщение от Eugen167 Посмотреть сообщение
Можно ли как-то решить эту задачу, чтобы в методе значения менялись, но не используя посредник в виде переменной в отдельном классе, а так же глобальной переменной?
Можно. Причем очень просто:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Main {
 
    public static final <T> T returnFirst(final T first, final T second) {
        return first;
    }
 
    public static void main(String[] args) {
        int a = 3;
        int b = 4;
 
        a = returnFirst(b, b = a);
 
        System.out.println("a = " + a + ", b = " + b);
 
        double c = 14.675;
        double d = 21.778;
 
        c = returnFirst(d, d = c);
 
        System.out.println("c = " + c + ", d = " + d);
    }
}
6
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 116
28.04.2017, 12:23  [ТС]
HighPredator, Интересное решение))

korvin_, Я не заморачиваюсь, просто было любопытно, можно ли решить эту задачу примерно тем же способом, что и в С, но как я понял - нельзя. Вообщем спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2017, 12:23
Помогаю со студенческими работами здесь

Поменять местами две переменные. Не используя третей
Помогите пожалуйста решить задачу. :friends: Условие задачи: Нужно поменять местами две переменные не используя третей переменной. То есть...

Если поменять две переменные местами, в выражении меняется результат вычисления
Привет всем) У меня тут вопрос к вам. В функции scanf когда меняешь две переменные местами, в выражении меняется результат вычесления: ...

Не меняются местами две переменные
Пытаюсь поменять местами две переменные через ассемблерные вставки. Почему нет результата? #include &lt;iostream&gt; using namespace...

Две переменные обменять местами
Подскажите, правильно ли написан код. Нужно поменять местами значения переменных. class MathOper { public int A, B, C; public...

Поменять местами 3 переменные
Подскажите как 2 поменять я знаю но 3 никак поменять не могу. Кто подскажет


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru