From 43adc0a7c2ae3e1c3bdc647b411261a6b9fe9fbf Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Tue, 1 Jan 2019 14:15:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Algorithms/FloodFillTuple.pas | 4 +-- InstallerSamples/Algorithms/PrimeNumbers.pas | 15 ++++---- .../Algorithms/Recursion/Hanoi.pas | 4 +-- .../Algorithms/Recursion/Knapsack.pas | 6 ++-- .../Algorithms/Recursion/Permutations.pas | 10 +++--- .../Algorithms/Recursion/TreeDraw.pas | 15 ++++---- .../Algorithms/SortArrays/QuickSort.pas | 6 ++-- .../Algorithms/SortArrays/SelectionSort.pas | 14 +++----- .../GraphApplications/FuncTransform.pas | 35 +++++++++---------- InstallerSamples/Games/15.pas | 31 ++++++++-------- InstallerSamples/Games/DeleteByMouse.pas | 24 ++++++------- InstallerSamples/Games/Matches.pas | 14 ++++---- TreeConverter/TreeRealization/generics.cs | 5 ++- bin/Lib/WPFObjects.pas | 13 ++++--- 14 files changed, 96 insertions(+), 100 deletions(-) diff --git a/InstallerSamples/Algorithms/FloodFillTuple.pas b/InstallerSamples/Algorithms/FloodFillTuple.pas index 8281e6430..9cd0c4fad 100644 --- a/InstallerSamples/Algorithms/FloodFillTuple.pas +++ b/InstallerSamples/Algorithms/FloodFillTuple.pas @@ -39,8 +39,8 @@ end; procedure ReadFromFile(fname: string; var a: array [,] of integer); begin var f := OpenRead(fname); - var dimx,dimy: integer; - readln(f,dimy,dimx); + var dimx,dimy: integer; + Readln(f,dimy,dimx); SetLength(a,dimy,dimx); for var y := 0 to dimy-1 do begin diff --git a/InstallerSamples/Algorithms/PrimeNumbers.pas b/InstallerSamples/Algorithms/PrimeNumbers.pas index bb0174db0..3e3b0512d 100644 --- a/InstallerSamples/Algorithms/PrimeNumbers.pas +++ b/InstallerSamples/Algorithms/PrimeNumbers.pas @@ -1,21 +1,22 @@ -// Генерация больших простых чисел +// Генерация больших простых чисел begin - writeln('Большие простые числа: '); + Println('Большие простые числа: '); var count := 0; var beg := Random(1000000000)+2; for var i:=beg to beg+5000 do begin var f := True; var j := 2; - var r := round(sqrt(i)); + var r := Round(Sqrt(i)); while f and (j<=r) do - if i mod j = 0 then f := false + if i mod j = 0 then f := False else j += 1; if f then begin - write(i,' '); - Inc(count); - if count mod 5 = 0 then writeln; + Print(i); + count += 1; + if count mod 8 = 0 then + Println; end; end; end. diff --git a/InstallerSamples/Algorithms/Recursion/Hanoi.pas b/InstallerSamples/Algorithms/Recursion/Hanoi.pas index c315a89fa..fc4b231d5 100644 --- a/InstallerSamples/Algorithms/Recursion/Hanoi.pas +++ b/InstallerSamples/Algorithms/Recursion/Hanoi.pas @@ -1,4 +1,4 @@ -// Ханойские башни +// Ханойские башни uses GraphABC; type @@ -59,7 +59,7 @@ begin DrawTower(Tower[2],DisksInTower[2],x2,y0); DrawTower(Tower[3],DisksInTower[3],x3,y0); Brush.Color := clWhite; - TextOut(20,20,'Число перемещений дисков = '+IntToStr(MoveNumber)); + TextOut(20,20,'Число перемещений дисков = '+MoveNumber); Redraw; end; diff --git a/InstallerSamples/Algorithms/Recursion/Knapsack.pas b/InstallerSamples/Algorithms/Recursion/Knapsack.pas index 53993e66c..ae037ad1b 100644 --- a/InstallerSamples/Algorithms/Recursion/Knapsack.pas +++ b/InstallerSamples/Algorithms/Recursion/Knapsack.pas @@ -1,4 +1,4 @@ -// Задача о ранце. В массиве B заданы веса предметов. +// Задача о ранце. В массиве B заданы веса предметов. // Выдать все варианты полной комплектации ранца частью этих предметов const Sz=100; @@ -7,8 +7,8 @@ type IntArr = array [1..Sz] of integer; procedure PrintArr(const A: IntArr; n: integer); begin for var i:=1 to n do - write(A[i],' '); - writeln; + Print(A[i]); + Println; end; procedure TrySolve(n: integer; const B: IntArr; nb: integer); diff --git a/InstallerSamples/Algorithms/Recursion/Permutations.pas b/InstallerSamples/Algorithms/Recursion/Permutations.pas index d8d97c9cb..b1b560f55 100644 --- a/InstallerSamples/Algorithms/Recursion/Permutations.pas +++ b/InstallerSamples/Algorithms/Recursion/Permutations.pas @@ -1,21 +1,19 @@ // Все перестановки const n = 4; -var a: array of integer; - -procedure Perm(m: integer); +procedure Perm(a: array of integer; m: integer); begin if m=1 then a.Println; for var i:=0 to m-1 do begin Swap(a[i],a[m-1]); // ставим каждый на место последнего - Perm(m-1); + Perm(a,m-1); Swap(a[i],a[m-1]); end; end; begin - a := Range(1,n).ToArray; // заполнение массива a числами от 1 до n - Perm(n); + var a := Range(1,n).ToArray; // заполнение массива a числами от 1 до n + Perm(a,n); end. \ No newline at end of file diff --git a/InstallerSamples/Algorithms/Recursion/TreeDraw.pas b/InstallerSamples/Algorithms/Recursion/TreeDraw.pas index 3251ca1dc..512a37fa1 100644 --- a/InstallerSamples/Algorithms/Recursion/TreeDraw.pas +++ b/InstallerSamples/Algorithms/Recursion/TreeDraw.pas @@ -1,27 +1,26 @@ -// Рекурсивное рисование двоичного дерева -uses GraphABC; +// Рекурсивное рисование двоичного дерева +uses GraphWPF; const LevelHeight = 50; Levels = 8; delay = 10; -procedure DrawTree(x,y,dx,level: integer); +procedure DrawTree(x,y,dx: real; level: integer); // обход: левое поддерево, корень, правое begin if level>0 then begin - DrawTree(x-dx,y+LevelHeight,dx div 2,level-1); + DrawTree(x-dx,y+LevelHeight,dx / 2,level-1); Line(x,y,x-dx,y+LevelHeight); Line(x,y,x+dx,y+LevelHeight); Sleep(delay); - DrawTree(x+dx,y+LevelHeight,dx div 2,level-1); + DrawTree(x+dx,y+LevelHeight,dx / 2,level-1); end; end; begin Window.Title := 'Рекурсивное рисование бинарного дерева'; - SetSmoothingOff; - SetWindowSize(800,30+Levels*LevelHeight); - DrawTree(WindowWidth div 2,10,WindowWidth div 5,Levels); + Window.SetSize(800,30+Levels*LevelHeight); + DrawTree(Window.Width / 2,10,Window.Width / 5,Levels); end. diff --git a/InstallerSamples/Algorithms/SortArrays/QuickSort.pas b/InstallerSamples/Algorithms/SortArrays/QuickSort.pas index 67dd48b3c..4d68e91ba 100644 --- a/InstallerSamples/Algorithms/SortArrays/QuickSort.pas +++ b/InstallerSamples/Algorithms/SortArrays/QuickSort.pas @@ -36,9 +36,9 @@ const n = 20; begin var a := ArrRandom(n); - writeln('До сортировки: '); + Println('До сортировки: '); Writeln(a); QuickSort(a,0,a.Length-1); - writeln('После сортировки: '); - Writeln(a); + Println('После сортировки: '); + Println(a); end. diff --git a/InstallerSamples/Algorithms/SortArrays/SelectionSort.pas b/InstallerSamples/Algorithms/SortArrays/SelectionSort.pas index 5f3da8c57..cfea28f29 100644 --- a/InstallerSamples/Algorithms/SortArrays/SelectionSort.pas +++ b/InstallerSamples/Algorithms/SortArrays/SelectionSort.pas @@ -3,24 +3,20 @@ procedure SelectionSort(a: array of real); begin for var i:=0 to a.Length-2 do begin - var min := a[i]; - var ind := i; + var (min,ind) := (a[i],i); for var j:=i+1 to a.Length-1 do if a[j]r.Round(2)).ToArray; + Println('Содержимое массива: '); a.Println; SelectionSort(a); - writeln('После сортировки выбором: '); + Println('После сортировки выбором: '); a.Println; end. \ No newline at end of file diff --git a/InstallerSamples/Applications/GraphApplications/FuncTransform.pas b/InstallerSamples/Applications/GraphApplications/FuncTransform.pas index c9859b9e1..a628fa09d 100644 --- a/InstallerSamples/Applications/GraphApplications/FuncTransform.pas +++ b/InstallerSamples/Applications/GraphApplications/FuncTransform.pas @@ -1,5 +1,5 @@ -uses - GraphABC; +uses + GraphWPF; var h := 0.01; @@ -20,32 +20,31 @@ end; procedure DrawGraphic(f: real -> real); begin - Draw(f, -boundx, boundx, -boundy, boundy); + Window.Clear; + DrawGraph(f, -boundx, boundx, -boundy, boundy); Window.Title := Format('mx={0:f2} my={1:f2} dx={2:f2} dy={3:f2}', mx, my, dx, dy); - Redraw; end; -procedure KeyDown(key: integer); -const - ArrowKeys: set of integer = [vk_Left, vk_Right, vk_Up, vk_Down, vk_Home, vk_End, vk_PageUp, vk_PageDown]; +var ArrowKeys := HSet(Key.Left, Key.Right, Key.Up, Key.Down, Key.Home, Key.&End, Key.PageUp, Key.PageDown); + +procedure KeyDown(k: Key); begin var g := Transform(f); - case key of - vk_Left: my -= h; - vk_Right: my += h; - vk_Up: mx -= h; - vk_Down: mx += h; - vk_Home: dx += h; - vk_PageUp: dx -= h; - vk_PageDown: dy += h; - vk_End: dy -= h; + case k of + Key.Left: my -= h; + Key.Right: my += h; + Key.Up: mx -= h; + Key.Down: mx += h; + Key.Home: dx += h; + Key.PageUp: dx -= h; + Key.PageDown: dy += h; + Key.End: dy -= h; end; - if key in ArrowKeys then + if k in ArrowKeys then DrawGraphic(g); end; begin DrawGraphic(Transform(f)); - LockDrawing; OnKeyDown := KeyDown; end. \ No newline at end of file diff --git a/InstallerSamples/Games/15.pas b/InstallerSamples/Games/15.pas index 23206ab8b..ccf1f3849 100644 --- a/InstallerSamples/Games/15.pas +++ b/InstallerSamples/Games/15.pas @@ -1,4 +1,4 @@ -// Игра в 15 +// Игра в 15 uses GraphABC,ABCObjects,ABCButtons; const @@ -37,9 +37,9 @@ begin end; // Определить, являются ли клетки соседями -function Sosedi(x1,y1,x2,y2: integer): boolean; +function Neighbours(x1,y1,x2,y2: integer): boolean; begin - Result := (abs(x1-x2)=1) and (y1=y2) or (abs(y1-y2)=1) and (x1=x2) + Result := (Abs(x1-x2)=1) and (y1=y2) or (Abs(y1-y2)=1) and (x1=x2) end; // Заполнить вспомогательный массив цифр @@ -50,7 +50,7 @@ begin end; // Перемешать вспомогательный массив цифр. Количество обменов должно быть четным -procedure MeshDigitsArr; +procedure MixDigitsArr; var x: integer; begin for var i:=1 to n*n-1 do @@ -81,9 +81,9 @@ begin end; // Перемешать массив фишек -procedure Mesh15; +procedure Mix15; begin - MeshDigitsArr; + MixDigitsArr; Fill15ByDigitsArr; MovesCount := 0; EndOfGame := False; @@ -107,25 +107,24 @@ begin p[EmptyCellY,EmptyCellX].Color := clWhite; p[EmptyCellY,EmptyCellX].BorderColor := clWhite; FillDigitsArr; - MeshDigitsArr; + MixDigitsArr; Fill15ByDigitsArr; end; // Проверить, все ли фишки стоят на своих местах function IsSolution: boolean; -var x,y,i: integer; begin Result:=True; - i:=1; - for y:=1 to n do - for x:=1 to n do + var i:=1; + for var y:=1 to n do + for var x:=1 to n do begin if p[y,x].Number<>i then begin Result:=False; break; end; - Inc(i); + i += 1; if i=n*n then i:=0; end; end; @@ -140,16 +139,16 @@ begin var fy := (y-y0) div (sz+zz) + 1; if (fx>n) or (fy>n) then exit; - if Sosedi(fx,fy,EmptyCellX,EmptyCellY) then // Если ячейка соседствует с пустой, то поменять их местами + if Neighbours(fx,fy,EmptyCellX,EmptyCellY) then // Если ячейка соседствует с пустой, то поменять их местами begin Swap(p[EmptyCellY,EmptyCellX],p[fy,fx]); EmptyCellX := fx; EmptyCellY := fy; Inc(MovesCount); - StatusRect.Text := 'Количество ходов: ' + IntToStr(MovesCount); + StatusRect.Text := 'Количество ходов: ' + MovesCount; if IsSolution then begin - StatusRect.Text := 'Победа! Сделано ходов: ' + IntToStr(MovesCount); + StatusRect.Text := 'Победа! Сделано ходов: ' + MovesCount; StatusRect.Color := RGB(255,200,200); EndOfGame := True; end @@ -166,7 +165,7 @@ begin Create15; MeshButton := ButtonABC.Create((WindowWidth-200) div 2,2*y0+(sz+zz)*n-zz,200,'Перемешать',clLightGray); - MeshButton.OnClick := Mesh15; + MeshButton.OnClick := Mix15; StatusRect := new RectangleABC(0,WindowHeight-40,WindowWidth,40,RGB(200,200,255)); StatusRect.TextVisible := True; StatusRect.Text := 'Количество ходов: '+IntToStr(MovesCount); diff --git a/InstallerSamples/Games/DeleteByMouse.pas b/InstallerSamples/Games/DeleteByMouse.pas index 77203faa2..7768a449a 100644 --- a/InstallerSamples/Games/DeleteByMouse.pas +++ b/InstallerSamples/Games/DeleteByMouse.pas @@ -1,4 +1,4 @@ -uses ABCObjects,GraphABC; +uses WPFObjects; const CountSquares = 20; @@ -8,21 +8,21 @@ var /// Количество ошибок Mistakes: integer; /// Строка информации - StatusRect: RectangleABC; + StatusRect: RectangleWPF; /// Вывод информационной строки procedure DrawStatusText; begin if CurrentDigit<=CountSquares then - StatusRect.Text := 'Удалено квадратов: ' + IntToStr(CurrentDigit-1) + ' Ошибок: ' + IntToStr(Mistakes) - else StatusRect.Text := 'Игра окончена. Время: ' + IntToStr(Milliseconds div 1000) + ' с. Ошибок: ' + IntToStr(Mistakes); + StatusRect.Text := $'Удалено квадратов: {CurrentDigit-1} Ошибок: {Mistakes}' + else StatusRect.Text := $'Игра окончена. Время: {Milliseconds div 1000} с. Ошибок: {Mistakes}'; end; /// Обработчик события мыши -procedure MyMouseDown(x,y,mb: integer); +procedure MyMouseDown(x,y: real; mb: integer); begin var ob := ObjectUnderPoint(x,y); - if (ob<>nil) and (ob is RectangleABC) then + if (ob<>nil) and (ob is RectangleWPF) then if ob.Number=CurrentDigit then begin ob.Destroy; @@ -31,7 +31,7 @@ begin end else begin - ob.Color := clRed; + ob.Color := Colors.Red; Inc(Mistakes); DrawStatusText; end; @@ -39,15 +39,15 @@ end; begin Window.Title := 'Игра: удали все квадраты по порядку'; - Window.IsFixedSize := True; for var i:=1 to CountSquares do begin - var x := Random(WindowWidth-50); - var y := Random(WindowHeight-100); - var ob := RectangleABC.Create(x,y,50,50,clMoneyGreen); + var x := Random(Window.Width-50); + var y := Random(Window.Height-100); + var ob := RectangleWPF.Create(x,y,50,50,Colors.LightGreen).WithBorder; + ob.FontSize := 25; ob.Number := i; end; - StatusRect := RectangleABC.Create(0,Window.Height-40,Window.Width,40,Color.LightSteelBlue); + StatusRect := RectangleWPF.Create(0,Window.Height-40,Window.Width,40,Colors.LightBlue); CurrentDigit := 1; Mistakes := 0; DrawStatusText; diff --git a/InstallerSamples/Games/Matches.pas b/InstallerSamples/Games/Matches.pas index 0ea31f7ed..3ad8100dc 100644 --- a/InstallerSamples/Games/Matches.pas +++ b/InstallerSamples/Games/Matches.pas @@ -1,4 +1,4 @@ -// Игра "Спички" +// Игра "Спички" const InitialCount=15; var @@ -18,9 +18,9 @@ begin begin var Correct: boolean; repeat - write('Ваш ход. На столе ',Count,' спичек. '); - write('Сколько спичек Вы берете? '); - readln(Num); + Write('Ваш ход. На столе ',Count,' спичек. '); + Write('Сколько спичек Вы берете? '); + Readln(Num); Correct := (Num>=1) and (Num<=3) and (Num<=Count); if not Correct then writeln('Неверно! Повторите ввод!'); @@ -31,7 +31,7 @@ begin Num := Random(1,3); if Num>Count then Num := Count; - writeln('Мой ход. Я взял ',Num,' спичек'); + Writeln('Мой ход. Я взял ',Num,' спичек'); end; Count -= Num; if Player=1 then @@ -40,6 +40,6 @@ begin until Count=0; if Player=1 then - writeln('Вы победили!') - else writeln('Вы проиграли!'); + Writeln('Вы победили!') + else Writeln('Вы проиграли!'); end. diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 84144287a..b3f9e2457 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1431,14 +1431,13 @@ namespace PascalABCCompiler.TreeRealization protected void AddMember(object original, object converted) { - if (!_members.ContainsValue(original)) + if (!_members.ContainsValue(original)) // SSM 30.12.18 bug fix #907 { _members.Add(original, converted); _member_definitions.Add(converted, original); } - else + else // SSM 30.12.18 bug fix #907 { - //_member_definitions[original] = converted; object kk = null; foreach (System.Collections.DictionaryEntry x in _members) { diff --git a/bin/Lib/WPFObjects.pas b/bin/Lib/WPFObjects.pas index 6a472be2e..718400406 100644 --- a/bin/Lib/WPFObjects.pas +++ b/bin/Lib/WPFObjects.pas @@ -146,15 +146,14 @@ type gr: Grid; // Grid связан только с текстом t: TextBlock; r: RotateTransform; - _dx,_dy: real; ChildrenWPF := new List; procedure InitOb(x,y,w,h: real; o: FrameworkElement; SetWH: boolean := True); public /// Направление движения по оси X. Используется методом Move - property Dx: real read _dx write _dx; + auto property Dx: real; /// Направление движения по оси Y. Используется методом Move - property Dy: real read _dy write _dy; + auto property Dy: real; /// Отступ графического объекта от левого края property Left: real read InvokeReal(()->Canvas.GetLeft(can)) write Invoke(procedure->Canvas.SetLeft(can,value)); /// Отступ графического объекта от верхнего края @@ -163,6 +162,8 @@ type property Width: real read InvokeReal(()->gr.Width) write Invoke(procedure->begin gr.Width := value; ob.Width := value end); virtual; /// Высота графического объекта property Height: real read InvokeReal(()->gr.Height) write Invoke(procedure->begin gr.Height := value; ob.Height := value end); virtual; + /// Прямоугольник графического объекта + property Bounds: GRect read Invoke&(()->begin Result := new GRect(Canvas.GetLeft(can),Canvas.GetTop(can),gr.Width,gr.Height); end); /// Текст внутри графического объекта property Text: string read InvokeString(()->t.Text) write Invoke(procedure->t.Text := value); /// Целое число, выводимое в центре графического объекта. Используется свойство Text @@ -193,6 +194,10 @@ type Result.Transform := g; // версия end; public + /// Видимость графического объекта + property Visible: boolean + read InvokeBoolean(()->ob.Visibility = Visibility.Visible) + write Invoke(procedure -> if value then ob.Visibility := Visibility.Visible else ob.Visibility := Visibility.Hidden); /// Выравнивание текста внутри графического объекта property TextAlignment: Alignment write Invoke(WTA,Value); /// Размер текста внутри графического объекта @@ -237,7 +242,7 @@ type /// Перемещает графический объект на вектор (a,b) procedure MoveOn(a,b: real) := MoveTo(Left+a,Top+b); /// Перемещает графический объект на вектор (dx,dy) - procedure Move := MoveOn(dx,dy); + procedure Move; virtual := MoveOn(dx,dy); /// Поворачивает графический объект по часовой стрелке на угол da procedure Rotate(da: real) := RotateAngle += da; /// Добавляет к графическому объекту дочерний