Форум программистов, компьютерный форум, киберфорум
Hrethgir
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Наверное это система. Не панацея, но способ.

Запись от Hrethgir размещена 19.02.2023 в 19:48
Показов 1308 Комментарии 0

Продолжаю писать код так, как считаю нужным.
Проект в целом, к Lazarus спрятан под спойлером.
В строку ввода вводить целочисленный угол от 0 до 45 градусов.
Работа кода заключается в том, что он пишет трассировку пути по параллельным линиям расположенным под углом, введённым в строку, на поле 45 на 45 клеток. В каждой ячейке он прописывает координаты ячейки где был до неё, и в каждом началеновой линии - единицу в поле записи boolean, а следующий по этой карте трассировки по этим данным узнает в какую клетку ему следовать, и соответственно по единице о том, что линия закончена.
Кликните здесь для просмотра всего текста


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls, Math;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
     type
  tracerRec = record
  ix:integer;
  yg:integer;
  bool:boolean;
end;
  var
    TtracerRec:tracerRec;
    Tracersloi: array of array of array of tracerRec;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
    procedure Step1;
  var
    v,p:pointer;
    y,step,stepF,s,x, sl, fi1, fi, ri1, ri, BasiY, MyCount:integer;
    px,py:^integer;
     Biger, FcountPix, countPix, FcountPix1, CaTanDegP:integer;
    CaTanDeg,TanDeg, deg:Extended;
    second_run:boolean;
    label l0,l1,l2,l3,l5,l6;//,l4
      label t1,t2;
        label v1,v2;
    begin
 
      deg:= StrToInt(Edit1.Text);
      step:=0;
      for s:=1 to  1 do begin
         TanDeg := Tan(DegToRad(deg));
         if TanDeg = 0 then begin
           CaTanDeg:=28;
           CaTanDegP:=Trunc(CaTanDeg);
           px:=@x;
           py:=@y;
           FcountPix:=0;
           FcountPix1:=0;
           end
         else begin
         CaTanDeg:= 1/TanDeg;
 
         if CaTanDeg>=TanDeg then begin
           px:=@x;
           py:=@y;
          CaTanDegP:=Trunc(CaTanDeg);
          if CaTanDegP>28 then CaTanDegP:=27;
           end
         else begin
           px:=@y;
           py:=@x;
           CaTanDegP:=Trunc(CaTanDeg);
           if CaTanDegP>28 then CaTanDegP:=27;
            end;
                  end;
         if CaTanDegP=0 then begin
           fi:=0;
           FcountPix:=0;
           FcountPix1:=0;
           end else begin
            fi:=Trunc(28 div CaTanDegP);
            FcountPix:=28-step*CaTanDegP;
            FcountPix1:=28-fi*CaTanDegP;
 
              end;
 
            stepF:=fi;
            fi1:= 27+fi;
            BasiY:=0;
            repeat
            v:=@v1;
            ri:=0;
            x:=27;
            y:=BasiY;
            step:=1;
            TtracerRec.bool:=true;
            second_run := true;
            p:=@l1;
            if BasiY>27 then  begin
            step:= BasiY-27+1;
            x:=27-(step-1)*CaTanDegP;
            y:=27;
            ri:=0;
            end;
            t1:
            FcountPix:=28-(step*CaTanDegP);
            ri1:=BasiY-fi;
            if (FcountPix1>=1) then begin
            stepF:=fi;
            end;
 
            if ri1<0 then begin
            ri:= ri1*CaTanDegP+1;
            end;
            Biger:=FcountPix;
            l0:
            /////vbnvn
            repeat
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//   StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);//StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//
            TtracerRec.ix:=x;
            dec(x);
            asm
            jmp p
            end;
            l1:
            TtracerRec.bool:=false;
            p:=@l2;
            l2:
            TtracerRec.yg:=y;
            p:=@l3;
            l3:
            until Biger > x;
            asm
            jmp v
            end;
            v1:
            dec(y);
            p:=@l2;
            inc(step);
            if ((FcountPix1-ri)>x) then goto t2;
            goto t1;
            t2:
            if (FcountPix1>0) and (y>=0)then begin
            Biger:=0;
            v:=@v2;
            goto l0;
      end;
          v2:
          if x = -1 then TtracerRec.ix:=0;
            inc(BasiY);
            until BasiY=fi1;
         if (FcountPix1>0) and (y>=0)then begin
         x:=FcountPix1-1;
         y:=27;
         TtracerRec.bool:=true;
         p:=@l5;
         repeat
         StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//   StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);
         TtracerRec.ix:=x;
         dec(x);
            asm
            jmp p
            end;
            l5:
            TtracerRec.bool:=false;
            TtracerRec.yg:=y;
            p:=@l6;
            l6:
         until 0 > x;
    end;
         end;
      end;
    begin
 Step1;
