Структуры и алгоритмы обработки данных

Описание процедур, используемых в программе




UPOR

процедура генерирует упорядоченный по возрастанию массив чисел

NOTUPOR

процедура генерирует неупорядоченный (случайный) массив чисел

PR_CHOOSE

процедура осуществляет сортировку методом прямого выбора

PR_INS

процедура осуществляет сортировку методом прямой  вставки

PR_OBM

процедура осуществляет сортировку методом прямого обмена

MAKE

процедура осуществляет исследование прямых методов сортировки

EXAMPLE

процедура выполняет контрольный пример (сортировку методом прямого включения)

Текст программы

 

{$M 65000,65000,65000}

{Выделение памяти осуществляется для того, чтобы было возможно осуществлять исследование  массива, содержащего 10000 элементов

***********************************************************

        Данная программа является курсовой работой по дисциплине

               'Структуры и алгоритмы обработки данных'

                  на тему 'Прямые методы сортировки'

                   В работе исследуются методы:

                          - прямого выбора;

                          - прямого обмена;

                          - прямой вставки.

   Для исследования используются массивы из 10,100,100,10000 элементов.

**********************************************************}

{ использование модулей для осуществления вывода на экран }

uses crt,crtext,dcrt;***************************************************}

{** процедура, генерирующая упорядоченный по возрастанию массив чисел**}

{*********************************************************}

procedure upor(a:array of integer;var a1:array of integer);

var

{i - счетчик в циклах}

 i:integer;

begin

{первый элемент принимает значение 1}

a[0]:=1;

 for i:=1 to high(a) do

  begin

{каждый последующий элемент принимает значение,

равное значению предыдущего элемента + случайное число}

   a[i]:=a[i-1]+random(2);

  end;

 for i:=0 to high(a) do

   a1[i]:=a[i];

end;

{*********************************************************}

{** процедура, генерирующая  не упорядоченный (случайный) массив чисел**}


{*********************************************************}
procedure notupor(a:array of integer;var a1:array of integer);
var
{i - счетчик в циклах}
 i:integer;
begin
 for i:=0 to high(a) do
  begin { элемент массива принимает случайное значение из диапазона 0 <= a[i] < 9999}
   a[i]:=random(9999);
  end;
 for i:=0 to high(a) do
   a1[i]:=a[i];
end;
{*********************************************************}
{***** процедура, осуществляющая сортировку методом прямого выбора***}
{*********************************************************}
procedure pr_choose(a:array of integer;var a1:array of integer;var k,k1:longint);
var
{i,j - счетчики в циклах}
 i,j:integer;
{x - переменная для осуществления обмена между a[i] и a[j]}
 x:integer;
begin
{k1  -  переменная для подсчета количества сравнений
 k   -  переменная для подсчета количества перемещений}
           k:=0;k1:=0;
{high(a) - функция, возвращающая номер последнего элемента массива}
for i := 0 to high(a) - 1 do
  begin
    for j := i + 1 to high(a) do
     begin
      k1:=k1+1;
      if a[i] < a[j] then
        begin
         k:=k+1;
  {перестановка i-го с j-м элементом с помощью переменной x}
          x:=a[i];
          a[i]:=a[j];
          a[j]:=x;
        end;
     end;
  end;
for i:=0 to high(a) do
 a1[i]:=a[i];
end;
{**********************************************************
 ***** процедура, осуществляющая сортировку методом прямого *
 *************** обмена(метод пузырька) *********************
**********************************************************}
procedure pr_obm(a:array of integer;var a1:array of integer;var k,k1:longint);
var
{i,j - счетчики в циклах}
 i,j:integer;
{x - переменная для осуществления обмена между a[j-1] и a[j]}
 x:integer;
begin
{k1 -  переменная для подсчета количества сравнений
 k  -  переменная для подсчета количества перемещений}
k:=0;k1:=0;
for i := 1 to high(a) do
 begin
  for j := high(a) downto i do
   begin


    k1:=k1+1;
    if a[j - 1] < a[j] then
      begin
        k:=k+1;
  {обмена содержимым элементов массива a[j-1] и a[j]
   с помощью переменной x}
        x := a[j - 1];
        a[j - 1] := a[j];
        a[j] := x;
      end;
    end;
 end;
 for i:=1 to high(a) do
  a1[i]:=a[i];
end;
{*********************************************************}
{*** процедура, осуществляющая сортировку методом прямого включения **}
{*********************************************************}
procedure pr_ins(a:array of integer;var a1:array of integer;var k,k1:longint);
var
{i,j - счетчики в циклах}
 i,j:integer;
{x - переменная для осуществления обмена между a[i] и a[j]}
 x:integer;
begin
{k1 -  переменная для подсчета количества сравнений
 k  -  переменная для подсчета количества перемещений}
k:=0;k1:=0;
for i := 1 to high(a) do
  begin
    x := a[i];
    for j := i - 1 downto 0 do
     begin
      k1:=k1+1;
      if x > a[j] then
                    begin
                     k:=k+1;
  {обмена содержимым элементов массива a[j+1] и a[j]
   с помощью переменной x}
                     a[j + 1] := a[j];
                     a[j]:=x;
                    end;
     end;
  end;
  for i:=0 to high(a) do
   a1[i]:=a[i];
end;
{**********************************************************
        процедура, осуществляющая исследование методов сортировок  для
 ***********  заданного массива чисел  ***********************
**********************************************************}
procedure make(x1,n:integer;a,a1:array of integer;k:byte);
var
{количество перестановок}
 kol_pr_ins, kol_pr_obm,kol_pr_choose:longint;
{количество сравнений}
 kol_sr_ins, kol_sr_obm,kol_sr_choose:longint;
  s:string;
begin
case k of
1:s:='упорядоченных по возрастанию';
2:s:='неупорядоченных (случайных)';
3:s:='упорядоченных по убыванию';
end;
{--------метод прямого включения---------}
pr_ins(a,a1,kol_pr_ins,kol_sr_ins);
{--------метод прямого обмена (метод пузырька)--------}


pr_obm(a,a1,kol_pr_obm,kol_sr_obm);
{---------метод прямого выбора----------}
pr_choose(a,a1,kol_pr_choose,kol_sr_choose);
{** вывод результата исследования **}
{вывод шапки таблицы}
gotoxy(3,x1);textcolor(cyan);textbackground(1);
writeln('Для ',high(a)+1,' ',s,' элементов:');
gotoxy(3,x1+1);textcolor(lightgreen);textbackground(1);
writeln('Методы:    прямого включения    прямого обмена     прямого выбора');
{вывод полученных при исследовании данных}
gotoxy(3,x1+2);textcolor(white);write('перест.');
gotoxy(17,wherey);write(kol_pr_ins);
gotoxy(37,wherey);write(kol_pr_obm);
gotoxy(58,wherey);writeln(kol_pr_choose);
gotoxy(3,x1+3);write('сравн.');
gotoxy(17,wherey);write(kol_sr_ins);
gotoxy(37,wherey);write(kol_sr_obm);
gotoxy(58,wherey);writeln(kol_sr_choose);
str(high(a)+1,s);box(1,19,80,24,1,15,double,s+' элементов');
 gotoxy(4,20);write('Сортировка ',s,' элементов по убыванию');
 gotoxy(4,21);write('Сортируются ',s,' упорядоченных(по возрастанию) элементов');
 gotoxy(4,22);write('Сортируются ',s,' неупорядоченных(случайных) элементов');
 textbackground(lightgray);
 textcolor(red);gotoxy(3,25);write('Esc - главное меню');
end;
{*********************************************
  Пример сортировки методом прямого включения
 Дан массив записей, содержащий:
           -имя студента;
           -кол-во баллов (рейтинг).
   Необходимо отсортировать данный массив по
   убыванию  количества  баллов  у  студента.
*********************************************}
procedure example;
type
{rec - запись, содержащая:
                 name - имя студента;
                 num  - кол-во баллов (рейтинг).}
 rec=record
      name:string;
      num:byte;
     end;
var
{mas - массив записей rec}
 mas:array[1..20] of rec;
{счетчики в циклах}
 i,j:integer;
 x:rec;
{переменные для подсчета количества сравнений и перемещений
 во время сортировки}
 k_sr,k_p:integer;
 key:char;
begin
{переменные для подсчета количества сравнений и перемещений
 во время сортировки}


 k_sr:=0;k_p:=0;
