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.

 


 

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

25247. Поняття трансцендентальної єдності апперцепцій у філософії Канта 21.5 KB
  – є трансцендентальна єдність самосвідомості тобто така що передує досвіду і утв можливість апріорногодо досвідного пізнання. Кант поєднує в нову структуру суть якої – коли б свідомість була не єдиною а мозаїчною то окремі властивості об’єкта потрапляли б у різні її незалежні частини і синтез їх став би неможливим а саме в ньому і полягає пізнання. Синтетична єдність свідомості є об’єктивною умовою будьякого пізнання.
25248. Принципи і основні положення екзистенційної діалектики Кіркегора 27.5 KB
  Принципи і основні положення екзистенційної діалектики Кіркегора. Субєктивна екзистенціальна діалектика Кіркегора виростає як протиставлення системі Гегеля де людина підвладна анонімному принципу історичного розвитку втрачає свою індивідуальність. ЕД виявляється у Кіркегора способом зберегти особистісне відношення людини і Бога на шляху до якого людина проходить три стадії: естетичну етичну та релігійну.
25249. Філософія та світогляд 24 KB
  Філософія – форма теоретичного розвитку світогляду. Три типи світогляду: Буденний формується умовами життя та передається з покоління в покоління за допомогою досвіду. Отже філософія певний тип світогляду хоча всі люди мають світогляд але не кожна людина виходить на філософських рівень у світоглядних орієнтуваннях. Звідси випливає що філософія постає як теоретична форма світогляду.
25250. Філософія неокантіанства: основні течії 28 KB
  Основна його мета – розвиток і перетворення трансцендентальної філософії Канта. Розпочався близько 1860х років ініціаторами були представники академічних кіл зокрема: Герман Гольмгольц фізіолог та фізик Куно Фішер історик філософії Отто Літман професор філософії та ін. Зокрема Віндельюандт ґрунтуючись на філософії Канта зазначає що критична філософія – це наука про необхідні та загально значимі визначення цінностей. Вона запитує: чи існує наука якій із загальною значимістю притаманна цінність істини Чи існує мораль якій із...
25251. Основні форми теорії та принципи її побудови 28 KB
  Основні форми теорії та принципи її побудови. У більш вузькому розумінні – вища найрозвинутіша форма організації наукового знання що дає цілісне уявлення про закономірності та суттєві звязки певної області дійсності – предмету даної теорії. Інші форми наукового знання – закони класифікації типології первинні пояснювальні схеми – можуть передувати та складати базу теорії. Сукупність певних тверджень та понять аксіом та методологічних принципів їх взаємодії складають певний базис теорії.
25252. Суперечка між універсалістами та комунітаристами в сучасній політичній філософії 23.5 KB
  Якщо ж переходити до сучасності то Роулз намагався реконструювати кантіанські принципи де є пріоритет права над благом. Тобто Роулз та його прибічники ліберали намагаються відшукати загальний консенсус та розмірковують над зародками світового громадянського правового ладу. Метою Роулза є втілити принципи всезагальної справедливості у реальне життя та зробити суспільство стабільним. Роулз у Теорії справедливості€ навіть пропонує у вихідній позиції представити що не знаєте свого віку статі соціального походження.
25253. Соціальна філософія Франкфуртської школи 27 KB
  Подібну думки висловлює і Маркузе в роботі Одномірна людина. Одномірна людина керується такою ж бідною та плоскою філософією. На думку Еріха Фрома людина народжується тоді коли він розриває первісні зв’язки з природою що характеризують тваринне існування. Розірвавши їх людина стає одинокою що змушує її обрати 1 із 2х можливих шляхів: скоритися іншому або скорити іншого.
25254. Культура як об’єкт і предмет філософського осмислення 29.5 KB
  В той же час формується і протилежний підхід до питання про вплив культури на людське життя. Виділяють наступні підходи до вивчення історії людської культури: Формаційний Маркс Енгельс: Історія розглядається як зміна супільноекономічних формацій рухомою силою якої вважається класова боротьба. Кожній формації властивий власний тип культури який еволюціонує в своєму розвитку від формації до формації. Процес розвиток культури наділяється прогресивним характером який підпорядковується єдиній логіці історичного процесу – утвердження...
25255. Моральні цінності і основні тенденції сучасної культури 27 KB
  Біоетичні проблеми: вторгнення в природу людини пересадка органів клонування €œсуррогатне материнство€ штучне запліднення зміна статі евтаназія виявляє неможливість узгодження моральної і медицинської позицій. Таким чином під сучасними €œгуманістичними тенденціями€ приховуються цілком протилежні процеси егоїстичне і руйнівне ставлення людини до природи – як до навколишньої так і до власної; гіпертрафія значення індивідуальної людини що нерідко приховує за собою інтереси конкретних соціальних груп.