Формирование нового символа из кисти. Формирование нового символа с применением Blend-перехода

Работа с текстовыми данными предполагает использование типов данных CHAR или STRING соответствующей длины. Для обработки данных этого типа в языках предлагается, кроме обычных операций, набор функций и процедур существенно сокращающих записи операций типа поиска символа в строке- POS(s1,s), вставки символа Insert(s1,s,n), удаление символа Delete(s,n,m), копирование символа строки Copy(s,n,m), определение длины строки Length(s), слияние строк- конктенация Concat(s1,s2,...,sn).

1.2.1. Вводится некоторое количество строк. В каждой строке - последовательность слов, разделенных хотя бы одним пробелом. Расположить в каждой строке слова по возрастанию их длины.

1.2.2. Дана строка, длиной не более 80 символов. Подсчитать количество повторений каждой встречающейся в строке буквы. Напечатать результат обработки в форме:

< буква > < количество повторений > < исходная строка>

1.2.3. Дана строка символов А. Удалить из строки все повторяющиеся символы, вывести исходную строку и результат обработки.

1.2.4. Дана строка из N букв. Разбить строку по m букв. Вывести исходную строку и результат обработки строки.

1.2.5. Дана строка из N букв. Разбить строку на K слов, в каждом из которых не более m букв. Вывести исходную строку и результат обработки строки.

1.2.6. Дана последовательность из строк с сообщениями: город, время вылета самолета, время в пути. Написать программу упорядочивания сообщений по времени в пути. Вывести исходные данные и результат обработки.

1.2.7. Дана последовательность слов в виде некоторого текста. К каждому слогу в словах текста добавить по новому слогу -”NO”. Слова в исходном тексте разделяются, по крайней мере, хотя бы одним пробелом. Вывести исходный текст и результат обработки текста.

1.2.8. Дан текст из некоторого количества предложений. Предложения разделяются знаком “;”. Разделить текст на отдельные предложения по этому знаку. Вывести исходный текст и результат обработки текста.

1.2.9. Дана строка из неизвестного заранее количества букв. Упорядочить все символы в строке по алфавиту. Вывести исходную строку и результат обработки строки.



1.2.10. Дана английская фраза из слов, разделенных хотя бы одним пробелом. Расположить слова по одному в каждой строке и упорядочить слова по алфавиту. Вывести исходную строку и результат обработки строки.

1.2.11. Вводится произвольное количество строк. Определить сколько раз в каждой строке повторяются одинаковые буквы. Вывести исходные строки и результат обработки строк.

1.2.12. Вводится произвольный текст из неизвестного количества строк. Разделить текст на строки и упорядочить по 1-ой букве строки. Конец каждой строки может быть любым из символов “. , ;”. Вывести исходный текст и результат обработки.

1.2.13. “Это я знаю и помню прекрасно пи многие знаки мне лишни напрасны”. Ввести фразу и напечатать полученное значение числа p. Проверить работоспособность программы на любом произвольном тексте. Вывести исходный текст и результат вычислений.

1.2.14. Дан текст из слов, разделенных пробелами. Выделить из текста слова, состоящие их 4, 5, 6 букв. Напечатать исходный текст и результат его обработки.

1.2.15. Дана строка из неизвестного количества символов. Исключить из последовательности K-ый элемент, сжать строку. Вставить за M-ым элементом новый элемент. Количество удалений и вставок - любое. Вывести исходную строку и все результаты преобразований.

1.2.16. Задан текст из латинских букв. Вывести в алфавитном порядке все буквы, которые встречаются в тексте только один раз. Вывод исходного текста обязателен.

1.2.17. Дан текст из K символов. Преобразовать текст, заменив все не одиночные пробелы одним пробелом, все точки - точкой с запятой, все многоточия - одной точкой. Вывести исходный текст и результат обработки текста.

1.2.18. Вводится последовательность строк. Определить для каждой строки количество слов разной длины. Например,

в i -ой строке 5 слов длины 4 буквы

3 слова длины 8 букв и т. д.