randomize;
{Данный массив, содержащий имена студентов}
mas[1].name:='Иван';mas[2].name:='Петр';mas[3].name:='Сидор';
mas[4].name:='Василий';mas[5].name:='Денис';mas[6].name:='Геннадий';
mas[7].name:='Борис';mas[8].name:='Марат';mas[9].name:='Казбек';
mas[10].name:='Алексей';mas[11].name:='Владимир';mas[12].name:='Сидор';
mas[13].name:='Виталий';mas[14].name:='Александр';mas[15].name:='Михаил';
mas[16].name:='Евгений';mas[17].name:='Артур';mas[18].name:='Руслан';
mas[19].name:='Мурат';mas[20].name:='Аркадий';
{задание количества баллов у студента случайным образом}
for i:=1 to 20 do
 mas[i].num:=random(19)+1;
{вывод пояснений}
getshadow;
textbackground(lightgray);
textcolor(red);gotoxy(15,1);write(' Пример сортировки по убыванию методом прямого включения');
textbackground(lightgray);
textcolor(red); gotoxy(3,25);  write('Esc - главное меню');
textcolor(red); gotoxy(65,25); write('F1 - задание');
box(58,0,80,25,1,15,double,'Статистика');
textcolor(lightmagenta);
gotoxy(59,3); write(' Сортировка  методом ');
gotoxy(61,4); write('прямого включения.');
textcolor(white); gotoxy(59,5); write('---------------------');
box(31,0,57,25,1,15,double,'После сортировки');
textcolor(lightmagenta); gotoxy(32,3); write(' N   Имя           балл');
box(1,0,30,25,1,15,double,'До сортировки');
textcolor(lightmagenta); gotoxy(3,3);  write('N   Имя              балл');
{вывод на экран исходного массива}
for i:=1 to 20 do
 begin
textcolor(lightcyan); gotoxy(3,i+3);  write(i);
textcolor(yellow);    gotoxy(7,i+3);  write(mas[i].name);
textcolor(lightred);  gotoxy(25,i+3); writeln(mas[i].num);
 end;
{сортировка по убыванию количества баллов}
for i := 2 to 20 do
  begin
    x := mas[i];
    for j := i - 1 downto 1 do
     begin
  {k_sr - счетчик количества сравнений}
    k_sr:= k_sr+1;
          if x.num > mas[j].num then
                    begin
  {k_p - счетчик количества перемещений}
                    k_p:=k_p+1;
  {обмена содержимым элементов массива mas[j+1] и mas[j]


   с помощью переменной x}
                     mas[j + 1] := mas[j];
                    mas[j]:=x;
                    end;
     end;
  end;
{вывод на экран отсортированного массива}
for i:=1 to 20 do
 begin
