unit Unit1; { Autor: Tomáš Budnikov Co to umí: - načítat XML a vstup - vypočítat výsledky na výstupy - ukládání do souboru Co to neumí: - standartizovaný výstup - grafický výstup (malování) - editování } interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, Math; type TMyNet = Array of record // datova struktura Hradlo: string; Output: string; Inputs: Array of string; InputsDone: integer; end; type TForm1 = class(TForm) Memo1: TMemo; MyXML: TXMLDocument; Button1: TButton; Button2: TButton; OpenDialog1: TOpenDialog; OpenDialog2: TOpenDialog; procedure LoadXML; procedure LoadData; function NetExecute: string; // hlavni vyhodnocovaci funkce procedure SetMyNet(hradlo: string; Output: string; Inputs: Array of string); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } MyNet: TMyNet; end; var Form1: TForm1; XMLpath, DataPath: string; implementation {$R *.dfm} procedure TForm1.LoadXML; var a: IDomNode; b: IDOMNode; gate: string; i,j: integer; inputs: Array of string; begin a:= MyXML.DOMDocument.documentElement.firstChild; // Parsování XML dokumentu i:= 0; while (i < MyXML.DOMDocument.documentElement.childNodes.length) do begin if a.nodeName = 'input' then begin //Memo1.Lines.add('input '+a.attributes.getNamedItem('id').nodeValue); setLength(inputs,0); SetMyNet('input',a.attributes.getNamedItem('id').nodeValue,inputs); end; //// ----------- GATE -------------------- if a.nodeName = 'gate' then begin //Memo1.Lines.add('GATE '+a.attributes.getNamedItem('type').nodeValue); gate:= a.attributes.getNamedItem('type').nodeValue; b:= a.firstChild; j:= 0; setLength(inputs,0); while (j < a.childNodes.length) do begin if b.nodeName = 'input' then begin //Memo1.Lines.add('-- input '+b.attributes.getNamedItem('id').nodeValue); setLength(inputs,length(inputs)+1); inputs[length(inputs)-1]:= b.attributes.getNamedItem('id').nodeValue; end; if b.nodeName = 'output' then begin //Memo1.Lines.add('-- output '+b.attributes.getNamedItem('id').nodeValue); SetMyNet(gate,b.attributes.getNamedItem('id').nodeValue,inputs); end; b:= b.nextSibling; inc(j); end; end; //// ----------- /GATE -------------------- if a.nodeName = 'output' then begin //Memo1.Lines.add('output '+a.attributes.getNamedItem('id').nodeValue); setLength(inputs,1); inputs[0]:= a.attributes.getNamedItem('id').nodeValue; SetMyNet('output',inputs[0],inputs); end; a:= a.nextSibling; inc(i); end; //for i:= low(MyNet) to High(MyNet) do // memo1.Lines.Add(MyNet[i].Hradlo + ' - '+ MyNet[i].Output); end; // Nacitani vstupnich dat procedure TForm1.LoadData; var str, str2: TStringList; tmp: string; ii,jj: integer; begin str:= TStringList.Create; // in str2:= TStringList.Create; // out str.LoadFromFile(DataPath); for jj:= 0 to str.Count-1 do begin // nacti SetLength(MyNet,0); LoadXML; for ii:= 0 to length(str.Strings[jj])-1 do begin setLength(MyNet[ii].Inputs,1); MyNet[ii].Inputs[0]:= str.Strings[jj][ii+1]; end; // Vypis vysledku do Mema tmp:= NetExecute; Memo1.Lines.Add(str.Strings[jj] + ' -> '+ tmp); str2.Add(tmp); end; // ulozeni vysledku do souboru str2.SaveToFile(Copy(Datapath,0,length(Datapath)-length(ExtractFileExt(DataPath)))+'.out'); end; // nastaveni hodnot do vyhodnocovaciho pole procedure TForm1.SetMyNet(hradlo: string; Output: string; Inputs: Array of string); var len,i: integer; begin len:= Length(MyNet); SetLength(MyNet, len + 1); MyNet[len].Hradlo:= hradlo; MyNet[len].Output:= Output; SetLength(MyNet[len].Inputs,length(inputs)); for i:= Low(inputs) to High(inputs) do begin MyNet[len].Inputs[i]:= Inputs[i]; end; end; // Vyhodnoceni function TForm1.NetExecute: string; var i,j,k,l: integer; hradlo, output, tmp: string; inputs: Array of string; zmena: boolean; begin result:= ''; SetLength(inputs,0); zmena:= true; while zmena do begin zmena:= false; for i:=Low(MyNet) to High(MyNet) do begin // INPUT if (MyNet[i].Hradlo = 'input') AND (MyNet[i].Output<>'') then begin for j:= Low(MyNet) to High(MyNet) do for k:= Low(MyNet[j].Inputs) to High(MyNet[j].Inputs) do begin if MyNet[j].Inputs[k] = MyNet[i].Output then // ID nahradime cislem begin MyNet[j].Inputs[k]:= MyNet[i].Inputs[0]; inc(MyNet[j].InputsDone); zmena:= true; end; end; MyNet[i].Output:= ''; continue; end; // HRADLA if (not(MyNet[i].Hradlo = 'output')) AND (MyNet[i].Output<>'') AND (MyNet[i].InputsDone = Length(MyNet[i].Inputs)) then begin tmp:= '0'; // MyNet[i] predchozi if MyNet[i].Hradlo = 'and' then // MyNet[j] dalsi begin tmp:= MyNet[i].Inputs[0]; for l:= Low(MyNet[i].Inputs)+1 to High(MyNet[i].Inputs) do tmp:= IntToStr(integer(bool(strToInt(tmp)) AND bool(strToInt(MyNet[i].Inputs[l])))); end else if MyNet[i].Hradlo = 'or' then begin tmp:= MyNet[i].Inputs[0]; for l:= Low(MyNet[i].Inputs)+1 to High(MyNet[i].Inputs) do tmp:= IntToStr(integer(bool(strToInt(tmp)) OR bool(strToInt(MyNet[i].Inputs[l])))); end else if MyNet[i].Hradlo = 'xor' then begin tmp:= MyNet[i].Inputs[0]; for l:= Low(MyNet[i].Inputs)+1 to High(MyNet[i].Inputs) do tmp:= IntToStr(integer(bool(strToInt(tmp)) XOR bool(strToInt(MyNet[i].Inputs[l])))); end else if MyNet[i].Hradlo = 'not' then tmp:= IntToStr(integer(NOT bool(strToInt(MyNet[i].Inputs[0])))); for j:= Low(MyNet) to High(MyNet) do for k:= Low(MyNet[j].Inputs) to High(MyNet[j].Inputs) do begin if MyNet[j].Inputs[k] = MyNet[i].Output then // ID nahradime vypoctem begin MyNet[j].Inputs[k]:= IntToStr( StrToInt(tmp)); inc(MyNet[j].InputsDone); zmena:= true; end; end; MyNet[i].Output:= ''; continue; end; end; end; // while zmena < { // kod slouzici k detailnimu vypisu memo1.Clear; for i:= low(MyNet) to High(MyNet) do begin memo1.text:= memo1.Text + MyNet[i].Hradlo + ' - out: '+ MyNet[i].Output + ' - in: '; for j:= low(MyNet[i].inputs) to high(MyNet[i].inputs) do begin memo1.text:= memo1.Text + MyNet[i].inputs[j] +','; end; memo1.Lines.Add(''); end; } for i:= low(MyNet) to High(MyNet) do // navratova hodnota if MyNet[i].Hradlo = 'output' then result:= result + MyNet[i].inputs[0]; end; procedure TForm1.FormCreate(Sender: TObject); begin //LoadData; end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then begin // knoflik pro nacteni XML XMLpath:= OpenDialog1.FileName; MyXML.FileName:= XMLPath; MyXML.Active:= true; end; end; procedure TForm1.Button2Click(Sender: TObject); begin if OpenDialog2.Execute then // knoflik k nacteni vstupnich dat begin DataPath:= OpenDialog2.FileName; LoadData; end; end; end.