[Программирование] Трудности перевода
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Микрософт сказал, что прекращает развитие языка Visual Basic. Значит, пришла пора в Ситилинк переписывать код.
Вне зависимости от этого эпохального решения, самому потребовалось перевести один пет-проект с VBA на C#. Я обычно все прототипирую на MS Access, и потом уже код переезжает на более серьезную базу данных (читай: SQL Server) и другой язык программирования.
И вот циклы.
В Basic и Pascal есть процедура цикла
for i = Lower to Upper step Step
…
next
Она универсальна в том смысле, что может ехать как снизу вверх, так и сверху вниз. Ее можно использовать и если Step>0, и если Step<0.
А как записать то же самое в нотации C/C++/C#/JavaScript? Оказывается, что ихний цикл for вовсе не эквивалент Basic-овскому:
for (i = Lower; i < Upper+1; i+=Step) { … }
Как модифицировать это, чтобы работало и для случая, когда Step<0? Приходит в голову такое, не самое изящное, решение:
for (i = Lower; Sign(Step)*i <= Sign(Step)*Upper; i+=Step) { … }
Он, как и изначальный for… next, зациклится при Step =0.
Коллеги предложили еще вариант:
for ( i=Lower; Step>0? i<=Upper: i>=Upper; i+=Step) {… }
На самом деле, поскольку нам надо, чтобы последним значением переменной цикла было Upper, и она тоже поучаствовала в теле цикла, это можно запрограммировать как цикл с постусловием:
i = Lower — Step;
do
i += Step;
…
while (i != Upper)
но этот код не годится, если Step не делит нацело диапазон Lower … Upper
Оказывается, цикл с использованием range на Python также не позволяет двигаться от большего значения к меньшему, range(b, a) при b>a задает просто пустой диапазон.
Какое решение предложите вы?
===========
Источник:
habr.com
===========
Похожие новости:
- [Big Data, Разработка под e-commerce, Машинное обучение, TensorFlow] Применение предобученной модели VGG16 для рекомендаций на основе изображений товаров
- [Python, Big Data, Машинное обучение] Мульти-классовое целе-вероятностное кодирование (Multi-Class Target Encoding) (перевод)
- [Мессенджеры, Программирование, Go, Agile] Пишем Slack бота для Scrum покера на Go. Часть 1
- [JavaScript, Программирование, HTML, TensorFlow] Обнаружение эмоций на лице в реальном времени с помощью веб-камеры в браузере с использованием TensorFlow.js. Часть 3 (перевод)
- [Занимательные задачки, JavaScript, Google Chrome, Браузеры] Как обойти ограничение браузера и прикрепить сразу два файла и более: мультидобавление файлов
- [Программирование микроконтроллеров, Умный дом, DIY или Сделай сам, Электроника для начинающих] Micropyserver. Реализуем Basic Auth для IoT устройств
- [Программирование, Разработка под Android] Чем отличаются Dagger, Hilt и Koin под капотом? (перевод)
- [Тестирование IT-систем, Python, Тестирование веб-сервисов] Тестирование скриншотами
- [C++, API, Прототипирование, 3D-принтеры, DIY или Сделай сам] Счетчик подписчиков Telegram с звуковым уведомление
- [.NET, C#, Разработка под Windows] Пишем установщик на WixSharp. Плюшки, проблемы, возможности
Теги для поиска: #_programmirovanie (Программирование), #_programmirovanie (Программирование), #_visual_basic, #_c#, #_c++, #_javascript, #_python, #_programmirovanie (
Программирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:47
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Микрософт сказал, что прекращает развитие языка Visual Basic. Значит, пришла пора в Ситилинк переписывать код. Вне зависимости от этого эпохального решения, самому потребовалось перевести один пет-проект с VBA на C#. Я обычно все прототипирую на MS Access, и потом уже код переезжает на более серьезную базу данных (читай: SQL Server) и другой язык программирования. И вот циклы. В Basic и Pascal есть процедура цикла for i = Lower to Upper step Step … next Она универсальна в том смысле, что может ехать как снизу вверх, так и сверху вниз. Ее можно использовать и если Step>0, и если Step<0. А как записать то же самое в нотации C/C++/C#/JavaScript? Оказывается, что ихний цикл for вовсе не эквивалент Basic-овскому: for (i = Lower; i < Upper+1; i+=Step) { … } Как модифицировать это, чтобы работало и для случая, когда Step<0? Приходит в голову такое, не самое изящное, решение: for (i = Lower; Sign(Step)*i <= Sign(Step)*Upper; i+=Step) { … } Он, как и изначальный for… next, зациклится при Step =0. Коллеги предложили еще вариант: for ( i=Lower; Step>0? i<=Upper: i>=Upper; i+=Step) {… } На самом деле, поскольку нам надо, чтобы последним значением переменной цикла было Upper, и она тоже поучаствовала в теле цикла, это можно запрограммировать как цикл с постусловием: i = Lower — Step; do i += Step; … while (i != Upper) но этот код не годится, если Step не делит нацело диапазон Lower … Upper Оказывается, цикл с использованием range на Python также не позволяет двигаться от большего значения к меньшему, range(b, a) при b>a задает просто пустой диапазон. Какое решение предложите вы? =========== Источник: habr.com =========== Похожие новости:
Программирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 13:47
Часовой пояс: UTC + 5