Робота з символьними об'єктами Adobe Illustrator. Операції з рядками

05.11.2019 Цікаве

Символ

Символ – це один знак. Будь-який - буква, цифра, арифметичний знак або пробіл, розділовий знак або підкреслення... А також спеціальні символи – перехід на новий рядок, BackSpace, знак долара або відсоток. Тип "символ" у Delphi позначається Char:

ShowMessage("Ви ввели" + c);

ShowMessage("Перехід на новий" + c + "рядок");

Ми вже казали, що символи беруться із таблиці символів ANSIабо UNICODE. Більшість символів використовуються, деякі символи є службовими. Зверніть увагу, що велика літера"А" та маленька "а" - це різні символи! Також різними символами є латинська "с" та російська "с", хоча вони схожі, як дві краплі води.

Нульовий символ не використовується, він зарезервований як нуль. Програмісти знайшли гідне застосування цього символу, використовуючи його у подіях введення тексту, коли потрібно заборонити користувачеві введення будь-яких символів. Службові символи ми не можемо побачити у текстовому поле. Службові символи, це , <Enter>, <Tab> та інші. Кожен символ обробляється комп'ютером як число від 0 до 255, таким чином, слово"ПРИВІТ" у пам'яті машини буде виглядати як набір цифр: "207 208 200 194 197 210".

Функції роботи із символами

Насправді часто доводиться обробляти окремі символи. Змінним символьного типу Char можна надавати значення таким чином:

Оскільки для комп'ютера символ – число, символьні дані можна порівнювати між собою. При цьому більшим буде символ, число якого в таблиці символів більше. Наприклад, "я" буде більше, ніж "а":

if b > c then ShowMessage("Істина!")

else ShowMessage("Брехня!");

При роботі із символьними змінними часто використовують функції Chr() та Ord(). Функція Chr() приймає як параметр число, і повертає символ, який відповідає цьому числу в таблиці ANSI:

функція Chr (X: Byte): Char;

Функція Ord() робить прямо протилежну дію, вона приймає як параметр символ, і повертає число, під яким цей символ зберігається в таблиці ANSI:

функція Ord (C: Char): Byte;

Символьні змінні можна використовувати з цими функціями:

У першому рядку в змінну a ми записали символ "І", якому в таблиці символів відповідає номер 200. У другий, цілу змінну, ми записали число 200, оскільки символ із цим номером був записаний в змінну a, яку ми передали як параметр . Зрештою, у третьому рядку ми в цілу змінну записали число 102, цей номер відповідає символу "f".


Рядок

Рядок – це набір символів. Рядок можна подати у вигляді статичного або динамічного масиву символьних даних. Типи рядків ми вже розбирали в "Керуюча конструкція if, цикл for" : AnsiString – рядок з ANSI– символів, та WideString- Рядок з UNICODE - символів.

Тип String не є окремим типом, за умовчанням він дорівнює AnsiString. Однак його можна переналаштувати і на WideStringхоча в цьому немає необхідності. Тому сміливо вказуйте рядкові змінні, як String:

s:= "Це багаторядкова" + # 13 + "рядок";

Як видно з прикладу, рядок можна складати з кількох підрядків, і навіть додавати до нього окремі символи. У прикладі ми додали символ під номером 13, це символ переходу на новий рядок. В результаті виконання цього коду процедура ShowMessage () виведе на екран повідомлення, розбите на два рядки:

Це багаторядкова

ShortString- короткий рядок з ANSI- Символів. Може містити від 0 до 255 символів. Використовується нечасто. Власне, ви можете оголосити тип String із заздалегідь вказаним розміром:

Як бачите, рядок оголошується з числовим індексом, майже як масив. Власне, рядок символіві є масивсимвольних даних, і поводитися з нею можна також. Індексаціясимволів у рядку починається з одиниці, тобто індексу 1 відповідає 1-й символ рядка.

stroka: = "Привіт";

stroka: = "а"; //змінили 5-й символ рядка

ShowMessage(stroka); //Результат: рядок "Приват"

Це теж рядок, і в майбутньому нам доведеться з ним стикатися. Цей рядок працює зовсім інакше, ніж String. РядокString являє собою масивсимволів, у нульовому елементі якого міститься кількість байт, що відводяться під цей рядок. А зміннатипу PChar– це не сам рядок, а покажчикна початок рядка, тобто зміннавказує на перший символ рядка у пам'яті комп'ютера. А де ж тоді PCharзберігає кількість байтв рядку?! А ніде! Ми вже говорили про таблицю символів ANSI, і з'ясували, що нульовий символ – порожній. Ось останній символ PCharякраз і зберігає цей символ, і комп'ютер, знайшовши його, вважає, що рядок закінчено.

З рядками PCharпрацювати дуже незручно, однак нам доведеться це робити, коли ми будемо працювати з функціями WinAPI безпосередньо. Функції WinAPI – це функції самої Windows, а чи не Delphi. Проте Delphi дозволяє їх використовувати. Іноді це буває необхідно, наприклад, коли коштів Delphi замало виконання наміченої завдання. Використання таких функцій не завжди зручне, проте вони виконуються процесором набагато швидше, оскільки містяться в самій операційній системі. Приклад – функція MessageBox().

Ви вже звикли виводити повідомлення за допомогою функції Delphi ShowMessage()? Звикайте до нової функції!

Application.MessageBox("рядок 1", "рядок 2", [кнопки + тип_вікна]);

· Рядок 1 - виводить текст усередині вікна.

· Рядок 2 – текст у заголовку вікна.

Якщо не вказувати [кнопки + тип_окна], то вийде просте вікно з кнопкою ОК, як у функції ShowMessage().

Важливі нотатки

Незмінність

У JavaScript рядки є незмінними, так само кажуть "імутальні". Це означає, що які б ви до них не застосовували функції, вони не виконують in-place заміни (тобто не здійснюють зміни самого рядка). Будь-які рядкові функції, застосовані до рядків, повертають новурядок. Це вірно й у тому випадку, коли ми звертаємось до конкретного символу у рядку.

Const str = "hello"; str.toUpperCase(); // HELLO console.log(str); // hello str.toUpperCase(); // H console.log(str); // hello str = "W"; console.log(str); // hello

Лексикографічний порядок

Лексикографічний порядок – це, іншими словами, алфавітний порядок. Такий порядок використовується у словниках, телефонних довідниках, записниках тощо.

У JavaScript ви можете порівнювати рядки за допомогою > та< , и сравнение будет происходить именно лексикографически.

Пам'ятайте, що "8" це не число, а рядок.

Інтерполяція

Крім одиночних "" та подвійних лапок, сучасний JavaScript містить зворотні тики (backticks):

``

Зі зворотними тиками ви можете використовувати інтерполяціюзамість конкатенації. Ось дивіться:

Const name = "Alex"; const a = 10; const b = 12; console.log(`His name was $(name) and his age was $(a + b)`);

Такий код виведе на екран His name was Alex and his age was 22 . Всередині $() ви можете помістити будь-який вираз.

Інтерполяція краще за конкатенацію. Ми радимо не використовувати конкатенацію загалом. Ось деякі з причин:

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

Конспект уроку

  • Рядок - це послідовність символів
  • Порожній рядок - це теж рядок (послідовність нуля символів)
  • Позначається одиничними або подвійними лапками

Створення рядка з константою:

Const str1 = "Hello"; const str2 = "Hello";

Можна включити лапку одного типу всередину рядка, оточивши її лапками іншого типу:

Const str1 = "The call him "Harry", and he likes it"; const str2 = "The call him "Harry", and he likes it";

Якщо у рядку використовуються лапки того ж типу, вони мають бути екранованіза допомогою зворотного слєшу \ :

Const str1 = "The call her \"Ann\", and she likes it"; const str2 = "The call her \"Ann\", and she likes it";

Якщо рядок включає зворотний сліш (саме як символ, який хочеться мати в рядку), він повинен бути екранований іншим зворотним слішем:

Const str = "Це є backslash \\ here" // This is a backslash \ here

Так само існують керуючі символи- спеціальні комбінації, що генерують невидимі деталі:

Const str = "Це є tab \t і він \ncomes the new line!" // Here is a tab and here // Comes the new line!

\t - це табуляція, \n це перенесення на новий рядок. Більше про екранування (англ).

Конкатенація рядків

Рядки можуть склеюватися один з одним. Такий процес називається конкатенацієюі задається символом +:

Const name = "Alex"; const age = 22; console.log("His name is " + name + " and his age is " + age); // His name is Alex і his age is 22

Рядки будуть склеєні в тому порядку, в якому вони вказані: "mos" + "cow" → "moscow", а "cow" + "mos" → "cowmos"

Доступ до індивідуальних символів

str[i] це перший символ рядка str , що починається з 0. Наприклад, "hexlet" це h , а "hexlet" це x .

Ось функція, яка приймає рядок та повертає копію цього рядка без кожної другої літери. Наприклад, "hexlet" стає "hxe".

Const skip = (str) =>< str.length) { result = result + str[i]; i = i + 2; } return result; }

str.length це довжина str, тобто кількість символів. Це просто кількість, тому ми непочинаємо відлік від 0. Наприклад, "food". length це 4.

Транскрипт уроку

Пам'ятаєте свою першу програму "hello, world"?

Console.log("Hello, World!");

Зараз ви вже знаєте, що відбувається виклик функції, а функція console.log приймає аргумент. У разі аргумент - не число, а " рядок " . Так ми називаємо фрагменти тексту у програмуванні, тому що вони як послідовність букв на мотузці.

Рядки є скрізь. Зараз я читаю сценарій, та текстовий файл- це довгий рядок. Веб-сайт, на якому ви дивитеся ці відео, містить багато слів - все це рядки. Робота Googleзапам'ятовувати рядки - у цьому суть пошуку. Файли та папки у вашому комп'ютері ідентифікуються через їх назви, які так само є лише рядками.

Так само, як ми це робили з числами, ми можемо створити константу з рядка:

Const str = "Hello";

Ви можете використовувати поодинокі лапки або подвійні, не так важливо, головне, щоб вони були однакові і на початку і в кінці рядка.

Якщо вам необхідно використовувати реальні лапки всередині рядка, тоді використовуйте інший знак для створення. Наприклад:

Const str="The call him "Harry", and he likes it"; ///They call him "Harry", and he likes it

Тут одиночні лапки використовуються для формулювання або обмеження рядка, і тоді ми маємо можливість поставити подвійні всередині. Або навпаки:

Const str="The call him "Harry", and he likes it"; /// They call him "Harry", and he likes it

Подвійні зовні – одиночні всередині.

Але що робити, якщо таке неможливо, і вам потрібно використовувати однаковий тип лапок і для формулювання рядка і в ньому. Якщо ви спробуєте зробити так

Const str="The call him "Harry", and he likes it";

то отримаєте помилку, тому що ваш рядок поламано. Програма зламається в цьому місці, тому що тут є друга закриваюча лапка такого ж типу, а потім йде дивне слово, яке нічого не означає, а потім новий рядок. Це неправильний JavaScript.

Нам потрібно пояснити інтерпретатору JavaScript, що деякі лапки він повинен сприймати інакше. Вони не повинні означати "початок рядка" або "кінець рядка", вони повинні означати "символ лапок".

Це називається "екрануванням". Додайте символ екранування, зворотний слєш перед символом, і символ "ізолюється" від своєї специфічної ролі і перетвориться на звичайний знак у рядку.

Const str = "The call him \"Harry\", and he likes it"; const str2 = "The call her \"Ann\", and she likes it"; // The call him "Harry", і я люблю це // They call her "Ann", і він хоче це

Цей символ екранування можна використовувати для вставлення інших спеціальних символів у рядок.

Тут є три моменти.

Перший: якщо нам потрібний зворотний сліш у рядку, то він повинен бути екранований іншим зворотним слішем.

Друге: зворотний слєш-t це не "екранований t-символ": вам не потрібно екранувати "t", "t" - це не спеціальний символ; вся конструкція зворотний слєш-t - це спеціальна керуюча послідовність- вона є одиничною табуляцією, по суті - довга прогалина.

Третє: зворотний слєш-n - це інша керуюча послідовність, яка є новий рядок. Вважай, що ви натиснете клавішу Enter, коли набираєте текст. Тому все, що йде далі, перейде на новий рядок.

Тепер спробуємо написати функцію. Вона прийматиме рядок - ім'я та повертатиме інший рядок - привітання. Ось як це має працювати:

Const result = greet("Sherlock"); // "Well hello, Sherlock"

Ця функція повинна вміти якимось чином приймати вхідний рядок та склеювати його з іншим рядком. Такий процес називається "конкатенацією" і в JavaScript він реалізується знаком плюс, як при додаванні чисел:

Const greet = (str) => ( return "Well hello, " + str; )

Тепер інший приклад. Ця функція приймає рядок і повертає той самий рядок, але без кожної другої літери. Наприклад, "California" стає "Clfri".

Const skip = (str) => ( let i = 0; let result = ""; while (i< str.length) { result = result + str[i]; i = i + 2; } return result; }

Такі квадратні дужки дозволяють отримувати індивідуальні символи з рядка. Як і у багатьох процесах у програмуванні, ви починаєте відлік з 0, а не від 1. Тому перший символ str це str , другий - str і так далі. Це число називається "індексом".

Функція skip приймає аргумент, створює дві змінні - i для лічильника та result для підсумкового рядка. Лічильник - це 0, тому що нам потрібно почати з першого символу, а результат - це порожній рядок - ми будемо додавати символи до неї один за одним.

Потім слідує цикл while, з умовою, що "i менше, ніж довжина рядка". Довжина означає "скільки символів". Довжина рядка "cats" - 4 - у ньому 4 символи, 4 літери.

Поки лічильник менший за довжину, ми склеюємо або конкатенуємо результуючий рядок із символом за індексом i. Потім додаємо 2 до лічильника. Два, а не одна, тому що нам потрібно пропустити один символ.

У якийсь момент лічильник стане досить великим для того, щоб умова циклу стала хибною, і функція поверне result .

Спробуємо викликати функцію з аргументом "cats":

Const skipped = skip ("cats");

Довжина "cats" – 4. Незважаючи на те, що індекси починаються з 0, довжина – це дійсна кількість. "c" - не 0 букв, це одна буква. Тому довжина "cats" – 4, але індекс його останньої літери – 3.

  1. 0 менше чотирьох, тому увійти в цикл while
  2. конкатенувати рядок із символом за індексом 0 - це "c"
  3. збільшити лічильник на 2
  4. 2 менше 4, тому повторити
  5. конкатенувати рядок із символом за індексом 2 - це "t". рядок тепер став "ct"
  6. збільшити лічильник на 2
  7. 4 не менше 4, тому більше не повторювати
  8. повернути результат - "ct"

На вас чекають тест та практична вправа.

Після того, як ми пройшли масиви, ми тепер зможемо зрозуміти що таке текст як певна структура даних мови програмування: текст - це набір символів або масив елементами якого є символьний тип даних Chr. Наприклад, якщо наш текст складається зі 100 символів, то оголосити його ми могли б наступним чином: Type Text=rry of chr; У багатьох мовах програмування з текстом і працюють як з масивом із символів обробляючи кожен символ окремо. Ці засоби поєднують з одного боку поняття про...


Поділіться роботою у соціальних мережах

Якщо ця робота Вам не підійшла внизу сторінки, є список схожих робіт. Також Ви можете скористатися кнопкою пошук


Рядковий тип даних. Робота з символами та рядками.

Після того, як ми пройшли масиви, ми тепер зможемо зрозуміти, що таке текст як певна структура даних мови програмування: текст це набір символів, або масив, елементами якого є символьний тип даних Char. Наприклад, якщо наш текст складається зі 100 символів, то оголосити його ми могли б так:

Type

Text=array of char;

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

Рядковий тип даних оголошується за допомогою зарезервованого слова Shortstring:

a: shortstring;

b: shortstring;

Змінна a ¦ це рядкова змінна, яка призначена для введення та виконання операцій над рядками, що мають довжину до 255 символів (з 1-го до 255-го). Нульовий байт рядка завжди зберігає значення її поточної довжини. Якщо рядок містить менше 255 символів, то нульовий байт міститиме двійковий код її поточної довжини, і звернутися до незаповнених символів за номерами, що перевищують довжину рядка, буде неможливо. Поточну довжину рядка можна завжди дізнатися за допомогою спеціальної функції Length , Про яку буде розказано пізніше, або звернувшись безпосередньо до її нульового байта.

