Обновление примеров и bug fix #132

This commit is contained in:
miks1965 2016-04-13 11:08:28 +03:00
parent 24a92cb5ce
commit 560122eebc
31 changed files with 117 additions and 190 deletions

View file

@ -2790,7 +2790,9 @@ namespace CodeFormatters
{ {
//multiline_stack_push(at); //multiline_stack_push(at);
visit_node(at.vars); visit_node(at.vars);
sb.Append(" := "); //add_space_before = true;
add_space_after = true;
//sb.Append(" := ");
visit_node(at.expr); visit_node(at.expr);
//multiline_stack_pop(at); //multiline_stack_pop(at);
} }
@ -2804,9 +2806,10 @@ namespace CodeFormatters
/*if (i > 0) /*if (i > 0)
sb.Append(", ");*/ sb.Append(", ");*/
visit_node(av); visit_node(av);
add_space_after = true;
i++; i++;
} }
sb.Append(")"); //sb.Append(")");
} }
#endregion #endregion
} }

View file

@ -1,7 +1,7 @@
// "Решето Эратосфена" - вычисление простых чисел // "Решето Эратосфена" - вычисление простых чисел
const n = 100000; const n = 100000;
var primes: set of integer; var primes: set of integer;
begin begin
primes := [2..n]; primes := [2..n];

View file

@ -1,4 +1,4 @@
// Все перестановки // Все перестановки
const n = 4; const n = 4;
var a: array of integer; var a: array of integer;
@ -16,6 +16,6 @@ begin
end; end;
begin begin
a := Range(1,n).ToArray(); // заполнение массива a числами от 1 до n a := Range(1,n).ToArray; // заполнение массива a числами от 1 до n
Perm(n); Perm(n);
end. end.

View file

@ -1,4 +1,4 @@
// Самообучающаяся игра "Угадай животное". // Самообучающаяся игра "Угадай животное".
// Старайтесь на вопрос "Чем отличается" вводить самый общий ответ // Старайтесь на вопрос "Чем отличается" вводить самый общий ответ
// Например: "Чем отличается чиж от ежа" - "Умеет летать" // Например: "Чем отличается чиж от ежа" - "Умеет летать"
type type

View file

@ -1,8 +1,8 @@
// Демонстрация фрактальной графики. Множество Мандельброта // Демонстрация фрактальной графики. Множество Мандельброта
// Для каждой точки комплексной плоскости z=(x,y) выполняем итерационный процесс z=z^2+c, c=(cx,cy) // Для каждой точки комплексной плоскости z=(x,y) выполняем итерационный процесс z=z*2+c, c=(cx,cy)
// Считаем количество итераций i до тех пор пока не выполнится условие |x|>max и |y|>max // Считаем количество итераций i до тех пор пока не выполнится условие |z|>max
// После этого рисуем точку x,y с насыщенностью красного цвета, пропорциональной i // После этого рисуем точку z=(x,y) с насыщенностью красного цвета, пропорциональной i
uses GraphABC,Utils; uses GraphABC;
const const
max = 10; max = 10;
@ -20,18 +20,16 @@ begin
for var ix:=0 to Window.Width-1 do for var ix:=0 to Window.Width-1 do
for var iy:=0 to Window.Height-1 do for var iy:=0 to Window.Height-1 do
begin begin
var x := 0.0;
var y := 0.0;
var cx := scalex * (ix - dx); var cx := scalex * (ix - dx);
var cy := scaley * (iy - dy); var cy := scaley * (iy - dy);
var c := Cplx(cx,cy);
var z := Cplx(0,0);
var i := 1; var i := 1;
while i<255 do while i<255 do
begin begin
var x1 := x*x-y*y+cx; z := z*z+c;
var y1 := 2*x*y+cy; if z.Magnitude>max then break;
x := x1;
y := y1;
if (abs(x)>max) and (abs(y)>max) then break;
i += 1; i += 1;
end; end;
if i>=255 then SetPixel(ix,iy,clRed) if i>=255 then SetPixel(ix,iy,clRed)

View file

@ -1,10 +1,9 @@
uses GraphABC; uses GraphABC;
begin begin
//Draw(-20,20,100,100,500,400,x->x*sin(x)); Brush.Color := ARGB(0,0,0,0); // ďđîçđŕ÷íŕ˙ ęčńňü
Draw(-20,20,x->x*sin(x)); Draw(x->x*sin(x),-20,20);
Draw(sin); Draw(sin);
Draw(cos); Draw(cos);
Draw(exp); Draw(exp);
//Draw(x->x*sin(x));
end. end.

View file