end;
end.


В общем с оптимизацией логического начала от строки 56 я решил ничего не делать, хотя в будущем может быть и это будет переписано.
А в остальном вот этот код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
            repeat
            ri:=0;
            x:=27;
            y:=BasiY;
            step:=1;
            TtracerRec.bool:=true;
            second_run := true;
            p:=@l1;
            if BasiY>27 then  begin
            step:= BasiY-27+1;
            x:=27-(step-1)*CaTanDegP;
            y:=27;
            ri:=0;
            end;
            repeat
            FcountPix:=28-(step*CaTanDegP);
            ri1:=BasiY-fi;
            if (FcountPix1>=1) then begin
            stepF:=fi;
            end;
 
            if ri1<0 then begin
            ri:= ri1*CaTanDegP+1;
            end;
            repeat
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//   StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);//StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//
            TtracerRec.ix:=x;
            dec(x);
            inc(countPix);
            asm
            jmp p
            end;
            l1:
            TtracerRec.bool:=false;
            TtracerRec.yg:=y;
            p:=@l2;
            l2:
            TtracerRec.yg:=y;
            until FcountPix > x;
            dec(y);
            inc(step);
            until ((28-fi*CaTanDegP-ri)>x);
           if (FcountPix1>0) and (y>=0)then begin
           repeat
           StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//   StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);
           inc(countPix);
           TtracerRec.ix:=x;
           TtracerRec.yg:=y;
           dec(x);
           until 0 > x;
      end;
          if x = -1 then TtracerRec.ix:=0;
            inc(BasiY);
            until BasiY=fi1;
стал выглядеть теперь вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
            repeat
            v:=@v1;
            ri:=0;
            x:=27;
            y:=BasiY;
            step:=1;
            TtracerRec.bool:=true;
            second_run := true;
            p:=@l1;
            if BasiY>27 then  begin
            step:= BasiY-27+1;
            x:=27-(step-1)*CaTanDegP;
            y:=27;
            ri:=0;
            end;
            t1:
            FcountPix:=28-(step*CaTanDegP);
            ri1:=BasiY-fi;
            if (FcountPix1>=1) then begin
            stepF:=fi;
            end;
 
            if ri1<0 then begin
            ri:= ri1*CaTanDegP+1;
            end;
            Biger:=FcountPix;
            l0:
            /////vbnvn
            repeat
            StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//   StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);//StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//
            TtracerRec.ix:=x;
            dec(x);
            asm
            jmp p
            end;
            l1:
            TtracerRec.bool:=false;
            p:=@l2;
            l2:
            TtracerRec.yg:=y;
            p:=@l3;
            l3:
            until Biger > x;
            asm
            jmp v
            end;
            v1:
            dec(y);
            p:=@l2;
            inc(step);
            if ((FcountPix1-ri)>x) then goto t2;
            goto t1;
            t2:
            if (FcountPix1>0) and (y>=0)then begin
            Biger:=0;
            v:=@v2;
            goto l0;
      end;
          v2:
          if x = -1 then TtracerRec.ix:=0;
            inc(BasiY);
            until BasiY=fi1;
не по правильным правилам заумных челов, но зато есть система, которой я теперь буду придерживаться в остальном:
Если машина производит всегда одни и те-же действия, то действия машины всегда предсказуемы, всегда есть код который добавляется к выполняемой части предсказуемых действиям машины, всегда есть код который исключается из выполняемой части предсказуемого кода.
В целом правила написания кода пока мои такие:
исключать по возможности проверки условий, рассматривать действия системы при любых обстоятельствах как одни и -же, но от ситуации к ситуации с увеличенным или уменьшенным списком действий.

В общем это так, между прочим.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru