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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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