Словарь с графической оболочкой — Pascal(Паскаль)

Для компиляции нужны файлы EGAVGA.BGI и GRAPH.TPU. Они должны лежать в папке с компилируемым файлом.

uses crt, graph;

const
  N = 10000;
  h = 5;

type
  slovo = record
    rus: string;
    perevod: string;
  end;

  Data = array [1 .. N] of ^slovo;

var
  a: Data;
  f: text;
  gd, gm: integer;
  DataCount, poz: integer;
  FileName, DCount, naity: string;
  simv, vybor: char;
  MaxRus: integer;
  poisk, y, y2: integer;

function rus(mes: string): string;
var
  i: integer;
BEGIN
  for i := 1 to Length(mes) do
    case mes[i] of
      'а' .. 'п':
        mes[i] := Chr(Ord(mes[i]) - 64);
      'р' .. 'я':
        mes[i] := Chr(Ord(mes[i]) - 16);
    end;
  rus := mes;
END;

function Prepare(path: string): boolean;
begin
  Prepare := true;
  assign(f, path);
{$I-}
  reset(f);
{$I+}
  if IOResult <> 0 then
  begin
    rewrite(f);
    Prepare := false;
  end;
  close(f);
end;

function Fill(var max_length: integer): integer;
var
  tmp, max_str: string;
  k: integer;
begin
  k := 0;
  reset(f);
  while not eof(f) do
  begin
    readln(f, tmp);
    if Length(tmp) > 0 then
    begin
      inc(k);
      new(a[k]);
      a[k]^.rus := copy(tmp, 1, pos(' ', tmp) - 1);
      if k > 1 then
      begin
        if Length(max_str) < Length((a[k]^.rus)) then
        begin
          max_str := a[k]^.rus;
          max_length := Length(a[k]^.rus);
        end;
      end
      else
      begin
        max_str := a[1]^.rus;
        max_length := Length(a[1]^.rus);
      end;
      a[k]^.perevod := copy(tmp, pos(' ', tmp) + 1,
        Length(tmp) - pos(' ', tmp));
    end;
  end;
  close(f);
  Fill := k;
end;

procedure Clear;
var
  k: integer;
begin
  for k := 1 to DataCount do
    Dispose(a[k]);
end;

procedure LexSort(count: integer; var item: Data);
{ leksikograficheskoe uporiadochivanie }
  procedure QuickSort(l, r: integer; var it: Data);
  var
    i, j: integer;
    x: string;
    y: slovo;
  begin
    i := l;
    j := r;
    x := it[(l + r) div 2]^.rus;
    repeat
      while it[i]^.rus < x do
        inc(i);
      while x < it[j]^.rus do
        dec(j);
      if i <= j then
      begin
        y := it[i]^;
        it[i]^ := it[j]^;
        it[j]^ := y;
        inc(i);
        dec(j);
      end;
    until i > j;
    if l < j then
      QuickSort(l, j, it);
    if l < r then
      QuickSort(i, r, it);
  end;

begin
  QuickSort(1, count, item);
end;

function BynarSearch(Search: string): integer;
{ dvoichnyi poisk }
var
  left, right, middle: integer;
  first, last: integer;
begin
  left := 1;
  right := DataCount;
  repeat
    middle := left + (right - left) div 2;
    if a[middle]^.rus > Search then
      right := middle
    else
      left := middle;
  until right - left <= 1;
  if Search = a[left]^.rus then
    BynarSearch := left
  else if Search = a[right]^.rus then
    BynarSearch := right
  else
    BynarSearch := 0;
end;

procedure PaintWindow;
begin
  SetFillStyle(1, White);
  Bar(8, 28, 622, 452);
  SetColor(LightBlue);
  Rectangle(8, 28, 622, 452);
  Line(311, 28, 311, 452);
end;

procedure TheEnd;
begin
  Clear;
  Halt;
end;

procedure Wait(x_, y_: integer);
begin
  repeat
    Delay(30000);
    SetFillStyle(1, LightRed);
    Bar(x_, y_, x_ + 5, y_ + 2);
    Delay(30000);
    SetFillStyle(1, White);
    Bar(x_, y_, x_ + 5, y_ + 2);
  until keypressed;
end;

function InTextXY(x_, y_: integer; kol_simv: byte; msg: string): string;
var
  tmp: string;
  ch: char;
  fl: boolean;