@ -15,15 +15,13 @@ begin
end; end;
begin begin
//Draw(-20,20,100,100,500,400,x->x*sin(x));
var r := ClientRectangle; var r := ClientRectangle;
r := r.Scale(0.5); r := r.Scale(0.5);
var r1 := r.Move(r.Width,0); var r1 := r.Move(r.Width,0);
var r2 := r.Move(0,r.Height); var r2 := r.Move(0,r.Height);
var r3 := r.Move(r.Width,r.Height); var r3 := r.Move(r.Width,r.Height);
Draw(-20,20,r,x->x*sin(x)); Draw(x->x*sin(x),-20,20,r);
Draw(r1,sin); Draw(sin,r1);
Draw(r2,cos); Draw(cos,r2);
Draw(20,10,r3,exp); Draw(exp,20,10,r3);
//Draw(x->x*sin(x));
end. end.

View file

@ -1,10 +1,10 @@
// Иллюстрация прозрачности // Иллюстрация прозрачности
uses GraphABC; uses GraphABC;
begin begin
for var Transparency:=0 to 255 do for var Transparency:=0 to 255 do
begin begin
Brush.Color:=ARGB(Transparency,Random(256),Random(256),Random(256)); Brush.Color := ARGB(Transparency,Random(256),Random(256),Random(256));
FillCircle(Random(Window.Width),Random(Window.Height),Random(20,60)); FillCircle(Random(Window.Width),Random(Window.Height),Random(20,60));
sleep(100); sleep(100);
end; end;

View file

@ -1,17 +1,12 @@
// Штампы - это классы графических фигур, хранящие их параметры // Штампы - это классы графических фигур, хранящие их параметры
// В любой момент можно нарисовать графическую фигуру, вызвав метод Stamp. // В любой момент можно нарисовать графическую фигуру, вызвав метод Stamp.
// Класс штампа прямоугольника // Класс штампа прямоугольника
uses GraphABC; uses GraphABC;
type type
RectangleStamp = class RectangleStamp = auto class
x,y,w,h: integer; x,y,w,h: integer;
constructor (xx,yy,ww,hh: integer);
begin
x := xx; y := yy;
w := ww; h := hh;
end;
procedure Stamp; procedure Stamp;
begin begin
Rectangle(x,y,x+w,y+h); Rectangle(x,y,x+w,y+h);

View file

@ -1,28 +1,17 @@
// Класс штампа ряда прямоугольников // Класс штампа ряда прямоугольников
uses GraphABC; uses GraphABC;
type type
RectangleStamp = class RectangleStamp = auto class
x,y,w,h: integer; x,y,w,h: integer;
constructor (xx,yy,ww,hh: integer);
begin
x := xx; y := yy;
w := ww; h := hh;
end;
procedure Stamp; procedure Stamp;
begin begin
Rectangle(x,y,x+w,y+h); Rectangle(x,y,x+w,y+h);
end; end;
end; end;
RowRectanglesStamp = class RowRectanglesStamp = auto class
x,y,w,h,n: integer; x,y,w,h,n: integer;
constructor (xx,yy,ww,hh,nn: integer);
begin
x := xx; y := yy;
w := ww; h := hh;
n := nn;
end;
procedure Stamp; procedure Stamp;
begin begin
var r := new RectangleStamp(x,y,w,h); var r := new RectangleStamp(x,y,w,h);

View file

@ -1,26 +1,15 @@
// Класс штампа прямоугольника с методами увеличения-уменьшения // Класс штампа прямоугольника с методами увеличения-уменьшения
uses GraphABC; uses GraphABC;
type type
RectangleStamp = class RectangleStamp = auto class
x,y,w,h: integer; x,y,w,h: integer;
constructor (xx,yy,ww,hh: integer); procedure Stamp := Rectangle(x,y,x+w,y+h);
begin
x := xx; y := yy;
w := ww; h := hh;
end;
procedure Stamp;
begin
Rectangle(x,y,x+w,y+h);
end;
procedure Increase(dw,dh: integer); procedure Increase(dw,dh: integer);
begin begin
w += dw; h += dh; w += dw; h += dh;
end; end;
procedure Decrease(dw,dh: integer); procedure Decrease(dw,dh: integer) := Increase(-dw,-dh);
begin
Increase(-dw,-dh);
end;
procedure MoveOn(dx,dy: integer); procedure MoveOn(dx,dy: integer);
begin begin
x += dx; y += dy; x += dx; y += dy;

View file

@ -1,14 +1,9 @@
// Класс штампа треугольника // Класс штампа треугольника
uses GraphABC; uses GraphABC;
type type
TriangleStamp = class TriangleStamp = auto class
x,y,w,orient: integer; x,y,w,orient: integer;
constructor (xx,yy,ww,o: integer);
begin
x := xx; y := yy;
w := ww; orient := o;
end;
procedure Stamp; procedure Stamp;
begin begin
MoveTo(x,y); MoveTo(x,y);

View file

@ -1,4 +1,4 @@
// Класс штампа креста // Класс штампа креста
uses GraphABC; uses GraphABC;
type type
@ -33,10 +33,7 @@ type
begin begin
MoveOn(a*w,b*w); MoveOn(a*w,b*w);
end; end;
function Clone(): CrossStamp; function Clone := new CrossStamp(x,y,w);
begin
Result := new CrossStamp(x,y,w);
end;
end; end;
begin begin

View file

@ -62,18 +62,8 @@ type
end; end;
end; end;
function f(x: real): real;
begin begin
Result := x*sin(5*x); var fs := new FuncStamp(10,10,310,230,0,-2*Pi,2*Pi,2*Pi,x->x*sin(5*x));
end;
function g(x: real): real;
begin
Result := sin(3*x)+sin(4*x);
end;
begin
var fs := new FuncStamp(10,10,310,230,0,-2*Pi,2*Pi,2*Pi,f);
fs.Stamp; fs.Stamp;
fs.MoveOn(320,0); fs.MoveOn(320,0);
fs.SetFuncWindow(-Pi,-1,Pi,1); fs.SetFuncWindow(-Pi,-1,Pi,1);
@ -84,6 +74,6 @@ begin
fs.Stamp; fs.Stamp;
fs.MoveOn(320,0); fs.MoveOn(320,0);
fs.SetFuncWindow(-2*Pi,-2,2*Pi,2); fs.SetFuncWindow(-2*Pi,-2,2*Pi,2);
fs.f := g; fs.f := x->sin(3*x)+sin(4*x);
fs.Stamp; fs.Stamp;
end. end.

View file

@ -1,16 +1,10 @@
// Класс штампа текста // Класс штампа текста
uses GraphABC; uses GraphABC;
type type
TextStamp = class TextStamp = auto class
x,y,pt: integer; x,y,pt: integer;
Text: string; Text: string;
constructor (xx,yy,ppt: integer; t: string);
begin
x := xx; y := yy;
pt := ppt;
Text := t;
end;
procedure Stamp; procedure Stamp;
begin begin
Font.Size := pt; Font.Size := pt;

View file

@ -1,7 +1,7 @@
// Вывод английских согласных // Вывод английских согласных
var vowel: string := 'aeiouy'; var vowel: string := 'aeiouy';
begin begin
var all := Range('a','z').Aggregate('',(s,x)->s+x); var all := Range('a','z').JoinIntoString('');
all.Except(vowel).Println; all.Except(vowel).Println;
end. end.

View file

@ -0,0 +1,13 @@
type
Point = auto class
x,y: integer;
procedure MoveOn(dx,dy: integer) := (x,y) := (x+dx,y+dy);
function Distance(p: Point) := sqrt(sqr(x-p.x)+sqr(y-p.y));
class function operator implicit(t: (integer,integer)): Point := new Point(t[0],t[1]);
end;
begin
var p: Point;
p := (2,3);
Println(p);
end.

View file

@ -1,7 +1,7 @@
// Это - главная программа // Это - главная программа
// Именами из dll-библиотеки, написанной на PascalABC.NET, можно пользоваться, // Именами из dll-библиотеки, написанной на PascalABC.NET, можно пользоваться,
// не подключая пространства имен // не подключая пространства имен
#reference 'mydll.dll' {$reference 'mydll.dll'}
begin begin
PrintPascalABCNET; PrintPascalABCNET;

View file

@ -1,4 +1,5 @@
var a: array of integer := (1,3,5,7); // Ïîìåíÿòü äâå ïîëîâèíû ìàññèâà
var a := Arr(1,3,5,7);
begin begin
a.Skip(2).Concat(a.Take(2)).Print; a.Skip(2).Concat(a.Take(2)).Print;

View file

