Версия 3.7.1
ABC здоровье кода
This commit is contained in:
parent
bf032e1255
commit
9c36aa4419
|
|
@ -14,8 +14,8 @@ internal static class RevisionClass
|
|||
{
|
||||
public const string Major = "3";
|
||||
public const string Minor = "7";
|
||||
public const string Build = "0";
|
||||
public const string Revision = "2671";
|
||||
public const string Build = "1";
|
||||
public const string Revision = "2677";
|
||||
|
||||
public const string MainVersion = Major + "." + Minor;
|
||||
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
%MINOR%=7
|
||||
%REVISION%=2671
|
||||
%COREVERSION%=0
|
||||
%REVISION%=2677
|
||||
%COREVERSION%=1
|
||||
%MAJOR%=3
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
3.7.0.2671
|
||||
3.7.1.2677
|
||||
|
|
|
|||
|
|
@ -37,17 +37,18 @@
|
|||
\fs22\lang1049\langfe1049\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1049\langfenp1049 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
|
||||
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1049\langfe1049\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1049\langfenp1049 \snext11 \ssemihidden \sunhideused
|
||||
Normal Table;}}{\*\rsidtbl \rsid1983975\rsid2307793\rsid2756858\rsid5121612\rsid9338748\rsid9583613\rsid12019863\rsid14836557}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}
|
||||
{\info{\operator \'d1\'f2\'e0\'ed\'e8\'f1\'eb\'e0\'e2 \'cc\'e8\'f5\'e0\'eb\'ea\'ee\'e2\'e8\'f7}{\creatim\yr2018\mo8\dy29\hr21\min57}{\revtim\yr2020\mo8\dy24\hr15\min4}{\version8}{\edmins9}{\nofpages4}{\nofwords1386}{\nofchars7904}{\nofcharsws9272}
|
||||
{\vern7}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1701\margr850\margt1134\margb1134\gutter0\ltrsect
|
||||
Normal Table;}}{\*\rsidtbl \rsid1983975\rsid2307793\rsid2756858\rsid5121612\rsid9338748\rsid9583613\rsid12019863\rsid14836557\rsid14959605}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440
|
||||
\mintLim0\mnaryLim1}{\info{\operator \'d1\'f2\'e0\'ed\'e8\'f1\'eb\'e0\'e2 \'cc\'e8\'f5\'e0\'eb\'ea\'ee\'e2\'e8\'f7}{\creatim\yr2018\mo8\dy29\hr21\min57}{\revtim\yr2020\mo9\dy5\hr20\min24}{\version9}{\edmins9}{\nofpages4}{\nofwords1386}{\nofchars7906}
|
||||
{\nofcharsws9274}{\vern7}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1701\margr850\margt1134\margb1134\gutter0\ltrsect
|
||||
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701
|
||||
\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot9338748 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
|
||||
\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale110\rsidroot9338748 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
|
||||
\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6
|
||||
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
|
||||
{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1049\langfe1049\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1049\langfenp1049 {\rtlch\fcs1
|
||||
\af37 \ltrch\fcs0 \f37\insrsid14836557 \loch\af37\dbch\af31505\hich\f37 \'c4\'e0\'ed\'ed\'fb\'e9\loch\f37 \hich\f37 \'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\loch\f37 \hich\f37 \'ee\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\loch\f37 \hich\f37 \'f3\'f1\'eb\'ee\'e2\'e8\'ff
|
||||
\loch\f37 \hich\f37 \'f0\'e0\'f1\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'ff\loch\f37 \hich\f37 \'ef\'f0\'ee\'e4\'f3\'ea\'f2\'e0\loch\f37 \hich\f37 PascalABC.NET (\'e2\'e5\'f0\'f1\'e8\'ff\loch\f37 3.}{\rtlch\fcs1 \af37 \ltrch\fcs0
|
||||
\f37\lang1033\langfe1049\langnp1033\insrsid2307793 \hich\af37\dbch\af31505\loch\f37 7}{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 ).
|
||||
\f37\insrsid2307793\charrsid14959605 \hich\af37\dbch\af31505\loch\f37 7}{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\insrsid14959605 \hich\af37\dbch\af31505\loch\f37 .1}{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557
|
||||
\hich\af37\dbch\af31505\loch\f37 ).
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\insrsid14836557 \loch\af37\dbch\af31505\hich\f37 \'ca\'ee\'ef\'e8\'ff\loch\f37 \hich\f37 \'eb\'e8\'f6\'e5\'ed\'e7\'e8\'e8\loch\f37 \hich\f37 GNU LGPL \'ef\'f0\'e8\'eb\'e0\'e3\'e0\'e5\'f2\'f1\'ff\loch\f37 \hich\f37
|
||||
\'e2\loch\f37 \hich\f37 \'ea\'ee\'ed\'f6\'e5\loch\f37 \hich\f37 \'fd\'f2\'ee\'e3\'ee\loch\f37 \hich\f37 \'f4\'e0\'e9\'eb\'e0.
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557
|
||||
|
|
@ -104,10 +105,10 @@ Normal Table;}}{\*\rsidtbl \rsid1983975\rsid2307793\rsid2756858\rsid5121612\rsid
|
|||
\par
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 Copyright (C) 2007 Free Software Foundation, Inc. <}{\field{\*\fldinst {\rtlch\fcs1 \af37 \ltrch\fcs0
|
||||
\f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 HYPERLINK "http://fsf.org/"}{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid9338748 {\*\datafield
|
||||
00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b3800000068007400740070003a002f002f006600730066002e006f00720067002f000000795881f43b1d7f48af2c825dc485276300000000a5ab0003006500000c}}}{\fldrslt {\rtlch\fcs1 \af37
|
||||
00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b3800000068007400740070003a002f002f006600730066002e006f00720067002f000000795881f43b1d7f48af2c825dc485276300000000a5ab0003006500000c00}}}{\fldrslt {\rtlch\fcs1 \af37
|
||||
\ltrch\fcs0 \f37\ul\cf2\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 http://fsf.org/}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af37\afs24 \ltrch\fcs0 \f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\hich\af37\dbch\af31505\loch\f37 >
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 Everyone is permitted to copy and distribute verbatim copies}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 Ev\hich\af37\dbch\af31505\loch\f37 eryone is permitted to copy and distribute verbatim copies}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 of this license document, but changing it is not allowed.}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
|
|
@ -117,7 +118,7 @@ Normal Table;}}{\*\rsidtbl \rsid1983975\rsid2307793\rsid2756858\rsid5121612\rsid
|
|||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 the terms and conditions of version 3 of the GNU General Public}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 License, supplemented by the additional permissions listed below.}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 Lic\hich\af37\dbch\af31505\loch\f37 ense, supplemented by the additional permissions listed below.}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 0. Additional Definitions.}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0 \f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
|
|
@ -178,9 +179,9 @@ Normal Table;}}{\*\rsidtbl \rsid1983975\rsid2307793\rsid2756858\rsid5121612\rsid
|
|||
\par
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 2. Conveying Modified Versions.}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0 \f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 If you modify a copy of the Library, and, in your mod\hich\af37\dbch\af31505\loch\f37 ifications, a}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 If you modify a copy of the Library, and, in your modifications, a}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 facility refers to a function or data to be supplied by an Application}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 facility refers to a function o\hich\af37\dbch\af31505\loch\f37 r data to be supplied by an Application}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \f37\lang7\langfe1049\langnp7\insrsid14836557 \hich\af37\dbch\af31505\loch\f37 that uses the facility (other than as an argument passed when the}{\rtlch\fcs1 \af37\afs24 \ltrch\fcs0
|
||||
\f37\fs24\lang1033\langfe1049\langnp1033\insrsid14836557
|
||||
|
|
@ -518,8 +519,8 @@ fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
|||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000e041
|
||||
e0ab0e7ad601feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000205e
|
||||
2269a983d601feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000105000000000000}}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
Данный документ описывает условия распространения продукта PascalABC.NET (версия 3.7).
|
||||
Данный документ описывает условия распространения продукта PascalABC.NET (версия 3.7.1).
|
||||
Копия лицензии GNU LGPL прилагается в конце этого файла.
|
||||
|
||||
ВАЖНЕЙШИЕ УСЛОВИЯ РАСПРОСТРАНЕНИЯ ПРОДУКТА PascalABC.NET или любого производного продукта
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
!define VERSION '3.7.0.2671'
|
||||
!define VERSION '3.7.1.2677'
|
||||
|
|
|
|||
|
|
@ -17,29 +17,125 @@ namespace SyntaxVisitors
|
|||
public int InBlockVarDefs { get; set; }
|
||||
public int OutBlockVarDefs { get; set; }
|
||||
public int ForsWithoutVar { get; set; }
|
||||
public int ForsWithVar { get; set; }
|
||||
public bool ProgramKeyword { get; set; }
|
||||
public bool OldStrings { get; set; }
|
||||
public bool StaticArrays { get; set; }
|
||||
public bool ReadProc { get; set; }
|
||||
public bool WriteProcWithSpace { get; set; }
|
||||
public int OldStrings { get; set; }
|
||||
public int StaticArrays { get; set; }
|
||||
public int DynamicArrays { get; set; }
|
||||
public int ReadProc { get; set; }
|
||||
public int WriteProcWithSpace { get; set; }
|
||||
public int TuplesCount { get; set; }
|
||||
public int InitVarInDef { get; set; }
|
||||
public int UnpackingAssign { get; set; }
|
||||
public int LoopsCount { get; set; }
|
||||
public int ForeachCount { get; set; }
|
||||
public int LambdasCount { get; set; }
|
||||
public int ExtAssignCount { get; set; }
|
||||
public int BigIntegerTypeCount { get; set; }
|
||||
public int ReadFuncCount { get; set; }
|
||||
public int PrintCount { get; set; }
|
||||
|
||||
public ABCStatisticsVisitor()
|
||||
{
|
||||
}
|
||||
|
||||
public override void visit(ident id)
|
||||
{
|
||||
var name = id.name.ToLower();
|
||||
if (name.StartsWith("readinteger") || name.StartsWith("readreal") || name.StartsWith("readstring") ||
|
||||
name.StartsWith("readlninteger") || name.StartsWith("readlnreal") || name.StartsWith("readlnstring"))
|
||||
ReadFuncCount++;
|
||||
if (name.StartsWith("print"))
|
||||
PrintCount++;
|
||||
}
|
||||
|
||||
public override void visit(named_type_reference ntr)
|
||||
{
|
||||
var name = ntr.names[0].name.ToLower();
|
||||
if (name == "biginteger")
|
||||
BigIntegerTypeCount++;
|
||||
base.visit(ntr);
|
||||
}
|
||||
public override void visit(assign an)
|
||||
{
|
||||
if (an.operator_type == Operators.AssignmentAddition || an.operator_type == Operators.AssignmentMultiplication || an.operator_type == Operators.AssignmentDivision)
|
||||
ExtAssignCount++;
|
||||
base.visit(an);
|
||||
}
|
||||
public override void visit(function_lambda_definition fld)
|
||||
{
|
||||
LambdasCount++;
|
||||
base.visit(fld);
|
||||
}
|
||||
public override void visit(loop_stmt ln)
|
||||
{
|
||||
LoopsCount++;
|
||||
base.visit(ln);
|
||||
}
|
||||
public override void visit(foreach_stmt fn)
|
||||
{
|
||||
ForeachCount++;
|
||||
base.visit(fn);
|
||||
}
|
||||
public override void visit(tuple_node tn)
|
||||
{
|
||||
TuplesCount++;
|
||||
base.visit(tn);
|
||||
}
|
||||
public override void visit(assign_var_tuple at)
|
||||
{
|
||||
UnpackingAssign++;
|
||||
base.visit(at);
|
||||
}
|
||||
public override void visit(assign_tuple at)
|
||||
{
|
||||
UnpackingAssign++;
|
||||
base.visit(at);
|
||||
}
|
||||
|
||||
public override void visit(for_node fn)
|
||||
{
|
||||
if (fn.create_loop_variable == false)
|
||||
ForsWithoutVar++;
|
||||
if (fn.create_loop_variable == true)
|
||||
ForsWithVar++;
|
||||
base.visit(fn);
|
||||
}
|
||||
|
||||
public override void visit(var_def_statement vds)
|
||||
{
|
||||
if (vds.Parent is var_statement)
|
||||
InBlockVarDefs += 1;
|
||||
else OutBlockVarDefs += 1;
|
||||
{
|
||||
InBlockVarDefs += vds.vars.Count;
|
||||
}
|
||||
else
|
||||
{
|
||||
OutBlockVarDefs += vds.vars.Count;
|
||||
}
|
||||
|
||||
if (vds.vars_type != null && vds.vars_type is string_num_definition)
|
||||
{
|
||||
OldStrings = true;
|
||||
OldStrings += 1;
|
||||
}
|
||||
if (vds.vars_type != null && vds.vars_type is array_type at && at.indexers != null && at.indexers.Count > 0 && at.indexers.indexers[0] != null)
|
||||
{
|
||||
StaticArrays = true;
|
||||
StaticArrays += 1;
|
||||
}
|
||||
if (vds.vars_type != null && vds.vars_type is array_type at1 && at1.indexers == null)
|
||||
{
|
||||
DynamicArrays += 1;
|
||||
}
|
||||
if (vds.inital_value != null)
|
||||
InitVarInDef++;
|
||||
/*if (vds.inital_value != null)
|
||||
{
|
||||
if (vds.inital_value is ident id &&
|
||||
(id.name.ToLower().StartsWith("readinteger") || id.name.ToLower().StartsWith("readreal") || id.name.ToLower().StartsWith("readstring") ||
|
||||
id.name.ToLower().StartsWith("readlninteger") || id.name.ToLower().StartsWith("readlnreal") || id.name.ToLower().StartsWith("readlnstring")))
|
||||
ReadFuncCount++;
|
||||
}*/
|
||||
|
||||
base.visit(vds);
|
||||
}
|
||||
|
||||
public override void visit(program_name pn)
|
||||
|
|
@ -50,7 +146,7 @@ namespace SyntaxVisitors
|
|||
|
||||
public override void visit(method_call mc)
|
||||
{
|
||||
if (mc.dereferencing_value is ident id && (id.name.ToLower() == "read" || id.name.ToLower() == "readln"))
|
||||
/*if (mc.dereferencing_value is ident id && (id.name.ToLower() == "read" || id.name.ToLower() == "readln"))
|
||||
{
|
||||
syntax_tree_node n = mc;
|
||||
do
|
||||
|
|
@ -58,15 +154,25 @@ namespace SyntaxVisitors
|
|||
n = n.Parent;
|
||||
} while (n != null && !(n is class_members));
|
||||
if (n != null)
|
||||
ReadProc = false;
|
||||
;
|
||||
//ReadProc = false;
|
||||
else
|
||||
ReadProc = true;
|
||||
}
|
||||
ReadProc += 1;
|
||||
}*/
|
||||
/*if (mc.dereferencing_value is ident id2)
|
||||
{
|
||||
var name = id2.name.ToLower();
|
||||
var h = new HashSet<string> { "readinteger", "readlninteger", "readreal", "readlnreal", "readstring", "readlnstring", "readchar", "readlnchar" };
|
||||
if (h.Contains(name))
|
||||
ReadFuncCount++;
|
||||
}*/
|
||||
|
||||
if (mc.dereferencing_value is ident id1 && (id1.name.ToLower() == "write" || id1.name.ToLower() == "writeln") &&
|
||||
mc.parameters != null && mc.parameters.expressions.Any(ex => ex is char_const cc && cc.cconst == ' '))
|
||||
{
|
||||
WriteProcWithSpace = true;
|
||||
WriteProcWithSpace += 1;
|
||||
}
|
||||
base.visit(mc);
|
||||
}
|
||||
public override void visit(procedure_call pc)
|
||||
{
|
||||
|
|
@ -78,15 +184,17 @@ namespace SyntaxVisitors
|
|||
n = n.Parent;
|
||||
} while (n != null && !(n is class_members));
|
||||
if (n != null)
|
||||
ReadProc = false;
|
||||
//ReadProc = false
|
||||
;
|
||||
else
|
||||
ReadProc = true;
|
||||
ReadProc += 1;
|
||||
}
|
||||
if (pc.func_name is method_call mc1 && mc1.dereferencing_value is ident id1 && (id1.name.ToLower() == "write" || id1.name.ToLower() == "writeln")
|
||||
&& mc1.parameters != null && mc1.parameters.expressions.Any(ex => ex is char_const cc && cc.cconst == ' '))
|
||||
{
|
||||
WriteProcWithSpace = true;
|
||||
WriteProcWithSpace += 1;
|
||||
}
|
||||
base.visit(pc);
|
||||
}
|
||||
|
||||
/*public override void visit(dot_node dn)
|
||||
|
|
|
|||
|
|
@ -80,24 +80,29 @@ function SeqRandomReal(n: integer; a, b: real; t: integer): sequence of real;
|
|||
/// на интервале [a; b) с t знаками в дробной части
|
||||
function MatrRandomReal(m: integer; n: integer; a, b: real; t: integer): array [,] of real;
|
||||
|
||||
/// Возвращает логическое значение операции импликации a -> b
|
||||
function Imp(a, b: boolean) : boolean;
|
||||
/// Возвращает таблицу истинности для двух переменных
|
||||
function TrueTable(f: function(a, b: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для двух переменных
|
||||
procedure TrueTable(f: function(a, b: boolean): boolean;
|
||||
vars: string := 'x1.x2');
|
||||
|
||||
/// Выводит на монитор таблицу истинности для трех переменных
|
||||
procedure TrueTable(f: function(a, b, c: boolean): boolean;
|
||||
vars: string := 'x1.x2.x3');
|
||||
/// Возвращает таблицу истинности для трех переменных
|
||||
function TrueTable(f: function(a, b, c: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для четырех переменных
|
||||
procedure TrueTable(f: function(a, b, c, d: boolean): boolean;
|
||||
vars: string := 'x1.x2.x3.x4');
|
||||
/// Возвращает таблицу истинности для четырех переменных
|
||||
function TrueTable(f: function(a, b, c, d: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для пяти переменных
|
||||
procedure TrueTable(f: function(a, b, c, d, e: boolean): boolean;
|
||||
vars: string := 'x1.x2.x3.x4.x5');
|
||||
/// Возвращает таблицу истинности для пяти переменных
|
||||
function TrueTable(f: function(a, b, c, d, e: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности
|
||||
/// f = 0 - только для значения функции False
|
||||
/// f = 1 - только для значения функции True
|
||||
procedure TrueTablePrint(a: array[,] of boolean; f: integer := -1);
|
||||
|
||||
/// Заменяет последнее вхождение подстроки в строку
|
||||
procedure ReplaceLast(var Строка: string; ЧтоЗаменить, ЧемЗаменить: string);
|
||||
|
||||
implementation
|
||||
|
||||
|
|
@ -219,6 +224,21 @@ begin
|
|||
end
|
||||
end;
|
||||
|
||||
/// Перевод десятичного числа в систему счисления по основанию base (2..32)
|
||||
function ToBase(Self: string; base: integer): string; extensionmethod;
|
||||
begin
|
||||
var n: BigInteger;
|
||||
if not BigInteger.TryParse(Self, n) then exit;
|
||||
var s := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
Result := '';
|
||||
while n > 0 do
|
||||
begin
|
||||
Result := s[integer(n mod base) + 1] + Result;
|
||||
n := n div base
|
||||
end;
|
||||
if Result = '' then Result := '0'
|
||||
end;
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region MinMax}
|
||||
|
|
@ -232,7 +252,7 @@ begin
|
|||
min := m
|
||||
else if m > max then
|
||||
max := m;
|
||||
Result := (min, max)
|
||||
Result := (min, max)
|
||||
end;
|
||||
|
||||
/// Возвращает кортеж из минимума и максимума последовательности s
|
||||
|
|
@ -244,16 +264,17 @@ begin
|
|||
min := m
|
||||
else if m > max then
|
||||
max := m;
|
||||
Result := (min, max)
|
||||
Result := (min, max)
|
||||
end;
|
||||
|
||||
/// Возвращает кортеж из минимума и максимума последовательности
|
||||
function MinMax(Self: sequence of int64): (int64, int64); extensionmethod :=
|
||||
MinMax(Self);
|
||||
|
||||
MinMax(Self);
|
||||
|
||||
/// Возвращает кортеж из минимума и максимума последовательности
|
||||
function MinMax(Self: sequence of integer): (integer, integer);
|
||||
extensionmethod := MinMax(Self);
|
||||
extensionmethod :=
|
||||
MinMax(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
@ -336,11 +357,11 @@ end;
|
|||
|
||||
/// разложение числа на простые множители
|
||||
function Factorize(Self: int64): List<int64>; extensionmethod :=
|
||||
Factorize(Self);
|
||||
|
||||
Factorize(Self);
|
||||
|
||||
/// Разложение числа на простые множители
|
||||
function Factorize(Self: integer): List<integer>; extensionmethod :=
|
||||
Factorize(Self);
|
||||
Factorize(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
@ -349,21 +370,21 @@ function Factorize(Self: integer): List<integer>; extensionmethod :=
|
|||
/// Простые числа на интервале [2;n]
|
||||
function Primes(n: integer): List<integer>;
|
||||
// Модифицированное решето Эратосфена на [2;n]
|
||||
begin
|
||||
begin
|
||||
var Mas := ArrFill(n, True);
|
||||
var i := 2;
|
||||
while i * i <= n do
|
||||
begin
|
||||
if Mas[i-1] then
|
||||
begin
|
||||
var k := i*i;
|
||||
begin
|
||||
if Mas[i - 1] then
|
||||
begin
|
||||
var k := i * i;
|
||||
while k <= n do
|
||||
begin
|
||||
Mas[k-1] := False;
|
||||
begin
|
||||
Mas[k - 1] := False;
|
||||
k += i
|
||||
end
|
||||
end;
|
||||
Inc(i)
|
||||
Inc(i)
|
||||
end;
|
||||
n := Mas.Count(t -> t);
|
||||
Result := new List<integer>;
|
||||
|
|
@ -375,21 +396,21 @@ end;
|
|||
function FirstPrimes(n: integer): List<integer>;
|
||||
// Модифицированное решето Эратосфена
|
||||
begin
|
||||
var n1 := Trunc(Exp((Ln(n)+1.088)/0.8832));
|
||||
var n1 := Trunc(Exp((Ln(n) + 1.088) / 0.8832));
|
||||
var Mas := ArrFill(n1, True);
|
||||
var i := 2;
|
||||
while i * i <= n1 do
|
||||
begin
|
||||
if Mas[i-1] then
|
||||
begin
|
||||
var k := i*i;
|
||||
begin
|
||||
if Mas[i - 1] then
|
||||
begin
|
||||
var k := i * i;
|
||||
while k <= n1 do
|
||||
begin
|
||||
Mas[k-1] := False;
|
||||
begin
|
||||
Mas[k - 1] := False;
|
||||
k += i
|
||||
end
|
||||
end;
|
||||
Inc(i)
|
||||
Inc(i)
|
||||
end;
|
||||
//n := Mas.Count(t -> t);
|
||||
Result := new List<integer>;
|
||||
|
|
@ -466,12 +487,14 @@ end;
|
|||
|
||||
/// Возвращает список, содержащий цифры числа
|
||||
function Digits(Self: integer): List<integer>;
|
||||
extensionmethod := Digits(Self);
|
||||
extensionmethod :=
|
||||
Digits(Self);
|
||||
|
||||
/// возвращает список, содержащий цифры числа
|
||||
function Digits(Self: int64): List<integer>;
|
||||
extensionmethod := Digits(Self);
|
||||
|
||||
extensionmethod :=
|
||||
Digits(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region Divisors}
|
||||
|
|
@ -484,7 +507,7 @@ begin
|
|||
L.Add(1);
|
||||
L.Add(n);
|
||||
if n > 3 then
|
||||
begin
|
||||
begin
|
||||
var k := 2;
|
||||
while (k * k <= n) and (k < 46341) do
|
||||
begin
|
||||
|
|
@ -510,7 +533,7 @@ begin
|
|||
L.Add(1);
|
||||
L.Add(n);
|
||||
if n > 3 then
|
||||
begin
|
||||
begin
|
||||
var k := int64(2);
|
||||
while (k * k <= n) and (k < 3037000500) do
|
||||
begin
|
||||
|
|
@ -530,11 +553,11 @@ end;
|
|||
|
||||
/// возвращает список делителей натурального числа
|
||||
function Divizors(Self: integer): List<integer>; extensionmethod :=
|
||||
Divizors(Self);
|
||||
|
||||
Divizors(Self);
|
||||
|
||||
/// возвращает список делителей натурального числа
|
||||
function Divizors(Self: int64): List<int64>; extensionmethod :=
|
||||
Divizors(Self);
|
||||
Divizors(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
@ -545,7 +568,7 @@ function SinDegrees(x: real): real := Sin(DegToRad(x));
|
|||
function CosDegrees(x: real): real := Cos(DegToRad(x));
|
||||
|
||||
function TanDegrees(x: real): real := Tan(DegToRad(x));
|
||||
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region Random}
|
||||
|
|
@ -581,79 +604,121 @@ end;
|
|||
|
||||
{$region BooleanLogic}
|
||||
|
||||
function BoolToStr(Self: boolean): string; extensionmethod :=
|
||||
if Self then '1' else '0';
|
||||
|
||||
/// Возвращает логическое значение операции импликации a -> b
|
||||
function Imp(a, b: boolean) : boolean := not a or b;
|
||||
function Imp(Self, b: boolean): boolean; extensionmethod := not Self or b;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для двух переменных
|
||||
procedure TrueTable(f: function(a, b: boolean): boolean;
|
||||
vars: string);
|
||||
/// Возвращает таблицу истинности для двух переменных
|
||||
function TrueTable(f: function(a, b: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[4, 3];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
f(a, b).BoolToStr:2)
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := f(a, b);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для трех переменных
|
||||
procedure TrueTable(f: function(a, b, c: boolean): boolean;
|
||||
vars: string);
|
||||
|
||||
/// Возвращает таблицу истинности для трех переменных
|
||||
function TrueTable(f: function(a, b, c: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[8, 4];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
for var c := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
c.BoolToStr:lengths[2], f(a, b, c).BoolToStr:2)
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := c;
|
||||
Result[i, 3] := f(a, b, c);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для четырех переменных
|
||||
procedure TrueTable(f: function(a, b, c, d: boolean): boolean;
|
||||
vars: string);
|
||||
/// Возвращает таблицу истинности для четырех переменных
|
||||
function TrueTable(f: function(a, b, c, d: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[16, 5];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
for var c := False to True do
|
||||
for var d := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
c.BoolToStr:lengths[2], d.BoolToStr:lengths[3],
|
||||
f(a, b, c, d).BoolToStr:2)
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := c;
|
||||
Result[i, 3] := d;
|
||||
Result[i, 4] := f(a, b, c, d);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для пяти переменных
|
||||
procedure TrueTable(f: function(a, b, c, d, e: boolean): boolean;
|
||||
vars: string);
|
||||
/// Возвращает таблицу истинности для пяти переменных
|
||||
function TrueTable(f: function(a, b, c, d, e: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[32, 6];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
for var c := False to True do
|
||||
for var d := False to True do
|
||||
for var e := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
c.BoolToStr:lengths[2], d.BoolToStr:lengths[3],
|
||||
e.BoolToStr:lengths[4], f(a, b, c, d, e).BoolToStr:2)
|
||||
end;
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := c;
|
||||
Result[i, 3] := d;
|
||||
Result[i, 4] := d;
|
||||
Result[i, 5] := f(a, b, c, d, e);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности
|
||||
/// f = 0 - только для значения функции False
|
||||
/// f = 1 - только для значения функции True
|
||||
procedure TrueTablePrint(a: array[,] of boolean; f: integer);
|
||||
begin
|
||||
var (n, c) := (a.ColCount, 'a');
|
||||
for var i := 0 to n - 2 do
|
||||
begin
|
||||
Write(' ' + c);
|
||||
Inc(c)
|
||||
end;
|
||||
Writeln(' F');
|
||||
Writeln(' ' + (2 * n - 1) * '-');
|
||||
for var i := 0 to a.RowCount - 1 do
|
||||
if not (((f = 0) and a[i, n - 1]) or ((f = 1) and not a[i, n - 1])) then
|
||||
begin
|
||||
for var j := 0 to n - 1 do
|
||||
Write(if a[i, j] then ' 1' else ' 0');
|
||||
Writeln
|
||||
end
|
||||
end;
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region String}
|
||||
|
||||
/// Заменяет последнее вхождение подстроки в строку
|
||||
procedure ReplaceLast(var Строка: string; ЧтоЗаменить, ЧемЗаменить: string);
|
||||
begin
|
||||
var Позиция := LastPos(ЧтоЗаменить, Строка);
|
||||
if Позиция > 0 then
|
||||
begin
|
||||
Delete(Строка, Позиция, ЧтоЗаменить.Length);
|
||||
Insert(ЧемЗаменить, Строка, Позиция)
|
||||
end
|
||||
end;
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
|
|||
48
VisualPascalABCNET/ABCHealth.Designer.cs
generated
Normal file
48
VisualPascalABCNET/ABCHealth.Designer.cs
generated
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
namespace VisualPascalABC
|
||||
{
|
||||
partial class ABCHealth
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ABCHealth));
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// ABCHealth
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(474, 331);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "ABCHealth";
|
||||
this.Text = "Здоровье PascalABC.NET программы";
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
28
VisualPascalABCNET/ABCHealth.cs
Normal file
28
VisualPascalABCNET/ABCHealth.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace VisualPascalABC
|
||||
{
|
||||
public partial class ABCHealth : Form
|
||||
{
|
||||
public ABCHealth()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.Font = new Font(this.Font.FontFamily, 10);
|
||||
this.Activated += OnActivated;
|
||||
//this.Paint += OnPaint;
|
||||
}
|
||||
|
||||
private int i = 0;
|
||||
private void OnActivated(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
VisualPascalABCNET/ABCHealth.ico
Normal file
BIN
VisualPascalABCNET/ABCHealth.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
145
VisualPascalABCNET/ABCHealth.resx
Normal file
145
VisualPascalABCNET/ABCHealth.resx
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAA
|
||||
AAD/////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////+tkYH/jHVj/4dvXP+CaVb/fWRR/3hfTP90Wkf/b1VC/2xRPf9oTTn/ZUs2/2VL
|
||||
Nv9jSDP/////////////////sJWF///////////////////////////////////////+/v3//v39//79
|
||||
/f/+/f3/ZUs1/////////////////7OYif/+/v7//v7+/5NHI/+TRyP/k0cj//7+/v/+/v7/AAD///7+
|
||||
/v/+/v7//v7+/2lOOf////////////////+2nI3//v7+/5NHI//+/v7//v7+//7+/v/+/v7//v7+/wAA
|
||||
///+/v7//v7+//7+/v9sUT3/////////////////uaCS//7+/v+TRyP//v7+//7+/v/+/v7/AAD//wAA
|
||||
//8AAP//AAD//wAA///+/v7/b1ZB/////////////////7yklv/+/v7/k0cj//7+/v/+/v7//v7+//7+
|
||||
/v/+/v7/AAD///7+/v/+/v7//v7+/3RaRv/////////////////Ap5v//v7+//7+/v+TRyP/k0cj/5NH
|
||||
I//+/v7//v7+/wAA///+/v7//v7+//7+/v94X0z/////////////////wque//7+/v/+/v7//vv7//76
|
||||
+f/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/f3/fWRQ/////////////////8Wuo//+/v7/k0cj//7+
|
||||
/v/+/v7/k0cj//7+/v+TRyP/k0cj/5NHI//+/v7//v39/4JpV//////////////////Is6j//////5NH
|
||||
I//9/f3//f39/5NHI//+/v7/k0cj//7+/v/+/v7/k0cj//79/f+Hblz/////////////////y7at////
|
||||
//+TRyP/k0cj/5NHI/+TRyP//v7+/5NHI/+TRyP/k0cj//7+/v/+/f3/jXRi/////////////////867
|
||||
sf//////k0cj////////////k0cj//7+/v+TRyP//v7+//7+/v+TRyP//v39/5J6af//////////////
|
||||
///SwLb///////////+TRyP/k0cj//7+/v/+/v7/k0cj/5NHI/+TRyP//v39//79/f+XgG//////////
|
||||
////////1cS8///////////////////////////////////////+/v3//v39//79/f/+/f3/nYZ1////
|
||||
/////////////9jJwf/VxLz/0sC2/8+8sv/MuK3/ybSo/8awpP/DrKD/wKmc/76mmf+7opT/u6KU/7if
|
||||
kP//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAA==
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
||||
27
VisualPascalABCNET/Form1.Designer.cs
generated
27
VisualPascalABCNET/Form1.Designer.cs
generated
|
|
@ -53,6 +53,7 @@ namespace VisualPascalABC
|
|||
this.tssRunStopSeparator = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.tsOutputWindow = new System.Windows.Forms.ToolStripButton();
|
||||
this.tsAutoInsertCode = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.tsFormat = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
||||
|
|
@ -298,6 +299,7 @@ namespace VisualPascalABC
|
|||
this.tssRunStopSeparator,
|
||||
this.tsOutputWindow,
|
||||
this.tsAutoInsertCode,
|
||||
this.toolStripButton1,
|
||||
this.toolStripSeparator13,
|
||||
this.tsFormat,
|
||||
this.toolStripSeparator4,
|
||||
|
|
@ -535,6 +537,16 @@ namespace VisualPascalABC
|
|||
this.tsAutoInsertCode.ToolTipText = "M_AUTOINSERT_CODE";
|
||||
this.tsAutoInsertCode.Click += new System.EventHandler(this.tsAutoInsertCode_Click);
|
||||
//
|
||||
// toolStripButton1
|
||||
//
|
||||
this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.toolStripButton1.Image = global::VisualPascalABC.Properties.Resources.ABCHealth;
|
||||
this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.toolStripButton1.Name = "toolStripButton1";
|
||||
this.toolStripButton1.Size = new System.Drawing.Size(23, 22);
|
||||
this.toolStripButton1.Text = "Здоровье PascalABC.NET программы";
|
||||
this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click);
|
||||
//
|
||||
// toolStripSeparator13
|
||||
//
|
||||
this.toolStripSeparator13.Name = "toolStripSeparator13";
|
||||
|
|
@ -1391,7 +1403,7 @@ namespace VisualPascalABC
|
|||
// miShowGrid
|
||||
//
|
||||
this.miShowGrid.Name = "miShowGrid";
|
||||
this.miShowGrid.Size = new System.Drawing.Size(180, 22);
|
||||
this.miShowGrid.Size = new System.Drawing.Size(165, 22);
|
||||
this.miShowGrid.Text = "M_SHOW_GRID";
|
||||
this.miShowGrid.Visible = false;
|
||||
this.miShowGrid.Click += new System.EventHandler(this.miShowGrid_Click);
|
||||
|
|
@ -1399,7 +1411,7 @@ namespace VisualPascalABC
|
|||
// miSnapToGrid
|
||||
//
|
||||
this.miSnapToGrid.Name = "miSnapToGrid";
|
||||
this.miSnapToGrid.Size = new System.Drawing.Size(180, 22);
|
||||
this.miSnapToGrid.Size = new System.Drawing.Size(165, 22);
|
||||
this.miSnapToGrid.Text = "M_SNAP_TO_GRID";
|
||||
this.miSnapToGrid.Visible = false;
|
||||
this.miSnapToGrid.Click += new System.EventHandler(this.miSnapToGrid_Click);
|
||||
|
|
@ -1415,7 +1427,7 @@ namespace VisualPascalABC
|
|||
this.miAlignCenters,
|
||||
this.miAlignToGrid});
|
||||
this.miAlign.Name = "miAlign";
|
||||
this.miAlign.Size = new System.Drawing.Size(180, 22);
|
||||
this.miAlign.Size = new System.Drawing.Size(165, 22);
|
||||
this.miAlign.Text = "M_ALIGN";
|
||||
//
|
||||
// miAlignLefts
|
||||
|
|
@ -1473,7 +1485,7 @@ namespace VisualPascalABC
|
|||
this.miCenterHorizontally,
|
||||
this.miCenterVertically});
|
||||
this.miCenter.Name = "miCenter";
|
||||
this.miCenter.Size = new System.Drawing.Size(180, 22);
|
||||
this.miCenter.Size = new System.Drawing.Size(165, 22);
|
||||
this.miCenter.Text = "M_CENTER";
|
||||
//
|
||||
// miCenterHorizontally
|
||||
|
|
@ -1498,7 +1510,7 @@ namespace VisualPascalABC
|
|||
this.miSizeToControlHeight,
|
||||
this.miSizeToGrid});
|
||||
this.miSizeTo.Name = "miSizeTo";
|
||||
this.miSizeTo.Size = new System.Drawing.Size(180, 22);
|
||||
this.miSizeTo.Size = new System.Drawing.Size(165, 22);
|
||||
this.miSizeTo.Text = "M_SIZE_TO";
|
||||
//
|
||||
// miSizeToControl
|
||||
|
|
@ -1535,7 +1547,7 @@ namespace VisualPascalABC
|
|||
this.miBringToFront,
|
||||
this.miSendToBack});
|
||||
this.miZOrder.Name = "miZOrder";
|
||||
this.miZOrder.Size = new System.Drawing.Size(180, 22);
|
||||
this.miZOrder.Size = new System.Drawing.Size(165, 22);
|
||||
this.miZOrder.Text = "M_Z_ORDER";
|
||||
//
|
||||
// miBringToFront
|
||||
|
|
@ -1555,7 +1567,7 @@ namespace VisualPascalABC
|
|||
// miTabOrder
|
||||
//
|
||||
this.miTabOrder.Name = "miTabOrder";
|
||||
this.miTabOrder.Size = new System.Drawing.Size(180, 22);
|
||||
this.miTabOrder.Size = new System.Drawing.Size(165, 22);
|
||||
this.miTabOrder.Text = "M_TAB_ORDER";
|
||||
this.miTabOrder.Click += new System.EventHandler(this.miTabOrder_Click);
|
||||
//
|
||||
|
|
@ -2615,6 +2627,7 @@ namespace VisualPascalABC
|
|||
private System.Windows.Forms.ToolStripButton tsAutoInsertCode;
|
||||
private System.Windows.Forms.ToolStripMenuItem mAUTOINSERTToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem mUNITTESTSToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButton1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1570,6 +1570,383 @@ namespace VisualPascalABC
|
|||
}
|
||||
}
|
||||
|
||||
public ABCHealth ABCHealthForm = null;
|
||||
|
||||
private Label AddString(double x, double y, string s, bool link = false, bool goodfeatures = false)
|
||||
{
|
||||
Label l;
|
||||
if (link)
|
||||
l = new LinkLabel();
|
||||
else l = new Label();
|
||||
l.Text = s;
|
||||
l.Left = (int)Math.Round(x);
|
||||
l.Top = (int)Math.Round(y);
|
||||
//if (link)
|
||||
if (!goodfeatures)
|
||||
l.ForeColor = System.Drawing.Color.Red;
|
||||
else l.ForeColor = System.Drawing.Color.Green;
|
||||
l.AutoSize = true;
|
||||
ABCHealthForm.Controls.Add(l);
|
||||
return l;
|
||||
}
|
||||
|
||||
private string Raz(int n)
|
||||
{
|
||||
if ((n % 10 == 2 || n % 10 == 3 || n % 10 == 4) && (n / 10 % 10 != 1))
|
||||
return n + " раза";
|
||||
else return n + " раз";
|
||||
}
|
||||
private void toolStripButton1_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (ABCHealthForm == null)
|
||||
{
|
||||
ABCHealthForm = new ABCHealth();
|
||||
ABCHealthForm.FormBorderStyle = FormBorderStyle.Fixed3D;
|
||||
}
|
||||
try
|
||||
{
|
||||
var gr = Graphics.FromHwnd(Handle);
|
||||
var scale = gr.DpiX / 96;
|
||||
|
||||
var aw = ABCHealthForm.Width;
|
||||
var ah = ABCHealthForm.Height;
|
||||
var c = new PascalABCCompiler.Compiler();
|
||||
c.Reload();
|
||||
var errors = new List<PascalABCCompiler.Errors.Error>();
|
||||
var warnings = new List<PascalABCCompiler.Errors. CompilerWarning>();
|
||||
|
||||
var text = CurrentSyntaxEditor.TextEditor.ActiveTextAreaControl.TextArea.Document.TextContent;
|
||||
|
||||
WorkbenchServiceFactory.Workbench.ErrorsListWindow.ClearErrorList();
|
||||
var res = c.ParseText(CurrentSourceFileName, text, errors, warnings);
|
||||
WorkbenchServiceFactory.Workbench.ErrorsListWindow.ShowErrorsSync(c.ErrorsList, c.ErrorsList.Count != 0);
|
||||
if (res != null)
|
||||
{
|
||||
var y = 30/2*scale;
|
||||
var stat = new SyntaxVisitors.ABCStatisticsVisitor();
|
||||
stat.ProcessNode(res);
|
||||
//stat.
|
||||
var h = 40 / 2 * scale;
|
||||
var x = 50 / 2 * scale;
|
||||
ABCHealthForm.Controls.Clear();
|
||||
|
||||
var pp = new Panel();
|
||||
|
||||
ToolTip ToolTip1 = new ToolTip();
|
||||
ToolTip1.SetToolTip(pp, "Здоровье PascalABC.NET программы");
|
||||
|
||||
pp.Width = (int)Math.Round(220 / 2 * scale);
|
||||
pp.Height = (int)Math.Round(100 / 2 * scale);
|
||||
pp.Left = ABCHealthForm.ClientSize.Width - pp.Width - (int)Math.Round(24 / 2 * scale);
|
||||
pp.Top = (int)Math.Round(24 / 2 * scale);
|
||||
pp.BackColor = Color.Gray;
|
||||
|
||||
ABCHealthForm.Controls.Add(pp);
|
||||
|
||||
|
||||
var l0 = AddString(x, y, "О здоровье кода",true) as LinkLabel;
|
||||
l0.LinkClicked += (o, e1) =>
|
||||
{
|
||||
System.Diagnostics.Process.Start("https://pascalabcnet.github.io/program_health.html");
|
||||
};
|
||||
y += 48 / 2 * scale;
|
||||
|
||||
var l1 = AddString(x, y, "В программе найдены следующие конструкции базового Паскаля,");
|
||||
y += 36 / 2 * scale;
|
||||
var l2 = AddString(x, y, "считающиеся устаревшими в PascalABC.NET:");
|
||||
l1.ForeColor = Color.Black;
|
||||
l2.ForeColor = Color.Black;
|
||||
y += h;
|
||||
y += 8 / 2 * scale;
|
||||
x += 24 / 2 * scale;
|
||||
|
||||
// Проценты в минус
|
||||
// 1. Количество var вне - количество var внутри. За первую - -10%, за остальные - -2% пока не достигнет 25%
|
||||
// 2. Количество for i - за первую - -15%, за каждую следующую - -3% пока не достигнет 25%
|
||||
// 3. Read(i,j) - за первую -15%, за последующие - -2% пока не достигнет -20%
|
||||
// 4. program - -10%
|
||||
// 5. Статические массивы - -10%, за каждый последующий - -2% пока не достигнет -15%
|
||||
// 6. Write(a,' ',b) - за каждую - -1% пока не достгнет -5%
|
||||
// 7. string[10] - за каждую - -1% . Если минусуется > 100%, то здоровье делать 0%
|
||||
|
||||
var Percent = 100;
|
||||
var NegativePercent = 0;
|
||||
|
||||
var ShowNegativeInfo = false;
|
||||
if (stat.OutBlockVarDefs > 0 && stat.OutBlockVarDefs > stat.InBlockVarDefs)
|
||||
{
|
||||
AddString(x, y, "Переменные описаны вне блоков begin-end: " + Raz(stat.OutBlockVarDefs), false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
if (stat.ForsWithoutVar != 0)
|
||||
{
|
||||
AddString(x, y, "Переменная цикла for не описана в заголовке цикла: " + Raz(stat.ForsWithoutVar), false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
if (stat.ReadProc > 0)
|
||||
{
|
||||
AddString(x, y, "Для ввода использована процедура Read: " + Raz(stat.ReadProc), false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
if (stat.ProgramKeyword)
|
||||
{
|
||||
AddString(x, y, "Использовано ключевое слово program", false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
if (stat.WriteProcWithSpace > 0)
|
||||
{
|
||||
AddString(x, y, "Использована процедура Write с пробелом в качестве разделителя: " + Raz(stat.WriteProcWithSpace), false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
if (stat.StaticArrays > 0)
|
||||
{
|
||||
AddString(x, y, "Используются статические массивы вместо динамических: " + Raz(stat.StaticArrays), false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
if (stat.OldStrings > 0)
|
||||
{
|
||||
AddString(x, y, "Используются устаревшие строки вида string[10]: " + Raz(stat.OldStrings), false);
|
||||
y += h;
|
||||
ShowNegativeInfo = true;
|
||||
}
|
||||
|
||||
///----------------------------------------------------
|
||||
y += 12 / 2 * scale;
|
||||
x -= 24 / 2 * scale;
|
||||
var l3 = AddString(x, y, "В программе используются следующие рекомендованные конструкции");
|
||||
y += 36 / 2 * scale;
|
||||
var l4 = AddString(x, y, "PascalABC.NET:");
|
||||
l3.ForeColor = Color.Black;
|
||||
l4.ForeColor = Color.Black;
|
||||
x += 24 / 2 * scale;
|
||||
y += h;
|
||||
y += 8 / 2 * scale;
|
||||
if (stat.InBlockVarDefs > 0)
|
||||
{
|
||||
AddString(x, y, "Используются внутриблочные описания переменных: " + Raz(stat.InBlockVarDefs), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.ForsWithVar != 0)
|
||||
{
|
||||
AddString(x, y, "Переменная цикла for описана в заголовке цикла: " + Raz(stat.ForsWithVar), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.InitVarInDef > 0)
|
||||
{
|
||||
AddString(x, y, "Используется инициализация при описании: " + Raz(stat.InitVarInDef), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.ReadFuncCount > 0)
|
||||
{
|
||||
AddString(x, y, "Для ввода используется функция вида ReadInteger, ReadReal: " + Raz(stat.ReadFuncCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.ExtAssignCount > 0)
|
||||
{
|
||||
AddString(x, y, "Используется расширенное присваивание: " + Raz(stat.ExtAssignCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.PrintCount > 0)
|
||||
{
|
||||
AddString(x, y, "Для вывода использована Print: " + Raz(stat.PrintCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.TuplesCount > 0)
|
||||
{
|
||||
AddString(x, y, "Используются кортежи: " + Raz(stat.TuplesCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.DynamicArrays > 0)
|
||||
{
|
||||
AddString(x, y, "Используются динамические массивы: " + Raz(stat.DynamicArrays), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.UnpackingAssign > 0)
|
||||
{
|
||||
AddString(x, y, "Используется распаковка значения в переменные: " + Raz(stat.UnpackingAssign), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.LoopsCount > 0)
|
||||
{
|
||||
AddString(x, y, "Используется цикл loop: " + Raz(stat.LoopsCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.ForeachCount > 0)
|
||||
{
|
||||
AddString(x, y, "Используется цикл foreach: " + Raz(stat.ForeachCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
if (stat.LambdasCount > 0)
|
||||
{
|
||||
AddString(x, y, "Используются лямбда-выражения: " + Raz(stat.LambdasCount), false, true);
|
||||
y += h;
|
||||
}
|
||||
|
||||
// Процент здоровья
|
||||
// VarDefs
|
||||
var diffBlockVarDefs = stat.OutBlockVarDefs; // - stat.InBlockVarDefs;
|
||||
if (diffBlockVarDefs > 0)
|
||||
{
|
||||
NegativePercent += 10; // за первую
|
||||
NegativePercent += (diffBlockVarDefs - 1) * 2; // за оставшиеся
|
||||
if (NegativePercent > 25)
|
||||
NegativePercent = 25;
|
||||
}
|
||||
// For i
|
||||
if (stat.ForsWithoutVar > 0)
|
||||
{
|
||||
NegativePercent += Math.Min(15 + (stat.ForsWithoutVar - 1) * 3, 25);
|
||||
}
|
||||
if (stat.ReadProc > 0)
|
||||
{
|
||||
NegativePercent += Math.Min(15 + (stat.ReadProc - 1) * 2, 20);
|
||||
}
|
||||
if (stat.ProgramKeyword)
|
||||
{
|
||||
NegativePercent += 10;
|
||||
}
|
||||
if (stat.StaticArrays > 0)
|
||||
{
|
||||
NegativePercent += Math.Min(10 + (stat.StaticArrays - 1) * 2, 15);
|
||||
}
|
||||
if (stat.WriteProcWithSpace > 0)
|
||||
{
|
||||
NegativePercent += Math.Min(2 + (stat.StaticArrays - 1) * 1, 5);
|
||||
}
|
||||
if (stat.OldStrings > 0)
|
||||
{
|
||||
NegativePercent += stat.OldStrings;
|
||||
}
|
||||
if (NegativePercent < 0)
|
||||
NegativePercent = 0;
|
||||
|
||||
Percent -= NegativePercent;
|
||||
|
||||
var PositivePercent = 0;
|
||||
|
||||
// Проценты за положительное
|
||||
if (stat.InBlockVarDefs > 0)
|
||||
{
|
||||
PositivePercent += 10; // за первую
|
||||
PositivePercent += (stat.InBlockVarDefs - 1) * 2; // за оставшиеся
|
||||
// этот алгоритм уравновешивает описания внутри и вне. За одинаковое количество дается 0 баллов
|
||||
}
|
||||
if (stat.ForsWithVar != 0)
|
||||
{
|
||||
PositivePercent += stat.ForsWithVar * 3;
|
||||
}
|
||||
if (stat.InitVarInDef > 0)
|
||||
{
|
||||
PositivePercent += stat.InitVarInDef * 4;
|
||||
}
|
||||
if (stat.ReadFuncCount > 0)
|
||||
{
|
||||
PositivePercent += stat.ReadFuncCount * 3;
|
||||
}
|
||||
if (stat.ExtAssignCount > 0)
|
||||
{
|
||||
PositivePercent += stat.ExtAssignCount * 3;
|
||||
}
|
||||
if (stat.PrintCount > 0)
|
||||
{
|
||||
PositivePercent += stat.PrintCount * 4;
|
||||
}
|
||||
if (stat.TuplesCount > 0)
|
||||
{
|
||||
PositivePercent += stat.PrintCount * 5;
|
||||
}
|
||||
if (stat.DynamicArrays > 0)
|
||||
{
|
||||
PositivePercent += stat.PrintCount * 5;
|
||||
}
|
||||
if (stat.UnpackingAssign > 0)
|
||||
{
|
||||
PositivePercent += stat.UnpackingAssign * 5;
|
||||
}
|
||||
if (stat.LoopsCount > 0)
|
||||
{
|
||||
PositivePercent += stat.LoopsCount * 4;
|
||||
}
|
||||
if (stat.ForeachCount > 0)
|
||||
{
|
||||
PositivePercent += stat.ForeachCount * 4;
|
||||
}
|
||||
if (stat.LambdasCount > 0)
|
||||
{
|
||||
PositivePercent += stat.LambdasCount * 8;
|
||||
}
|
||||
|
||||
Percent += PositivePercent;
|
||||
if (Percent > 200)
|
||||
Percent = 200;
|
||||
|
||||
if (!ShowNegativeInfo)
|
||||
{
|
||||
l1.Text = "В программе отсутствуют устаревшие в PascalABC.NET конструкции";
|
||||
l2.Text = "";
|
||||
}
|
||||
if (PositivePercent == 0)
|
||||
{
|
||||
l3.Text = "В программе отсутствуют рекомендованные в PascalABC.NET конструкции";
|
||||
l4.Text = "";
|
||||
}
|
||||
|
||||
// Цвет панели
|
||||
if (Percent < 25)
|
||||
pp.BackColor = Color.FromArgb(255, 0, 0);
|
||||
else if (Percent < 50)
|
||||
pp.BackColor = Color.FromArgb(255, 64, 64);
|
||||
else if (Percent < 75)
|
||||
pp.BackColor = Color.FromArgb(128, 128, 128);
|
||||
else if (Percent < 100)
|
||||
pp.BackColor = Color.FromArgb(64+16, 128, 64 + 16);
|
||||
else pp.BackColor = Color.FromArgb(0, 128, 0);
|
||||
|
||||
pp.Paint += (o, ea) =>
|
||||
{
|
||||
Font drawFont = new Font("Arial", 20);
|
||||
SolidBrush drawBrush = new SolidBrush(Color.White);
|
||||
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
|
||||
format.LineAlignment = StringAlignment.Center;
|
||||
format.Alignment = StringAlignment.Center;
|
||||
ea.Graphics.DrawString(Percent + "%", drawFont, drawBrush, new RectangleF(0, 0, pp.Width, pp.Height),format);
|
||||
};
|
||||
|
||||
Button b = new Button();
|
||||
b.Text = "OK";
|
||||
b.Width = (int)Math.Round(156 / 2 * scale);
|
||||
b.Height = (int)Math.Round(48 / 2 * scale);
|
||||
y += h;
|
||||
b.Top = (int)Math.Round(y);
|
||||
b.Left = (int)Math.Round((double)(ABCHealthForm.Width - b.Width) / 2);
|
||||
b.Click += (o, ee) => { ABCHealthForm.Close(); };
|
||||
ABCHealthForm.Controls.Add(b);
|
||||
y += b.Height + h;
|
||||
var hh = ABCHealthForm.Height - ABCHealthForm.ClientSize.Height;
|
||||
ABCHealthForm.Height = (int)Math.Round(y+hh);
|
||||
|
||||
ABCHealthForm.StartPosition = FormStartPosition.Manual;
|
||||
ABCHealthForm.Left = this.Left + Width - aw;
|
||||
ABCHealthForm.Top = this.Top;
|
||||
b.PreviewKeyDown += (o, eee) =>
|
||||
{
|
||||
if (eee.KeyCode == Keys.Escape)
|
||||
ABCHealthForm.Close();
|
||||
};
|
||||
ABCHealthForm.ShowDialog();
|
||||
}
|
||||
}
|
||||
catch (System.Exception ee)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private void tsHelp_Click(object sender, EventArgs e)
|
||||
{
|
||||
__showhelpinqueue();
|
||||
|
|
|
|||
|
|
@ -681,7 +681,7 @@
|
|||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABK
|
||||
FQAAAk1TRnQBSQFMAgEBEAEAARwBAQEcAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||
FQAAAk1TRnQBSQFMAgEBEAEAAaQBAQGkAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||
AwABQAMAAVADAAEBAQABCAYAARQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
||||
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
||||
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
||||
|
|
|
|||
10
VisualPascalABCNET/Properties/Resources.Designer.cs
generated
10
VisualPascalABCNET/Properties/Resources.Designer.cs
generated
|
|
@ -60,6 +60,16 @@ namespace VisualPascalABC.Properties {
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap ABCHealth {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("ABCHealth", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -526,4 +526,7 @@
|
|||
<data name="AutoInsertCode" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\format1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="ABCHealth" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\format2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
@ -119,6 +119,12 @@
|
|||
<Reference Include="WindowsFormsIntegration" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ABCHealth.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ABCHealth.Designer.cs">
|
||||
<DependentUpon>ABCHealth.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="AboutBox.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
|
@ -417,6 +423,9 @@
|
|||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Workbench\WorkbenchServiceFactory.cs" />
|
||||
<EmbeddedResource Include="ABCHealth.resx">
|
||||
<DependentUpon>ABCHealth.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="AboutBox.resx">
|
||||
<SubType>Designer</SubType>
|
||||
<DependentUpon>AboutBox.cs</DependentUpon>
|
||||
|
|
@ -672,6 +681,8 @@
|
|||
<ItemGroup>
|
||||
<Content Include="ABCNET32.ico" />
|
||||
<None Include="Resources\format1.png" />
|
||||
<None Include="Resources\format2.png" />
|
||||
<None Include="Resources\Image1.bmp" />
|
||||
<Content Include="_ABC13.ico" />
|
||||
<None Include="Resources\AlignObjectsBottomHS.png" />
|
||||
<None Include="Resources\AlignObjectsCenteredHorizontalHS.png" />
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ namespace VisualPascalABC
|
|||
bool __ForRun;
|
||||
string __RuntimeServicesModule;
|
||||
bool __savePCU;
|
||||
List<PascalABCCompiler.Errors.Error> ErrorsList = new List<PascalABCCompiler.Errors.Error>();
|
||||
public List<PascalABCCompiler.Errors.Error> ErrorsList = new List<PascalABCCompiler.Errors.Error>();
|
||||
|
||||
IWorkbench Workbench;
|
||||
IWorkbenchProjectService ProjectService;
|
||||
|
|
|
|||
|
|
@ -80,24 +80,29 @@ function SeqRandomReal(n: integer; a, b: real; t: integer): sequence of real;
|
|||
/// на интервале [a; b) с t знаками в дробной части
|
||||
function MatrRandomReal(m: integer; n: integer; a, b: real; t: integer): array [,] of real;
|
||||
|
||||
/// Возвращает логическое значение операции импликации a -> b
|
||||
function Imp(a, b: boolean) : boolean;
|
||||
/// Возвращает таблицу истинности для двух переменных
|
||||
function TrueTable(f: function(a, b: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для двух переменных
|
||||
procedure TrueTable(f: function(a, b: boolean): boolean;
|
||||
vars: string := 'x1.x2');
|
||||
|
||||
/// Выводит на монитор таблицу истинности для трех переменных
|
||||
procedure TrueTable(f: function(a, b, c: boolean): boolean;
|
||||
vars: string := 'x1.x2.x3');
|
||||
/// Возвращает таблицу истинности для трех переменных
|
||||
function TrueTable(f: function(a, b, c: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для четырех переменных
|
||||
procedure TrueTable(f: function(a, b, c, d: boolean): boolean;
|
||||
vars: string := 'x1.x2.x3.x4');
|
||||
/// Возвращает таблицу истинности для четырех переменных
|
||||
function TrueTable(f: function(a, b, c, d: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для пяти переменных
|
||||
procedure TrueTable(f: function(a, b, c, d, e: boolean): boolean;
|
||||
vars: string := 'x1.x2.x3.x4.x5');
|
||||
/// Возвращает таблицу истинности для пяти переменных
|
||||
function TrueTable(f: function(a, b, c, d, e: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
|
||||
/// Выводит на монитор таблицу истинности
|
||||
/// f = 0 - только для значения функции False
|
||||
/// f = 1 - только для значения функции True
|
||||
procedure TrueTablePrint(a: array[,] of boolean; f: integer := -1);
|
||||
|
||||
/// Заменяет последнее вхождение подстроки в строку
|
||||
procedure ReplaceLast(var Строка: string; ЧтоЗаменить, ЧемЗаменить: string);
|
||||
|
||||
implementation
|
||||
|
||||
|
|
@ -219,6 +224,21 @@ begin
|
|||
end
|
||||
end;
|
||||
|
||||
/// Перевод десятичного числа в систему счисления по основанию base (2..32)
|
||||
function ToBase(Self: string; base: integer): string; extensionmethod;
|
||||
begin
|
||||
var n: BigInteger;
|
||||
if not BigInteger.TryParse(Self, n) then exit;
|
||||
var s := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
Result := '';
|
||||
while n > 0 do
|
||||
begin
|
||||
Result := s[integer(n mod base) + 1] + Result;
|
||||
n := n div base
|
||||
end;
|
||||
if Result = '' then Result := '0'
|
||||
end;
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region MinMax}
|
||||
|
|
@ -232,7 +252,7 @@ begin
|
|||
min := m
|
||||
else if m > max then
|
||||
max := m;
|
||||
Result := (min, max)
|
||||
Result := (min, max)
|
||||
end;
|
||||
|
||||
/// Возвращает кортеж из минимума и максимума последовательности s
|
||||
|
|
@ -244,16 +264,17 @@ begin
|
|||
min := m
|
||||
else if m > max then
|
||||
max := m;
|
||||
Result := (min, max)
|
||||
Result := (min, max)
|
||||
end;
|
||||
|
||||
/// Возвращает кортеж из минимума и максимума последовательности
|
||||
function MinMax(Self: sequence of int64): (int64, int64); extensionmethod :=
|
||||
MinMax(Self);
|
||||
|
||||
MinMax(Self);
|
||||
|
||||
/// Возвращает кортеж из минимума и максимума последовательности
|
||||
function MinMax(Self: sequence of integer): (integer, integer);
|
||||
extensionmethod := MinMax(Self);
|
||||
extensionmethod :=
|
||||
MinMax(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
@ -336,11 +357,11 @@ end;
|
|||
|
||||
/// разложение числа на простые множители
|
||||
function Factorize(Self: int64): List<int64>; extensionmethod :=
|
||||
Factorize(Self);
|
||||
|
||||
Factorize(Self);
|
||||
|
||||
/// Разложение числа на простые множители
|
||||
function Factorize(Self: integer): List<integer>; extensionmethod :=
|
||||
Factorize(Self);
|
||||
Factorize(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
@ -349,21 +370,21 @@ function Factorize(Self: integer): List<integer>; extensionmethod :=
|
|||
/// Простые числа на интервале [2;n]
|
||||
function Primes(n: integer): List<integer>;
|
||||
// Модифицированное решето Эратосфена на [2;n]
|
||||
begin
|
||||
begin
|
||||
var Mas := ArrFill(n, True);
|
||||
var i := 2;
|
||||
while i * i <= n do
|
||||
begin
|
||||
if Mas[i-1] then
|
||||
begin
|
||||
var k := i*i;
|
||||
begin
|
||||
if Mas[i - 1] then
|
||||
begin
|
||||
var k := i * i;
|
||||
while k <= n do
|
||||
begin
|
||||
Mas[k-1] := False;
|
||||
begin
|
||||
Mas[k - 1] := False;
|
||||
k += i
|
||||
end
|
||||
end;
|
||||
Inc(i)
|
||||
Inc(i)
|
||||
end;
|
||||
n := Mas.Count(t -> t);
|
||||
Result := new List<integer>;
|
||||
|
|
@ -375,21 +396,21 @@ end;
|
|||
function FirstPrimes(n: integer): List<integer>;
|
||||
// Модифицированное решето Эратосфена
|
||||
begin
|
||||
var n1 := Trunc(Exp((Ln(n)+1.088)/0.8832));
|
||||
var n1 := Trunc(Exp((Ln(n) + 1.088) / 0.8832));
|
||||
var Mas := ArrFill(n1, True);
|
||||
var i := 2;
|
||||
while i * i <= n1 do
|
||||
begin
|
||||
if Mas[i-1] then
|
||||
begin
|
||||
var k := i*i;
|
||||
begin
|
||||
if Mas[i - 1] then
|
||||
begin
|
||||
var k := i * i;
|
||||
while k <= n1 do
|
||||
begin
|
||||
Mas[k-1] := False;
|
||||
begin
|
||||
Mas[k - 1] := False;
|
||||
k += i
|
||||
end
|
||||
end;
|
||||
Inc(i)
|
||||
Inc(i)
|
||||
end;
|
||||
//n := Mas.Count(t -> t);
|
||||
Result := new List<integer>;
|
||||
|
|
@ -466,12 +487,14 @@ end;
|
|||
|
||||
/// Возвращает список, содержащий цифры числа
|
||||
function Digits(Self: integer): List<integer>;
|
||||
extensionmethod := Digits(Self);
|
||||
extensionmethod :=
|
||||
Digits(Self);
|
||||
|
||||
/// возвращает список, содержащий цифры числа
|
||||
function Digits(Self: int64): List<integer>;
|
||||
extensionmethod := Digits(Self);
|
||||
|
||||
extensionmethod :=
|
||||
Digits(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region Divisors}
|
||||
|
|
@ -484,7 +507,7 @@ begin
|
|||
L.Add(1);
|
||||
L.Add(n);
|
||||
if n > 3 then
|
||||
begin
|
||||
begin
|
||||
var k := 2;
|
||||
while (k * k <= n) and (k < 46341) do
|
||||
begin
|
||||
|
|
@ -510,7 +533,7 @@ begin
|
|||
L.Add(1);
|
||||
L.Add(n);
|
||||
if n > 3 then
|
||||
begin
|
||||
begin
|
||||
var k := int64(2);
|
||||
while (k * k <= n) and (k < 3037000500) do
|
||||
begin
|
||||
|
|
@ -530,11 +553,11 @@ end;
|
|||
|
||||
/// возвращает список делителей натурального числа
|
||||
function Divizors(Self: integer): List<integer>; extensionmethod :=
|
||||
Divizors(Self);
|
||||
|
||||
Divizors(Self);
|
||||
|
||||
/// возвращает список делителей натурального числа
|
||||
function Divizors(Self: int64): List<int64>; extensionmethod :=
|
||||
Divizors(Self);
|
||||
Divizors(Self);
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
@ -545,7 +568,7 @@ function SinDegrees(x: real): real := Sin(DegToRad(x));
|
|||
function CosDegrees(x: real): real := Cos(DegToRad(x));
|
||||
|
||||
function TanDegrees(x: real): real := Tan(DegToRad(x));
|
||||
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region Random}
|
||||
|
|
@ -581,79 +604,121 @@ end;
|
|||
|
||||
{$region BooleanLogic}
|
||||
|
||||
function BoolToStr(Self: boolean): string; extensionmethod :=
|
||||
if Self then '1' else '0';
|
||||
|
||||
/// Возвращает логическое значение операции импликации a -> b
|
||||
function Imp(a, b: boolean) : boolean := not a or b;
|
||||
function Imp(Self, b: boolean): boolean; extensionmethod := not Self or b;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для двух переменных
|
||||
procedure TrueTable(f: function(a, b: boolean): boolean;
|
||||
vars: string);
|
||||
/// Возвращает таблицу истинности для двух переменных
|
||||
function TrueTable(f: function(a, b: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[4, 3];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
f(a, b).BoolToStr:2)
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := f(a, b);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для трех переменных
|
||||
procedure TrueTable(f: function(a, b, c: boolean): boolean;
|
||||
vars: string);
|
||||
|
||||
/// Возвращает таблицу истинности для трех переменных
|
||||
function TrueTable(f: function(a, b, c: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[8, 4];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
for var c := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
c.BoolToStr:lengths[2], f(a, b, c).BoolToStr:2)
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := c;
|
||||
Result[i, 3] := f(a, b, c);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для четырех переменных
|
||||
procedure TrueTable(f: function(a, b, c, d: boolean): boolean;
|
||||
vars: string);
|
||||
/// Возвращает таблицу истинности для четырех переменных
|
||||
function TrueTable(f: function(a, b, c, d: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[16, 5];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
for var c := False to True do
|
||||
for var d := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
c.BoolToStr:lengths[2], d.BoolToStr:lengths[3],
|
||||
f(a, b, c, d).BoolToStr:2)
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := c;
|
||||
Result[i, 3] := d;
|
||||
Result[i, 4] := f(a, b, c, d);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности для пяти переменных
|
||||
procedure TrueTable(f: function(a, b, c, d, e: boolean): boolean;
|
||||
vars: string);
|
||||
/// Возвращает таблицу истинности для пяти переменных
|
||||
function TrueTable(f: function(a, b, c, d, e: boolean): boolean):
|
||||
array[,] of boolean;
|
||||
begin
|
||||
var names := vars.ToWords('.');
|
||||
var lengths := names.Select(Имя -> Имя.Length + 1).ToArray;
|
||||
Write(' ');
|
||||
names.Print;
|
||||
Writeln(' F');
|
||||
Result := new boolean[32, 6];
|
||||
var i := 0;
|
||||
for var a := False to True do
|
||||
for var b := False to True do
|
||||
for var c := False to True do
|
||||
for var d := False to True do
|
||||
for var e := False to True do
|
||||
Writeln(a.BoolToStr:lengths[0], b.BoolToStr:lengths[1],
|
||||
c.BoolToStr:lengths[2], d.BoolToStr:lengths[3],
|
||||
e.BoolToStr:lengths[4], f(a, b, c, d, e).BoolToStr:2)
|
||||
end;
|
||||
begin
|
||||
Result[i, 0] := a;
|
||||
Result[i, 1] := b;
|
||||
Result[i, 2] := c;
|
||||
Result[i, 3] := d;
|
||||
Result[i, 4] := d;
|
||||
Result[i, 5] := f(a, b, c, d, e);
|
||||
i += 1
|
||||
end;
|
||||
end;
|
||||
|
||||
/// Выводит на монитор таблицу истинности
|
||||
/// f = 0 - только для значения функции False
|
||||
/// f = 1 - только для значения функции True
|
||||
procedure TrueTablePrint(a: array[,] of boolean; f: integer);
|
||||
begin
|
||||
var (n, c) := (a.ColCount, 'a');
|
||||
for var i := 0 to n - 2 do
|
||||
begin
|
||||
Write(' ' + c);
|
||||
Inc(c)
|
||||
end;
|
||||
Writeln(' F');
|
||||
Writeln(' ' + (2 * n - 1) * '-');
|
||||
for var i := 0 to a.RowCount - 1 do
|
||||
if not (((f = 0) and a[i, n - 1]) or ((f = 1) and not a[i, n - 1])) then
|
||||
begin
|
||||
for var j := 0 to n - 1 do
|
||||
Write(if a[i, j] then ' 1' else ' 0');
|
||||
Writeln
|
||||
end
|
||||
end;
|
||||
|
||||
{$endregion}
|
||||
|
||||
{$region String}
|
||||
|
||||
/// Заменяет последнее вхождение подстроки в строку
|
||||
procedure ReplaceLast(var Строка: string; ЧтоЗаменить, ЧемЗаменить: string);
|
||||
begin
|
||||
var Позиция := LastPos(ЧтоЗаменить, Строка);
|
||||
if Позиция > 0 then
|
||||
begin
|
||||
Delete(Строка, Позиция, ЧтоЗаменить.Length);
|
||||
Insert(ЧемЗаменить, Строка, Позиция)
|
||||
end
|
||||
end;
|
||||
|
||||
{$endregion}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue