Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Dokument_Microsoft_Word_2.doc
Скачиваний:
19
Добавлен:
11.02.2016
Размер:
273.41 Кб
Скачать

1.2 Опис засобів реалізації гри Рядки

Рядок , вона ж текст - це набір символів , будь-яка їх послідовність . Відповідно, один символ - це теж рядок , теж текст. Текстовий рядок має певну довжину. Довжина рядка - це кількість символів , які вона містить. Якщо один символ займає 1 байт , то рядок з N символів займає відповідно N байт.

Є й інші кодові таблиці , в яких 1 символ представлений не одним байтом , а двома . Це Юнікод (Unicode ) . У таблиці Юникода є символи всіх мов світу. На жаль , робота з юникоде досить ускладнена і його підтримка поки що носить лише локальний характер. Delphi не надає можливостей для роботи з Unicode. Програмна частина є, але от візуальні елементи - форми , кнопки і т.д. не вміють відображати текст у форматі Юнікод. Будемо сподіватися , в найближчому майбутньому така підтримка з'явиться. 2 байта також називають словом ( word ) . Звідси і назва відповідного числового типу даних - Word ( число , що займає в пам'яті 2 байти , значення від 0 до 65535 ) . Кількість " осередків" в таблиці Юникода становить 65536 і цього цілком достатньо для зберігання всіх мов світу. Якщо ви вирішили , що " 1 байт - 256 значень , значить 2 байти - 2 * 256 = 512 значень " , раджу згадати двійкову систему і принцип зберігання даних в комп'ютері.

типи даних

Перейдемо безпосередньо до програмування. Для роботи з символами і рядками існують відповідні типи даних:

Char - один символ (тобто 1 байт) ;

String - рядок символів , текст ( N байт) .

Офіційно рядки вміщають лише 255 символів , однак в Delphi в рядок можна записати набагато більше. Для зберігання великих текстів і текстів зі спеціальними символами існують спеціальні типи даних AnsiString і WideString (останній , до речі , двобайтовий , тобто для Юнікоду ) .

Для завдання текстових значень в Pascal використовуються одинарні лапки ( це не подвійні !) . Тобто коли ви хочете привласнити строкової змінної небудь значення , слід зробити це так :

s : = ' text ';

Символи вказуються аналогічно, тільки в лапках присутній один -єдиний символ .

Якщо ви хочете жорстко обмежити довжину тексту , що зберігається в строкової змінної , можна зробити це таким чином:

var s : string ;

У дужках вказується максимальна довжина рядка.

Операції з рядками

Основною операцією з рядками є складання . Подібно числах , рядки можна складати. І якщо в числах стільці з апельсинами складати не можна , то в рядках - можна. Додавання рядків - це просто їх об'єднання . приклад :

var s : string ;

...

s : = '123 '+ '456 ';

/ / s = " 123 456 "

Оскільки кожен рядок - це послідовність символів , кожен символ має свій порядковий номер . У Pascal нумерація символів у рядках починається з 1 . Тобто в рядку "ABC" символ "A " - перший , "B" - другий і т.д.

Порядковий номер символу в рядку придуманий не випадково , адже саме за цими номерами , індексам , здійснюються дії над рядками. Отримати будь-який символ з рядка можна зазначенням його номера в квадратних дужках поряд з ім'ям змінної. наприклад:

var s : string ; c : char ;

...

s : = ' Hello! ';

c : = s [ 2 ] ;

/ / c = " e "

Трохи пізніше, стане зрозуміло , що рядок - це масив символів. Звідси випливає і форма звернення до окремих символів .

Обробка рядків

Перейдемо до функцій і процедур обробки рядків.

довжина рядка

Довжину рядка можна дізнатися за допомогою функції Length ( ) . Функція приймає єдиний параметр - рядок , а повертає її довжину. приклад :

var Str : String ; L : Integer;

{... }

Str : = ' Hello! ';

L : = Length ( Str ) ;

/ / L = 6

Знаходження підрядка в рядку