@ -1,12 +1,9 @@
// Пример иллюстрирует всевозможные типы контейнеров, // Пример иллюстрирует всевозможные типы контейнеров,
// по которым можно перемещаться с помощью оператора foreach // по которым можно перемещаться с помощью оператора foreach
uses System.Collections.Generic;
const n = 10; const n = 10;
var var
x: integer;
a: array [1..n] of integer; a: array [1..n] of integer;
b: array of integer; b: array of integer;
s: set of integer; s: set of integer;
@ -16,8 +13,8 @@ begin
for var i:=1 to n do for var i:=1 to n do
a[i] := Random(100); a[i] := Random(100);
// Цикл foreach по статическому массиву // Цикл foreach по статическому массиву
foreach x in a do foreach var x in a do
write(x,' '); Print(x);
writeln; writeln;
SetLength(b,n); SetLength(b,n);
@ -25,20 +22,22 @@ begin
b[i] := Random(100); b[i] := Random(100);
// Цикл foreach по динамическому массиву // Цикл foreach по динамическому массиву
foreach x in b do foreach var x in b do
write(x,' '); Print(x);
writeln; writeln;
s := [2..5,10..14]; s := [2..5,10..14];
foreach x in s do // Цикл foreach по множеству
write(x,' '); foreach var x in s do
Print(x);
writeln; writeln;
l := new List<integer>; l := new List<integer>;
l.AddRange(b); l.AddRange(b);
l.Reverse; l.Reverse;
foreach x in l do // Цикл foreach по списку
write(x,' '); foreach var x in l do
Print(x);
writeln; writeln;
end. end.

View file

@ -1,5 +1,5 @@
// Цикл по множеству. Порядок - не по алфавиту, поскольку множества реализованы на базе хеш-таблиц // Цикл по множеству. Порядок - не по алфавиту, поскольку множества реализованы на базе хеш-таблиц
begin begin
foreach c: char in ['a'..'z'] do foreach var c in ['a'..'z'] do
Write(c); Write(c);
end. end.

View file

@ -1,10 +1,8 @@
// Пример иллюстрирует реализацию классом интерфейса IEnumerable // Пример иллюстрирует реализацию классом интерфейса IEnumerable
// для использования его в операторе foreach // для использования его в операторе foreach
uses System.Collections;
type type
// Генератор чисел Фибоначчи // Генератор чисел Фибоначчи
FibGen = class(IEnumerable, IEnumerator) FibGen = class(IEnumerable<integer>, IEnumerator<integer>)
private private
a,b,n,i: integer; a,b,n,i: integer;
public public
@ -15,37 +13,34 @@ type
b := 1; b := 1;
Self.n := n; Self.n := n;
end; end;
function Get_Current: Object; function Get_Current: integer;
begin begin
if i=0 then if i=0 then
Result := 1 Result := 1
else Result := b; else Result := b;
end; end;
function GetEnumerator: IEnumerator; function System.Collections.IEnumerator.Get_Current: object := Get_Current;
begin function GetEnumerator: IEnumerator<integer> := Self;
Result := Self; function System.Collections.IEnumerable.GetEnumerator: System.Collections.IEnumerator := Self;
end;
function MoveNext: boolean; function MoveNext: boolean;
begin begin
i += 1; i += 1;
Result := i<n; Result := i<n;
if i=0 then exit; if i=0 then exit;
var c := a + b; (a,b) := (b,a+b);
a := b;
b := c;
end; end;
property Current: Object read Get_Current; property Current: integer read Get_Current;
procedure Reset; procedure Reset;
begin begin
i := -1; end;
procedure Dispose;
begin
end; end;
end; end;
var f: FibGen;
begin begin
writeln('Числа Фибоначчи'); writeln('Числа Фибоначчи');
f := new FibGen(25); var f := new FibGen(25);
foreach var x in f do foreach var x in f do
write(x,' '); Print(x);
end. end.

View file

@ -1,4 +1,4 @@
// Перегрузка операций. Класс "Дробь" // Перегрузка операций. Класс "Дробь"
type type
Frac = record Frac = record
private private
@ -25,11 +25,9 @@ type
end; end;
end; end;
var f,f1: Frac;
begin begin
f := new Frac(2,3); var f := new Frac(2,3);
f1 := new Frac(1,2); var f1 := new Frac(1,2);
writelnFormat('{0} + {1} = {2} ',f,f1,f+f1); writelnFormat('{0} + {1} = {2} ',f,f1,f+f1);
// f+f1 переводится компилятором в Frac.operator+(f,f1) // f+f1 переводится компилятором в Frac.operator+(f,f1)
writelnFormat('{0} - {1} = {2} ',f,f1,f-f1); writelnFormat('{0} - {1} = {2} ',f,f1,f-f1);

View file

@ -1,4 +1,4 @@
// Обобщенные функции // Обобщенные функции
// Выведение типа T по типам параметров // Выведение типа T по типам параметров
function IndexOf<T>(a: array of T; val: T): integer; function IndexOf<T>(a: array of T; val: T): integer;
@ -12,7 +12,7 @@ begin
end; end;
end; end;
var a: array of string := ('Ваня', 'Коля', 'Саша', 'Сережа'); var a := Arr('Ваня', 'Коля', 'Саша', 'Сережа');
begin begin
var s := 'Сережа'; var s := 'Сережа';

