Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 225
от 15.10.2006, 22:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 210, Экспертов: 57
В номере:Вопросов: 1, Ответов: 2


Вопрос № 58446: Здравствуйте, помогите плз с задачкой: program paveikslas; var n: 1..10; {начальное число} ... begin read(n); write(n); ... end. Прога запускалась 3 раза, результат Вы видите ниже. Что же тут за вло...

Вопрос № 58.446
Здравствуйте, помогите плз с задачкой:

program paveikslas;
var n: 1..10; {начальное число}
...
begin
read(n);
write(n);
...
end.

Прога запускалась 3 раза, результат Вы видите ниже. Что же тут за вложенные циклы будут? Заранее спасибо!

Приложение:

Отправлен: 10.10.2006, 22:03
Вопрос задал: Dr1m (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: NiGHT
Здравствуйте, Dr1m!

На входе есть размерность массива, допустим n. Определяем первый элемент как n/2, с округлением в меньшую сторону. Получим стартовый индекс.

Вот закономерность:
Проход вправо на 1.
Проход вниз на 1.
Проход влево на 2.
Проход вверх на 2.
Проход вправо на 3.
Проход вниз на 3.
Проход влево на 4.
Проход вверх на 4.
Проход вправо на 5.
Проход вниз на 5.
Проход влево на 6, но мы обратились бы к индексу за пределами массива. Это и есть критерий выхода. Если один из очередных индексов больше n или меньше 1 то конец.

Следовательно можно решать по разному:
1. сделать один большой цикл и играться с коэффициентами. Одна переменная за направление, одна от 1 до 2, одна на кол-во длинну прохода.

2. можно сделать 1 большой цикл и в нем 4 маленьких по движению в каждую сторону на "длинну прохода", которую увеличивать в 2х местах.
Ответ отправил: NiGHT (статус: Студент)
Ответ отправлен: 11.10.2006, 04:43
Оценка за ответ: 4

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Dr1m!
Можно завести два константных массива:
const
dx: array[0..3] of Integer = (1, 0, -1, 0);
dy: array[0..3] of Integer = (0, 1, 0, -1); // ось 0Y направлена вниз
Далее написать один большой цикл, в котором происходит смещение вдоль направления (j mod 4) и если направо от направления движения (a[x + dx[(j+1) mod 4], y + dy[(j+1) mod 4]]) пустая ячейка, то повернуть направо.
Кстати, не змейка, а скорее спираль.
В приложении готовый код. Проверить его и отловить возможные ошибки предстоит вам =)
Ну и вывод написать, но это уже просто. А вот зачем в коде write(n); - я не знаю.

Приложение:

---------
Не узнаешь - не попробуешь.

Ответ отправил: Сухомлин Кирилл Владимирович (статус: Практикант)
Ответ отправлен: 11.10.2006, 11:35


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное