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.

 


 

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

26599. СПОСОБЫ ОБЕЗВРЕЖИВАНИЯ МОЛОКА БОЛЬНЫХ ЖИВОТНЫХ. КОНТРОЛЬ ЗА ЭФФЕКТИВНОСТЬЮ ОБЕЗВРЕЖИВАНИЯ 2.24 KB
  СПОСОБЫ ОБЕЗВРЕЖИВАНИЯ МОЛОКА БОЛЬНЫХ ЖИВОТНЫХ. Высокотемпературная обработка молока проводится с целью его обеззараживания от патогенных микроорганизмов продления срока хранения и обеспечения технологических свойств при переработке в молочные продукты. Чаще применяют пастеризацию нагревание молока до температуры не выше 100 С с выдержкой или без нее при этом инактивируют вегетативные формы бактерий. Пастеризация может быть длительной молоко нагревают до температуры 63 65С и выдерживают 30 мин кратковременной нагревание до...
26600. СПОСОБЫ ОГЛУШЕНИЯ УБОЙНЫХ ЖИВОТНЫХ, ИХ СРАВНИТЕЛЬНАЯ ХАРАКТЕРИСТИКА 12.88 KB
  СПОСОБЫ ОГЛУШЕНИЯ УБОЙНЫХ ЖИВОТНЫХ ИХ СРАВНИТЕЛЬНАЯ ХАРАКТЕРИСТИКА. 2 способа: с оглушением и без оглушения. Животных других видов убивают без оглушения. К кольцу привязывают животное за рога чтобы в момент оглушения оно не отскочило назад.
26601. СТАНДАРТНАЯ СОРТИРОВКА ТУШ ПО УПИТАННОСТИ 15.96 KB
  Говядину взрослого скота молодняка а также баранину и козлятину подразделяют на 1ю и 2ю категории. Говядина 1й категории должна иметь как минимум удовлетворительное развитие мускулатуры; остистые отростки позвонков седалищные бугры и маклоки не должны резко выступать жировые отложения должны быть заметны в виде небольших участков на шее лопатках бедрах в тазовой полости и в области паха; слои подкожного жира от 8го ребра к седалищным буграм могут иметь значительные просветы. Говядина 2й категории характеризуется менее...
26602. СУЩНОСТЬ «ЗАГАРА» МЯСА. САНИТАРНАЯ ОЦЕНКА МЯСА ПРИ «ЗАГАРЕ». ЗАГАР 2.3 KB
  СУЩНОСТЬ ЗАГАРА МЯСА. САНИТАРНАЯ ОЦЕНКА МЯСА ПРИ ЗАГАРЕ. Это особый вид порчи мяса в первые сутки после убоя животного. Наблюдают его при недостаточно интенсивном охлаждении парного мяса а также при слабой аэрации если туши в парном состоянии плотно укладывают или тесно подвешивают одна к другой в душных помещениях при температуре выше 1520 С.
26603. СУЩНОСТЬ ПОНЯТИЙ «УСЛОВНО ГОДНОЕ МЯСО», «МЯСО ВЫНУЖДЕННО УБИТЫХ ЖИВОТНЫХ» 878 Bytes
  СУЩНОСТЬ ПОНЯТИЙ УСЛОВНО ГОДНОЕ МЯСО МЯСО ВЫНУЖДЕННО УБИТЫХ ЖИВОТНЫХ. Мясо вынужденно убитых животных мясо от больных животных лишенных жизни ввиду нецелесообразности или неэффективности дальнейшего лечения с целью недопущения падежа. Условногодное мясо мясо использование которого для пищевых целей допускается после обеззараживания.
26604. СУЩНОСТЬ ПРОЦЕССА ПОСОЛКИ И ГИГИЕНА ПОСОЛКИ МЯСА. ЗНАЧЕНИЕ И СУЩНОСТЬ ПОСОЛА 6.28 KB
  СУЩНОСТЬ ПРОЦЕССА ПОСОЛКИ И ГИГИЕНА ПОСОЛКИ МЯСА. Посол мяса один из самых древних ранее широко распространенных и доступных методов консервирования. В связи с развитием холодильной техники использованием высоких температур для консервирования мяса и мясопродуктов развитием колбасного производства посол уступил первое место этим методам консервирования. Однако и сейчас в сельской местности в личном хозяйстве он находит и будет находить применение как самостоятельный метод консервирования мяса н мясопродуктов.
26605. СХЕМА ИССЛЕДОВАНИЯ МЯСА НА ОБСЕМЕНЕННОСТЬ ВОЗБУДИТЕЛЯМИ ТОКСИКОИНФЕКЦИЙ 1.54 KB
  СХЕМА ИССЛЕДОВАНИЯ МЯСА НА ОБСЕМЕНЕННОСТЬ ВОЗБУДИТЕЛЯМИ ТОКСИКОИНФЕКЦИЙ. Схема бактериологического исследования мяса и мясопродуктов по ГОСТ 2123775.
26606. ТЕХНОЛОГИЯ УБОЯ КРС И ПЕРВИЧНАЯ ПЕРЕРАБОТКА ТУШ. ОГЛУШЕНИЕ. 22.62 KB
  ТЕХНОЛОГИЯ УБОЯ КРС И ПЕРВИЧНАЯ ПЕРЕРАБОТКА ТУШ. Чтобы предотвратить загрязнение туш и крови содержимым преджелудков на пищевод животным перед их обескровливанием накладывают лигатуру. Во избежание попадания крови от больных животных емкости нумеруют соответствующими номерами туш от которых собрана кровь. После этого полый нож извлекают из туши.
26607. ТЕХНОЛОГИЯ УБОЯ СВИНЕЙ И ПЕРВИЧНАЯ ПЕРЕРАБОТКА ТУШ. УБОЙ. ОГЛУШЕНИЕ 22.1 KB
  При сборе крови только для технических целей обычным боенским ножом производят глубокий разрез тканей в месте соединения шеи с грудной частью туши и направляя лезвие ножа вверх перерезают кровеносные сосуды у правого предсердия. Зачистка этих участков приводит к потерям массы туши и снижению ее товарного вида. Как указано выше свиные туши обрабатывают со съемкой шкур со съемкой крупонов и со шпаркой туш без съемки шкур. На конвейере вручную кольцеобразно подрезают гузенки снимают шкуру с бедер голяшек и паховой части от туш самцов...