Уведомления
Очистить все

Поменять значения двух переменных, не используя третью, средствами языка 1С

4 Записи
1 Пользователи
0 Likes
9,034 Просмотры
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Начнём со стандартного алгоритма (Куда без него)))

&НаКлиенте
Процедура Команда1(Команда)
	
	а = 5;
	б = 10;
	
	Сообщить("==================");
	Сообщить(СтрШаблон("Было: а = %1; б = %2", Строка(а), Строка(б)));
	
	а = а + б;	
	б = а - б;	
	а = а - б; 
	
	Сообщить(СтрШаблон("Стало: а = %1; б = %2", Строка(а), Строка(б)));
	Сообщить("=================="); 
	
	// Вывод
	// ==================
	// Было: а = 5; б = 10
	// Стало: а = 10; б = 5
	// ==================
	
КонецПроцедуры

   
Цитата
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Далее, пример стандартного алгоритма, но немного модифицированного. - Просто для более углубленного раскрытия темы.

Смотрите, если уж совсем докопаться до примера, то можно увидеть, что мы используем целые числа: Тип: int, который имеет ограничения на размер числа, как в сторону знака "-", так и в сторону знака "+". (Всё это к 1С не относится. 1С не имеет таких явных типов и ограничений!)

То, так скажем, при использовании стандартного (вышеуказанного) алгоритма (обмена значениями переменных) и применении его в других языках программирования или системах, можно получить критическую ошибку - "переполнение" в "узком: месте кода:

а = а + б;	

Представьте, что "а" и "б" - эти обе переменных, равны максимальному возможному значению и при суммировании их, возникнет ошибка...

Обратите на это внимание, на будущее.

(Да и если уже совсем прямо докопаться, то и использование русскоязычных символов в именах переменных других языков программирования, в большинстве случаев недопустимо)))

Ладно, всё это присказки, перейдём непосредственно к алгоритму, где (Если возникают ограничения с использованием памяти - просто уменьшим промежуточное число):

&НаКлиенте
Процедура Команда2(Команда)
	
	а = 5;
	б = 10;
	
	Сообщить("==================");
	Сообщить(СтрШаблон("Было: а = %1; б = %2", Строка(а), Строка(б)));	
	
	а = а / б;
	б = а * б;
	а = б / а;
	
	Сообщить(СтрШаблон("Стало: а = %1; б = %2", Строка(а), Строка(б)));
	Сообщить("==================");
	
	// Можно, конечно, для итоговых результатов использовать и функцию: Цел(<Число>), 
	// которая "Вычисляет целую часть переданного числа, полностью отсекая дробную часть."
	// Но, в "академических" целях, хочу показать, что небольшая погрешность, как правило, автоматически пропадает при вычислении.
	
	// Вывод
	// ==================
	// Было: а = 5; б = 10
	// Стало: а = 10; б = 5
	// ==================
	
КонецПроцедуры

   
ОтветитьЦитата
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Используем "Структуру"

&НаКлиенте
Процедура Команда3(Команда)
	
	а = 5;
	б = 10;
	
	Сообщить("==================");
	Сообщить(СтрШаблон("Было: а = %1; б = %2", Строка(а), Строка(б)));
	
	СтруктураДляРасчетов = Новый Структура;	
	СтруктураДляРасчетов.Вставить("а", б); 
	СтруктураДляРасчетов.Вставить("б", а);
	
	а = СтруктураДляРасчетов.а;
	б = СтруктураДляРасчетов.б;
	
	Сообщить(СтрШаблон("Стало: а = %1; б = %2", Строка(а), Строка(б)));
	Сообщить("==================");	
	
	// Вывод
	// ==================
	// Было: а = 5; б = 10
	// Стало: а = 10; б = 5
	// ==================
	
КонецПроцедуры

   
ОтветитьЦитата
65-150 Okolokompa Форум
(@kalininalex)
Reputable Member
Присоединился: 4 года назад
Записи: 160
Создатель темы  

Используем "Соответствие"

&НаКлиенте
Процедура Команда4(Команда)
	
	а = 5;
	б = 10;
	
	Сообщить("==================");
	Сообщить(СтрШаблон("Было: а = %1; б = %2", Строка(а), Строка(б)));
	
	СоответствиеДляРасчетов = Новый Соответствие;	
	СоответствиеДляРасчетов.Вставить(а, б); 
	СоответствиеДляРасчетов.Вставить(б, а);
	
	а = СоответствиеДляРасчетов.Получить(а);
	б = СоответствиеДляРасчетов.Получить(б);
	
	Сообщить(СтрШаблон("Стало: а = %1; б = %2", Строка(а), Строка(б)));
	Сообщить("==================");
	
	// Вывод
	// ==================
	// Было: а = 5; б = 10
	// Стало: а = 10; б = 5
	// ==================
	
КонецПроцедуры

   
ОтветитьЦитата
Поделиться: