2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Помогите решить задачу по прогграммированию на Pascal
Сообщение07.11.2009, 16:58 
Заслуженный участник


11/05/08
32166
Профессор Снэйп в сообщении #259454 писал(а):
А смысл? Оптимизация по времени?

Нет. Просто при полной проверке мы будем тыкаться время от времени за пределы массива. И если в ДОСовской среде это безобидно (т.к. там всего лишь проверка), то в защищённых режимах (в которых, предупреждаю, я не разбираюсь) любой выход за пределы сегмента данных чреват вылетом.

 Профиль  
                  
 
 Re: Помогите решить задачу по прогграммированию на Pascal
Сообщение07.11.2009, 17:02 
Заморожен
Аватара пользователя


18/12/07
8774
Новосибирск
ewert в сообщении #259458 писал(а):
Профессор Снэйп в сообщении #259454 писал(а):
А смысл? Оптимизация по времени?

Нет. Просто при полной проверке мы будем тыкаться время от времени за пределы массива. И если в ДОСовской среде это безобидно (т.к. там всего лишь проверка), то в защищённых режимах (в которых, предупреждаю, я не разбираюсь) любой выход за пределы сегмента данных чреват вылетом.

Понял :oops: Щас исправлю.

 Профиль  
                  
 
 Re: Помогите решить задачу по прогграммированию на Pascal
Сообщение07.11.2009, 17:03 
Заслуженный участник


11/05/08
32166
Профессор Снэйп в сообщении #259457 писал(а):
На самом деле там в проверке условия первые 4 сработают всего три первых раза, а затем начнёт работать последнее условие. Всё это можно расписать...

Усложнит логику, хотя маленько и повысит эффективность.

Профессор Снэйп в сообщении #259457 писал(а):
Проверку $b + y < 1$ можно вообще убрать.

Это правда, это у Вас обоих просто по инерции вставлено. Но опять же -- его выкидывание усложняет логику (только на сей раз не программы, а программирования). А зачем рисковать/надрываться?...

 Профиль  
                  
 
 Re: Помогите решить задачу по прогграммированию на Pascal
Сообщение07.11.2009, 17:05 
Заслуженный участник


09/08/09
3438
С.Петербург
ewert в сообщении #259451 писал(а):
И ещё раз настоятельно рекомендую: последнее OR всё же лучше вынести в отдельный оператор. Хотя борландовский транслятор и обрывает (насколько я помню) проверку по достижении гарантированного результата, но в стандарт языка это вроде не входит, да и у самого Борланда (опять же насколько помню) эту опцию можно отключать.

Есть такое дело. Называется short-circuiting. В Паскале не стандартизовано (можно применять, можно не применять). В С++, C#, Java - требование стандарта.

 Профиль  
                  
 
 Re: Помогите решить задачу по прогграммированию на Pascal
Сообщение07.11.2009, 17:07 
Заморожен
Аватара пользователя


18/12/07
8774
Новосибирск
Всё, теперь не придерётесь :)

-- Сб ноя 07, 2009 20:11:21 --

На самом деле там количества шагов, происходящих при неизменном направлении, такие: $6,6,6,5,5,4,4,3,\ldots$. Можно всё это явно прописать и вообще убрать проверку. Будет работать быстрее :)

 Профиль  
                  
 
 Re: Помогите решить задачу по прогграммированию на Pascal
Сообщение08.11.2009, 07:23 
Заслуженный участник


26/07/09
1559
Алматы
2Профессор Снэйп
Цитата:
Можно всё это явно прописать и вообще убрать проверку

Попробовал:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var Matrix: array[1..7, 1..7] of Byte;

procedure FillPerimeter(Offset, Side, Accumulator: integer);
var Index: integer;

    procedure Put(Row, Column: integer);
    begin
        Matrix[Row, Column]:=Accumulator;
        Inc(Accumulator);
    end;

begin
    for Index:=1 to Side do Put(Offset, Index+Offset-1);
    for Index:=1 to Side-1 do Put(Index+Offset, Offset+Side-1);
    for Index:=Side-1 downto 1 do Put(Offset+Side-1, Index+Offset-1);
    for Index:=Side-1 downto 2 do Put(Index+Offset-1, Offset);

    if Side>1 then FillPerimeter(Offset+1, Side-2, Accumulator);
end;

begin
    FillPerimeter(1, 7, 1);

    Yield(Matrix);
end.
 

Правда аж $\mathcal{O}(n^2)$ памяти использует.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Missir


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group