begin
  tmp := '';
  InTextXY := 'Slovar.txt';
  fl := false;
  Wait(x_, y_ + TextHeight(' ') - 4);
  repeat
    ch := readkey;
    if fl = true then
    begin
      Bar(x_, y_, x_ + TextWidth(msg) + TextWidth(' '), y_ + TextHeight(msg));
      fl := false;
    end;
    if ch = #27 then
      TheEnd;
    if ch <> #13 then
      if (ch <> #8) and (Length(tmp) <= kol_simv) then
        tmp := tmp + ch
      else if Length(tmp) > 0 then
        delete(tmp, Length(tmp), 1);
    if Length(tmp) <= kol_simv then
    begin
      Bar(x_, y_, x_ + TextWidth(tmp) + TextWidth(' '), y_ + TextHeight(tmp));
      OutTextXY(x_, y_, tmp);
    end;
    if (ch = #13) and ((Length(tmp) = 0) or (tmp = ' ')) then
    begin
      Bar(x_, y_, x_ + TextWidth(tmp) + TextWidth(' '), y_ + TextHeight(tmp));
      SetColor(LightRed);
      OutTextXY(x_, y_, msg);
      SetColor(LightBlue);
      fl := true;
    end;
  until (ch = #13) and (Length(tmp) > 0) and (tmp <> ' ');
  InTextXY := tmp;
end;

procedure Add(x_, y_: integer; kol_simv: byte; msg: string);
var
  tmp: string;
begin
  x_ := x_ + TextWidth(' ');
  Bar(x_, y_, x_ + TextWidth(' ') * kol_simv, y_ + TextHeight(' '));
  tmp := InTextXY(x_ + 8, y_, kol_simv, msg);
  inc(DataCount);
  new(a[DataCount]);
  a[DataCount]^.rus := naity;
  a[DataCount]^.perevod := tmp;
  append(f);
  writeln(f, a[DataCount]^.rus, ' ', a[DataCount]^.perevod);
  close(f);
  if Length(naity) > MaxRus then
    MaxRus := Length(naity);
  Bar(312, y_, x_ + TextWidth(' ') * kol_simv, y_ + TextHeight(' '));
  SetColor(Blue);
  OutTextXY(316, y_, ': ' + tmp);
end;

function ChooseSlovar: string;
var
  tmp: string;
begin
  SetFillStyle(1, Yellow);
  Bar(150, 146, 472, 160);
  Rectangle(150, 146, 472, 160);
  SetColor(LightBlue);
  OutTextXY(254, 150, 'VYBOR SLOVARIA');
  SetFillStyle(1, White);
  Bar(150, 160, 472, 190);
  Rectangle(150, 160, 472, 190);
  FileName := InTextXY(172, 170, 35, 'Vvedite imia faila-slovaria!');
  OutTextXY(171, 10, '|  File://' + FileName);
end;

begin
  DataCount := 0;
  gd := detect;
  initgraph(gd, gm, '');
  if graphresult <> grok then
  begin
    writeln('Oshibka pri zapuske graficheskogo rezhima!');
    readln;
    Halt;
  end
  else
  begin
    SetBkColor(LightCyan);
    HighVideo;
    ClearDevice;
    SetFillStyle(1, Yellow);
    Bar(8, 5, 622, 21);
    SetColor(LightBlue);
    OutTextXY(14, 10, 'PROGRAMMA "SLOV@R"');
    Rectangle(8, 5, 622, 21);
    SetColor(Blue);
    OutTextXY(280, 460, 'ESC-EXIT');
    SetColor(LightBlue);
    ChooseSlovar;
    PaintWindow;

    repeat
      poisk := 0;
      repeat
        if Prepare(FileName) then
        begin
          DataCount := Fill(MaxRus);
          LexSort(DataCount, a);
        end;

        SetFillStyle(1, Yellow);
        Bar(510, 9, 620, 17);
        SetColor(LightBlue);
        if DataCount > 0 then
        begin
          Str(DataCount, DCount);
          OutTextXY(510, 10, DCount + ' slov');
        end
        else
          OutTextXY(510, 10, 'slovar pust');

        y := h * 2 * poisk;
        OutTextXY(12, 36 + y, '> ');

        naity := InTextXY(28, 36 + y, 35, 'Vvedite slovo!');

        if Length(naity) <= MaxRus then
        begin
          poz := 0;
          if DataCount > 0 then
            poz := BynarSearch(naity);
          if poz > 0 then
          begin
            SetColor(Blue);
            OutTextXY(316, 36 + y, ': ' + a[poz]^.perevod);
          end
          else
          begin
            SetColor(Red);
            OutTextXY(316, 36 + y, ': Net v slovare. Dobavit? [y/n]');
            Wait(572, 40 + y);
            vybor := upcase(readkey);
            if vybor = 'Y' then
              Add(316, 36 + y, 35, 'Vvedite perevod slova!')
            else
            begin
              Bar(316, 36 + y, 316 + TextWidth(' ') * 35,
                36 + y + TextHeight(' '));
              OutTextXY(316, 36 + y, ': Net v slovare.');
            end;
          end;
        end
        else
        begin
          SetColor(Red);
          OutTextXY(316, 36 + y, ': Net v slovare. Dobavit? [y/n]');
          Wait(572, 40 + y);
          vybor := upcase(readkey);
          if vybor = 'Y' then
            Add(316, 36 + y, 35, 'Vvedite perevod slova')
          else
          begin
            Bar(316, 36 + y, 316 + TextWidth(' ') * 35,
              36 + y + TextHeight(' '));
            OutTextXY(316, 36 + y, ': Net v slovare.');
          end;
        end;
        inc(poisk);
        if poisk = 41 then
          readkey;
      until poisk = 41;
      poisk := 0;
      PaintWindow;
    until h = 11;
  end;
  TheEnd;

end.

Leave a Comment

77 + = 81