67461

Процедуры и функции для работы со строками string

Лекция

Информатика, кибернетика и программирование

Объявление класса Имя класса = clss Имя базового класса privte Объявление закрытых полей и методов Все что объявлено здесь может быть использовано только в данном модуле protected Объявление открытых полей и методов Все что объявлено здесь может быть использовано и в данном модуле и во всех...

Русский

2014-09-10

150 KB

0 чел.

Лекция 9

Процедуры и функции для работы со строками string

function Length(S: string): byte;

Возвращает длину строки S. Значение длины равноценно значению Ord(s[0]), поскольку код «нулевого» байта строки есть её текущая длина.

function Copy(S: string; iStart, iLength: byte): string;

Возвращает подстроку строки S – набор из iLength символов, начинающийся с символа с номером iStart. Нумерация символов в строке начинается с единицы.

Замечание: Copy(S, n, 1) равноценно S[n].

procedure Delete(S: string; iStart, iLength: byte);

Удаляет из строки S её подстроку – набор из iLength символов, начинающийся с символа с номером iStart. Нумерация символов в строке начинается с единицы.

function Index(S, SWhat: string): byte;

Ищет первое вхождение подстроки sWhat в строку S. Результат – номер символа, начиная с которого найдено вхождение. Результат – ноль, если вхождение не найдено.

function Str(X: <числовой тип>): string;

Возвращает строковое выражение числа X.

procedure Val(S: string; var X: <числовой тип>; IER: integer);

Пытается преобразовать строку S в число и занести его в параметр-переменную X. Если попытка завершается удачно, IER=0, в противном случае IER<>0.


Граф. Основные понятия и определения

(http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84_(%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0))

Граф, или неориентированный граф  – это упорядоченная пара , для которой выполнены следующие условия:

  •   – это непустое множество вершин, или узлов,
  •   – это множество пар (в случае неориентированного графа – неупорядоченных) вершин, называемых рёбрами.

(а значит и, , иначе оно было бы мультимножеством) обычно считаются конечными множествами. Многие хорошие результаты, полученные для конечных графов, неверны (или каким-либо образом отличаются) для бесконечных графов. Это происходит потому, что ряд соображений становится ложным в случае бесконечных множеств.

Вершины и рёбра графа называются также элементами графа, число вершин в графе  – порядком, число рёбер   – размером графа.

Вершины  и  называются концевыми вершинами (или просто концами) ребра  . Ребро, в свою очередь, соединяет эти вершины. Две концевые вершины одного и того же ребра называются соседними.

Два ребра называются смежными, если они имеют общую концевую вершину.

Два ребра называются кратными, если множества их концевых вершин совпадают.

Ребро называется петлёй, если его концы совпадают, то есть .

Степенью  вершины  называют количество инцидентных ей рёбер(при этом петли считают дважды).

Вершина называется изолированной, если она не является концом ни для одного ребра; висячей (или листом), если она является концом ровно одного ребра.


Ориентированный граф

Ориентированный граф (сокращённо орграф)  – это упорядоченная пара  , для которой выполнены следующие условия:

  •   – это непустое множество вершин или узлов,
  •   – это множество (упорядоченных) пар различных вершин, называемых дугами или ориентированными рёбрами.

Дуга – это упорядоченная пара вершин , где вершину  называют началом, а  – концом дуги. Можно сказать, что дуга  ведёт от вершины  к вершине .


Объектно-ориентированное программирование (ООП)

Понятие класса – дополнение к понятию типа.

Тип [обычной] переменной определяет множество значений, которые она способна принимать, и множество операций, которые над ней можно производить.

Класс [объектной] переменной определяет и множество значений, которые она способна принимать, и множество операций, которые над ней можно производить, и множество операций, которые она сама над собой способна производить.


Три принципа ООП:

  1.  Инкапсуляция
  2.  Наследование
  3.  Полиморфизм

Инкапсуляция – соединение в единой структуре данных и программных кодов (т.н. методов), предназначенных для обработки именно этих данных.

Наследование – возможность построения нового класса на основе существующего (т.н. базового, или родительского) класса с дополнением и/или переопределением данных и методов. Наследование есть механизм передачи данных и методов родительского класса в дочерний класс.

Полиморфизм – возможность обращения по одному имени к разным методам.

Объектом, или объектной переменной принято называть конкретный экземпляр переменной заданного класса.

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