Невід'ємною завданням є знаходження підрядка в рядку. Тобто завдання формулюється так : є рядок S1. Визначити , починаючи з якої позиції в неї входить рядок S2. Без виконання цієї операції ні одну обробку уявити неможливо.

Отже , для такого знаходження існує функція Pos ( ) . Функція приймає два параметри : перший - підрядок , яку потрібно знайти , другий - рядок, в якому потрібно виконати пошук . Пошук здійснюється з урахуванням регістра символів. Якщо функція знайшла входження підрядка в рядок , повертається номер позиції її першого входження. Якщо входження не знайдено , функція дає результат 0 . приклад :

var Str1 , Str2 : String ; P: Integer;

{... }

Str1 : = ' Hi! How do you do ? ';

Str2 : = ' do ';

P: = Pos ( Str2 , Str1 ) ;

/ / P = 9

Видалення частини рядка

Видалити частину рядка можна процедурою Delete ( ) . Слід звернути увагу , що це саме процедура , а не функція - вона виробляє дії безпосередньо над тією змінною , яка їй передана . Отже, перший параметр - мінлива строкового типу , з якої видаляється фрагмент (саме змінна ! Конкретне значення не запитує , тому процедура не повертає результат) , другий параметр - номер символу , починаючи з якого потрібно видалити фрагмент , третій параметр - кількість символів для видалення. приклад :

var Str1 : String ;

{... }

Str1 : = ' Hello , world ! ';

Delete ( Str1 , 6 , 7 ) ;

/ / Str1 = " Hello! "

Слід зазначити , що якщо довжина видаляється фрагмента виявиться більше кількості символів в рядку , починаючи із зазначеної позиції (тобто " виліземо за край" ) , функція нормально відпрацює . Тому , якщо потрібно видалити фрагмент з рядка з якогось символу до кінця , не потрібно обчислювати кількість цих символів. Кращим способом буде задати довжину самої цього рядка .

Ось приклад. Припустимо, потрібно знайти в рядку першу літеру " a " і видалити наступну за нею частину рядка . Зробимо так: позицію букви в рядку знайдемо функцією Pos ( ) , а фрагмент видалимо функцією Delete ( ) .

var Str : String ;

{... }

Str : = ' This is a test .' ;

Delete ( Str , Pos (' a ' , Str ) , Length ( Str )) ;

Спробуємо підставити значення і подивитися , що передається функції Delete. Перша буква " a " в рядку стоїть на позиції 9 . Довжина всієї рядки - 15 символів. Значить виклик функції відбувається такий : Delete ( Str , 9,15 ) . Видно , що від букви " a " до кінця рядка всього 7 символів ... Але функція зробить свою справу , не дивлячись на цю різницю. Результатом , звичайно , буде рядок " This is " . Даний приклад одночасно показав і комбінування декількох функцій.

Копіювання (витяг ) частини рядка

Ще одним важливим завданням є копіювання частині рядка . Наприклад , вилучення з тексту окремих слів. Виділити фрагмент рядка можна видаленням зайвих частин , але цей спосіб незручний. Функція Copy ( ) дозволяє скопіювати з рядка вказану частину . Функція приймає 3 параметра : текст ( рядок ) , звідки копіювати , номер символу , починаючи з якого скопіювати і кількість символів для копіювання. Результатом роботи функції і буде фрагмент рядка.

Приклад : нехай потрібно виділити з пропозиції перше слово (слова розділені пробілом). На формі розмістимо Edit1 ( TEdit ) , в який буде введено пропозицію. Операцію буде виконувати після натискання на кнопку. маємо:

procedure TForm1.Button1Click ( Sender: TObject ) ;

var s , word : string ;

begin

  s : = Edit1.Text ;

  word : = Copy ( s , 1 , Pos ( '' , s ) -1 ) ;

  ShowMessage (' Перше слово :' + word ) ;

end ;

У даному випадку з рядка копіюється фрагмент від початку до першого пробілу . Число символів береться на одиницю менше , т.к. в іншому випадку пробіл також буде скопійований.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]