Вывести на экран исходный текст и результат его обработки.

1.2.19. Вводится некоторая произвольная фраза на английском языке. Выделить из фразы две последовательности: гласных и согласных букв. Вывести исходный текст и результат его обработки.

1.2.20. Вводится текст, разбитый на две строки знаком “;”. Удалить из этой пары строк все повторяющиеся символы, общие для этой пары строк.. Вывести на экран исходный текст и результат его преобразования.

1.2.21. Вводится произвольное количество строк. Определить максимальное число подряд расположенных символов, совпадающих с первым или последним символами в каждой строке. Вывести исходный текст и результат его обработки.

1.2.22. Вводится произвольный текст из некоторого количества строк. Обеспечить выравнивание текста по количеству символов в строке за счет размещения дополнительных пробелов в строках. Количество символов в строке перед каждой операцией выравнивания задается с клавиатуры. Вывести исходный текст и результат его обработки.

1.2.23. Вводится произвольный текст, разбитый на строки знаком” ; “. Слова в строке разделены, по крайней мере, одним пробелом. Выделить в каждой строке слова в которых: а) первые буквы слов совпадают; б) длина слова - наибольшая в строке. Вывести исходный текст и результат его обработки.

1.2.24. Каждая строка текста содержит цифры десятичной системы счисления и символы - знаки “+” или “- “. Строка заканчивается знаком “=“, пробелы в строке должны игнорироваться. Получить арифметическое значение вводимого выражения. Пример: 9+5-3=11.Вывести исходный текст и результат его обработки.

1.2.25. Вводится некоторая последовательность строк. В каждой строке слова переставить в обратном порядке. Пример: fdc, ads, 2.5cx, hjkl. преобразуется в hjkl, 2.5cx, ads,fdc. Вывести исходный текст и результат его обработки.

1.2.26. Дана строка из произвольного количества символов. Выделить из строки подстроки из букв, цифр и прочих символов. Вывести исходную строку и результат обработки.

1.2.27. Дана строка из английских слов. Выделить из строки подстроки из согласных букв, у которых и справа и слева стоят гласные буквы. Вывести исходную строку и результат ее обработки.

1.2.28. Дана строка длиной не более 80 символов. Строка представляет из себя запись некоторой математической формулы. Проверить правильность записи формулы по открывающим “(” и закрывающим скобкам “)”.

1.2.29. Дана строка из некоторого количества слов. Слова разделены в строке знаками “, ”, “ пробел”. Вставить произвольное новое слово в строку за i -ым словом. Вывести исходную строку и результат ее преобразования.

1.2.30. Вводится строка произвольной длины. Определить количество одинаковых подряд стоящих символов. Вывести исходную строку и результат обработки строки.

1.2.31. Заданная строка символов должна быть преобразована вычеркиванием всех символов, стоящих до первой точки в строке и после последней точки с запятой.

п»їTrustworthy SEO Agency India Can Increase Revenues of Small Businesses