Довжина рядка b відразу позначена 80 символів. Реальний рядок може бути і меншим від цього значення, але перевищувати 80 символів він уже не може. Обмежувати рядок доцільно в тому випадку, якщо ми знаємо, що наша рядкова змінна може зберігати будь-які свої значення, які ніколи не перевищують певного розміру. Наприклад, якщо вона зберігає однозначну відповідь («так», «ні» або «не знаю»), то в даному випадку бажано з метою економії пам'яті комп'ютера використовувати рядкову змінну, що складається з символів (за найдовшою фразою «не знаю»: 6 літер і ще одна прогалина).

Після того, як ми створили рядкові змінні, тепер їм можна надавати рядкові значення, позначені в апострофах, наприклад:

a:= Коли в кабінет зайшли учні;

a:=?весняний БАЛ";

b:= екіпаж сформований, сер";

b:= футбол|;

a:=#4$& *&^;

b:=?15478 564 22; jdjjk;

a: = 2547;

b: = true;

Слід відрізняти рядки від реальних чисел та значень. Наприклад, з рядком a ми не можемо проводити жодних арифметичних операцій, оскільки a (2547) в даному випадку тільки набір символів, а не число. Також і значення b перестав бути логічної змінної, лише словом “true”.

Коли спочатку програми ініціалізували змінні, ми надавали їм якесь значення, як правило, 0. Рядки ініціалізують порожнім оператором‘’ . Ця процедура записує в нульовий байт значення довжини рядка, що дорівнює 0. Зверніть увагу, що запис пробілу і нульового рядка це різні дії. Іншими словами, після проведення операцій a:= "; b:=; рядок a міститиме пробіл, а рядок b буде порожньою, яка не містить жодних символів.

Щоб ввести рядок з клавіатури, можна скористатися звичним оператором read() без організації циклу за її довжиною (на відміну введення масивів):

read(a);

readln(b);

Виведення рядків на екран аналогічне:

write(a);

writeln(b);

До символів рядка можна звернутися безпосередньо. У цьому випадку рядок виступає в ролі масиву:

a:= и;

write(b);

У першому випадку 10 символ рядка a приймає значення літери «ы », а в другому випадку ми виводимо третій символ рядка b . Тільки будьте уважні: якщо рядки не будуть містити цих символів (їх поточна довжина буде меншою або рядок буде порожнім), то виконання програми буде перервано через помилку, тому передбачайте різні варіанти і завжди перевіряйте поточну довжину рядка програмними засобами(За допомогою Length)!

До рядків застосовується операція об'єднання, яка в термінах називаєтьсяконкатенацією . Ця операція поєднує кілька рядків в одну велику. Для того, щоб скласти кілька рядків, ми повинні скористатися звичайним оператором «+», що підсумовує. Ось як це виглядає на прикладах:

a: = | Додавання | + | рядків |; //a=Складання рядків

a:= Складення +першого +і+ другого+  рядка;

//a=складання першого та другого рядка

Можна об'єднувати і самі рядкові змінні, наприклад:

a:=a+b;

Для роботи з рядковими змінними мовою Pascalпередбачені такі спеціальні процедури та функції:

1. Функція Length:

Length(s: string): integer;

Ця функція повертає поточну довжину рядка s змінну типу integer.

Ось приклад використання цієї функції:

N: integer;

A: shortstring;

Begin

a:= 1-й рядок ;

n:=Length(a); //n=10

End.

2. Функція Pos:

Pos(Підстрока , s:string): byte;

Функція Pos повертає ціле значення типу Byte, що відповідає індексу першого символу підрядка, яка входить у рядок s. Якщо підрядок не міститься в рядку s, функція повертає 0.

Приклад:

n:=Pos(?рядок?, a); //n=5; (Значення взяті з першого прикладу)

3. Функція Copy:

Copy(s: string; Index, Count: integer): string;

Функція Copy копіює частину рядка s, починаючи з символу з номером index кількість Count символів.

Приклад:

B: shortstring;

Begin

a := ?1-й рядок?;

b:=Copy(a, 3, 5); //b містить я стр

End.

4. Функція Concat:

Concat(s1; s2; …; sn): string;

Ця функція поєднує кілька рядків, здійснюючи операцію конкатенації над своїми аргументами. Цю операцію можна зробити і за допомогою оператора додавання «+», як ми побачили це вище.

5. Процедура Val:

Val(s: string; Var v; Var Code: integer;);

s | рядок цифр, v Змінна типу integer або real

Процедура, на відміну функції, не повертає жодного значення, а просто змінює свої параметри. Якщо змінній можна призначити значення функції, значення процедури привласнити не можна.

Функція Val повертає до змінної v число, знайдене у рядку. При цьому весь рядок має містити лише число. В іншому випадку, якщо

перетворення виконати не вдалося, значення code містить номер позиції у рядку, в якому відбулася помилка під час перетворення, а інакше повертає значення 0.

Приклад:

A: shortstring;

V, m: integer;

Begin

a: = 2356;

Val(a, v, m); //v=2356, m=0

End.

6. Процедура Str:

Str(y; s: string);

Змінна y це число, що належить деякому з числових типів даних.

Процедура Str перетворює число у рядок s.

Приклад:

Str(10254, a); //рядок а почала містити |10254|

7. Процедура Insert:

Insert(s1: string; Var s2: string; index: integer);

Процедура Insert вставляє рядок s1 у рядок s2, починаючи з позиції index . Якщо рядок s2, що отримується, стає довшим за 255 символів, то символи, що не ввійшли з кінця, просто відкидаються.

Приклад:

S1, s2: shortstring;

Ind: integer;

Begin

s1: = 1 - я ;

s2:= рядок ;

Insert(s1, s2, 7); //s2 = рядок 1 - я |

End.

8. Процедура Delete:

Delete(Var s: string; Index: integer; Count: integer);

Процедура Delete видаляє з рядка s її частина, що починається з позиції index і триває на count елементів.

Приклад:

A: shortstring;

P, m: integer;

Begin

a:=?рядок?;

Delete (a, 2, 3); //Рядокa почала містити |ска|

End.

Приклади програм використання рядкового типу даних.

1) Написати програму, яка знаходить кількість букв “k”, які у тексті.

program Pr_27_28_1;

($APPTYPE CONSOLE)

uses

SysUtils;

A, a_save: string;

s: byte;

Const bukva = "k";

Begin

Writeln("Vvedite tekst");

Readln(a); // Введення тексту

a_save:=a; //сам текст змінюватиметься, тому ми зберігаємо його копію

s:=0; //ініціалізація лічильника літер "K" запис початкового

// Значення

While Pos("k",a)>0 do //поки "K" зустрічається в тексті

begin

Delete(a,Pos("k",a),1); //видаляємо літеру "K" (щоб знайти нові літери "K")

s:=s+1; //і збільшуємо лічильник на 1

end;

Writeln("Ваш текст: ",a_save, " soderjit ",s, "bukv "k""); //виведення тесту та

Readln; //кількості букв "K", що зустрілися в ньому

End.

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

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

While i

begin

end;

Кожне слово в тексті закінчується певним символом, наприклад, пробілом, точкою, двокрапкою або якимось знаком (окликовим, запитальним, лапками та іншими). Для спрощення нашого завдання приймемо, що всі слова в тексті поділяються пробілами, а текст закінчується точкою. Як було сказано в уроці про символьний тип даних Char, кожен символ має свій унікальний код. Список всіх кодів міститься в таблиці ASC2, в якій коду пробілу відповідає номер 32. Для звернення до будь-якого символу потрібно вказати або сам сам символ в апострофах, або задати його код після знака грати# . Символ пробілу - символ, що не відображається, тому звертаємося до цього символу так:#32 .

Щоб виділити будь-яке слово тексту, ми повинні знайти закінчення цього слова: пробіл або точку (для останнього слова). Цикл, що знаходить кожне слово тексту, записується так:

inach:=i;

while (S[i]<>#32) and (S[i]<>".") do

begin

St:=St+S[i]; inc(i);

end;

Змінна I зберігає номер поточного символу тексту, inach зберігає номер першого символу слова (словом стосовно нашого завдання можна вважати і цифру, і будь-який набір символів, що відображаються). Змінна S містить наш текст, а в St буквально формується наше виділене слово.

Якщо ми хочемо видалити знайдене слово, наприклад, якщо це слово містить понад 8 літер, ми повинні записати наступний фрагмент програми:

inach:=i;

while (S[i]<>#32) and (S[i]<>".") do

begin

St:=St+S[i]; inc(i);

End;

If i>8 then

Delete(S, inach, i-1);

else inach:=inach+i-1;

Тепер давайте напишемо програму, яка формуватиме новий текст, що містить з вихідного текстутільки слова, що починаються і закінчуються на ту саму букву:

program Tekst2z;

($APPTYPE CONSOLE)

uses

SysUtils;

Var S, St: string;

Z: 0..50;

Inach, i: byte;

B: char;

Begin

Writeln("Napishite predlogenie");

Readln(S);

i:=1; z:=0; St:=""; inach:=1; // початкова ініціалізація

Whilei do //загальний цикл (доки закінчився весь текст)

begin

b: = S [i]; //Виділяємо перший символ

while (S[i]<>#32) and (S[i]<>".") do //цикл виділяє слово

Begin

St:=St+S[i]; inc(z); inc(i);

end;

If b<>S then //якщо перша і остання букви слова не рівні, тоdelete(St,inach,z) // Потрібно видалити це слово з формованого

//тексту

Else

begin inach:=inach+z+1; St:=St+#32; end; //інакше можна йти далі, //додавши після слова прогалину

if S[i]<>"." Then inc(i); z:=0; //якщо не досягнуто кінця тексту, то обнулюємо лічильник числа символів у слові (z) і збільшуємо номер поточного символу на 1

end;

Writeln("Trebuemoe predlogenie:");

Writeln(St); //виводимо текст, що вийшов.

Readln;

End.

Інші схожі роботи, які можуть вас зацікавити.

2764. Рядковий тип 22.07 KB
Подання у пам'яті Деякі мови програмування накладають обмеження на максимальну довжинурядки, але в більшості мов подібні обмеження відсутні. Основні проблеми в машинному поданні рядкового типу: рядки можуть мати досить суттєвий розмір до кількох десятків мегабайтів; Розмір, що змінюється з часом, виникають труднощі з додаванням і видаленням символів. Уявлення масивом символів У цьому підході рядки є масивом символів; при цьому розмір масиву зберігається в окремій...
7176. ОРГАНІЗАЦІЯ БАЗ ДАНИХ І СИСТЕМИ УПРАВЛІННЯ БАЗАМИ ДАНИХ 116.07 KB
Наприклад як інформаційної системиможна розглядати розклад руху поїздів або книгу реєстрації даних про замовлення. Атрибут записаний на якомусь носії інформації називають елементом даних полем даних або просто полем. Під час обробки даних часто зустрічаються однотипні об'єкти з однаковими властивостями.
8335. Аналогова та дискретна інформація. Носії даних. Операції із даними. Кодування даних. Системи числення. Ентропія та кількість інформації 227.54 KB
Системи числення. Системи числення Кодування даних використовується здавна: код Морзе Брайля морський сигнальний алфавіт і т. д. В історії людства для кодування чисел найбільш відомі дві системи числення: непозиційна та позиційна. Як та так і інша системи числення характеризуються підставою кількістю різних цифр використовуваних для запису чисел наприклад від 0 до 9 т.
8334. Формули Шеннона та Хартлі. Розрахунок кількості інформації. Кодування символьних, графічних та звукових даних. Структури даних Формула Шеннона 140.5 KB
Для вирішення зворотних завдань, коли відома невизначеність (H) або отримана в результаті її зняття кількість інформації (I) і потрібно визначити, яка кількість рівноймовірних альтернатив відповідає виникненню цієї невизначеності, використовують зворотну формулу Хартлі, яка виводиться відповідно до визначення логарифму і виглядає ще простіше ...
10584. Робота над словником 12.01 KB
Робота над лексичним запасом є однією з основних цілей і завдань у методиці викладання іноземної мови і водночас однією з найскладніших проблем із низки причин однієї з яких є динамічний характер лексики. Що стосується лексичного складу сучасного німецької мовита кількість лексичних одиниць використовуваних носіями мови у повсякденному спілкуванні Stndrtsprche коливається в межах від 300. Цілком очевидно що освоїти такий обсяг складно якщо не сказати не можливо навіть носію мови не кажучи вже про...
19204. Робота з пресою 31 KB
Надання матеріалів для друку, на основі яких потім журналістами готуються повідомлення, репортажі, статті, нариси; відповіді на запити преси та надання комплексних інформаційних послуг(Можливості для журналістів зі збору та технічної обробки вихідної інформації), моніторинг - відстеження, аналіз та оцінка повідомлень друку, радіо та телебачення. Вжиття заходів, за необхідності, щодо виправлення помилок у повідомленнях та виступ із спростуваннями.
3933. Робота з масивами в PHP 8.92 KB
Вставка видалення та заміна елементів у масиві Функція rry_push додає один або кілька елементів у кінець масиву, а функція rry_pop видаляє останній елемент масиву. Функція rry_splice видаляє length елементів масиву починаючи зі зміщення offset і якщо заданий третій параметр замінює видалені елементи елементами масиву replcement, якщо параметр length не заданий видаляються елементи до кінця масиву. Функція rry_unique видаляє з масиву значення, що повторюються залишаючи тільки одне з них. Функція rry_merge зливає...
3696. Робота з макроскопічними препаратами 4.7 KB
Форма органу збережена чи ні, якщо немає в чому виражена деформація. Розміри органу збільшено зменшений приблизно у скільки разів. Колір органу з поверхні.
3936. Робота з файловою системою в PHP 9.24 KB
Кожен файл, крім імені та змісту, має набір параметрів, що визначають його характеристики (час створення, ідентифікатор власника, кількість посилань на даний файлв файловій системіі т.п.). Наведені нижче функції забезпечують доступ до цієї інформації
6343. ЕНЕРГІЯ, РОБОТА, ПОТУЖНІСТЬ 59.23 KB
Поняття енергії та роботи широко використовуються у повсякденному житті. Відомо, що робота здійснюється за рахунок запасу енергії і, навпаки, виконуючи роботу можна збільшити запас енергії в якому-небудь пристрої. Наприклад здійснюючи роботу при заводі годинника ми створюємо запас енергії в пружині за рахунок якого потім іде годинник. Поняття енергії пов'язує докупи всі явища природи.

Ми продовжуємо вивчати символи, основне довідалися, інше доопрацюється в процесі застосування інструментів, що управляють символами, та створення ілюстрацій з ними.

Але для творчих людей важливими є і психологічні моменти. На них постійно спираємося, вивчаючи черговий матеріал. Дійшов час і до Робіна Шарми. Читали ви цього автора, не читали, чи не це важливо. Важливо, що психологічно вивірені положення варто читати та перечитувати! Коли ви самі цим займатиметеся? В умі часто звучить відповідь: "Ніколи!"

А разом ми все обміркуємо!

Отже, «у людини чотири творчі початки».

«Як вважає Робін Шарма, визнаний майстер мотивації та автор світових бестселерів, у кожної людини є 4 творчі початки, 4 творців джерела, які на 100% зумовлюють усі його життєві результати. І саме від них залежить місце, яке ми займаємо в житті».

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

Думки

«Кожна обміркована нами думкавизначає кожен окремо результат, Який, у свою чергу, є відображенням нашої думки. Кожна звичка колись починалася з думки».
Якщо ви освоїли Adobe Illustrator,вийшли на стоки, намагайтеся мислититільки позитивно, незважаючи ні на що! Хваліть себе і підтримуйте, успіх прийде, це перевірено багатьма.
А то отримую листи з роздумами, що на стоках впав продаж, отже, йти туди не варто! Пишуть люди, які лише освоюють програму. Не залякуйте себе. Може, на вас стоки тільки й чекають! Ніхто нічого не знає, але не підживлюйтесь негативом!

Почуття

«Наші почуттятакож творчі. Якщо ми почуваємося добре, ми отримуємо відмінні результати. Якщо ми пристрасні, наша пристрасть передаватиметься іншим. Якщо ми почуваємось жахливо, наші результати будуть далекі від видатних».
Радійте кожному зробленому вами малюнку, кожній прийнятій роботі, кожному продажу, кожному центу, що впав вам у кишеню! Згадуйте, що колись ви цього не мали, а зараз справа пішла! Не забивайте радість творчої дитини своїми роздумами про гроші та продажі.

Слова

«Ми забуваємо, що слова маютьвеличезною силою. Слова здатні бачити. Якщо ви щось назвете трагедією, це визначить вашу реакцію та все подальше ставлення».
Слова ми комусь говоримо чи пишемо. Так кажіть і пишіть про свої успіхи. Розглядайте успіх навіть у дрібницях і не бійтеся перебільшувати. Це не хвастощі, не позерство, це залучення у своє життя справжнього успіху.

Дії

«Кожен наш діївизначають конкретний результат. Чим сильніше розвинене цей творчий початок у людині, чим активніше і цілеспрямованіше ми діємо, тим більш видатним результатам ми приходимо».
Про дії ми багато говорили. Велике портфоліо не звалиться саме вам на голову, як манна небесна. Над ним треба працювати, творити, вигадувати, шукати нове. Не треба зі шкіри геть лізти, але треба налаштувати себе на щоденну копітку працю. А народні прислів'я про працю ви знаєте з дитинства. Їхня головна думка – праця завжди винагороджується!
Тож дякую Робіну Шарме за чудове узагальнення людських можливостей. Все в наших руках!

У цьому уроці продовжуємо розмову про символи.

Згадаймо, що символ у Adobe Illustrator – це графіка, яка може застосовуватися необмежену кількість разів на малюнку. Ви можете використовувати символ стільки разів, скільки вам необхідно, але якщо ви зміните символ, зміняться всі зразки.

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

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

Листочки

Залишимо назву малюнка symbol4, а екран вичистимо. Заглянемо у Adobe Bridge.


Малюнки школи ілюстратора

Скільки малюнків накопичилося вже в нашій школі, починаючи від найпримітивніших, закінчуючи закінченими! Візьмемо для майбутнього символу малюнок ribki2 . Ось вони, наші перші красуні!

Рибки

Виберемо з них зелену, помістимо в габаритний прямокутник за допомогою чорної стрілки Selection Tool(V), скопіюємо ( Ctrl+C) і вставимо ( Ctrl+V) у малюнок symbol4


Вибрана рибка

Рибка велика, зменшимо її за допомогою Shiftдля рівномірної зміни та перетягнемо в порожній простір панелі Symbols(Символи). Але спочатку видаліть непотрібні там символи, що залишилися від роботи з попереднім малюнком.
У діалоговому вікні вставимо назву нового символу fish(Риба). І розберемося з тим, що є у вікні.

Вікно параметри символу

У діалоговому вікні Symbol Options(Параметри символу) дається примітка, що в програмі Illustratorнемає відмінностей між типами символу Movie Clip(відеоролик) та Graphic(Графіка). Значить, не турбуватимемося про значення параметра Export Type(Тип).
Звернімо увагу на Symbol Type(тип символ). За замовчуванням стоїть функція Dynamic Symbol(Динамічний символ). Ця функція дозволяє символам зберігати загальну форму, але зовнішній виглядІнші зразки символу можуть динамічно змінюватися. При зміні основної форми змінюються зразки символів, але інші зміни також зберігаються. Ми постійно користувалися Dynamic Symbol(Динамічний символ). У палітрі Symbols(символи) динамічні символи відображаються з «+» у нижньому правому куті значка. І ми це не раз бачили, тепер знатимемо! Але при створенні динамічних символівне слід додавати текст, розміщені зображення або об'єкти із сітками (міш). Запам'ятаємо!
Static Symbol(Статичний символ) говорить сам за себе. Він не змінюється.

Registration– точка реєстрації символу означає початок координат для об'єкта визначення символу. Під час створення символу ми можемо вибрати одну з 8 точок реєстрації на межі символу або точку в центрі обмежувальної рамки. Облишмо все як є! Крапка в центрі.
Enable Guides for 9- Slice Scaling– увімкнути напрямні для 9-фрагментного масштабування. Знатимемо, що таке є. Тут не так просто, треба серйозно розбиратися!

У нас галочка за замовчуванням стоїть на іншому записі.
Align to Pixel Grid- Вирівняти по піксельній сітці. Із цим ми теж познайомимося, але не зараз. Символи, вирівняні піксельною сіткою, залишаються вирівняними при переміщенні їх у межах монтажної області, якщо їх поточний розмір не змінюється. Залишимо цю галочку, ми з нею працювали.

ОК. У панелі Symbols(Символи) відразу з'явилася наша рибка як символ.

За промовчанням виділений графічний об'єкт стає екземпляром нового символу. Якщо хочете уникнути такого перетворення, під час створення нового символу утримуйте клавішу Shift.
А я не тримала клавішу Shiftі хочу подивитись, що робити далі.


Палітра «Символи»

Залишився зразок, він помічений плюсиком. Згадайте, у перших уроках з символів такі плюсики з'являлися, коли ми зменшували дані програмою символи. За замовчуванням виділений графічний об'єкт стає екземпляром нового символу, а він нам не потрібен.

Палітра «Символи»

Видалимо створений символ із панелі Symbols(Символи). Але спершу вийде така табличка. Минемо і цей етап. Видаляти свої символи доведеться. Подивимося, що на нас чекає!


Попереджувальна табличка

Один або більше символів можуть бути використані і можуть бути нерозривні until they instances є expanded or deleted. – Один або більше символів використовуються і не можуть бути видалені, доки їх екземпляри не будуть розширені або видалені.

Ось так, не одразу й видалиш непотрібний символ! Якщо виберемо Delete Instances(Видалити екземпляри), зникне все: і символ, і рибка. Вибираємо Expand Instances(Розгорнути екземпляри).


Виділена рибка

Рибка виділилася червоним, але символ із палітри зник! Домоглися свого! Заглянемо в палітру Layers(Шари). Ось це так!

Палітра «Шари»

Я розсунула палітру, і видно, що наша рибка розгрупувалася! Будемо це знати!

Давайте за допомогою Ctrl+ Gоб'єднаємо деталі рибки. Можете спробувати, але без поєднання рибка не перетягується в палітру.
Нам все ж таки треба створити новий символ. Ось тут затиснемо та утримаємо клавішу Shift, поки символ перетягуємо на панель. Крім того, якщо не потрібно, щоб під час створення символу відкривалося діалогове вікно New Symbol(новий символ), то, створюючи символ, тримайте кнопку Alt. Illustratorнадасть символу ім'я за промовчанням, наприклад, New Symbol1 (Новий символ1).

Потренуйтеся, і тут не так просто!

Палітра «Символи»

Символ з'явився, а скопійовану рибку можна видалити! Проблем не буде!

Тепер витягнемо рибку з панелі Symbols(Символи). Розпорошимо і подивимося, як все працює! Чому б не пробігтися знайомими інструментами?! Тут ви вже спеціалісти! Починайте! Інструмент Symbol Sprayer Tool(розпилювач символів) і всі освоєні на минулих уроках!


Розпорошення символів

Ми колись руками перетягували рибок, і це було довго, а тепер знаємо, як швидше зробити без проблем. Та ще й колір, і прозорість змінили! Звичайно, я не старалася особливо, але рибки різні. Знаю, що ви намагаєтесь! Молодці!

Застосування символів дозволяє заощадити час та значно скоротити розмір файлу. Оскільки один і той же символ легко розмножується, ви не завантажуєте нові важкі файли щоразу, коли використовуєте малюнок або працюєте з ним. Набір розмножених символів – це єдине ціле, не треба експандувати символи.

Власне, будь-який об'єкт, група об'єктів або зображення в цілому може бути збережено як символ незалежно від того, чи воно містить намальовані елементи, текст, впроваджені зображення або комбінацію перерахованих елементів. Це дуже зручно, тому що дозволяє поповнити бібліотеку. Symbolsтими графічними елементами, які часто використовуються у конкретній роботі.

Відредагувати символ можна, змінивши відповідний графічний об'єкт. Крім того, можна перевизначити символ, замінивши його на новий графічний об'єкт. При редагуванні та перевизначенні символу змінюється його зовнішній вигляд на панелі Symbols(Символи), а також вид всіх його зразків в монтажній області.

Нам треба в цьому переконатися, чи школа є школа, вона закладає основи.
Виділимо наші символи. Двічі натисніть на виділення в будь-якому місці.


Розмножуємо набір символів

Здається, нічого не змінилося, крім того, що вгорі з'явилася синя смужка та зник габаритний прямокутник, що виділяє наш розмножений знак.

Синя смуга зверху

Це потрібно! Візьмемо клавішу Altі розмножимо рибок.
Клікнули, знову з'явився габаритний прямокутник, затиснули Altі трохи відтягли нових рибок убік.


Розмножені рибки

Тепер приберемо їх із екрана, перетягнувши на полотно. Усі рибки не потрібні, скористаємося лише однією!


Рибки на полотні

Мені сподобалася верхня червона рибка. Ви можете вибрати будь-яку зі своїх. Але як її дістати із набору символів? Зараз дізнаємось!
Два рази клацнемо в будь-якому місці екрана, щоб забралася синя смужка зверху.


Прибрали синю смугу

Виділимо новий набір рибок. Пересунемо ближче до обраної рибки палітру Symbols(Символи), і подивимося на одну з її функцій. Працюємо на полотні.


Розриваємо зв'язок символів

Break Link to Symbol– розірвати зв'язок із символом. Клацніть на ній!
Усі рибки стали виділеними. Зв'язок розірвався!


Зв'язок розірвався

Вони перетворилися на окремі об'єкти. Але рибки були єдністю, не забувайте! Знімемо виділення, розгрупуємо набір виділених рибок, виберемо одну, яка потрібна, решту видалимо.

Вибрана рибка

У нас залишилася одна рибка! Розгорнемо її і щось у ній змінимо, перетягнувши на екран із полотна.

Набір символів та окрема рибка

Рибки у наборі не заважають. Вони всі разом! Змінюватимемо цю рибку. Повернемо їй нормальні очі. Знову скористаємося новим прийомом! Виділіть рибку, двічі клацніть на екрані, вона стане ледве видимою, тепер виділяйте око і спокійно змінюйте його колір. Зручно та швидко. Режим ізоляції вмикається, якщо є вгорі синя смуга!


Режим ізоляції

Двічі клацнемо по екрану, рибці повернувся колір. І око стало іншим!


У рибки нове око

Дуже потрібний прийом сьогодні їм ще скористаємося. Він допомагає не тільки під час роботи із символами, а й іншими об'єктами.

Ми про нього мимохіть згадували щодо кольору. Але тільки побіжно. Настав час поговорити про нього докладніше.
Режим ізоляції (поява синьої смуги на екрані) ізолює групи та шари нижче, щоб можна було легко виділяти та змінювати об'єкти та їх частини без розгрупування. Не потрібні в Наразіоб'єкти стають тьмяними та блокуються. Ми можемо вільно змінювати лише виділені об'єкти. Ви самі це зробили з оком рибки.
Для переходу в режим ізоляції треба виділити об'єкт чорною стрілкою Selection Tool(V) та натиснути кнопку Isolate Selected Object(ізолювати вибраний об'єкт) на панелі Control(Управління). Це ще один спосіб, як увійти до режиму.


Кнопка режиму ізоляції

Цей значок на панелі Control(Управління) говорить про включення даного режиму. Я поки що на нього не натиснула! Розглянемо ближче!

Кнопка режиму ізоляції

Клікнемо на ньому і подивимося.


Режим ізоляції та палітра «Шари»

Режим ізоляції увімкнено, в панелі Layers(Шари) ми це бачимо. Рибка згрупована, а я легко виділила її тулуб, з яким хочу попрацювати. Набір знебарвлених рибок, вони ізольовані.
Можна і не включати палітру Layers(Шари). Програма Adobe IllustratorCCне в одному місці застерігає нас, що зробили. Потрібно тільки знати місця!


Сіра панель режиму ізоляції

У верхній частині вікна документа на сірій панелі написано Layer1 (шар1) та < Group> (група). Програма показує нам, що ми ізолювали групу об'єктів, розташовану на шарі Layer1 (Шар1). Вийти з режиму ізоляції можна, клацнувши двічі поза об'єктами.
Якщо уважно дивіться, то помічаєте, що на сірій панелі все чітко наголошується, що ви ізолюєте. Але зараз у мене рибка не знебарвилася. Не хвилюйтесь, буває і так! Знатимемо! Своє ми зробимо, все вийде без розгрупування! Режим працює!


Режим ізоляції

Я хочу змінити хвіст рибки. Починаю зміни!


Змінений хвіст рибки

Олівцем Pencil Tool(N) та згладжуванням Smooth Toolзробила новий хвіст рибці. Я не дуже старалася, у вас все краще, але зразок є! Тепер кісточки не підходять, спробуємо і з ними щось зробити, не виходячи з режиму ізоляції.

Змінені кісточки хвоста

Я скопіювала кісточки, розгорнула, підігнала під новий хвіст і в нижній змінила колір. Думаю, ви це зробили навіть краще. Все знайоме! Нічого не поясню!

Подивимося на нашу рибку та вийдемо з режиму ізоляції. Усі рибки одразу набули кольору!

Без режиму ізоляції

Ось і набір символів, і нова рибка. Ви можете створити новий символ. Почнемо!
Для початку зменшимо рибку за допомогою кнопки Shift, Виділивши її.


Набір символів та зменшена рибка

Ось наш набір і в нижньому правому кутку нова рибка. Знову виділяємо її, затискаючи клавішу Shift, клацніть по значку New Symbol(новий символ), вийде діалогове вікно Symbol Options(Параметри символу), отримаємо символ!


Створюємо новий символ

Я не стала називати символ, програма дала свою назву.
ОК.


З'явився новий символ

З'явився новий динамічний символ! На рибці плюса немає, її можна видалити! Але посунемо її на полотно, раптом знадобиться!


Розпорошення нового символу

Побалуватись ми любимо! Клікнемо новий символ, візьмемо Symbol Sprayer Tool(Розпилювач символів) і подивимося, що зробили!

Відірвалися щиро! Чому не порадіти можливостям! Зграя риб за одну мить! Творча дитина у захваті!

Клавішів Deleteвидалимо цей набір, перейшовши на чорну стрілку Selection Tool(V), створимо інший! Будемо спокійніше, бо від радості хотіли всю монтажну область заполонити новою рибкою! Це просто та швидко!


Рибки нового символу

Нехай буде якось так! Ви вільні у своєму розміщенні нових рибок, не забувайте про вивчені інструменти з управління символами! Без них не обійтись! Усі знаєте, я не повторюю!

Пересунемо наш новий набір на наявний. Вони не об'єднуються, це видно на палітрі


Два набори символів

У нас є два набори символів. Так просто не об'єднати їх. Найлегше розірвати зв'язок усередині наборів, роз'єднати їх у групі, розгорнути як треба, пересунути, красиво розподілити, а потім об'єднати та створити новий символ! Пробуємо! Це ви вмієте!


Створення третього символу

Дивимося на палітру Layers(Шари).


Новий символна панелі «Шари»

На панелі один новий символ, крім самотньої рибки. Це не набір, це символ! Посунемо його на полотно, де знаходиться рибка, очистимо монтажну область.


Новий символ і рибка на полотні

Видалити завжди встигнемо. Так багато всього, а це два об'єкти. Виділено символ і не виділено рибку.
Монтажна область чиста! А тепер повернемося до урок № 58я процитую фрагмент з нього:

«Бують ситуації, коли після створення набору символів необхідно додати ще трохи інших, слід виділитицю групу, активізуватиінструмент Symbol Sprayer(розпорошення символів) і знову почати «розпорошувати»символи. Вони об'єднаються в єдине ціле».

На чистій монтажній області цим і займемося! Ви все знаєте, дійте самостійно!


Розпорошення символів

Ось і новий набір символів Symbol Set. Його можна редагувати, але це на ваш розсуд. Новий символ, що на полотні, дуже важкий, я не розпилюватиму його. А ви самі вирішуйте.
Просто витягну на монтажну область із полотна і символ, і рибку. У палітрі Layers(шари) все залишиться так само, а на екрані інакше. Але ми розуміємось!


Палітри «Символи» та «Шари» на монтажній області

Самотню рибку я збільшила. Нехай буде видно!

А тепер увімкну ще один режим, ми ним теж колись користувалися.

Режим «Контури»

Це режим Outline(Контури). Він відкривається на панелі меню, ViewOutline(Перегляд – контури). І що бачимо? Якось пусто!

На екрані контури збільшеної самотньої рибки та контури нового символу. Від об'єднаного набору лише рамка! Ось що таке символи! Вони не перевантажують рисунок! Використовувати їх варто.
Повернемося назад. ViewPreview(Перегляд – ілюстрація).

З використанням гарячих клавіш простіше: Ctrl+ Y. Пробуйте!


Екран у звичайному режимі

У мене вийшов не особливий шедевр, але закінчимо. Знаю, що у вас гарніше! Ви завжди молодці! Пишаюся!
Не дуже втомились! Навички відпрацьовані!

Але ж достатньо! Відпочиваємо! Зміна!
Збережіть намальоване, закріпіть вивчене!


Ця сторінка була показана 1343 рази.

Робота з рядками та символами

Обробка тексту - одне з найпоширеніших завдань програмування. Якщо потрібно обробити будь-які текстові дані, то без знання того матеріалу, що буде викладено нижче, просто не обійтися. Особливо, якщо дані сформовані не особисто вами, а будь-який сторонньою програмоюабо іншою людиною.

Символи

Символ – це одна одиниця тексту. Це буква, цифра, знак. Кодова таблиця знаків складається з 256 позицій, тобто. кожен символ має свій унікальний код від 0 до 255. Символ із деяким кодом N записують так: #N. Так символи і вказуються в коді програми. Оскільки код символу є число трохи більше 255, очевидно, що у пам'яті символ займає 1 байт. Як відомо, менше байта розмірності немає. Точніше, вона є – це біт, але працювати з бітами у програмі ми не можемо: байт – мінімальна одиниця. Переглянути таблицю символів та їх коди можна за допомогою стандартної утиліти"Таблиця символів", що входить у Windows (ярлик розташований у меню Пуск – Програми – Стандартні – Службові). Але незабаром ми й самі напишемо щось подібне.

Рядки

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

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

Типи даних

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

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

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

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

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

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

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

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

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

var s:string; c: char; ... s:="Hello!"; c:=s; //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), який буде введено пропозицію. Операцію виконуватиме після натискання на кнопку. Маємо:

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

Вставка підрядка у рядок

Якщо потрібно вставити в рядок, який ви маєте, можна використовувати процедуру Insert(). Перший параметр – рядок для вставки, другий – змінна, що містить рядок, куди потрібно вставити, третій – позиція (номер символу), починаючи з якого буде вставлено рядок. Приклад:

procedure TForm2.Button1Click(Sender: TObject); var S: String; begin S:="1234567890"; Insert("000",S,3); ShowMessage(S) end;

В даному випадку результатом буде рядок "1200034567890".

Приклад "серйозніший"

Приклади, наведені вище, лише демонструють принцип роботи з рядками за допомогою функцій Length(), Pos(), Delete() та Copy(). Тепер вирішимо завдання складніше, яке вимагатиме комбінованого застосування цих функцій.

Завдання: текст, введений у полі Memo, розбити на слова та вивести їх у ListBox по одному на рядку. Слова відокремлюються один від одного пробілами, точками, комами, знаками оклику і знаки питання. Крім цього вивести загальну кількість слів у тексті та найдовше з цих слів.

Ось так... Завдання зовсім не просте. По-перше, ви одразу маєте здогадатися, що потрібно використовувати цикли. Без них ніяк, адже ми не знаємо, який текст буде передано програмі для обробки. По-друге, слова відокремлюються різними символами – це створює додаткові труднощі. Що ж, ходімо по порядку.

Інтерфейс: Memo1 (TMemo), Button1 (TButton), ListBox1 (TListBox), Label1, Label2 (TLabel).

Спочатку перенесемо введений текст до змінної. Для того, щоб разом взяти весь текст із Memo, звернемося до властивості Lines.Text:

var Text: string; begin Text:=Memo1.Lines.Text; end;

Тепер перейдемо до обробки. Перше, що потрібно зробити – розібратися із символами-розділювачами. Справа в тому, що такі символи можуть запросто йти поспіль, адже після ком, крапок та інших знаків ставиться пробіл. Обійти цю проблему можна таким простим способом: всі символи, що розділяють, замінимо на якийсь один, наприклад на кому. Для цього пройдемо всі символи та зробимо необхідні заміни. Щоб визначити, чи є символ роздільником, запишемо всі роздільники в окрему змінну (константу), а потім будемо шукати в цьому рядку кожен символ функцією Pos(). Всі ці заміни будуть проводитися в змінній, щоб оригінальний текст в Memo (тобто на екрані) не торкнувся. Тим не менш, для перевірки проміжних результатів роботи є сенс виводити оброблений текст будь-куди. Наприклад, в іншому полі Memo. Щоб пройти всі символи, скористаємося циклом FOR, де змінна пройде порядкові номери символів, тобто. від 1 до довжини рядка тексту:

procedure TForm1.Button1Click(Sender: TObject); const DelSym = ".,!?"; var Text: string; i: integer; if Pos(Text[i],DelSym) > 0 then Text[i]:=","; Memo2.Text:=Text; end;

Тепер потрібно усунути перешкоди. По-перше, перший символ не може бути роздільником, тобто. якщо перший символ - кома, його потрібно видалити. Далі, якщо поспіль йдуть кілька ком, їх потрібно замінити на одну. І нарешті, щоб коректно обробити весь текст, останнім символом має бути кома.

if Text = "," then Delete(Text,1,1); while Pos(",",Text) > if Text<>"," Text:=Text+",";

Тут заміна проведена наступним чином: організований цикл, в якому одна з ком видаляється, але відбувається це доти, поки в тексті є дві коми, що йдуть поспіль.

Ну от тепер у тексті не залишилося нічого зайвого - тільки слова, розділені комами. Спочатку досягнемо того, щоб програма витягла з тексту перше слово. Для цього знайдемо першу кому, скопіюємо слово від початку тексту до цієї коми, після чого видалимо це слово з тексту разом із комою. Вилучення робиться для того, щоб далі можна було, проробивши ту ж саму операцію, вирізати наступне слово.

var Word: string; (...)

Тепер у змінній Word у нас слово з тексту, а змінної Text вся решта тексту. Вирізане слово тепер додаємо в ListBox, викликаючи ListBox.Items.Add(рядок_додавання).

Тепер нам потрібно організувати такий цикл, який би дозволив вирізати з тексту всі слова, а не тільки перше. У цьому випадку підійде швидше REPEAT, ніж WHILE. Як умову слід зазначити Length(Text) = 0, тобто. завершити цикл тоді, коли текст стане пустим, тобто. коли ми виріжемо з нього усі слова.

repeat Word:=Copy(Text,1,Pos(",",Text)-1); Delete(Text,1,Length(Word)+1); ListBox1.Items.Add(Word); until Length(Text) = 0;

Отже, зараз маємо:

procedure TForm1.Button1Click(Sender: TObject); const DelSym = ".,!?"; var Text,Word: string; i: integer; begin Text:=Memo1.Lines.Text; for i:= 1 to Length(Text) do if Pos(Text[i],DelSym) > 0 then Text[i]:=","; if Text = "," then Delete(Text,1,1); while Pos(",",Text) > 0 do Delete(Text,Pos(",",Text),1); repeat Word:=Copy(Text,1,Pos(",",Text)-1); Delete(Text,1,Length(Word)+1); ListBox1.Items.Add(Word); until Length(Text) = 0; end;

Якщо ви зараз запустите програму, то побачите, що все добре працює. За винятком одного моменту – у ListBox наприкінці з'явилися якісь порожні рядки... Виникає питання: звідки вони взялися? Про це ви дізнаєтеся в наступному розділі уроку, а поки що реалізуємо необхідне до кінця.

Кількість слів у тексті визначити дуже просто – не потрібно заново нічого писати. Т.к. слова у нас занесені до ListBox, досить просто дізнатися, скільки там рядків – ListBox.Items.Count.

Тепер потрібно знайти найдовше з усіх слів. Алгоритм знаходження максимального числа такий: приймаємо як максимальне перше з чисел. Потім перевіряємо решту числа таким чином: якщо число більше того, яке зараз записано як максимальне, робимо максимальним це число. У нашому випадку слід шукати максимальну довжину слова. Для цього можна додати код до циклу вирізання слів з тексту або зробити пошук після додавання всіх слів до ListBox. Зробимо другим способом: організуємо цикл рядками ListBox. Слід зазначити, що рядки нумеруються з нуля, а чи не з одиниці! В окремій змінній зберігатимемо найдовше слово. Здавалося б, треба ще зберігати максимальну довжину слова, щоб було з чим порівнювати ... Але не потрібно заводити для цього окрему змінну, адже ми завжди можемо дізнатися довжину слова функцією Length (). Отже, припустимо, що перше слово найдовше...

Чому цикл до ListBox.Items.Count-1, а не просто до Count, розберіться самостійно:-)

Ось тепер все готове!

procedure TForm1.Button1Click(Sender: TObject); const DelSym = ".,!?"; var Text,Word,LongestWord: string; i: integer; begin Text:=Memo1.Lines.Text; for i:= 1 to Length(Text) do if Pos(Text[i],DelSym) > 0 then Text[i]:=","; if Text = "," then Delete(Text,1,1); while Pos(",",Text) > 0 do Delete(Text,Pos(",",Text),1); Text:=AnsiReplaceText(Text,Chr(13),""); Text:=AnsiReplaceText(Text,Chr(10),""); repeat Word:=Copy(Text,1,Pos(",",Text)-1); Delete(Text,1,Length(Word)+1); ListBox1.Items.Add(Word); until Length(Text) = 0; Label1.Caption:="Кількість слів у тексті: "+IntToStr(ListBox1.Items.Count); LongestWord:=ListBox1.Items; for i:= 1 to ListBox1.Items.Count-1 do if Length(ListBox1.Items[i]) > Length(LongestWord) then LongestWord:=ListBox1.Items[i]; Label2.Caption:="Найдовше слово: "+LongestWord+" ("+IntToStr(Length(LongestWord))+" літер)"; end;

Робота із символами

Власне, робота із символами зводиться до використання двох основних функцій - Ord() та Chr(). З ними ми зустрічалися. Функція Ord() повертає код вказаного символу, а функція Chr() - навпаки, повертає символ із вказаним кодом.

Пам'ятаєте "Таблицю символів"? Давайте зробимо її самі!

Висновок здійснимо в TStringGrid. Цей компонент є таблицею, де в кожному осередку записано текстове значення. Компонент розташований на вкладці Additional (за промовчанням слідує прямо за Standard). Насамперед налаштуємо нашу табличку. Нам потрібні лише дві колонки: в одній відображатимемо код символу, а в іншій - сам символ. Кількість колонок задається як логічна назва ColCount. 2. За замовчуванням у StringGrid заданий один фіксований стовпець і один фіксований рядок (вони відображаються сірим кольором). Стовпець нам не потрібний, а ось рядок дуже доречний, тому ставимо FixedCols = 0, а FixedRows залишаємо = 1.

Заповнення здійснимо при запуску програми, тобто. не ставитимемо жодних кнопок. Отже, створюємо обробник події OnCreate() форми.

Кількість символів у кодовій таблиці 256 плюс заголовок - всього 257. Задамо число рядків програмно (хоча можна задати і в Інспекторі Об'єкта):

procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.RowCount:=257; end;

Висновок робиться вкрай просто – за допомогою циклу. Просто проходимо числа від 0 до 255 та виводимо відповідний символ. Також виводимо написи у заголовок. Доступ до осередків StringGrid здійснюється за допомогою властивості Cells: Cells [номер_стовпця, номер_рядка]. У квадратних дужках зазначаються номери стовпця та рядки (починаються з нуля). Значення текстові.

Запускаємо, дивимось.

Спеціальні символи

Якщо ви уважно подивіться на нашу таблицю, побачите, що багато символів відображаються у вигляді квадратиків. Ні, це не значки. Так відображаються символи, які не мають візуального відображення. Тобто. символ, наприклад, з кодом 13 існує, але невидимий. Ці символи використовуються для додаткових цілей. Наприклад, символ #0 (тобто символ із кодом 0) часто застосовується для вказівки відсутності символу. Існують також рядки, які називають null-terminated - це рядки, що закінчуються символом #0. Такі рядки використовуються у мові Сі.
За кодами можна впізнати натискання кнопок. Наприклад, кнопка Enter має код 13, Escape - 27, пропуск - 32, Tab - 9 і т.д.

Давайте додамо до нашої програми можливість дізнатися код будь-якої клавіші. Для цього обробимо подію форми OnKeyPress(). Щоб цей механізм працював, необхідно встановити форму KeyPreview = True.

Тут ми виводимо віконце з текстом. Подія має змінну Key, в якій зберігається символ, відповідний натиснутій клавіші. За допомогою функції Ord() дізнаємося код цього символу, а потім функцією IntToStr() перетворимо це число на рядок.

Приклад "серйозніший" - продовження

Повернемося до нашого прикладу. Настав час з'ясувати, звідки до ListBox беруться порожні рядки. Справа в тому, що вони не зовсім порожні. Так, візуально вони порожні, але насправді в кожній із них по 2 спеціальний символ. Це символи з кодами 13 та 10 (тобто рядок #13#10). У Windows така послідовність цих двох не візуальних символів означає кінець поточного рядка та початок нового рядка. Тобто. у будь-якому файлі і взагалі будь-де перенесення рядків - це два символи. А весь текст відповідно залишається безперервною послідовністю символів. Ці символи можна (і навіть потрібно) використовувати у випадках, коли потрібно вставити перенесення рядка.

Доведемо нашу програму пошуку слів до логічного кінця. Отже, щоб позбавитися порожніх рядків, нам потрібно видалити з тексту символи #13 і #10. Зробити це можна за допомогою циклу, за аналогією з тим, як ми робили заміну двох ком на одну:

while Pos(Chr(13),Text) > 0 do Delete (Text, Pos (Chr (13), Text), 1); while Pos(Chr(10),Text) > 0 do Delete (Text, Pos (Chr (10), Text), 1);

Ну ось – тепер програма повністю працездатна!

Додаткові функції для роботи з рядками – модуль StrUtils

Додатковий модуль StrUtils.pas містить додаткові функціїдля роботи з рядками. Серед цих функцій багато корисних. Ось короткий описчасто використовуваних функцій:

PosEx(Підстрока, рядок, відступ) - функція, аналогічна функції Pos(), але виконує пошук із зазначеної позиції (тобто з відступом від початку рядка). Наприклад, якщо ви хочете знайти в рядку другий пробіл, а не перший, без цієї функції вам не обійтися. Щоб зробити пошук другого пропуску вручну, потрібно попередньо вирізати частину вихідного рядка.

AnsiReplaceStr, AnsiReplaceText(рядок, текст_1, текст_2) - функції виконують заміну рядка рядка текст_1 на текст_2. Функції відрізняються лише тим, що перша веде заміну з урахуванням регістру символів, а друга без нього.

У нашій програмі можна використовувати ці функції для вирізання з рядка символів #13 і #10 - для цього як текст для заміни слід вказати порожній рядок. Ось рішення в один рядок коду:

Text:=AnsiReplaceText(AnsiReplaceText(Text,Chr(13),""),Chr(10),"");

DupeString(Рядок, число_повторень) - формує рядок, що складається з рядка рядком шляхом повторення її задану кількість разів.

ReverseString(Рядок) - інвертує рядок ("123" -> "321").

Також слід згадати у функціях перетворення регістру.

UpperCase(рядок) - перетворює рядок на верхній регістр; LowerCase(Рядок) - перетворює рядок в нижній регістр.

Для перетворення окремих символів слід використовувати ці функції.

Детальну інформацію про кожну функцію можна отримати, ввівши її назву в будь-якому місці редактора коду, встановивши курсор на цю назву (або виділивши його) та натиснувши F1.

Скріншоти програм, описаних у статті

Висновок

Довгий вийшов урок. Отже, сьогодні ми познайомилися з рядками та символами та навчилися з ними працювати. Вивчені прийоми використовують практично повсюдно. Не бійтеся експериментувати – самостійно підвищуйте свій рівень навичок програмування!