Алгоритм «Поразрядная сортировка»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение

 

Компьютеры являются неотъемлемой частью нашей жизни, так как мы каждый день используем их на работе, дома и во множестве других мест.

Возможности применения компьютера в учебном процессе, весьма многообразны. Он может служить для моделирования  изучаемых явлений или систем, для реализации учебных игр, применяться  для выполнения вычислений, для редактирования текстов, в качестве различного рода тренажеров, как инструмент автоматизации  проектирования, программируемого управления экспериментами, как информационно-поисковая или экспертная система и, наконец, как средство практического обучения самой компьютерной технике и программированию.

Основной задачей современного программиста при написании программы  является не подвергание её бесконечным  тестированиям, а тщательный, полный анализ исходного текста программы, а также отладка программы  с помощью дополнительных программных  средств.

Целью моей курсовой работы является повторение и закрепление  материала, изученного по языку программирования высокого уровня Паскаль. Задачами является повышение навыков программирования, закрепление полученных знаний.

 

1. Задание

 

Разработать программу для OS MS-DOS "Поразрядная сортировка", Использовать средства встроенного Ассемблера, реализующие алгоритм, работу с файла (считывание из файла), пользовательский интерфейс.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.Основная  часть

2.1 Алгоритм «Поразрядная  сортировка»

 

Поразрядная сортировка  — алгоритм сортировки за линейное время.

Алгоритм сортировки, числа  сортируются по разрядам. Существует два варианта least significant digit (LSD) и most significant digit (MSD). При LSD сортировке, сначала сортируются младшие разряды, затем старшие. При MSD сортировке все наоборот. При LSD сортировке получается следующий порядок: короткие ключи идут раньше длинных, ключи одного размера сортируются по алфавиту, это совпадает с нормальным представлением чисел: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. При MSD сортировке получается алфавитный порядок, который подходит для сортировки строк. Например "b, c, d, e, f, g, h, i, j, ba" отсортируется как "b, ba, c, d, e, f, g, h, i, j". Если MSD применить к числам разной длины, то получим последовательность 1, 10, 2, 3, 4, 5, 6, 7, 8, 9.

 

При MSD сортировке последовательность сортируется по старшему значимому  двоичному разряду так, чтобы  все ключи начинающиеся с 0 оказались  перед всеми ключами начинающимися  с 1. Для этого необходимо найти  крайний слева ключ Ki, начиющийся с 1, и крайний справа ключ Kj, начиющийся с 0. После чего Ki и Kj меняются местами, и процесс повторяется, пока не получится i > j. Пусть F0 — множество элементов  начинающихся с 0, F1 — множество всех остальных элементов. Будем к F0 применять  поразрядную сортировку (начав теперь со второго бита слева, а не со старшего) до тех пор, пока множество F0 полностью  не рассортируется. Затем проделаем  то же самое с F1.

Вместо сравнения N-й битовой  позиции в слове сравнивается N-й байт строки.

 

Нулевой проход использует только нулевые символы в каждой строке и является корзинной сортировкой  по нулевому символу. Эффективная реализация возможна при использовании массива  ссылок на строки вместо самих строк, дополнительного массива «границ  корзин», инициализируемого частотами  встреч символов при первом проходе, они же число элементов в каждой «корзине». При следующем проходе  заполняется массив ссылок.

 

N-й (для N > 0) проход  выполняется последовательно над  каждой корзиной, полученной на (N - 1)-м проходе, с делением её  на «подкорзины». В этом проходе  сравниваются N-ные символы каждой  строки.

 

Операция завершается  при N, равном максимальной длине строки, или же в ситуации, когда все  «подкорзины» получили длину 1.

 

 

.

2.2 Выбор языка и среды разработки

 

В процессе моего обучения мною были освоены 2 языка программирования: Turbo Pascal и Си. Для реализации программы в качестве основного был выбран язык программирования Turbo Pascal, который представляется мне наиболее оптимальным для разработки MS-DOS приложений и который отлично подходит для реализации заданий средней сложности, какой и является моя программа. Данный язык мне кажется наиболее удобным, ясным и понятным для программирования.