80% users search on Google and other search engines before making a purchase and more than 50% inquiries generated through search engines get converted. These two statistics prove the importance of Search Engine Optimization. There are many as such stats and facts that make a clear point: any small, mid or large scaled business need professional SEO services. Small businesses and startups often face budget issues. They can take help of any trustworthy SEO agency from India to get the best SEO service in their budget to increase their revenues.
Search holds a great impact on consumers’ minds. According to the various statistics shared by major search engine optimization experts on various authorized websites such as Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot, etc. SEO captures a majority of the leads. Also, the leads coming from the organic search results have a higher conversion rate. These stats and consumer behavior make a clearer point that best SEO service is not a luxury, but a necessity for any business.
To bypass the competition and to increase business growth each organization needs to use the Search Engine Optimization services. The big brands can invest enough money for the expert SEO service offered by a top SEO company or an SEO specialist, but small business owners often compromise on the quality of this service due to less budget. It’s a hard fact the small business and startups end up leaving the opportunities that can be created with the professional SEO service or use a cheap SEO service which yields no positive results.
The small business owners and startups can take benefit of professional SEO services even in the limited budget. The best solution is finding a trustworthy SEO company based out of India. In India, there are many SEO experts who are working with the digital marketing agency and offer best-in-the-industry services. They can provide you the required SEO services in your budget. The wages can be negotiated with an SEO agency India to get better services at lower rates. However, don’t fall for cheap SEO service that charges less and promise to give more as expertise comes at its own cost. You must see the portfolio or ask proper questions before contracting a company for your business.
The SEO experts in India are skilled with the best practices of search engine optimization. Also, there are some SEO specialists in India such as Ash Vyas, who specialize in creating the best search engine optimization strategy for a business in stated budget. The SEO professionals will create a clear plan and will also share what can be the expected results. This way you can be well aware of your investment and returns. This helps in making a better business decision.
A good idea is to find and contract a trustworthy SEO company from India that offers the best SEO services as soonest as possible. You may also start with a small budget and limited activities to start getting your WebPages indexed and boosting your keywords in search engines. Don’t wait for the perfect time or a day when you will have thousands of dollars to invest in the best SEO services. Starting early will help you get quicker results when you can go aggressive with your marketing approach. A trustworthy SEO company based out of India will help you define your current and future plans to yield good results. More indexed pages boosted rankings and credible brand of your business made with continuous professional SEO practices will double inquiries, business, and revenues. Any small business can start with two-digit investment in the professional SEO services. There are many SEO agencies in India that offer low budget yet result from oriented Search Engine Optimization services.

surveys from exile

  • CraigWew

    12.04.2018

    п»їThe Importance of Establishing Rapport With the Customer in Real Estate and General Sales

    The importance of establishing rapport with the customer.
    Establishing rapport with a customer has to be earned and must be approached as a very integral part of the sales process.
    In order to get a customer and yourself to relate on a real one to one basis, involves two things!
    First, you will have to be aware and be there! Second you must understand that there are two different stages that will occur during this process.
    A-Be there-what does that mean?
    o Most people don’t really listen to another person as they talk. Generally they are so busy formulating their next answer or statement that they couldn’t possibly really listen.
    o If this sounds like you, being there means shut up and listen!
    B-What is the first or initial stage?
    o Generally you have just a few minutes to establish yourself in the customers mind as someone they want to deal with.
    o When in doubt it is best to first ask questions that will draw them out and talk about themselves.
    o It is also always safe to appear as a professional-I don’t mean stoic or dry, but someone who knows what they are doing and talks and looks the part.
    C-Other stages
    o As time goes on, through conversation and questions they will have, you will either establish your ability or not.
    o Be aware that they will probably be measuring you for a while. The good news is that at some point, if you have been successful at establishing rapport-they will relax and you can both concentrate on finding or selling the home.
    What else can help me develop rapport?
    o By trying to understand different personality types and then by saying and asking the right questions.
    o If you have good rapport (get on the same wave length as the customer) then the selling is basically over, now it’s just a matter of finding the right home or filling out the listing papers.
    What about different personalities
    o Since this is not a book on psychiatry, for now just understand two main types.
    o There are introverted and extroverted people.
    o You know the type. Think about three people you know that fit each classification.
    What about body Language and speech patterns?
    o If they talk fast or slow, try to mimic their speech patterns.
    o If they talk loud or soft, do the same. Are they leaning forward or backward?
    o Needless to say, there are lots of books written on this subject. Just be aware that it is an important factor-especially when you’re sitting in a conference room or at someone’s home discussing a $400,000 deal.
    Developing rapport is a skill that can be learned and improved upon.
    o We all have experienced a salesperson that sold us something and yet we didn’t feel like we were being sold. The reason is he or she, made you feel comfortable to where you trusted them.
    How do we develop rapport?
    o Use your eyes and ears and ask questions. To explain
    o Use the eyes:
    o Look at their dress-their car-their personal possessions and I mean really look at them and decipher what that tells you about them.
    o Use the ears:
    o Listen to what they say and ask questions to get to the bottom of their real MOTIVATION!
    Now during all this conversation, there will probably be one or two things you’ll discover that you have in common with them. (Family, geographical areas, fishing, etc) When you come across common ground, let them know you’re familiarity and then take a minute to discuss it with them.
    What is the Goal?
    o Once they accept you as one of them you’re in position to really have a great experience in the sale as you’re now working together then as a team—you’re no longer the salesman you’re now in an advisory position.
    o Remember, the customer either will or will not allow you to enter his world. If you understand this and really work hard to become empathetic with him/her, you can gain a position of trust. In most cases, you will actually see them relax (body language) when this happens you’re on the way.
    o To illustrate this have you ever given a speech and noticed that as you finally connected with an audience member they will nod in approval. These things may all seem trite but they aren’t.
    In closing, if you can earn a customers trust, selling a product or service is much easier and the experience can be enoyable for everyone involved.
    Always remember that a Win/Win is the best situation.

