Логика как основной иснтрумент создания структурных алгоритмов.
Запись от Hrethgir размещена 04.04.2023 в 21:50
Показов 1288
Комментарии 1
|
Краткая справка про что это: [QUOTE]Функциональный-вызванный функционированием чего-н., зависящий от деятельности, а не от структуры, строения чего-н.[/QUOTE] Собственно почему так называется тема - потому что считают что знания математики как-то помогают алгоритмизации. Не спорю, но у каждого свой образ и методика мышления, и следуя своим правилам прибегаю к математике только тогда - когда вижу что иного выхода нет абсолютно ни какого, и своего решения на задачу выдвинуть не могу. Итак - заметил артефакты при задании длины таблицы большей чем ширины. И всё понятно - ведь проверка условия тут никогда не проводилась так, как цикл заканчивался (условно имя части к которой принадлежит код - ПОДДОН) [PASCAL] Edge2: //трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца Dec(steps1); TracerY := y - steps1; TracerX := 0; if TracerY < 0 then begin TracerY := 0; TracerX := x - (stepFrequent * y + znak * trunc(y / (stepsBig+1))) + 1; end; p := @p1; goto Edge4;[/PASCAL] . И вот тут я уже было пожалел что убрал метки [B][I]altHead[/I][/B] и прыжок по ним перед моторным (самым внутренним) циклом , так как дикремент [PASCAL] Dec(steps); until x < 0;[/PASCAL] производится теперь перед проверкой условия определющего частый или редкий шаг сейчас будет осуществляться, но не беда - убедившись что если угол равен 45 градусов, то короткий шаг не равен нулю, а тоже равен пикселу, я подтвердил то, что ошибки не будет, если ниже мотора (ПОДДОН) вместо кода выше я сделаю нечто вроде этого [PASCAL] Edge2: //трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца Dec(steps1); TracerY := y - steps1; TracerX := 0; if TracerY < 0 then begin if steps = 1 then begin TracerX := x - (stepFrequent * y + znak *trunc(y / (stepsBig+1)))+1;//топтался,топтался - на месте остался end else begin TracerX := x - (stepFrequent * y + znak * trunc((y) / (stepsBig+1)))+1;//топтался,топтался - на месте остался end; TracerY := 0; end; p := @p1; goto Edge4; [/PASCAL] НО это всё ещё выдаёт не правильную трассировку практически выпотрошив теперь (после замены лишней ассемблерной вставки) оглавляющую мотор проверку условия выглядящую так [PASCAL] if steps = 0 then begin Biger := x - stepRare+1; steps := stepsBig+1; end else begin Biger := x - stepFrequent + 1; end;[/PASCAL] и следующую в в начале цикла после дикримента [B][I]steps[/I][/B] в его конце, заменив[B][I] if steps = 0[/I][/B] на [B][I] if steps = 1[/I][/B]. Почему я начал делать такие записи? Потому что находятся индивиды, которые при непонимании работающего кода называют его абсолютным бредом, не на этом форуме. [B][I]Поэтому чтобы в будущем меня не обвинили в контактах с внеземными цивилизациями я вынужден описывать свою логику при создании каких-то алгоритмов для своих боле-менее глобальных проектов.[/I][/B] В целом планируется "двигатель" генератора карт трассировок в таком образе теперь, с изменённым "поддоном", и теперь приступлю к выводу необходимых для этого формул. [SPOILER][PASCAL] repeat if steps = 0 then begin Biger := x - stepRare+1; steps := stepsBig+1; end else begin Biger := x - stepFrequent + 1; end; if Biger < 0 then Biger := 0; repeat {%REGION 'Engine'} xf := x + 1; //если раскомментироваnm строки После jmp p то начнётся вывод данных в таблицу asm ////////////////////////////// JMP p end; p1: StringGrid1.Cells[xf, yf] := IntToStr(TracerX) + ',' + IntToStr(TracerY) + ',' + '1'; //запись правого столбца p := @p3; goto p4; p2: StringGrid1.Cells[xf, yf] := IntToStr(xf) + ',' + IntToStr(yf) + ',' + '0'; //автоматическое забивание координат в местах скоса трассы p := @p3; goto p4; p3: StringGrid1.Cells[xf, yf] := IntToStr(xf) + ',' + IntToStr(y) + ',' + '0'; //автоматическое забивание координат трассы на прямых участках p4: Dec(x); {%ENDREGION} until x < Biger; asm JMP Edge end; Edge1: //подсчёт шагов в первой строке - других расчётов для первой строки не требуется и знание этого значения нужно для последней строки Inc(steps1); goto Edge3; Edge2: //трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца Dec(steps1); TracerY := y - steps1; TracerX := 0; if y < 1 then begin if steps = 1 then в таблице частый шаг над частым, редкий над редким. begin TracerX := x - (stepFrequent * y + znak *trunc(y / (stepsBig+1))); end else begin Переход к шагу с учётом типа шага и рсстояния по оси y end; end; p := @p1; goto Edge4; Edge3: p := @p2; Edge4: Dec(steps); until x < 0; [/PASCAL][/SPOILER] В чём преимущество структуры перед функцией? В структуре можно сделать логические привязки, построения, улучшающие её работу, а в функции - нет, так как при этом изменится функционал. Именно поэтому не стоит сразу погружаться в изучении конкретной философии программирования, так как не известно что будет лучше при случайной конкретной задаче, а нужно сразу начинать осваивать алгоритмизацию, а не философию. P.S; имхо - хотя я всё роавно думаю, что даже при наличии документации к коду chatgpt - будет потенциально "втыкать", так как у него нет никакого опыта о физической реальности, а логика связана не абстрактным или дискретным пространством. Над формулами для нижней строки надо серьёзно подумать. [IMG]https://www.cyberforum.ru/blog_attachment.php?attachmentid=8008&stc=1&d=1680722091[/IMG] |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
-
Завтра после работы попробую потестировать формулу из этого кода, тут строка номер 5 [PASCAL]Edge2:
//трассировку начальной ячейки каждого шага последней обрабатываемой строки кроме правого столбца
Dec(steps1);
if RazmerX > RazmerY then begin
TracerX := x - (stepFrequent * y - steps + znak *trunc((y+steps) / (stepsBig+1)))+1;
end else begin
TracerY := y - steps1;
TracerX := 0;
end;
p := @p1;
goto Edge4;[/PASCAL]Запись от Hrethgir размещена 07.04.2023 в 22:57