Вместе с «рождением» первого экземпляра объекта заданного класса в память загружается и его инкапсулированные программные коды. Второй и последующие экземпляры, занимая под свои поля новые области памяти, пользуются уже загруженным кодом первого экземпляра.


Три группы атрибутов объекта:

  1.  Методы
  2.  Свойства
  3.  События

Методы – процедуры и функции, описываемые при описании класса, предназначенные для приема объектом данных извне, изменения данных внутри объекта (модификации полей), подачи данных от объекта внешним «потребителям».

Свойства (для пользователя объекта) – параметры (числовые, символьные, строковые и прочих типов), характеризующие состояние объекта в данный момент. Обращение к свойствам объекта внешне выглядит как обращение к полям переменной типа «запись».

Свойства (для программиста класса) – процедуры и функции, назначение которых совпадает с назначением методов. В среде программистов не утихают споры о праве свойств на существование.

События – это то, что с объектом «может произойти», и на что можно предусмотреть реакцию кода класса.


Объявление класса

<Имя класса> = class(<Имя базового класса>)

 private

    <Объявление закрытых полей и методов>

// Все, что объявлено здесь, может быть использовано только в данном модуле

 protected

    <Объявление открытых полей и методов>

// Все, что объявлено здесь, может быть использовано

// и в данном модуле, и во всех классах-наследниках данного класса

 public

    <Объявление открытых полей и методов>

// Все, что объявлено здесь, может быть использовано везде, где виден класс


 
published

    <Объявление открытых полей и методов>

end;

Всё, что объявлено в разделе published, может быть использовано везде, где виден класс.

Раздел published может присутствовать, только если включен режим «динамическая идентификация типа данных» (Run-time type information, Run-time type identification, RTTI), который позволяет определить тип данных переменной или объекта во время выполнения программы.

Режим RTTI должен быть включен с помощью ключа {$M+}.

http://www.rsdn.ru/Forum/message/704173.flat.aspx


Конструктор

Объявление:

constructor TList1.Create;

begin

 inherited Create;

//  inherited;

 pHead := Nil;

 pTail := Nil;

 nItems := 0;

end;

Обращение:

MyList1 := TList1.Create;

Обращение происходит к методу класса.


Деструктор

Объявление:

destructor TList1.Destroy;

begin

 inherited Destroy;

//  inherited;

end;

Обращение:

MyList1.Destroy;

Обращение происходит к методу объекта.

Пример построения линейного однонаправленного списка,

использующий ООП

Проект строится в «DOS-овском» режиме и имеет имя Project1 (по умолчанию). Для его построения из верхнего меню следует пройти маршрутом:

FileNewOtherConsole Application.

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


Образец такого файла:

Inanov

24000

Sidorov

19000

Petrov

28000

Petrov

17500

Andrianov

21000

Andreev

27500

Yakovlev

32500


Проект состоит из четырёх файлов, содержащих коды на языке
Pascal.

Файл  Project1.dpr обращается к кодам (описаниям классов), представленным в трёх файлах-«устройствах» Unit1.pas, Unit2.pas, Unit3.pas, присоединённых к проекту.

В файле Unit1.pas описан базовый класс MyList1Class, способный к формированию линейного однонаправленного списка в оперативной памяти. Каждый новый элемент списка ставится в конец списка. Назначение методов класса пояснено комментариями.

В файле Unit2.pas описан класс MyList2Class – наследник базового класса MyList1Class. Все методы базового класса сохраняют силу, а в дополнение появляются два новых метода:  PrependItem  и  PrependFromFile.  С их помощью каждый новый элемент списка ставится в начало списка.


Текст
 файла  Project1.dpr:

program Project1;

{$APPTYPE CONSOLE}

uses

 SysUtils,

 Unit1 in 'Unit1.pas',

 Unit2 in 'Unit2.pas',

 Unit3 in 'Unit3.pas';

var

 MyList1: MyList1Class;

 MyList2: MyList2Class;

 MyList3: MyList3Class;


begin

 MyList1 := MyList1Class.Create;

 MyList1.AppendFromFile('c: List1.txt');

 MyList1.ShowList;

 WriteLN;

 MyList2 := MyList2Class.Create;

 MyList2.PrependFromFile('c: List2.txt');

 MyList2.ShowList;

 WriteLN;

 MyList3 := MyList3Class.Create;

 MyList3.InsertFromFile('c: List1.txt');

 MyList3.ShowList;

 Readln;