View file

@ -1,4 +1,4 @@
// Индексные свойства. Массив цветных квадратов // Индексные свойства. Массив цветных квадратов
uses GraphABC; uses GraphABC;
const const
@ -27,9 +27,7 @@ type
public public
constructor (n: integer); constructor (n: integer);
begin begin
SetLength(a,n); a := ArrFill(n,Color.White);
for var i:=0 to n-1 do
a[i] := clWhite;
Draw; Draw;
end; end;
/// Рисует i-тый квадрат /// Рисует i-тый квадрат
@ -53,7 +51,7 @@ var arr: VisualArray;
begin begin
Window.Title := 'Иллюстрация индексных свойств'; Window.Title := 'Иллюстрация индексных свойств';
arr := new VisualArray(dim); arr := new VisualArray(dim);
SetWindowSize(sz*(dim+2),3*sz); Window.SetSize(sz*(dim+2),3*sz);
arr[0] := clGreen; // arr.Items[0] = arr[0] поскольку свойство Items является свойством по умолчанию arr[0] := clGreen; // arr.Items[0] = arr[0] поскольку свойство Items является свойством по умолчанию
Sleep(delay); Sleep(delay);
arr[1] := clBlack; arr[1] := clBlack;

View file

@ -1,9 +1,9 @@
// Создание функции Concat с переменным числом параметров // Создание функции Concat с переменным числом параметров
function Concat(params strs: array of string): string; function Concat(params strs: array of string): string;
begin begin
var sb := new System.Text.StringBuilder; var sb := new StringBuilder;
foreach x: string in strs do foreach var x in strs do
sb.Append(x); sb.Append(x);
Result := sb.ToString; Result := sb.ToString;
end; end;

View file

@ -1,10 +1,10 @@
// Создание процедуры MyWriteln с переменным числом параметров // Создание процедуры MyWriteln с переменным числом параметров
procedure MyWriteln(params args: array of object); procedure MyWriteln(params args: array of object);
begin begin
foreach x: Object in args do foreach var x in args do
System.Console.Write(x); Write(x);
System.Console.WriteLine; WriteLn;
end; end;
var var

View file

@ -1,22 +1,15 @@
// Иллюстрация процедурных переменных как параметров подпрограмм // Иллюстрация процедурных переменных как параметров подпрограмм
// Для процедурного типа в PascalABC.NET реализована структурная эквивалентность типов // Для процедурного типа в PascalABC.NET реализована структурная эквивалентность типов
// Процедурный тип реализован через делегаты .NET // Процедурный тип реализован через делегаты .NET
procedure for_each(var a: array of real; p: procedure(var r: real)); procedure for_each(a: array of real; p: procedure(var r: real));
var i: integer;
begin begin
for i := 0 to a.Length-1 do for var i := 0 to a.Length-1 do
p(a[i]); p(a[i]);
end; end;
procedure mult2(var r: real); procedure mult2(var r: real) := r := 2*r;
begin
r := 2*r
end;
procedure print(var r: real); procedure print(var r: real) := write(r,' ');
begin
write(r,' ');
end;
var a: array of real := (1,2,3,6,7); var a: array of real := (1,2,3,6,7);

View file

@ -1,35 +1,18 @@
//Перегрузка операторов // Перегрузка операторов
type type
Student = class Student = auto class
Name: string; Name: string;
Height: integer; Height: integer;
public public
constructor(Name: string; Height: integer);
begin
Self.Name := Name;
Self.Height := Height;
end;
class function operator<(left,right: Student): boolean;
// Сравнение по росту // Сравнение по росту
begin class function operator<(left,right: Student): boolean := left.Height < right.Height;
Result := left.Height < right.Height; class function operator>(left,right: Student): boolean := left.Height > right.Height;
end; function ToString: string; override := string.Format('{0} ({1})', Name, Height);
class function operator>(left,right: Student): boolean;
begin
Result := left.Height > right.Height;
end;
function ToString: string; override;
begin
Result := string.Format('{0} ({1})', Name, Height);
end;
end; end;
var
s1,s2: Student;
begin begin
s1 := new Student('Stepa Morkovkin',188); var s1 := new Student('Stepa Morkovkin',188);
s2 := new Student('Petya Pomidorov',180); var s2 := new Student('Petya Pomidorov',180);
Writeln('s1: ',s1); Writeln('s1: ',s1);
Writeln('s2: ',s2); Writeln('s2: ',s2);
Writeln; Writeln;