Разработка программы  велась в среде Turbo Pascal 7.0. Система программирования Turbo-Pascal была разработана в середине 80-х годов фирмой Borland International (США). Turbo-Pascal включает в себя как язык программирования - одно из расширений языка Pascal для ЭВМ типа IBM, так и среду, предназначенную для написания, отладки и запуска программ.   Практически он полностью реализует аппаратные возможности персонального компьютера фирмы IBM и совместимых с ним. Система имеет два основных достоинства: простота и естественность языка программирования Pascal, великолепные сервисные возможности диалоговой среды программирования фирмы Borland.  Язык характеризуется расширенными возможностями по сравнению со стандартом, хорошо развитой библиотекой стандартных модулей,  позволяющих использовать возможности операционной системы,  создавать оверлейные структуры, организовывать ввод-вывод , формировать графические изображения и т.д.

Именно поэтому, на мой  взгляд, язык Turbo Pascal является универсальным  и оптимальным для программистов, начинающих писать собственные программы.

Так же согласно заданию  данной курсовой работы в данной программе  использованы средства встроенного  Ассемблера, реализующие алгоритм поиска «Поразрядная сортировка», работу с файлами (считывание из файла), пользовательский интерфейс.

2.3Описание переменных

Описание переменных, используемых в исполнительном файле RAZR.PAS приведено в таблице 1.

Таблица 1.Описание переменных исполнительного файла RAZR.PAS

 

 

Идентификатор

Тип данных

Назначение

lng

integer

Хранит длину строки

s

string

Строка для вывода на экран  текста

f

txt

Переменная привязки файла  с входными данными

g

txt

Переменная привязки файла  с выходными данными

ic

integer

Переменная-счётчик

p

integer

Переменная-счётчик

n

integer

Переменная-счётчик

m

string

Массив входных значений

gf

string

Массив выходных значений

ks

string

Переменная для связи  массива и файла


 

2.4 Описание  процедур

 

Все процедуры в исполнительном файле RAZR.PAS приведены в таблице 2.

 

Таблица 2. Процедуры модуля RAZR.PAS

Идентификатор

Назначение

MainMenu

Вывод меню


 

Таблица 2. Процедуры модуля RAZR.PAS(Продолжение)

Идентификатор

Назначение

Vihod

Выход из программы

About

О программе

MenuSpr

Вывод информации о входных  данных

ZapVFail

Вывод информации о записи данных

Schit

Считывание данных из файла

Zapis

Запись данных в файл

RazSort

Поразрядная сортировка


2.5 Комплект  файлов, входящих в состав программы

 

В комплект готовой программы  входят файлы: RAZR.PAS, RAZR.EXE, in.txt

2.6 Интерфейс

При запуске исполняемого файла программы BINARNIY.EXE появляется основное окно программы (Рисунок 1.)

Рисунок 1.Основное меню программы.

При нажатии на 1, появляется окно (Рисунок 2)

Рисунок 2.Окно по нажатии пункта 2.

При нажатии пункта 2, происходит запуска алгоритма «Поразрядной сортировки» (Рисунка 3).

Рисунок 3.Запуск алгоритма  поиска.

При нажатии пункта 3, происходит сохранение в файл под названием  OUT.txt (Рисунок 4).

Рисунок 4.Сохранение в файл.

По нажатию пункта 4 происходит вывод справочной информации (Рисунок  5).

Рисунок 5.Справочная информация

По нажатию пункта 0 происходит выход из программы(Рисунок 6)

 

Рисунок 6.Выход из программы

 

2.7 Тестирование программы

 

Проверка  правильности работы программы и отсутствия ошибок в  ней была проведена на следующих  компьютерах разными пользователями:

  • Celeron 433, 128Mb ОЗУ, RivaTNT-2, OC Windows Me;
  • AMD 64, 512Mb ОЗУ, 3.0Ггц, Radeon X9600, OC Windows XP SP2;
  • Intel Pentium 4, 2.8 GHz, 512 Mb ОЗУ, Sapphire ATI Radeon 9600 XT,  ОС Windows XP Sp 2;

 

  • Intel Celeron D 2.6 GHz, 512 Mb ОЗУ, NVidia GeForce 6600,
    • OC Windows XP SP2;
    • Intel Pentium 3 733 Mгц, 420Mb ОЗУ,  GeForce2 440 MX,
  • OC Windows XP SP2;

В процессе тестирования никаких  ошибок и неисправностей не выявлено. Программа работает стабильно и  без ошибок.

 

 

 

 

 

 

 

Заключение

 

Был изучен и реализован алгоритм «Поразрядной сортировки».Как  было указано возможно использование  алгоритма и для сортировки строк, но был реализован «цифровой» алгоритм. Это обусловлено той причиной, что алгоритм более продуктивно  работает с числами, давая высокие  результаты.

