Сделал возможным неявное приведение некоторого типа к array of T (при описании оператора в виде статической функции класса)

School - IsPrime(n)
This commit is contained in:
Mikhalkovich Stanislav 2024-07-31 18:21:04 +03:00
parent 3db5709101
commit 64acde6460
8 changed files with 113 additions and 83 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "9";
public const string Build = "0";
public const string Revision = "3520";
public const string Revision = "3521";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3520
%MINOR%=9
%REVISION%=3521
%COREVERSION%=0
%MAJOR%=3

View file

@ -8,4 +8,7 @@
Cartesian(1..4,3..5,(x,y) -> x*y).Println;
Cartesian(1..2,4..5,6..7).Println;
Cartesian(1..2,4..5,6..7,(x,y,z) -> x*y*z).Println;
foreach var (a,b) in Cartesian(1..2,3..5) do
Print($'{a}+{b}')
end.

View file

@ -1 +1 @@
3.9.0.3520
3.9.0.3521

View file

@ -1 +1 @@
!define VERSION '3.9.0.3520'
!define VERSION '3.9.0.3521'

View file

@ -1,4 +1,4 @@
/// Учебный модуль, реализующий базовые алгоритмы информатики (18.07.2024)
/// Учебный модуль, реализующий базовые алгоритмы информатики (31.07.2024)
unit School;
interface
@ -203,6 +203,9 @@ function НОДНОК(a, b: int64): (int64, int64);
/// Разложение числа на простые множители
function Factorize(n: integer): List<integer>;
/// возвращает True, если число n простое и False в противном случае
function IsPrime(n: integer): boolean;
/// Простые числа на интервале [2;n]
function Primes(n: integer): List<integer>;
@ -705,6 +708,47 @@ Factorize(Self);
{$region Primes}
// Внутреняя процедура для заполнения LPrimes
// Решето Эратосфена
procedure PrimesInternal;
begin
LPrimes := new List<integer>;
var Sieve := new boolean[ubPrimeDivs + 1];
for var i := 2 to ubPrimeDivs do
if not Sieve[i] then
begin
LPrimes.Add(i);
var k := i;
while k <= ubPrimeDivs - i do
begin
k += i;
Sieve[k] := True
end
end
end;
/// возвращает True, если число n простое и False в противном случае
function IsPrime(n: integer): boolean;
begin
if n < 2 then
Result := False
else
begin
Result := True;
foreach var prime in LPrimes do
if Sqr(prime) > n then
break
else if n mod prime = 0 then
begin
Result := False;
break
end
end
end;
/// возвращает True, если число простое и False в противном случае
function IsPrime(Self: integer): boolean; extensionmethod := IsPrime(Self);
/// Простые числа на интервале [2;n]
function Primes(n: integer): List<integer>;
// Решето Эратосфена
@ -732,44 +776,6 @@ begin
Result.Add(i)
end;
// Внутреняя процедура для заполнения LPrimes
// Решето Эратосфена
procedure PrimesInternal;
begin
LPrimes := new List<integer>;
var Sieve := new boolean[ubPrimeDivs + 1];
for var i := 2 to ubPrimeDivs do
if not Sieve[i] then
begin
LPrimes.Add(i);
var k := i;
while k <= ubPrimeDivs - i do
begin
k += i;
Sieve[k] := True
end
end
end;
/// возвращает True, если число простое и False в противном случае
function IsPrime(Self: integer): boolean; extensionmethod;
begin
if Self < 2 then
Result := False
else
begin
Result := True;
foreach var prime in LPrimes do
if Sqr(prime) > Self then
break
else if Self mod prime = 0 then
begin
Result := False;
break
end
end
end;
/// Простые числа на интервале [m;n]
function Primes(m, n: integer): List<integer>;
begin

View file

@ -2459,6 +2459,21 @@ namespace PascalABCCompiler.TreeRealization
{
fn = fn.get_instance(ctn.instance_params, true, null);
}
else if (ctn.type_special_kind == SemanticTree.type_special_kind.array_kind)
// надо ещё проверить rank - а его просто проверить только у compiled_type_node - как у common_type_node - не знаю
{
var rank = 1;
if (ctn is compiled_type_node comptn)
rank = comptn.rank;
else if (ctn is compiled_type_node commtn)
rank = commtn.rank;
if (rank == 1)
{
List<type_node> instance_params = new List<type_node>();
instance_params.Add(ctn.element_type);
fn = fn.get_instance(instance_params, false, null);
}
}
else if (fn.get_generic_params_list() != null && fn.get_generic_params_list().Count > 0)
{
if (ctn.IsPointer)

View file

@ -1,4 +1,4 @@
/// Учебный модуль, реализующий базовые алгоритмы информатики (18.07.2024)
/// Учебный модуль, реализующий базовые алгоритмы информатики (31.07.2024)
unit School;
interface
@ -203,6 +203,9 @@ function НОДНОК(a, b: int64): (int64, int64);
/// Разложение числа на простые множители
function Factorize(n: integer): List<integer>;
/// возвращает True, если число n простое и False в противном случае
function IsPrime(n: integer): boolean;
/// Простые числа на интервале [2;n]
function Primes(n: integer): List<integer>;
@ -705,6 +708,47 @@ Factorize(Self);
{$region Primes}
// Внутреняя процедура для заполнения LPrimes
// Решето Эратосфена
procedure PrimesInternal;
begin
LPrimes := new List<integer>;
var Sieve := new boolean[ubPrimeDivs + 1];
for var i := 2 to ubPrimeDivs do
if not Sieve[i] then
begin
LPrimes.Add(i);
var k := i;
while k <= ubPrimeDivs - i do
begin
k += i;
Sieve[k] := True
end
end
end;
/// возвращает True, если число n простое и False в противном случае
function IsPrime(n: integer): boolean;
begin
if n < 2 then
Result := False
else
begin
Result := True;
foreach var prime in LPrimes do
if Sqr(prime) > n then
break
else if n mod prime = 0 then
begin
Result := False;
break
end
end
end;
/// возвращает True, если число простое и False в противном случае
function IsPrime(Self: integer): boolean; extensionmethod := IsPrime(Self);
/// Простые числа на интервале [2;n]
function Primes(n: integer): List<integer>;
// Решето Эратосфена
@ -732,44 +776,6 @@ begin
Result.Add(i)
end;
// Внутреняя процедура для заполнения LPrimes
// Решето Эратосфена
procedure PrimesInternal;
begin
LPrimes := new List<integer>;
var Sieve := new boolean[ubPrimeDivs + 1];
for var i := 2 to ubPrimeDivs do
if not Sieve[i] then
begin
LPrimes.Add(i);
var k := i;
while k <= ubPrimeDivs - i do
begin
k += i;
Sieve[k] := True
end
end
end;
/// возвращает True, если число простое и False в противном случае
function IsPrime(Self: integer): boolean; extensionmethod;
begin
if Self < 2 then
Result := False
else
begin
Result := True;
foreach var prime in LPrimes do
if Sqr(prime) > Self then
break
else if Self mod prime = 0 then
begin
Result := False;
break
end
end
end;
/// Простые числа на интервале [m;n]
function Primes(m, n: integer): List<integer>;
begin