end.


Текст
 файла  Unit1.pas:

unit Unit1;

interface

 type

   pPersonType = ^PersonType;

   PersonType = record

     sName: string[40];

     Salary: double;

     pNext: pPersonType;

   end;


MyList1Class = Class(TObject)

 protected

   pHead, pTail: pPersonType;

 public

   constructor Create;

   destructor Destroy;

   function AloneItem(sName: string; Salary: double;

     var pNew: pPersonType): boolean;

   procedure AppendItem(sName: string; Salary: double);

   procedure AppendFromFile(sFileName: string);

   procedure ShowList;

end;

implementation

constructor MyList1Class.Create;

begin

 pHead := Nil;

 pTail := Nil;

end;

destructor MyList1Class.Destroy;

begin

 // Код будет написан позже!

end;


function
MyList1Class.AloneItem(sName: string; Salary: double;

 var pNew: pPersonType): boolean;

begin

 New(pNew);

 if pNew = Nil then Halt;  // Нет места в памяти – прекращаем работу.

 pNew^.sName := sName;

 pNew^.Salary := Salary;

 pNew^.pNext := Nil;

 if pHead = Nil then

 begin

   pHead := pNew; pTail := pNew;

   AloneItem := True;

 end

 else

   AloneItem := False;

end;


procedure
MyList1Class.AppendItem(sName: string; Salary: double);

var

 pNew: pPersonType;

begin

 if not AloneItem(sName, Salary, pNew) then

 begin

   pTail^.pNext := pNew;

   pTail := pNew;

 end;

end;


procedure
MyList1Class.AppendFromFile(sFileName: string);

var

 F: Text;

 sName: string[40];

 Salary: double;

begin

 Assign(F, sFileName);

 {$I-}

 Reset(F);

 {$I+}

 if IOResult <> 0 then

 begin

   WriteLN('File ', sFileName, ' not found');

   Halt;

 end;

 while not EOF(F) do

 begin

   Readln(F, sName);

   Readln(F, Salary);

   AppendItem(sName, Salary);

 end;

end;


procedure
MyList1Class.ShowList;

var pCurr: pPersonType;

begin

 pCurr := pHead;

 Writeln('Name':40, '  ', 'Salary');

 Writeln('----':40, '  ', '------');

  while pCurr <> Nil do

 begin

   Writeln(pCurr^.sName:40, '  ', pCurr^.Salary:8:2);

   pCurr := pCurr^.pNext;

 end;

end;

end.


Текст
 файла  Unit2.pas:

unit Unit2;

interface

uses Unit1;

type

 MyList2Class = Class(MyList1Class)

   public

     procedure PrependItem(sName: string; Salary: double);

     procedure PrependFromFile(sFileName: string);

end;


implementation

procedure MyList2Class.PrependItem(sName: string; Salary: double);

var

 pNew: pPersonType;

begin

 if not AloneItem(sName, Salary, pNew) then

 begin

   pNew^.pNext := pHead;

   pHead := pNew;

 end;

end;


procedure
MyList2Class.PrependFromFile(sFileName: string);

var

 F: Text;

 sName: string[40];

 Salary: double;

begin

 Assign(F, sFileName);

 {$I-}

 Reset(F);

 {$I+}

 if IOResult <> 0 then

 begin

   WriteLN('File ', sFileName, ' not found');

   Halt;

 end;

 while not EOF(F) do

 begin

   Readln(F, sName);

   Readln(F, Salary);

   PrependItem(sName, Salary);

 end;

end;

end.


Текст
 файла  Unit3.pas:

unit Unit3;

interface

uses Unit1, Unit2, Math;

type

MyList3Class = Class(MyList2Class)

 public

   function CompareTwoRecords(var R1, R2: PersonType): integer;

   procedure InsertItem(sName: string; Salary: double);

   procedure InsertFromFile(sFileName: string);

end;

implementation

function MyList3Class.CompareTwoRecords(

  var R1, R2: PersonType): integer;

// Функция возвращает:

//   –1, если запись R1 «меньше» записи R2

//   +1, если запись R1 «больше» записи R2

//     0, если запись R1 «равна» записи R2

var

 l1, l2, l0, i: integer;

begin

 l1 := Length(R1.sName);

 l2 := Length(R2.sName);

 l0 := Min(l1, l2);


 