Все выше указанные задачи были успешно реализованы на языке  Pascal, с применением «ассемблерных вставок», что значительно увеличивает скорость работы алгоритма.

 

 

 

 

 

 

 

 

 

 

 

 

 

Список  литературы:

  1. Кнут Д., Искусство программирования для ЭВМ, т. 3 "Сортировка и поиск", М., Мир, 1978
  2. Вирт Н., Алгоритмы и структуры данных, М., Мир, 1989.

 

  1. Абрамов С.А., Зима В.С. Начало программирования на языке Паскаль. – М.: Наука, 1987. – 112 с.
  2. Вальвачев А.Н., Крисевич В.С. Программирование на языке Паскаль для персональных ЭВМ ЕС: Справочное пособие. – Мн.: Вышэйшая школа, 1989. – 223 с.
  3. Дробышевский Р.В., Лифенко А.П., Персональный компьютер для начинающих. – Л.: ИМА–пресс, 1990. – 88 с.
  4. Зуев Е.А. Язык программирования Turbo Pascal 6.0. – М.: Унитех , 1992. – 298 с.
  5. Котов В.М., Волков B.А., Лапо И.А., Методы алгоритмизации. – М.: Народная асвета, 1997. – 159 с.
  6. Павловский А.И., Пупцев А.Е., Гращенко П.Л, Информатика 10. – М.: Народная асвета, 2000. – 222 с.
  7. Фаронов В.В. Программирование на персональных ЭВМ в среде Турбо Паскаль. – М.: Изд-во МГТУ, 1990. – 590 с.
  8. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс: Учеб. пособие. – М.: Нолидж, 1998. – 616 с.

 

 

 

 

 

Приложение

Ниже приведён листин разрабатываемой  программы:

program razrSort;

 

uses

  Crt;

 

var

  buf: char;

  lng, i: integer;

  s: string;

  NameTxt: string;

  f,g:Text;

    ic,p,n:integer;

    m:array [1..100] of string;

    gf:array [1..100] of string;

    ks:string;

    ppc:integer;

    psk:string;

    res:string;

    mas:pointer;

    len:word;

 

procedure Pause;forward;

procedure MainMenu;forward;

procedure MenuInf;forward;

 

procedure Vihod;

 

var

  key: Char;

begin

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,28

        mov DH,10

        int 10h

     end;

     s:='Hotite viyty?';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,28

        mov DH,12

        int 10h

     end;

     s:='Da - Enter';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,48

        mov DH,12

        int 10h

     end;

     s:='Net - Esc';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,28

        mov DH,10

        int 10h

     end;

  repeat

     asm

        mov AH,0

        int 16h

        mov key,AL

     end;

    if key = #13 then Halt(1);

  until key = #27;

  MainMenu;

     end;

 

procedure Information;

var

f:file of char;

p:char;

begin

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

   assign(f, NameTxt);

   reset(f);

   if IOResult<>0 then begin

    s:='Ошибка! Файл не найден!';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     end

     else

    begin

    while not eof(f) do

       begin

       read(f,p);

       write(p);

       end;

    close(f);

    end;

    asm

       mov AH,0

       int 16h

    end;

    MenuInf;

end;

 

procedure Pause;

begin

    asm

       mov AH,0

       int 16h

    end;

end;

 

procedure About;

begin

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,34

        mov DH,6

        int 10h

     end;

     s:='O programme';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,26

        mov DH,8

        int 10h

     end;

     s:='>>>>>>>>>>>Kursovaya rabota Porazradnaya sortirovka<<<<<<<<';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,26

        mov DH,10

        int 10h

     end;

     s:='******************';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

 

     asm

        mov AH,2

        mov BH,0

        mov DL,36

        mov DH,18

        int 10h

     end;

     s:='>>>>>>AF RGSU<<<<<<';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,36

        mov DH,20

        int 10h

     end;

     s:='2011 god';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,26

        mov DH,24

        int 10h

     end;

     s:='Dla vihoda nachmite lubuiy knopky';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0

        int 16h

     end;

mainmenu;

end;

 

procedure B;

var

i, j: Integer;

T:string;

begin

  for i := 1 to n do

    for j := n downto i+1 Do

      if m[Pred(j)] > m[j] then begin { < }

        T := m[Pred(j)]; m[Pred(j)] := m[j]; m[j] := T

      end