Введение

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

Символы

Символ - это одна единица текста. Это буква, цифра, какой-либо знак. Кодовая таблица символов состоит из 256 позиций, т.е. каждый символ имеет свой уникальный код от 0 до 255. Символ с некоторым кодом N записывают так: #N . Прямо так символы и указываются в коде программы. Так как код символа представляет собой число не более 255, то очевидно, что в памяти символ занимает 1 байт . Как известно, менее байта размерности нет. Точнее, она есть - это бит, но работать с битами в программе мы не можем: байт - минимальная единица. Просмотреть таблицу символов и их коды можно с помощью стандартной утилиты "Таблица символов ", входящей в Windows (ярлык расположен в меню Пуск - Программы - Стандартные - Служебные ). Но совсем скоро мы и сами напишем нечто подобное.

Строки

Строка , она же текст - это набор символов, любая их последовательность. Соответственно, один символ - это тоже строка, тоже текст. Текстовая строка имеет определённую длину. Длина строки - это количество символов, которые она содержит. Если один символ занимает 1 байт, то строка из N символов занимает соответственно N байт.
Есть и другие кодовые таблицы, в которых 1 символ представлен не одним байтом, а двумя. Это Юникод (Unicode ). В таблице Юникода есть символы всех языков мира. К сожалению, работа с Юникодом довольно затруднена и его поддержка пока что носит лишь локальный характер. Delphi не предоставляет возможностей для работы с Юникодом. Программная часть есть, но вот визуальные элементы - формы, кнопки и т.д. не умеют отображать текст в формате Юникода. Будем надеяться, в ближайшем будущем такая поддержка появится. 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 [ 10 ] ;

В скобках указывается максимальная длина строки.

Операции со строками

Основной операцией со строками является сложение. Подобно числам, строки можно складывать. И если в числах стулья с апельсинами складывать нельзя, то в строках - можно. Сложение строк - это просто их объединение. Пример:

var s: string ; ... s :="123" +"456" ; //s = "123456"

Поскольку каждая строка - это последовательность символов, каждый символ имеет свой порядковый номер. В 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 ;

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

Вставка подстроки в строку

Если требуется в имеющуюся строку вставить другую строку, можно использовать процедуру 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 :

procedure TForm1.Button1Click (Sender: TObject ) ; 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 ; begin Text:=Memo1.Lines .Text ; for i:= 1 to Length (Text) do if Pos (Text[ i] ,DelSym) > 0 then Text[ i] :="," ; Memo2.Text :=Text; end ;

Теперь нужно устранить помехи. Во-первых, первый символ не должен быть разделителем, т.е. если первый символ - запятая, его нужно удалить. Далее, если подряд идут несколько запятых, их нужно заменить на одну. И наконец, чтобы корректно обработать весь текст, последним символом должна быть запятая.

if Text[ 1 ] = "," then Delete (Text,1 ,1 ) ; while Pos ("," ,Text) > 0 do Delete (Text,Pos ("," ,Text) ,1 ) ; if Text[ Length (Text) ] <> "," then Text:=Text+"," ;