for i := 1 to l0 do

   if R1.sName[i] < R2.sName[i] then

   begin

     CompareTwoRecords := -1;

     exit;

   end

   else

     if R1.sName[i] > R2.sName[i] then

     begin

       CompareTwoRecords := +1;

       exit;

     end;

 if l1 < l2 then

 begin

   CompareTwoRecords := -1;

   exit;

 end

 else

   if l1 > l2 then

   begin

     CompareTwoRecords := +1;

     exit;

   end;

 if R1.Salary < R2.Salary then

 begin

   CompareTwoRecords := -1;

   exit;

 end

 else

   if R1.Salary > R2.Salary then

   begin

     CompareTwoRecords := +1;

     exit;

   end;

// Если уж сюда попали, значит, никаких различий между записями не найдено.

 CompareTwoRecords := 0;

end;


procedure
MyList3Class.InsertItem(sName: string; Salary: double);

var

 pNew, pCurr, pPrev: pPersonType;

 pc: pChar;

begin

 if AloneItem(sName, Salary, pNew) then EXIT;

 

   if CompareTwoRecords(pNew^, pHead^) < 0 then

   begin

     pNew^.pNext := pHead;

     pHead := pNew;

     exit;

   end;

   pPrev := pHead;

   pCurr := pPrev^.pNext;


   
while pCurr <> Nil do

   begin

     if CompareTwoRecords(pNew^, pCurr^) < 0 then

     begin

       pPrev^.pNext := pNew;

       pNew^.pNext := pCurr;

       exit;

     end;

     pPrev := pCurr;

     pCurr := pCurr^.pNext;

   end;

   pPrev^.pNext := pNew;

   pTail := pNew;

 

end;

procedure MyList3Class.InsertFromFile(sFileName: string);

var

 F: Text;

 sName: string[40];

 Salary: double;

begin

 Assign(F, sFileName);

 {SI-}

 Reset(F);

 {SI+}

 if IOResult <> 0 then

 begin

   WriteLN('File ', sFileName, ' not not found');

   Halt;

 end;

 while not EOF(F) do

 begin

   ReadLN(F, sName);

   ReadLN(F, Salary);

   InsertItem(sName, Salary);

 end;

end;

end.

 


 

А также другие работы, которые могут Вас заинтересовать

35524. bCAD Полезные Советы 831 KB
  Использование форматов трёхмерных данных не поддерживаемых bCAD непосредственно [1.3] Вставка иллюстраций из bCAD в документ MSWord [2] Советы по плоскому черчению [2.23] Использование растровых изображений не поддерживаемых системой bCAD непосредственно [2.
35525. Виды стандартов и технических регламентов (ТР). Содержание стандартов на продукцию и ТР. Обязательные требования технических регламентов на продукцию 18.93 KB
  Технический регламент — документ (нормативный правовой акт), устанавливающий обязательные для применения и исполнения требования к объектам технического регулирования (продукции, в том числе зданиям, строениям и сооружениям, процессам производства...
35526. Технические регламенты РФ и Таможенного союза. Цели. Содержание и применение 17.46 KB
  Таможенного союза. Одновременно с этим эта Комиссия осуществляет и координацию усилий трёх стран во всей сфере технического регулирования. В момент вступления в силу технических регламентов Таможенного союза национальные нормы прекращают своё действие
35527. Международные и региональные (Европейские) организации по стандартизации. Их задачи, статус, приоритетные направления. Маркировка продукции в ЕЭС, отвечающей требованиям Директив 22.23 KB
  Взаимозаменяемость- это свойство независимо изготовленных деталей занимать свое место в сборочной единице без дополнительной или ручной обработки при сборке, обеспечивая при этом нормальную работу сборочного узла, другими словами это возможность сборки и замены при ремонте деталей и сборочных единиц другими независимо изготовленными экземплярами без подгонки при выполнении технических условий, и при достижении заданных показателей машины.
35528. Особенности подтверждения соответствия в Таможенном союзе. Правовые и регламентирующие документы. Понятие. Цели. Принципы. Формы. Знаки соответствия 320.9 KB
  Декларация о соответствии Таможенного союза, как и Сертификат соответствия Таможенного союза является документом юридической силы, удостоверяющим соответствие выпускаемой в обращение продукции требованиям нормативных документов Таможенного союза