end;

 

procedure MenuSpr;

var ccc:char;

begin

repeat

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,5

        int 10h

     end;

     s:='zagruzka faila..';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,6

        int 10h

     end;

{for i:=1 to n do writeln(m[i]);}

     s:='>>>>>>>>>   Obrabotka faila.......|';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,7

        int 10h

     end;

     begin

 

{   if IOResult<>0 then begin

    s:='Ошибка! Файл не найден!';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH, 0eh

        mov AL, buf

        mov BH, 0

        int 10h

     end;

     end;

     asm

        mov AH, 0eh

        mov AL, 10

        mov BH, 0

        int 10h

        mov AH, 0eh

        mov AL, 13

        mov BH, 0

        int 10h

     end;

     end

     else

    begin}

 

    end;

    {asm

       mov AH,0

       int 16h

    end;

    end;      }

{begin

assign(f,'in.txt');

reset(f);

 

{while not eof(f) do begin   

 

 

     s:='Dla vozvrata nazhmite "0"';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,40

        mov DH,22

        int 10h

     end;

     asm

        mov AH,0

        int 16h

        mov ccc,AL

     end;

     until(ccc='0');

case ccc of

'0': mainmenu

    end;

    asm

       mov AH,0

       int 16h

    end;

end;

 

 

procedure Zapvfail;

var ccc:char;

begin

repeat

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,5

        int 10h

     end;

     s:='>>>>>>>>>  Otkritie faila.........|';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,6

        int 10h

     end;

     s:='>>>>>>>>>  Zapis dannih v fail.....|';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,7

        int 10h

     end;

begin

 

end;

{   if IOResult<>0 then begin

    s:='Ошибка! Файл не найден!';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH, 0eh

        mov AL, buf

        mov BH, 0

        int 10h

     end;

     end;

     asm

        mov AH, 0eh

        mov AL, 10

        mov BH, 0

        int 10h

        mov AH, 0eh

        mov AL, 13

        mov BH, 0

        int 10h

     end;

     end

     else

    begin}

       {begin

 

for i:=1 to n do

begin

write(g,m[i],' ');

end;

    close(g);

    end;

    {asm

       mov AH,0

       int 16h

    end;

    end;      }

{begin

assign(f,'in.txt');

reset(f);

 

{while not eof(f) do begin   

 

 

 

     s:='Dla vozvrata v menu nazhmite "0"';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,40

        mov DH,22

        int 10h

     end;

     asm

        mov AH,0

        int 16h

        mov ccc,AL

     end;

     until(ccc='0');

case ccc of

'0': mainmenu

    end;

    asm

       mov AH,0

       int 16h

    end;

end;

 

 

procedure schit;

begin

assign(f,'vhodnie.txt'); reset(f);

assign(g,'vihodnie.txt'); rewrite(g);

 

while not eof(f) do begin    {считываем ВЕСЬ файл}

readln(f,ks);    {считываем  очередную строку}

ic:=0;  {ставим счётчик  слов на 0}

 

repeat     {*********предложение  разбиваем на слова и записываем  в массив}

inc(ic); {увеличиваем счётчик  текущего ПРЕДЛОЖЕНИЯ}

p:=pos(' ',ks);  {смотрим где  находится пробел}

m[ic]:=copy(ks,1,p-1);  {записываем  текущее слово в массив}

delete(ks,1,p); {то слово, которое  заприсали в массив - удаляем}

until p=0; {****************}

 

n:=ic+1;   {конец массива}

if s[length(ks)]='.' then  {если строчка  заканчивается точкой}

begin m[n]:=copy(ks,1,length(ks)-1); m[1]:=m[1]+'.' {то эту точку перемещаем на 1 слово}

end else m[n]:=ks;  {а если нет  точки - то просто его записываем  в массив}

writeln(g);;

for i:=5 downto 1 do write(g,gf[i],' '); {идём  с конца массива в начало  и записываем слова в обратном  порядке}

end;

close(f);  close(g);

MenuSpr;

end;

 

 

procedure schit2;

begin

assign(f,'vhodnie.txt'); reset(f);

assign(g,'vihodnie.txt'); rewrite(g);

 

while not eof(f) do begin    {считываем ВЕСЬ файл}

readln(f,ks);    {считываем  очередную строку}

ic:=0;  {ставим счётчик  слов на 0}

 

repeat     {*********предложение  разбиваем на слова и записываем  в массив}

inc(ic); {увеличиваем счётчик  текущего ПРЕДЛОЖЕНИЯ}

p:=pos(' ',ks);  {смотрим где  находится пробел}

gf[ic]:=copy(ks,1,p-1);  {записываем  текущее слово в массив}

delete(ks,1,p); {то слово, которое  заприсали в массив - удаляем}

until p=0; {****************}

 

n:=ic+1;   {конец массива}

if s[length(ks)]='.' then  {если строчка  заканчивается точкой}

begin gf[n]:=copy(ks,1,length(ks)-1); gf[1]:=gf[1]+'.' {то эту точку перемещаем на 1 слово}

end else gf[n]:=ks;  {а если нет  точки - то просто его записываем  в массив}

writeln(g);;

for i:=1 to n do write(g,m[i],' '); {идём  с конца массива в начало  и записываем слова в обратном  порядке}

end;

close(f);  close(g);

end;

 

 

 

procedure zapis;

begin

schit2;

  begin

  zapvfail;

  end;

end;

 

 

 

procedure RazSort;

begin

 

{asm

  dec n

 

@CycleExt:

  xor ebx, ebx

  mov ecx, n

  mov esi, 0

 

@CycleIn:

  mov edi, M[esi]

  cmp edi, M[esi+4]

  jg @Exchange

  add esi, 4

  loop @CycleIn

  jmp @Check

 

@Exchange:

  mov ebx, M[esi+4]

  mov M[esi+4], edi

  mov M[esi], ebx

  add esi, 4

  loop @CycleIn

 

@Check:

  cmp ebx, 0

  je @Exit

  jmp @CycleExt

 

@Exit:  }

end;

 

 

 

 

procedure sort;

var ccc:char;

begin

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,5

        int 10h

     end;

     s:='Sortiruem..';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,5

        mov DH,6

        int 10h

     end;

begin

B;

end;

 

{   if IOResult<>0 then begin

    s:='Ошибка! Файл не найден!';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH, 0eh

        mov AL, buf

        mov BH, 0

        int 10h

     end;

     end;

     asm

        mov AH, 0eh

        mov AL, 10

        mov BH, 0

        int 10h

        mov AH, 0eh

        mov AL, 13

        mov BH, 0

        int 10h

     end;

     end

     else

    begin}

       {begin

 

for i:=1 to n do

begin

write(g,m[i],' ');

end;

    close(g);

    end;

    {asm

       mov AH,0

       int 16h

    end;

    end;      }

{begin

assign(f,'in.txt');

reset(f);

 

{while not eof(f) do begin   

repeat

 

 

     s:='Otsortirovan.Dla vozvrata nazhmite "0"';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,40

        mov DH,22

        int 10h

     end;

     asm

        mov AH,0

        int 16h

        mov ccc,AL

     end;

     until(ccc='0');

case ccc of

'0': mainmenu

    end;

    asm

       mov AH,0

       int 16h

    end;

end;

 

 

 

 

procedure MainMenu;

var a:char;

begin

repeat

     asm

        mov AH,0

        mov AL,3

        int 10h

     end;

     asm

       mov AH,2

       mov BH,0

       mov DL,40

       mov DH,7

       int 10h

     end;

     s:='Glavnoe menu';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

       mov AH,2

       mov BH,0

       mov DL,35

       mov DH,10

       int 10h

    end;

    s:='** 1) - Zagruzit ishodnie dannie **';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,35

        mov DH,12

        int 10h

     end;

     s:='** 2) - Vipolnit Sortirovky **';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,35

        mov DH,14

        int 10h

     end;

     s:='** 3) - Sohranit rezultati **';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,35

        mov DH,16

        int 10h

     end;

     s:='** 4) - Copyright **';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,35

        mov DH,18

        int 10h

     end;

      s:='** 0) - Vihod v windows **';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh

        mov AL,13

        mov BH,0

        int 10h

     end;

     asm

        mov AH,2

        mov BH,0

        mov DL,30

        mov DH,24

        int 10h

     end;

      s:='>>>>>Viberite punkt menu<<<<<';

     lng:=length (s);

     for i:= 1 to lng do

     begin

     buf:=s[i];

     asm

        mov AH,0eh

        mov AL,buf

        mov BH,0

        int 10h

     end;

     end;

     asm

        mov AH,0eh

        mov AL,10

        mov BH,0

        int 10h

        mov AH,0eh