textcolor(lightcyan); gotoxy(33,i+3);  write(i);
textcolor(yellow);    gotoxy(37,i+3);  write(mas[i].name);
textcolor(lightred);  gotoxy(52,i+3);  writeln(mas[i].num);
 end;
{ вывод на экран количества сравнений и перестановок
 в массиве, осуществленных во время сортировки}
 textcolor(lightgreen); gotoxy(61,6); write('Сравнений:');
 textcolor(lightgray);  gotoxy(75,6); write(k_sr);
 textcolor(lightgreen); gotoxy(61,8); write('Перестановок:');
 textcolor(lightgray);  gotoxy(75,8); write(k_p);
   repeat
   key:=' ';   if keypressed then  key:=readkey;
    case key of
    {#59 - код клавиши F1}
    #59:begin
    {вывод окна с заданием для контрольного примера}
    {putshadow+box - вывод окна с тенью}
     putshadow(15,7,65,15);box(15,7,65,15,lightgray,0,double,'Задание');
         textcolor(red);
         gotoxy(21,9);  write('Дан список, содержащий фамилии студентов');
         gotoxy(21,10); write('и их рейтинговые  баллы. Необходимо от-');
         gotoxy(21,11); write('сортировать данный список  по убыванию ');
         gotoxy(21,12); write('рейтинговых баллов.');
         textcolor(yellow);gotoxy(50,15);write('Enter - отмена');
        end;
    {#13 - код клавиши Enter}
    #13:getshadow;
    end;
    {#27 - код клавиши Esc}
   until key=#27;
end;
{**********************************************************
************************  Основная программа **************
**********************************************************}
const
{массив строк - пунктов главного меню}
 menu:array[1..7] of string=(' Пример сортировки  ',' Исследование (10 эл-тов)',
                             ' Исследование (100 эл-тов) ',
                             ' Исследование (1000 эл-тов) ',
                             ' Исследование (10000 эл-тов)  ',


                             ' О программе '
                             ,' Выход ');
var
{массивы чисел, используемые для исследования}
 a,a1:array[0..9] of integer;    {10    - чисел}
 b,b1:array[0..99] of integer;   {100   - чисел}
 c,c1:array[0..999] of integer;  {1000  - чисел}
 d,d1:array[0..9999] of integer; {10000 - чисел}
 f:byte;                         {показатель того , какой массив
                                  поступает в процедуру для упо-
                                  рядочивания по убыванию:
                                   1     - неупорядоченный (слу-
                                           чайный);
                                   2     - упорядоченный по воз-
                                           растанию;
                                   3     - упорядоченный по убы-
                                           ванию}.
 k:char;
 item:byte;
begin
clrscr;cursoroff; {гашение курсора}
repeat
textbackground(0);clrscr;
{fill - процедура, заполняющая заданную область  экрана заданными  символами заданного  цвета}
fill(lightgray,1,1,2,80,25,' ');
{menuv - процедура, выводящая на экран вертикальное меню}
menuv(25,10,menu,lightgray,black,red,lightgreen,yellow,'Сортировка',item,double);
{item - переменная, содержащая номер выбранного пункта меню}
case item of
1:example;
2:begin
       {getshadow - процедура, убирающая тень от меню}
          getshadow;
       {** исследуются 10 упорядоченных по возрастанию элементов **}
       {box - процедура, выводящая на экран окно}
           box(1,0,80,18,1,15,double,'10 элементов');
       {вызов процедуры upor, генерирующей упорядоченный по возрастанию
        массив чисел}
           upor(a,a);
       {вызов процедуры make, осуществляющей исследование методов сортировки}
           make(3,10,a,a1,1);
       {** исследуются 10 неупорядоченных (случайных) элементов **}
       {вызов процедуры notupor, генерирующей неупорядоченный(случайный)  массив чисел}


          notupor(a,a);
       { вызов процедуры make, осуществляющей исследование методов сортировки}
          make(8,10,a,a1,2);
       {** исследуются 10 упорядоченных по убыванию элементов **}
       {вызов процедуры make, осуществляющей исследование методов сортировки}
          make(13,10,a1,a1,3);
       {ожидание нажатия клавиши Esc}
     repeat
      k:=readkey;
     until k=#27;
  end;
3:begin
       {getshadow - процедура, убирающая тень от меню}
       getshadow;
       {box - процедура, выводящая на экран окно}
       box(1,0,80,18,1,15,double,'100 элементов');
      {исследуются 100 упорядоченных по возрастанию элементов}
         upor(b,b);
         make(3,100,b,b1,1);
      {исследуются 100 неупорядоченных (случайных) элементов}
          notupor(b,b);
          make(8,100,b,b1,2);
       {исследуются 100 упорядоченных по убыванию элементов}
          make(13,100,b1,b1,3);
     repeat   k:=readkey;    until k=#27;
  end;
4:begin
       {getshadow - процедура, убирающая тень от меню}
       getshadow;
       box(1,0,80,18,1,15,double,'1000 элементов');
 {исследуется 1000 упорядоченных по возрастанию элементов}
   upor(c,c);
   make(3,1000,c,c1,1);
 {исследуется 1000 неупорядоченных (случайных) элементов}
   notupor(c,c);
   make(8,1000,c,c1,2);
 {исследуется 1000 упорядоченных по убыванию элементов}
   make(13,1000,c1,c,3);
     repeat
      k:=readkey;
     until k=#27;
  end;
5:begin
       getshadow;
       box(1,0,80,18,1,15,double,'10000 элементов');
 {исследуются 10000 упорядоченных по возрастанию элементов}
   upor(d,d);
   make(3,10000,d,d1,1);
 {исследуются 10000 неупорядоченных (случайных) элементов}
   notupor(d,d);
   make(8,10000,d,d1,2);
  {исследуются 10000 упорядоченных по убыванию элементов}
   make(13,10000,d1,d,3);
     repeat
      k:=readkey;
     until k=#27;
  end;
6:begin
       {getshadow - процедура, убирающая тень от меню}
       getshadow;
       {ввод окна с темой курсовой работы}
       box(10,5,70,15,lightgray,0,double,'О программе');
       putshadow(10,5,70,15);
       textcolor(brown);
       gotoxy(12,7);write('Данная программа является курсовой работой по дисциплине');
       gotoxy(21,8);write('"Алгоритмы и структуры обработки данных"');
       gotoxy(30,9);write('Тема курсовой работы: ');
       gotoxy(18,10);write('   "Исследование прямых методов сортировки"');
       gotoxy(17,11);write('Курсовую работу выполнили студенты группы 95-ОА-21');
         textcolor(red);gotoxy(3,25);write('Esc - главное меню');
     repeat
      k:=readkey;
     until k=#27;
  end;
end;
until item=7;
end.
{*********************конец программы********************}
 

Содержание раздела