Здесь замена произведена следующим образом: организован цикл, в котором одна из запятых удаляется, но происходит это до тех пор, пока в тексте есть две идущие подряд запятые.

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

var Word: string ; {...} Word:=Copy (Text,1 ,Pos ("," ,Text) -1 ) ; Delete (Text,1 ,Length (Word) +1 ) ;

Теперь в переменной 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[ 1 ] = "," 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 .

Label1.Caption :="Количество слов в тексте: " +IntToStr (ListBox1.Items .Count ) ;

Теперь нужно найти самое длинное из всех слов. Алгоритм нахождения максимального числа таков: принимаем в качестве максимального первое из чисел. Затем проверяем все остальные числа таким образом: если число больше того, которое сейчас записано как максимальное, делаем максимальным это число. В нашем случае нужно искать максимальную длину слова. Для этого можно добавить код в цикл вырезания слов из текста или произвести поиск после добавления всех слов в ListBox. Сделаем вторым способом: организуем цикл по строкам ListBox. Следует отметить, что строки нумеруются с нуля, а не с единицы! В отдельной переменной будем хранить самое длинное слово. Казалось бы, нужно ведь ещё хранить максимальную длину слова, чтобы было с чем сравнивать... Но не нужно заводить для этого отдельную переменную, ведь мы всегда можем узнать длину слова функцией Length(). Итак, предположим, что первое слово самое длинное...

var LongestWord: string ; {...} LongestWord:=ListBox1.Items [ 0 ] ; for i:= 1 to ListBox1.Items .Count -1 do if Length (ListBox1.Items [ i] ) > "Самое длинное слово: " +LongestWord+" (" +IntToStr (Length (LongestWord) ) +" букв)" ;

Почему цикл до 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[ 1 ] = "," 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 [ 0 ] ; 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[номер_столбца,номер_строки] . В квадратных скобках указываются номера столбца и строки (начинаются с нуля). Значения текстовые.

procedure TForm1.FormCreate (Sender: TObject ) ; var i: Integer ; begin StringGrid1.RowCount :=257 ; StringGrid1.Cells [ 0 ,0 ] :="Код" ; StringGrid1.Cells [ 1 ,0 ] :="Символ" ; for i:= 0 to 255 do begin StringGrid1.Cells [ 0 ,i+1 ] :=IntToStr (i) ; StringGrid1.Cells [ 1 ,i+1 ] :=Chr (i) ; end ; end ;

Запускаем, смотрим.

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

Если вы внимательно посмотрите на нашу таблицу, то увидите, что многие символы отображаются в виде квадратиков. Нет, это не значки. Так отображаются символы, не имеющие визуального отображения. Т.е. символ, например, с кодом 13 существует, но он невидим. Эти символы используются в дополнительных целях. К примеру, символ #0 (т.е. символ с кодом 0) часто применяется для указания отсутствия символа. Существуют также строки, называемые null-terminated - это строки, заканчивающиеся символом #0. Такие строки используются в языке Си.
По кодам можно опознавать нажатия клавиш. К примеру, клавиша Enter имеет код 13, Escape - 27, пробел - 32, Tab - 9 и т.д.
Давайте добавим в нашу программу возможность узнать код любой клавиши. Для этого обработаем событие формы OnKeyPress() . Чтобы этот механизм работал, необходимо установить у формы KeyPreview = True .

procedure TForm1.FormKeyPress (Sender: TObject ; var Key: Char ) ; begin ShowMessage("Код нажатой клавиши: " +IntToStr (Ord (Key) ) ) ; end ;

Здесь мы выводим окошко с текстом. У события есть переменная 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.

Скриншоты программ, описанных в статье

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

Но для творческих людей важны и психологические моменты. Мы на них постоянно опираемся, изучая очередной материал. Дошло время и до Робина Шармы . Читали вы этого автора, не читали, не это важно. Важно, что психологически выверенные положения стоит читать и перечитывать! Когда вы сами этим займетесь? В уме часто звучит ответ: «Никогда!»

А вместе мы всё обдумаем!

