Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  XXX
Language: PASCAL
Code:
Uses Crt;
Const
  R = 4;
  SR = 16;
Type
  Diz = string[R];
Var
  S :array[1..SR*2] of Diz;
  Rez :array[1..SR*2] of Diz;
  MD :array[1..SR*2] of Diz;
  Flag :array[1..SR*2] of byte;
  Y :array[1..SR] of byte;
  IndexS : byte;
  IndexRez : byte;
  i, j, k : byte;
  FData : Text;
  FRez : Text;
  FDSNF : file of Diz;
  FSImp : file of Diz;
  p:Diz;
  mdnf, num:string;
  n,err : integer; 
  
  
Function MakeDiz(Number: byte): Diz;
Var
  i : byte;
  S : Diz;
  C : char;
Begin
  S:='';
  for i:=0 to R-1 do
    begin
      C:=chr(((Number shr i) and $01) + 48);
      Insert(C, S, 1);
    end;
  MakeDiz:=S;
End;

Procedure Stuck(S1, S2: Diz; IndexS1, IndexS2 : byte);
Var
  i, k, n: byte;
Begin
  k:=0; 
  for i:=1 to R do
    if S1[i] <> S2[i] then
      begin
        k:=k+1;
        n:=i;
      end;
  case k of
    0 : begin
          Inc(IndexRez);
          Rez[IndexRez]:=S1;
          Flag[IndexS1]:=1;
          Flag[IndexS2]:=1;
        end;
    1 : if (S1[n]<>'*') and (S2[n]<>'*') then
          begin
            S1[n]:='*';
            Inc(IndexRez);
            Rez[IndexRez]:=S1;
            Flag[IndexS1]:=1;
            Flag[IndexS2]:=1;
          end;
  end;
End;

Function Del(S : Diz): Boolean;
Var
  i, k : byte;
Begin
  Del:=False;
  k:=0;
  for i:=1 to R do
    if S[i]='*' then k:=k+1;
  if k=R then Del:=True;
End;

Procedure Clear;
Var
  i, j : byte;
Begin
  IndexS:=0;
  for i:=1 to SR*2 do
    begin
      Flag[i]:=0;
      S[i]:='';
    end;
  for i:=1 to IndexRez-1 do
    if Flag[i]=0 then
      for j:=i+1 to IndexRez do
        if Rez[i]=Rez[j] then Flag[j]:=1;
  for i:=1 to IndexRez do
    if Flag[i]=0 then
      begin
        Inc(IndexS);
        S[IndexS]:=Rez[i];
      end;
End;


Procedure PrintRezult(Step: Byte);
Var
  i : byte;
Begin
  WriteLn('{------------------------------------------------}');
  WriteLn(FRez, '{-----------------------------------------}');
  if Step=0 then
    begin
      Write('Source DNF.');
      Write(FRez, 'Source DNF.');
    end
  else
    begin
      Write('Step num :', Step:2, '.');
      Write(FRez, 'Step num:', Step:2, '.');
    end;
  WriteLn(' Diz qty :', IndexS:2);
  WriteLn(FRez, ' Diz qty :', IndexS:2);
  for i:=1 to IndexS do
    begin
      WriteLn(S[i]);
      WriteLn(FRez, S[i]);
    end;
  ReadKey;
End;


Begin
  ClrScr;
  Assign(FDSNF, 'dsnf.dat');
  Rewrite(FDSNF);
  Assign(FSImp, 'simplimp.dat');
  Rewrite(FSImp);
  Assign(FRez, 'rezult.dat');
  ReWrite(FRez);
  
  Assign(FData, 'func.dat');
  Reset(FData);
  for i:=1 to SR do
    Read(FData, Y[i]);
  Close(FData);
  
  for i:=1 to SR do
    S[i]:=MakeDiz(i-1);
  
  
  IndexRez:=0;
  for i:=1 to SR do
    if Y[i]=1 then
      begin
        Inc(IndexRez);
        Rez[IndexRez]:=S[i];
      end;
  for i:=1 to SR*2 do
    S[i]:=Rez[i];
  IndexS:=IndexRez;
  for i:=1 to IndexS do
    Write(FDSNF, S[i]);
  PrintRezult(0);
  
  for i:=1 to R do
    begin
      IndexRez:=0;
      {------------------------------------------------------------}
      for j:=1 to SR*2 do {prepare Flag to join}
        Flag[j]:=0;
      {------------------------------------------------------------}
      for j:=1 to SR*2 do {join}
        Rez[j]:='';
      for j:=1 to IndexS-1 do
        for k:=j+1 to IndexS do
          Stuck(S[j], S[k], j, k);
      {------------------------------------------------------------}
      for j:=1 to IndexS do 
        if Flag[j]=0 then
          begin
            Inc(IndexRez);
            Rez[IndexRez]:=S[j];
          end;
      {------------------------------------------------------------}
      Clear;
      {------------------------------------------------------------}
      PrintRezult(i); 
    end;
  
  IndexRez:=0;
  for i:=1 to IndexS do
    if not Del(S[i]) then
      begin
        Inc(IndexRez);
        Rez[IndexRez]:=S[i];
      end;
  for i:=1 to IndexS do
    Write(FSImp, S[i]);
  PrintRezult(R+1);
  writeln;
  for i:=1 to IndexS do
    begin
      p:=s[i];
      for j:=1 to R do
        begin
          if p[j]<>'*' then begin
            if p[j]='1' then write('x',j)
            else write('!x',j);
          if (j<>R) then 
            if (p[j+1]<>'*') or (j<>(R-1)) then write(' & ');
          end;
        end;
      if i<>IndexS then write('  +  ');
    end;
  writeln;
  writeln('Enter MDNF:');
  readln(mdnf);
  i:=1;
  while (i<=length(mdnf)) do
    begin
      p:='****';
      while (mdnf[i]<>'+') do
        begin
          if mdnf[i]<>'!' then 
            begin
              num:=mdnf[i+1];
              val(num, n, err);
            end
          else num:=mdnf[i+2];
          
        end;
    end;
  Close(FSImp);
  Close(FDSNF);
  Close(FRez);
End.
Comments: