Задать вопрос
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Чего-то в расчёте намудрили. Не вижу, где последнее решение кладётся в стек? Внимательнее вечерком гляну.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, по пунктам.
    1) На счёт того, какой из способов легче модифицировать - пофиг! С рекурсией всё то же самое будет. Тут главное не перестараться. Строго говоря остановка может быть осуществлена в процессе поиска очередного решения. Т.е. сколько-то решений найдено, и сделано сколько-то шагов в поисках следующего. Вот если запомнить это состояние - это конечно высший пилотаж будет, но сложность не оправдана абсолютно. Не надо! Нужно считать, что восстанавливаем ситуацию, когда очередное решение найдено, а следующее ещё не начинали искать. Вот это реализовать вполне реально и, как я сказал, по трудозатратам должно быть примерно одинаково для всех способов решения. Для стека в этом случае на стеке лежат все 8 значений, а для рекурсии в этот момент нет никаких вложенных вызовов.
    2) С флагом запуска процедуры расчёта чего-то намудрили. Я имел ввиду следующее. Процедуру объявляете как-то так:
    procedure StackSolution(RestoreLastSolution: boolean);
    И вызываете допустим из обработчика нажатия кнопки "Старт" так:
    StackSolution(False);
    а из обработчика нажатия кнопки "Продолжить" так:
    StackSolution(True);
    Внутри процедуры StackSolution этот параметр анализируется и делается либо то, либо другое.
    3) В процедуре расчёта используются три вспомогательных массива - a, b, c. По которым определяются свободные и битые поля. Если расчёт начинается с начала (RestoreLastSolution=false), то они инициализируются как написано - все значения true. А если мы восстанавливаем работу (RestoreLastSolution=true), то они уже какие-то значения должны иметь! Тут два варианта возможны:
    a) Их тоже сохранять в файл и считывать из файла
    б) рассчитывать их по последнему найденному решению
    4) А вот уж как цикл с нужного места стартануть - подумать надо, сейчас уже плохо соображается.
    Что-то возможно будет вместо:
    x := 1;
    Y := 0;
    А в стек надо последнее решение, наверное запихнуть. И дальше цикл while пойдёт как есть.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, С одной стороны, жажда деятельности конечно похвальна. Но про гемморой я предупреждал! :)
    Главное, что всё это к работе с файлами никакого отношения не имеет.
    Есть процедура собственно расчёта - допустим, как в последнем сообщении StackSolution. Вот её нужно научить работать двумя способами (допустим, в зависимости от переданного параметра) - начиная с самого начала, когда ни одного решения нет, или начиная с какого-то решения. Это самое главное и самое сложное.
    Ещё нужно смотреть - хватит ли для продолжения рассчёта только самогО предыдущего решения, как Вы сейчас предполагаете. В некоторых способах однозначно потребуется сохранение вспомогательных данных. Так что файл со списком решений и файл для восстановления состояния расчёта - это может быть совсем не одно и то же.
    Кнопок для наглядности сделайте две: 1-я - та, что есть сейчас, старт с начала, 2-я - старт с запомненной позиции. И вызывайте этот самый StackSolution по одной кнопке с одним значением параметра, по другой с другим.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso,
    согласен, но, по крайней мере, я сделаль и получил удовольствие)

    Тоже хорошо - не поспоришь! :)
    Разбор заданных строкой выражений - это классическая задача. В ней кстати стеки часто применяются.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, На счёт приоритетов операций. С другими действиями кроме + и - выражение не будет соответствовать определению из задания 7. Зря в это полезли - это совсем другая задача.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, если честно, я бы подумал, а не прокатит ли для сдачи задания, если работу с файлом не для сохранения/возобновления расчёта использовать, а для чего-нибудь ещё, что попроще. Правда, не знаю для чего :) Хуже нет - встраивать в готовый код функционал, который не был предусмотрен на этапе проектирования. Будет собственно работы с файлом пара строчек, а расчётные методы вырастут вдвое каждый, причём в каждом будет что-то своё, неуниверсальное - сплошной гемморой!
    Может на самом деле какие-нибудь три-четыре числа, типа "настройки программы", при выходе сохранять, при входе считывать? Мало ли, что так не делается - зато покажете, что вот мол есть работа с файлом!
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, ну это может примерно так выглядеть. Для способа без рекурсии текущее решение хранится в массиве из 8 целых чисел. Объявляем file of integer. При нажатии кнопки "стоп" записываем наши 8 целых чисел в файл. Ещё более по уму будет писать первым числом количество ферзей, а потом уж и соответствующее количество элементов массива. Будет универсально для расчета с любым количеством. По кнопке "продолжить" читаете количество ферзей, потом считываете в массив собственно последнее решение. Как там дальше цикл расчета стартовать - смотреть надо. Возможно, что-то ещё надо сохранять или по считанному определять, чтобы расчёт не с начала стартовал.
    Вот рекурсию я так сразу даже и не знаю получится или нет. То что нужно не один, а ещё и вспомогательные массивы сохранить это ерунда. А вот продолжить расчёт с нужного места - не знаю.
    Возможно ещё число стоит первым записать - способ расчета. Это если будете реализовывать сохранение позиции для разных способов решения.
    А может всё и не так сложно. Надо пробовать.
    Но всё-таки опять за уши притянутое решение. Разве что на максимальное количество ферзей расчет запустить и прерываться на перерыв! :)
    Можно кстати и начать с того, что просто научить программу останавливаться и потом возобновлять расчёт с этого же места. Ничего не записывая и не считывая. Ну то есть Вы не собираетесь закрывать программу, что-то там с ней делать - просто пауза, посмотрели на текущее решение, поехали дальше!
    По-моему это более сложная часть, возможно что-то в логике, в способе останова поменять придётся. Может и нет. Пристегнуть потом запись и чтение файла - уже ерунда.
  • Как можно оптимизировать код?

    @kalapanga
    Не очень понял задачу. Типизированный файл - это файл содержащий записи определённого типа, файловая переменная объявляется как file of чего-нибудь.
    Вам его что, по заданию что ли как-то "пришить" нужно?
    Если какие-то настройки нужно хранить в файле, то никакого смысла нет использовать для этого что-то кроме класса TIniFile. Который именно для этого и предназначен.
    Результаты расчётов выдавать (например, все найденные комбинации) - тут обычный текстовый файл годится. Не знаю, формально он наверное тоже может считаться типизированным...
    Можно конечно решения сохранять в каком-нибудь File of SolutionArray. Где SolutionArray это ваш массив с текущим решением array [1..QueensCount]. Но совсем не понимаю зачем. Решения же для человека выводятся, а тут файл не человекочитаемый будет.
    Короче. Если просто работу с файлами показать нужно, то я бы сделал настройки в ini-файле и сохранение решения в текстовый файл. Если стоит задача поработать именно с типизированным файлом, то только довольно искусственные, притянутые за уши решения на ум приходят.
  • Почему батник генерирует ошибку если во всех источниках команда из него работает?

    @kalapanga
    Deiwan, Установленная - не установленная, но написано здесь максимально однозначно:
    "java" не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом.
    Не находится именно java.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Как всегда забываешь пояснять о чём речь, что за клетки такие и подсказки?
    Хрустальный шар говорит, что это наверное какие-то помеченные клетки куда уже нельзя ставить?
    Здесь 2 варианта с типичной альтернативой. Первый - после убирания одного ферзя пересчитывать всю картинку по оставшимся. Требует больше вычислений. Второй - иметь массив клеток и в клетке хранить число ферзей, которые её бьют. Убрали ферзя - значения для клеток которые он бил уменьшаем на 1. Если ноль - красим как свободную. Тут меньше ненужных рассчетов, но более сложная структура данных.
    Понятно, что для этой задачи, что то, что другое - мизерные затраты. Для более сложных задач и выбор должен быть более обоснованным.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, а зачем? Чем это будет лучше?
    Но если очень хочется один TImage, то нужно иметь 9 картинок с разным количеством ферзей, включая пустую и менять их.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Нее, Label то тут как уж? Если это делается для фиксированного числа ферзей (8) то положить 8 штук TImage. Сделать их нужного размера. Через свойство Picture в дизайнтайме загрузить в них картинку. Красивее будет если картинка заранее в нужном размере нарисована. Если картинка большего размера, то поставить у TImage свойство Stretch = True. А дальше у них при необходимости менять Visible. Лучше сделать отдельную процедурку с параметром, которая будет делать видимым нужное количество фигурок. Параметр как для общей логики удобнее. Либо число видимых фигур, либо команда добавить/убавить фигурку.
  • Как можно оптимизировать код?

    @kalapanga
    Вспомнил, что ещё заметил. Как раз по теме этого вопроса! Как минимум в паре мест присутствует подобная конструкция:
    while (I <= QueensCount) do with grdChessBoard do
      begin
        Font.Size:=20+trunc(grdChessBoard.DefaultRowHeight/QueensCount)-1;
        Font.Style:=[fsBold];
        Font.Name:='Times New Roman';
        grdChessBoard.Canvas.Brush.Style:=bsClear;
        .....
      end;

    Такие вещи надо делать один раз ДО цикла. А в цикле оставляем только то, что действительно зависит от шага цикла.
  • Как можно оптимизировать код?

    @kalapanga
    С конца начну. Запрещать ставить ферзя надо там, где он собственно и ставится в OnClick.
    Знаем, по какой клетке кликнули.
    По массиву ферзей определяем пустая клетка или нет.
    Если не пустая, то хочет убрать. Это можно всегда. Убираем. Перерисовываем.
    Если пустая, то сначала проверять можно ли в это клетку ставить.
    Если можно, то ставим и рисуем, если нет, ругаемся.

    Про буквы я примерно знаю причину, но расписывать долго. Если кратко, Дельфи в разных случаях, в разных компонентах рисует текст разными механизмами. В нашем случае не включено сглаживание. Если время будет, я попробую реализовать включение.

    И ещё. Про избавление от абсолютных путей всё забываю написать. Кладёте Ферзь 1.bmp и Ферзь 2.bmp в одну папку с EightQueensPuzzle.exe. А в коде пишете так:
    img1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Ферзь 1.bmp');
    img2.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Ферзь 2.bmp');
    И они всегда и у всех будут находиться.
    Совсем хорошо их вообще в ресурсы засунуть, чтобы отдельных файлов не было. Но это уже другая история.
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Давайте весь проект целиком (лучше и со всеми бмп-шками). В то, что последний раз выкладывали я этот код вставил - ну буквы как буквы. Ничего особенного не вижу.
    И не понял про какой фон речь - "с фоном четкие". Лучше и пару скриншотов к проекту киньте с хорошими и плохими буквами.
  • Как можно оптимизировать код?

    @kalapanga
    Диалог нашли - это правильно. Ради одного сообщения свою форму рисовать незачем.
    Если с доски нужно убрать всё, расставленное вручную, то нужно не картинку чистить, а массив ферзей. А потом доску просто перерисовать (Repaint).
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, Это проверка расставленной позиции? А чего уж тут ненормального может быть? Работает? Вот и хорошо! У меня вот за этот кусочек больше глаз зацепился:
    if not Flag then
      Begin
        frmMain.Hide;
        Form1.Show;
      End;

    Это что, какое-то сообщение об ошибке небось? А зачем основную форму скрывать?
    Впрочем это дело хозяйское.

    И ещё, это так задумано, что:
    - проверить вертикали-горизонтали,
    - если найдена ошибка, то что-то показать
    - была ошибка или нет, всё равно проверять диагонали <-- это точно так должно быть?
    - если найдена ошибка, то что-то показать
  • Как можно оптимизировать код?

    @kalapanga
    Alertoso, так она же в поиске решения есть проверка такая. Там где типа "если модуль разности строк равен модулю разности колонок то ферзи на одной диагонали". Как-то так примерно. Это если по массиву бежать и каждого уже установленного ферзя с интересующей точкой сравнивать.
    Или можно от интересующей точки пробежать по диагоналям в четыре стороны до границы доски и смотреть, попадётся ли ферзь. Если попался сразу останавливаться.
  • Можно ли хранить все подряд на ssd диске C?

    @kalapanga
    Дмитрий, Ну начинааается! Я уж думал, народ таки перестал ssd экономить - а нет, новую тему нашли! Шучу! :)
  • Можно ли хранить все подряд на ssd диске C?

    @kalapanga
    Дмитрий, всё в целом вроде правильно пишете, но вот это я совсем не понял:
    я например вынес темп папки рабочий стол и загрузки на другой ссд, файл подкачки тоже, 100 гиг винде вполне хватает, если задрот то и сохраненки тоже можно вынести

    В чём прикол переноса этих папок с одного ssd на другой? Ну если только вам комп/ноут достался именно в таком виде - пара мелких ssd, каждого по отдельности мало и нужно как-то между ними распределиться.