Итак, «у человека четыре творческих начала ».

«Как считает Робин Шарма , признанный мастер мотивации и автор мировых бестселлеров, у каждого человека есть 4 творческих начала , 4 созидающих источника , которые на 100% предопределяют все его жизненные результаты . И именно от них зависит то место, которое мы занимаем в жизни».

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

Мысли

«Каждая обдумываемая нами мысль определяет каждый отдельно взятый результат , который, в свою очередь, является отражением нашей мысли. Каждая привычка когда-то начиналась с мысли».
Если вы освоили Adobe Illustrator ,вышли на стоки, старайтесь мыслить только позитивно , несмотря ни на что! Хвалите себя и поддерживайте, успех придет, это проверено многими.
А то получаю письма с размышлениями, что на стоках упали продажи, значит, идти туда не стоит! Пишут люди, которые только осваивают программу. Не запугивайте себя. Может, вас стоки только и ждут! Никто ничего не знает, но не подпитывайтесь негативом!

Чувства

«Наши чувства также созидательны . Если мы чувствуем себя отлично, мы получаем отличные результаты. Если мы страстны, наша страсть будет передаваться другим. Если мы чувствуем себя ужасно, наши результаты будут далеки от выдающихся».
Радуйтесь каждому сделанному вами рисунку, каждой принятой работе, каждой продаже, каждому центу, упавшему вам в карман! Вспоминайте, что когда-то вы этого не имели, а сейчас дело пошло! Не забивайте радость творческого ребенка своими размышлениями о деньгах и продажах.

Слова

«Мы забываем, что слова обладают огромной силой . Слова способны созидать. Если вы что-то назовете трагедией, это предопределит вашу реакцию и всё последующее отношение».
Слова мы кому-то говорим или пишем. Так говорите и пишите о своих успехах. Разглядывайте успех даже в мелочах и не бойтесь преувеличивать. Это не хвастовство, не позерство, это привлечение в свою жизнь настоящего успеха.

Действия

«Каждые наши действия определяют конкретный результат . Чем сильнее развито это творческое начало в человеке, чем активнее и целенаправленнее мы действуем, тем к более выдающимся результатам мы приходим».
О действиях мы много говорили. Большое портфолио не свалится само вам на голову как манна небесная. Над ним надо работать, творить, придумывать, выискивать новое. Не надо из кожи вон лезть, но надо настроить себя на ежедневный кропотливый труд. А уж народные пословицы о труде вы знаете с детства. Их главная мысль – труд всегда вознаграждается!
Так что спасибо Робину Шарме за чудесное обобщение человеческих возможностей. Всё в наших руках!

В этом уроке продолжаем разговор о символах.

Вспомним, что символ в Adobe Illustrator – это графика, которая может применяться неограниченное количество раз в рисунке. Вы можете использовать символ столько раз, сколько вам необходимо, но если вы измените символ, то изменятся все образцы.

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

Итак, хороши наши осенние листики, созданные на последнем уроке, но давайте-ка их уберем, не мы их рисовали.

Листочки

Оставим название рисунка symbol4 , а экран вычистим. Заглянем в Adobe Bridge .


Рисунки школы иллюстратора

Сколько рисунков накопилось уже в нашей школе, начиная от самых примитивных, кончая законченными! Возьмем для будущего символа рисунок ribki 2 . Вот они, наши первые красавицы!

Рыбки

Выберем из них зеленую, заключим в габаритный прямоугольник с помощью черной стрелки 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 (символы). Но прежде выйдет такая табличка. Пройдем и этот этап. Удалять свои символы придется. Посмотрим, что нас ждет!


Предупреждающая табличка

One or more the symbols are in use and cannot be deleted until their instances are expanded or deleted . – Один или более символов используются и не могут быть удалены, пока их экземпляры не будут расширены или удалены.

Вот так, не сразу и удалишь ненужный символ! Если выберем Delete Instances (удалить экземпляры), исчезнет всё: и символ, и рыбка. Выбираем Expand Instances (развернуть экземпляры).


Выделенная рыбка

Рыбка выделилась красным, но символ из палитры исчез! Добились своего! Заглянем-ка в палитру Layers (слои). Вот это да!

Палитра «Слои»

Я раздвинула палитру, и видно, что рыбка наша разгруппировалась! Будем это знать!

Давайте-ка с помощью Ctrl + G объединим детали рыбки. Можете попробовать, но без объединения рыбка не перетаскивается в палитру.
Нам всё же надо создать новый символ. Вот тут зажмем и удержим клавишу Shift , пока перетаскиваем символ в палитру. Кроме того, если не нужно, чтобы при создании символа открывалось диалоговое окно New Symbol (новый символ), то, создавая символ, держите нажатой кнопку Alt . Illustrator присвоит символу имя по умолчанию, например, New Symbol 1 (новый символ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 Illustrator CC не в одном месте предупреждает нас, что сделали. Надо только знать места!


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

В верхней части окна документа на серой панели написано Layer 1 (слой1) и < Group > (группа). Программа показывает нам, что мы изолировали группу объектов, расположенную на слое Layer 1 (слой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 (контуры). Он открывается на панели меню, View Outline (просмотр – контуры). И что видим? Как-то пусто!

На экране контуры увеличенной одинокой рыбки и контуры нового символа. От объединенного набора только рамка! Вот что такое символы! Они не перегружают рисунок! Использовать их стоит.
Вернемся обратно. View Preview (просмотр – иллюстрация).

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


Экран в обычном режиме

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

Но достаточно! Отдыхаем! Перемена!
Сохраните нарисованное, закрепите изученное!


Эта страница была показана 1343 раза.

Важные заметки

Неизменяемость

В JavaScript строки являются неизменяемыми, так же говорят "immutable". Это означает, что какие бы вы к ним не применяли функции, они не производят 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 = "They call him "Harry", and he likes it"; const str2 = "They call him "Harry", and he likes it";

Если в строке используются кавычки того же типа, они должны быть экранированы с помощью обратного слеша \ :

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

Если строка включает обратный слеш (именно как символ, который хочется иметь в строке), он должен быть экранирован другим обратным слешем:

Const str = "This is a backslash \\ here" // This is a backslash \ here

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

Const str = "There is a tab \t and here \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 and his age is 22

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

Доступ к индивидуальным символам

str[i] это 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 = "They call him "Harry", and he likes it"; ///They call him "Harry", and he likes it

Здесь одиночные кавычки используются для формулирования или ограничения строки, и тогда у нас есть возможность поставить двойные внутри. Или наоборот:

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

Двойные снаружи - одиночные внутри.

Но что делать, если такое невозможно, и вам нужно использовать одинаковый тип кавычек и для формулировки строки и внутри неё. Если вы попробуете сделать так

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

то получите ошибку, потому что ваша строка поломана. Программа сломается в этом месте, потому что тут присутствует вторая закрывающая кавычка такого же типа, а затем идёт странное слово, которое ничего не означает, а потом новая строка. Это неправильный JavaScript.

Нам нужно объяснить интерпретатору JavaScript, что некоторые кавычки он должен воспринимать иначе. Они не должны означать "начало строки" или "конец строки", они должны означать "символ кавычек".

Это называется "экранированием". Добавьте символ экранирования, обратный слеш \ перед символом, и символ "изолируется" от своей специфической роли и превратится в обычный знак в строке.

Const str = "They call him \"Harry\", and he likes it"; const str2 = "They call her \"Ann\", and she likes it"; // They call him "Harry", and he likes it // They call her "Ann", and she likes it

Этот символ экранирования может использоваться для вставления других специальных символов в строку.

Тут есть три момента.

Первый: если нам нужен обратный слеш в строке, то он должен быть экранирован другим обратным слешем.

Второе: обратный слеш-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, потому что нам нужно начать с первого символа, а result это пустая строка - мы будем добавлять символы к ней один за другим.

Затем следует цикл 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"

Вас ждут тест и практическое упражнение.