<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=95734&amp;view=findpost&amp;p=728046</guid>
        <pubDate>Tue, 24 May 2005 08:59:00 +0000</pubDate>
        <title>Знакомство с коллекциями</title>
        <link>https://forum.sources.ru/index.php?showtopic=95734&amp;view=findpost&amp;p=728046</link>
        <description><![CDATA[Romtek: <span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>База данных на примере коллекции с интерфейсом Turbo Vision</strong></span><br>
<br>
Программа основана на программе из сообщ. №1 (без интерфейса)<br>
Аналогично, рассмотрены реализованы операции: добавление, редактирование, удаление, просмотр, поиск в коллекции, сохранения и загрузки коллекции.]]></description>
        <author>Romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=95734&amp;view=findpost&amp;p=721159</guid>
        <pubDate>Wed, 18 May 2005 05:59:16 +0000</pubDate>
        <title>Знакомство с коллекциями</title>
        <link>https://forum.sources.ru/index.php?showtopic=95734&amp;view=findpost&amp;p=721159</link>
        <description><![CDATA[Romtek: <span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'><span class='tag-size' data-value='11' style='font-size:11pt;'>Знакомство с коллекциями (одно из применений ООП)</span></strong></span><br>
<br>
Предлагаю вашему вниманию базу данных на основе коллекций. В ней мы рассмотрим такие операции<br>
над коллекцией, как <span class="tag-color tag-color-named" data-value="purple" style="color: purple">добавление, редактирование, просмотр, поиск в коллекции, сохранения<br>
и загрузки коллекции</span>.<br>
<br>
Почему я решил показать именно на примере коллекций? Да потому, что я вижу их как очень удобную<br>
структуру для хранения самой разной информации.<br>
Возьмём для примера такую структуру:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; &nbsp; PRecord = ^TRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TRecord = record</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Name: String[12];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Mark: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Для того, чтобы работать с базой данных все знают, что нам нужен массив, хранящий эти записи:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; &nbsp; TDataArr = array [1..N] of TRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; DB: file of TDataArr; { описание файловой переменной для работы с файлом }</div></ol></div></div></div></div><br>
Для коллекции же необходимо создать объект, в котором будет находиться переменная (в данном случае <em class='tag-i'>TransferRecord</em>)<br>
типа <em class='tag-i'>TRecord </em>(запись):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; PStudentInfo=^TStudentInfo;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TStudentInfo=object(TObject)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; TransferRecord: TRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; constructor Load(var S: TStream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; procedure &nbsp; Store(var S: TStream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Procedure &nbsp; Print;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div></ol></div></div></div></div><br>
Метод <em class='tag-i'>Store </em>нужен для сохранения объекта в поток, а конструктор Load - для его загрузки из потока.<br>
Метод <em class='tag-i'>Print </em>выводит на экран данные о студенте из TransferRecord. Это, собственно, всё, что нам<br>
требуется от объекта TStudentInfo.<br>
Остальные операции будут проводиться с коллекцией.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; PStudentsColl=^TStudentsColl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TStudentsColl=object(TSortedCollection)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; function Compare(Key1, Key2: Pointer): Integer; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div></ol></div></div></div></div><br>
<em class='tag-i'>TSortedCollection </em>является потомком обычной коллекции <em class='tag-i'>TCollection</em>, только у неё имеется возможность<br>
сортировки объектов. Т.к. функция сравнения <em class='tag-i'>Compare </em>(с её помощью сортируется коллекция) является<br>
абстрактной, её надо перекрывать, что мы и сделали:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">function TStudentsColl.Compare(Key1, Key2: Pointer): Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Compare:=StrICmp(PStudentInfo(Key1)^.TransferRecord.Name, PStudentInfo(Key2)^.TransferRecord.Name);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Здесь сравнение ведётся по имени студентов с помощью функции сравнения строк <em class='tag-i'>StrICmp </em>(файл sortfunc.inc),<br>
без учёта регистра букв. Можно сортировать также по оценке.<br>
<br>
В разделе инициализации модуля следует зарегистрировать типы <em class='tag-i'>RStudentsColl </em>и <em class='tag-i'>RStudentInfo</em>, чтобы не<br>
возникало ошибок при работе с потоками:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;RegisterType (RStudentsColl);</div><div class="code_line">&nbsp;&nbsp;RegisterType (RStudentInfo);</div></ol></div></div></div></div><br>
<span class='tag-u'>Используемые в коллекции функции и процедуры:</span><br>
<em class='tag-i'>At()</em> - указатель на объект в коллекции<br>
<em class='tag-i'>Insert()</em> - добавление в коллекцию<br>
<em class='tag-i'>AtDelete()</em> - удаление объекта из коллекции<br>
<em class='tag-i'>FirstThat </em>- итератор для поиска по заданному условию.<br>
<br>
Сам код программы я старался прокоментировать как можно более подробно.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Keywords: OOP, Collection, Database</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Программа является базой данных на основе коллекций.</div><div class="code_line">&nbsp;&nbsp; &nbsp;Используются операции добавления, редактирования, удаления, просмотра, поиска в коллекции,</div><div class="code_line">&nbsp;&nbsp; &nbsp;сохранения и загрузки коллекции.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Примечание: программу несложно изменить для использования интерфейса Turbo Vision.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Romtek (c) May 2005</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">uses crt, objects, drivers, strings, StudObj;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;db_file = &#39;stud_db.dat&#39;;</div><div class="code_line">&nbsp;&nbsp;maxitems = 9;</div><div class="code_line">&nbsp;&nbsp;OptionsList: array [1..maxitems] of string[30] = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Load collection from file&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Save collection to file&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;View collection&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Add record&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Edit record&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Delete record&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Search record in collection&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Best students&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;Quit from program&#39;</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Created,</div><div class="code_line">&nbsp;&nbsp;Quit: boolean;</div><div class="code_line">&nbsp;&nbsp;option: integer;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure AbortMsg (msg: string);</div><div class="code_line">&nbsp;{ Вывести сообщение об ошибке и выйти из программы }</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (msg);</div><div class="code_line">&nbsp;&nbsp; &nbsp; halt;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure LoadCollection;</div><div class="code_line">&nbsp;{ Загрузка сохраненной ранее коллекции из бинарного файла коллекции }</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;FS: TBufStream;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FS.Init (db_file, stOpen,1024);</div><div class="code_line">&nbsp;&nbsp;if FS.Status &#60;&#62; stOK then</div><div class="code_line">&nbsp;&nbsp; &nbsp; AbortMsg (&#39;File not found.&#39;); { Файл не найден }</div><div class="code_line">&nbsp;&nbsp;PC := PStudentsColl (FS.Get); { Вставить коллекцию из файла &nbsp;}</div><div class="code_line">&nbsp;&nbsp;FS.Done;</div><div class="code_line">&nbsp;&nbsp;if FS.Status &#60;&#62; stOK then</div><div class="code_line">&nbsp;&nbsp; &nbsp; AbortMsg (&#39;Error of loading collection.&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Произошла ошибка чтения коллекции. Подробности искать в справке по &#39;stXXX&#39; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp;writeln (&#39;Collection is loaded successfully.&#39;); &nbsp;{ Сообщение об успешно загруженной коллекции }</div><div class="code_line">&nbsp;&nbsp;readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure SaveCollection;</div><div class="code_line">&nbsp;{ Сохранить коллекцию в файл }</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;FS: TBufStream;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FS.Init (db_file, stCreate,1024); { Открываем файл коллекции на создание }</div><div class="code_line">&nbsp;&nbsp;FS.Put (PC); { Вставляем коллекцию в файл }</div><div class="code_line">&nbsp;&nbsp;FS.Done; { Закрываем работу с потоком }</div><div class="code_line">&nbsp;&nbsp;if FS.Status &#60;&#62; stOK then</div><div class="code_line">&nbsp;&nbsp; &nbsp; AbortMsg (&#39;Error while saving collection!&#39;); { Произошла ошибка при сохранении коллекции }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp;writeln (&#39;Collection is stored successfully.&#39;); &nbsp;{ Сообщение об успешно сохраненной коллекции }</div><div class="code_line">&nbsp;&nbsp;readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ViewCollection (C: PCollection);</div><div class="code_line">procedure CallPrint (P : PStudentInfo); far;</div><div class="code_line">&nbsp;{ Обязательно должна присутствовать директива FAR !</div><div class="code_line">&nbsp;&nbsp; Кроме того, процедура должна быть вложенной, иначе возникнут проблемы. }</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;P^.Print;</div><div class="code_line">end;</div><div class="code_line">begin { Print }</div><div class="code_line">&nbsp;&nbsp;Writeln;</div><div class="code_line">&nbsp;&nbsp;Writeln;</div><div class="code_line">&nbsp;&nbsp;Writeln (&#39;Student list:&#39;);</div><div class="code_line">&nbsp;{ помощью итератора ForEach выводим информацию о каждом студенте }</div><div class="code_line">&nbsp;&nbsp;C^.ForEach (@CallPrint);</div><div class="code_line">&nbsp;&nbsp;readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure PrintMatches (C: PCollection; _Mark: integer);</div><div class="code_line">&nbsp;{ Подсчёт и вывод студентов, имеющих оценку свыше указанной _Mark }</div><div class="code_line">var count: word;</div><div class="code_line">procedure Match (P : PStudentInfo); far;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; if PStudentInfo(P)^.TransferRecord.Mark &#62;= _Mark then</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;P^.Print;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;inc (count);</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin { Print }</div><div class="code_line">&nbsp;&nbsp;count:=0;</div><div class="code_line">&nbsp;&nbsp;Writeln (#13#10&#39;Students who have mark above &#39;, _Mark,&#39;: &#39;);</div><div class="code_line">&nbsp;&nbsp;C^.ForEach (@Match);</div><div class="code_line">&nbsp;&nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp;Writeln (&#39;Total: &#39;, count);</div><div class="code_line">&nbsp;&nbsp;readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure BestStudents;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; PrintMatches (PC, 80); { Искать студентов, имеющих балл свыше 80 }</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure SearchRecord;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; P: PStudentInfo;</div><div class="code_line">&nbsp;&nbsp; i: integer;</div><div class="code_line">&nbsp;&nbsp; who: string;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;function Matches (Item: Pointer): Boolean; far;</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Matches := PStudentInfo (Item)^.TransferRecord.Name = Who;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; write (&#39;Look for student (name): &#39;); readln (who);</div><div class="code_line">&nbsp;&nbsp; &nbsp; { Используйте итератор FirstThat, чтобы найти первую &quot;карточку&quot;,</div><div class="code_line">&nbsp;&nbsp; &nbsp; удовлетворяющую условию }</div><div class="code_line">&nbsp;&nbsp; &nbsp; P := PC^.FirstThat (@Matches);</div><div class="code_line">&nbsp;&nbsp; &nbsp; i := PC^.IndexOf (P);</div><div class="code_line">&nbsp;&nbsp; &nbsp; if i &#62;= 0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln (&#39;Student was found:&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PStudentInfo(PC^.At(i))^.Print;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end</div><div class="code_line">&nbsp;&nbsp; &nbsp; else writeln (&#39;&quot;&#39;, Who ,&#39;&quot; was not found.&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure AddRecord;</div><div class="code_line">&nbsp;{ Добавление &quot;карточки&quot; в коллекцию &nbsp;}</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SI: PStudentInfo;</div><div class="code_line">&nbsp;&nbsp;Rec: TRecord;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln(&#39;Enter some info about a student: &#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; SI := New (PStudentInfo, Init); &nbsp;{ Создаем &quot;карточку&quot; студента }</div><div class="code_line">&nbsp;&nbsp; &nbsp; with SI^.TransferRecord do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Name: &#39; : 8); readln (Name); { Вводим новые фамилию }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Mark: &#39; : 8); readln (Mark); { и оценку }</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PC^.Insert (SI); &nbsp;{ Вставляем данные о студенте в коллекцию }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (&#39;Record stored successfully.&#39;); { Сообщение об успешно добавленной &quot;карточке&quot; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure EditRecord;</div><div class="code_line">&nbsp;{ Редактировать заданную &quot;карточку&quot; студента }</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SI: PStudentInfo;</div><div class="code_line">&nbsp;&nbsp;Rec: TRecord;</div><div class="code_line">&nbsp;&nbsp;num: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; { Прежде чем заменять данные в &quot;карточке&quot; студента, надо ввести его номер в коллекции.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Поэтому для начала нужно просмотреть список выбором &#39;View collection&#39; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; write (&#39;Enter number of student in list: &#39;); readln (num);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; SI := PC^.At (Pred (num)); { Присваиваем указатель на &quot;карточку&quot; студента под номером num-1.</div><div class="code_line">&nbsp;&nbsp; &nbsp; Не забывайте, что нумерация в коллекциях идет с нуля! }</div><div class="code_line">&nbsp;&nbsp; &nbsp; with SI^.TransferRecord do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SI^.Print; { Показываем текущие данные из &quot;карточки&quot; студента }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Enter new name: &#39;); readln (Name); { Вводим новые фамилию }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;write (&#39;Enter new mark: &#39;); readln (Mark); { и оценку }</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (&#39;Record stored successfully.&#39;); { Сообщение об успешно измененной &quot;карточке&quot; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure DeleteRecord;</div><div class="code_line">&nbsp;{ Удаление &quot;карточки&quot; из коллекции }</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;SI: PStudentInfo;</div><div class="code_line">&nbsp;&nbsp;Rec: TRecord;</div><div class="code_line">&nbsp;&nbsp;num: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; { Прежде чем удалять данные в &quot;карточке&quot; студента, надо ввести его номер в коллекции.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Поэтому для начала нужно просмотреть список выбором &#39;View collection&#39; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; write (&#39;Enter number of student in list: &#39;); readln (num);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PC^.AtDelete (Pred (num));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (&#39;Record deleted successfully.&#39;); { Сообщение об успешно измененной &quot;карточки&quot; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; readln;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure ShowMenu;</div><div class="code_line">&nbsp;{ Построение меню и выбор операции }</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp; i: integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; clrscr;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln (&#39;-= Menu =-&#39;: 46);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; for i := 1 to maxitems do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;writeln (i: 26, &#39;. &nbsp;&#39;, OptionsList[i]); { Вывод элементов меню }</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; writeln;</div><div class="code_line">&nbsp;&nbsp; &nbsp; write (&#39;Enter option: &#39;: 43); readln (option);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;Created := true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;PC:=New(PStudentsColl,Init(50,10));</div><div class="code_line">&nbsp;&nbsp;{ Создание коллекции в памяти из 50 объектов.</div><div class="code_line">&nbsp;&nbsp; &nbsp;Цифра 10 говорит о том, что если попытаемся вставить в коллекцию больше чем 50 объектов,</div><div class="code_line">&nbsp;&nbsp; &nbsp;то станем увеличивать начальный размер (50) на 10, пока не хватит места для всех объектов. }</div><div class="code_line">&nbsp;&nbsp;if PC = Nil then { Увы, не хватило памяти... Выходим. }</div><div class="code_line">&nbsp;&nbsp; &nbsp; exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;repeat</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ShowMenu;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Выбор опции }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case option of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: if PC^.Count = 0 then { Коллекция пуста }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LoadCollection;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2: SaveCollection;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3: ViewCollection (PC);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4: AddRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5: EditRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6: DeleteRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7: SearchRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8: BestStudents;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;9: Quit := true; { Получили команду выйти из программы }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;until Quit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;{ Освободить память от коллекции }</div><div class="code_line">&nbsp;&nbsp;Dispose(PC, Done);</div><div class="code_line">END.</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Unit StudObj;</div><div class="code_line">&nbsp;</div><div class="code_line">Interface</div><div class="code_line">Uses Objects;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; &nbsp; PRecord = ^TRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TRecord = record</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Name: String[12];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Mark: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PStudentInfo=^TStudentInfo;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TStudentInfo=object(TObject)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; TransferRecord: TRecord;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; constructor Load(var S: TStream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; procedure &nbsp; Store(var S: TStream);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Procedure &nbsp; Print; Virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; PStudentsColl=^TStudentsColl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; TStudentsColl=object(TSortedCollection)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; function Compare(Key1, Key2: Pointer): Integer; virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; procedure Error(Code, Info: Integer); virtual;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;RStudentInfo: TStreamRec = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;ObjType: 55001;</div><div class="code_line">&nbsp;&nbsp; &nbsp;VmtLink: Ofs(TypeOf(TStudentInfo)^);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Load: &nbsp; &nbsp;@TStudentInfo.Load;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Store: &nbsp; @TStudentInfo.Store</div><div class="code_line">&nbsp;&nbsp;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;RStudentsColl: TStreamRec = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;ObjType: 55002;</div><div class="code_line">&nbsp;&nbsp; &nbsp;VmtLink: Ofs(TypeOf(TStudentsColl)^);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Load: @TStudentsColl.Load;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Store: @TStudentsColl.Store);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;PC: PStudentsColl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">Implementation</div><div class="code_line">Uses Drivers;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp; &nbsp; TLinkRecord = record</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; PName: PString;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; PMark: longint;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">constructor TStudentInfo.Load(var S: TStream);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Inherited Init;</div><div class="code_line">&nbsp;&nbsp;S.Read(TransferRecord, SizeOf(TransferRecord));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TStudentInfo.Store(var S: TStream);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;S.Write(TransferRecord, SizeOf(TransferRecord));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">Procedure TStudentInfo.Print;</div><div class="code_line">var str: string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LinkRecord: TLinkRecord;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;&nbsp;with LinkRecord do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; PName := @TransferRecord.Name;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; PMark := TransferRecord.Mark;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;FormatStr (str,&#39; &nbsp;%-24s%-4d&#39;, LinkRecord);</div><div class="code_line">&nbsp;&nbsp;writeln (str);</div><div class="code_line">End;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TStudentsColl.Error (Code, Info: Integer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; write (&#39;Error: &#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; case Code of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;coIndexError: writeln (&#39;Index out of range.&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;coOverflow &nbsp;: writeln (&#39;Collection overflow.&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">{$i sortfunc.inc}</div><div class="code_line">&nbsp;</div><div class="code_line">function TStudentsColl.Compare (Key1, Key2: Pointer): Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Compare:=StrICmp(PStudentInfo(Key1)^.TransferRecord.Name, PStudentInfo(Key2)^.TransferRecord.Name);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;</div><div class="code_line">{ &nbsp;RegisterType (RSortedCollection);}</div><div class="code_line">&nbsp;&nbsp;RegisterType (RStudentsColl);</div><div class="code_line">&nbsp;&nbsp;RegisterType (RStudentInfo);</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<strong class='tag-b'>Полная</strong> версия находится в прикреплённом файле.]]></description>
        <author>Romtek</author>
        <category>Pascal: Структуры данных</category>
      </item>
	
      </channel>
      </rss>
	