
- •Предисловие
- •Раздел 1. Полный курс программирования на стандартном языке Си Глава 1. Базовые понятия языка
- •1.1. Алфавит, идентификаторы, служебные слова Алфавит
- •Идентификатор
- •Служебные (ключевые) слова
- •1.2. Константы и строки
- •Символы, или символьные константы.
- •Целые константы.
- •Вещественные константы.
- •Предельные значения и типы арифметических констант.
- •Целые константы и выбираемые для них типы
- •Данные вещественных типов
- •Нулевой указатель.
- •Строки, или строковые константы.
- •1.3. Переменные и именованные константы Переменная как объект.
- •Определение переменных.
- •Предельные значения переменных.
- •Основные типы данных
- •Инициализация переменных.
- •Именованные константы.
- •1.4. Операции
- •Знаки операций.
- •Приоритеты (ранги) операций
- •Унарные (одноместные) операции.
- •1.5. Разделители
- •Квадратные скобки.
- •Круглые скобки.
- •Запятая.
- •Точка с запятой.
- •Двоеточие.
- •Многоточие.
- •Звездочка.
- •Обозначение присваивания.
- •Признак препроцессорных средств.
- •1.6. Выражения и приведение арифметических типов
- •Отношения и логические выражения.
- •Присваивание (выражение и оператор).
- •Приведение типов.
- •Правила преобразования типов
- •Правила стандартных арифметических преобразований
- •Выражения с поразрядными операциями.
- •Условное выражение.
- •Глава 2. Введение в программирование на языке си
- •2.1. Структура и компоненты простой программы
- •Текст программы и препроцессор.
- •Структура программы.
- •Функция форматированного вывода.
- •Программы печати предельных констант.
- •Применимость вещественных данных.
- •Выделение лексем из текста программы.
- •2.2. Элементарные средства программирования Деление операторов языка Си на группы.
- •Программа оценки машинного нуля.
- •Трассировочная таблица
- •Ввод данных.
- •Вычисление объема цилиндра.
- •Сумма членов ряда Фибоначчи.
- •2.3. Операторы цикла Три формы операторов цикла.
- •Приближенное значение экспоненты.
- •Оператор break.
- •Сумма отрезка степенного ряда.
- •Оператор continue.
- •Суммирование положительных чисел.
- •2.4. Массивы и вложение операторов цикла Массивы и переменные с индексами.
- •Вычисление среднего и дисперсии.
- •Упорядочение в одномерных массивах.
- •Инициализация массивов.
- •2.5. Функции Определение функций.
- •Функция для вычисления объема цилиндра.
- •Функция для вычисления скалярного произведения векторов.
- •Обращение к функции и ее прототип.
- •Вычисление биномиального коэффициента.
- •Вычисление объема цилиндра
- •Вычисление площади треугольника.
- •Скалярное произведение векторов.
- •2.6. Переключатели
- •Глава 3. Препроцессорные средства
- •3.1. Стадии и команды препроцессорной обработки
- •Стадии препроцессорной обработки.
- •Директивы препроцессора.
- •3.2. Замены в тексте Директива #define.
- •Цепочка подстановок.
- •3.3. Включение текстов из файлов
- •3.4. Условная компиляция Директивы ветвлений.
- •Операция defined.
- •3.5. Макроподстановки средствами препроцессора
- •Моделирование многомерных массивов.
- •Отличия макросов от функций.
- •Препроцессорные операции в строке замещения.
- •3.6. Вспомогательные директивы
- •Препроцессорные обозначения строк.
- •Реакция на ошибки.
- •Пустая директива.
- •Прагмы.
- •3.7. Встроенные (заранее определенные) макроимена
- •Глава 4. Указатели, массивы, строки
- •4.1. Указатели на объекты Адреса и указатели.
- •Операции над указателями.
- •Арифметические операции и указатели.
- •Указатели и отношения.
- •4.2. Указатели и массивы Указатели и доступ к элементам массивов.
- •Массивы динамической памяти.
- •Функции для выделения и освобождения памяти
- •Массивы указателей и моделирование многомерных массивов.
- •"Матрица" со строками разной длины.
- •4.3. Символьная информация и строки
- •Ввод-вывод символьных данных.
- •Внутренние коды и упорядоченность символов.
- •Строки, или строковые константы.
- •Строки и указатели.
- •Глава 5. Функции
- •5.1. Общие сведения о функциях Определение функции.
- •Описание функции и ее тип.
- •Вызов функции.
- •5.2. Указатели в параметрах функций Указатель-параметр.
- •Имитация подпрограмм.
- •5.3. Массивы и строки как параметры функций Массивы в параметрах.
- •Резюме по строкам-параметрам.
- •5.4. Указатели на функции Указатели при вызове функций.
- •Указатели на функции как параметры
- •Указатель на функцию как возвращаемое функцией значение.
- •Библиотечные функции с указателями на функции в параметрах.
- •5.5. Функции с переменным количеством параметров
- •Доступ к адресам параметров из списка.
- •Макросредства для переменного числа параметров.
- •Примеры функций с переменным количеством параметров.
- •5.6. Рекурсивные функции
- •5.7. Классы памяти и организация программ Локализация объектов.
- •Глобальные объекты.
- •Динамическая память
- •Внешние объекты.
- •5.8. Параметры функции main( )
- •Глава 6. Структуры и объединения
- •6.1. Структурные типы и структуры Производные типы.
- •Структурный тип.
- •Определение структур.
- •Выделение памяти для структур.
- •Инициализация и присваивание структур.
- •Доступ к элементам структур.
- •6.2. Структуры, массивы и указатели Массивы и структуры в качестве элементов структур.
- •Массивы структур.
- •Указатели на структуры.
- •Указатели как средство доступа к компонентам структур.
- •Указатели на структуры как компоненты структур.
- •6.3. Структуры и функции
- •Имитация абстрактных типов данных.
- •6.4. Динамические информационные структуры Статическое и динамическое представление данных.
- •Односвязный список.
- •Рекурсия при обработке списка.
- •6.5. Объединения и битовые поля Объединения.
- •Битовые поля.
- •Глава 7. Ввод и вывод
- •7.1. Потоковый ввод-вывод
- •7.1.1. Открытие и закрытие потока
- •7.1.2. Стандартные файлы и функции для работы с ними
- •Ввод-вывод отдельных символов.
- •Ввод-вывод строк.
- •Форматный ввод-вывод.
- •Спецификаторы форматной строки для функции форматного вывода
- •Спецификаторы форматной строки для функции форматного ввода
- •7.1.3. Работа с файлами на диске
- •Двоичный (бинарный) режим обмена с файлами.
- •Строковый обмен с файлами.
- •Позиционирование в потоке.
- •Трехъязычный словарь "Цифры
- •7.2. Ввод-вывод нижнего уровня
- •7.2.1. Открытие / закрытие файла
- •7.2.2. Чтение и запись данных
- •7.2.3. Произвольный доступ к файлу
- •Глава 8. Примеры разработки программ
- •8.1. Программа с объектами разных классов памяти Постановка задачи.
- •Программная реализация.
- •8.2. Структуры и обработка списков в основной памяти Постановка задачи.
- •Функция main( ).
- •Функция init( ) - "Инициализировать базу данных".
- •Функция delete() - "Удалить все сведения о сотруднике из базы данных".
- •Функция fr( ) - "Возвратить освобожденный элемент в список свободных элементов".
- •Функция input( ) - "Ввести в базу данных сведения о новом сотруднике".
- •Функция print( ) - "Печать списка занятых элементов".
- •Сохранение (восстановление) базы данных.
- •8.3. Сортировка на основе бинарного дерева Статические и динамические данные.
- •Управление динамической памятью.
- •Сортировка с помощью бинарного дерева.
- •Печать результатов сортировки.
- •Раздел 2. Выполнение программ в разных операционных системах Глава 9. Подготовка и выполнение программ
- •9.1. Подготовка программ в операционной системе unix
- •9.1.1. Команда make
- •Формат файла описаний зависимостей модулей.
- •Формат команды make.
- •Макроопределения.
- •Встроенные правила.
- •9.1.2. Библиотеки объектных модулей
- •Стандартные библиотеки.
- •Создание и сопровождение собственных библиотек.
- •9.2. Сборка и выполнение программ в интегрированной среде Turbo с 2.0
- •9.2.1. Состав системы программирования Turbo с 2.0
- •9.2.2. Экран интегрированной среды Turbo с 2.0
- •9.2.3. Система меню среды Turbo с 2.0
- •9.2.4. Настройка среды Turbo с
- •Создание рабочего каталога.
- •Установка в среде Turbo с 2.0 полных имен каталогов.
- •Настройка параметров управления проектом.
- •9.5. Окно определения проекта
- •Сборка и выполнение программы.
- •1. Команды управления курсором:
- •2. Команды вставки и удаления:
- •3. Команды обработки блоков текста:
- •4. Дополнительные команды:
- •9.3.2. Экран интегрированной среды
- •9.3.3. Система меню интегрированной среды
- •Задание полных имен основных и рабочего каталогов.
- •Выбор стандарта языка Си.
- •Установка параметров подсистемы Make.
- •Создание проекта.
- •Задание аргументов командной строки.
- •Сохранение параметров настройки интегрированной среды.
- •Сборка и выполнение программы.
- •Работа в интегрированной среде в последующих сеансах.
- •Раздел 3. Практикум по программированию на языке Си Глава 10. Задачи по программированию
- •10.1. Ознакомительная работа
- •10.2. Итерационные методы и ряды
- •Варианты заданий по итерационным методам и рядам
- •10.3. Работа со строками. Указатели, динамические одномерные массивы
- •10..1. Варианты задач по обработке строк*
- •10.3.2. Рекомендации по обработке строк
- •10.3.3. Пример выполнения задания по обработке строк
- •10.4. Многомерные динамические массивы с переменными размерами
- •10.4.1. Варианты задач для 1-й части задания по многомерным массивам (правила формирования многомерного массива)
- •10.4.2. Варианты для 2-й части задания по многомерным массивам
- •10.4.3. Пример выполнения задания по многомерным динамическим массивам
- •10.5. Функции и указатели
- •10.6. Функции и массивы
- •10.7. Работа со структурами
- •10.7.1. Варианты структур для выполнения работы
- •10.8. Списки и деревья
- •10.8.1. Списки
- •10.8.2. Деревья
- •Приложение 1. Таблицы кодов ascii
- •Коды управляющих символов (0 31)
- •Символы с кодами 32 127
- •Символы с кодами 128 255 (Кодовая таблица 866 - ms-dos)
- •Символы с кодами 128 255 (Кодовая таблица 1251 - ms Windows)
- •Приложение 2. Константы предельных значений
- •Приложение 3. Стандартная библиотека функций языка Си
- •Функции для работы с терминалом в текстовом режиме (файл conio.H)
- •Специальные функции
- •Литература
- •Содержание
- •Раздел 1. Полный курс программирования на стандартном языке Си 4
- •Глава 1. Базовые понятия языка 4
- •Глава 2. Введение в программирование на языке си 33
- •Глава 3. Препроцессорные средства 73
- •Глава 4. Указатели, массивы, строки 91
- •Глава 5. Функции 114
- •Глава 6. Структуры и объединения 155
- •Глава 7. Ввод и вывод 186
- •Глава 8. Примеры разработки программ 218
- •Раздел 2. Выполнение программ в разных операционных системах 256
- •Глава 9. Подготовка и выполнение программ 256
- •Раздел 3. Практикум по программированию на языке Си 282
- •Глава 10. Задачи по программированию 282
- •Подбельский Вадим Валерьевич Фомин Сергей Сергеевич программирование на языке си
- •101000, Москва, ул. Покровка, 7 Телефон (095) 925-35-02, факс (095) 925-09-57
10..1. Варианты задач по обработке строк*
* Условия задач подобраны С.Г. Чернацким,
Вариант 1 ("Палиндромы").
Проверить, является ли выражение, состоящее только из прописных букв заданной строки, палиндромом (палиндром - слово или выражение, читающееся слева направо и справа налево одинаково, например, "кабак" или "нажал кабан на баклажан"). Если да, то напечатать полученный палиндром. В противном случае вывести строку, состоящую из символов исходной строки с удаленными прописными символами.
Допустимые символы - цифры; прописные и строчные латинские буквы.
Примеры:
Исходная строка Результат
Вариант 2.
Имеется строка, содержащая буквы и цифры. Преобразуйте эту строку так, чтобы сначала в ней шли все цифры, а потом -все буквы исходной строки.
Допустимые символы - цифры; прописные и строчные латинские буквы.
Примеры:
Исходная строка Результат
Вариант 3.
Имеется строка, содержащая буквы и цифры. Преобразуйте эту строку так, чтобы сначала в ней шли все буквы, встречающиеся в исходной строке, но в обратном порядке, а потом - все цифры исходной строки в прямом порядке.
Вариант: сначала все буквы, потом цифры в обратном порядке.
Допустимые символы - цифры; прописные и строчные латинские буквы.
Примеры:
Исходная строка Результат
Вариант 4.
Имеется строка, содержащая буквы и цифры. Преобразуйте эту строку так, чтобы сначала в ней шли все цифры исходной строки, а потом - все буквы исходной строки, но в обратном порядке.
Допустимые символы - цифры; прописные и строчные латинские буквы.
Примеры:
Исходная строка Результат
Вариант 5.
С клавиатуры вводятся:
• предложение, слова в котором разделены символом подчеркивания ('_');
• маска (шаблон) для выбора из предложения нужных слов (содержит буквы и символ-заполнитель '*', который заменяет любое сочетание букв, в том числе пустое).
Необходимо выбрать из предложения все слова, соответствующие маске (шаблону).
Допустимые символы - прописные русские буквы; символ-разделитель '_'.
Пример.
Вариант 6.
Пусть цифрам от 1 до 9 соответствуют буквы от А (а) до I (i). С клавиатуры вводится строка. Составьте новую строку из цифр, соответствующих только данным буквам (прописным и строчным), отсортированным по возрастанию.
Допустимые символы - прописные и строчные латинские буквы.
Пример.
Вариант 7.
С клавиатуры вводится строка. Выберите из нее все буквы от А(а) до I(i) (строчные преобразуйте в прописные) и отсортируйте их в алфавитном порядке.
Допустимые символы - прописные и строчные латинские буквы.
Пример.
Вариант 8.
С клавиатуры вводится строка. Выберите из нее все буквы от J (j) до S (s) (строчные преобразуйте в прописные) и отсортируйте их в алфавитном порядке.
Допустимые символы - прописные и строчные латинские буквы.
Пример.
Вариант 9.
С клавиатуры вводится строка. Выберите из нее все буквы от Q (q) до Z (z) (строчные преобразуйте в прописные) и отсортируйте их в алфавитном порядке.
Допустимые символы - прописные и строчные латинские буквы.
Пример.
Вариант 10 ("Треугольник Паскаля")*
Имеется некоторое предложение (слова разделяются символами подчеркивания '_'). Используя треугольник Паскаля, зашифруйте исходное предложение по следующему правилу:
• из предложения выделяется очередное слово;
• из треугольника Паскаля выбирается строка с номером, равным числу букв в слове;
• k-я буква исходного слова заменяется на букву, отстоящую от исходной на число букв, указанное в k-м столбце выбранной строки треугольника Паскаля (отсчет производится по часовой стрелке, как показано на схеме).
Допустимые символы - прописные русские буквы; символ-разделитель '_'.
Пример:
Вариант 11.
Имеется некоторое предложение, все слова которого разделены символами подчеркивания ('_'). Используя треугольник Паскаля, зашифруйте исходное предложение по следующему правилу:
• из предложения выделяется очередное слово;
• из треугольника Паскаля выбирается строка с номером, равным числу букв в слове;
• k-я буква исходного слова заменяется на набор одинаковых букв в количестве, указанном в k-м столбце выбранной строки треугольника Паскаля.
Допустимые символы - прописные русские буквы; символ-разделитель '_'.
Пример.
Исходная строка:
Зашифрованная строка:
Вариант 12.
Проверить, является ли заданная строка зашифрованной по алгоритму, приведенному в варианте 11. Если да - выдать расшифрованную строку, если нет - вывести сообщение об ошибке с печатью первого ошибочного слова.
Допустимые символы - прописные русские буквы; символ-разделитель '_'.
Примеры:
Зашифрованная строка:
Результат расшифровки:
Зашифрованная строка:
Результат расшифровки:
Вариант 13.
Выберите 10 произвольных букв русского алфавита (введите с клавиатуры). Введите произвольное русское слово. С помощью ключа длиной от трех до восьми символов, также вводимого пользователем с клавиатуры, произведите шифровку слова в числовую комбинацию, как показано в следующем примере.
Допустимые символы - прописные русские буквы (для букв алфавита и слова), цифры (для ключа).
Пример.
Пусть задан набор русских букв:
Поставим им в соответствие цифры от 0 до 9:
Пусть введено какое-нибудь русское слово, например
Переведем буквы этого слова в цифры, соответствующие этим буквам. В данном случае
Запрашиваем у пользователя цифровой ключ (З ÷ 8 символов).
Пусть пользователь ввел
Теперь подставляем ключ под очередные числа, в которые переведено наше число, и оставляем число единиц результата (десятки отбрасываем). В нашем примере:
Окончательный ответ:
Примечание. Если длина ключа не кратна длине слова, то оставшиеся цифры ключа отбрасываются (как в примере).
Вариант 14.
Напишите дешифратор, преобразующий исходную строку, зашифрованную по принципу, указанному в варианте 13 и содержащую цифры, в слово на русском языке, используя вводимый набор из десяти допустимых символов.
Допустимые символы - прописные русские буквы (для алфавита), цифры (для шифра и ключа).
Пример.
Вариант 15.
Пусть задано некоторое слово. Начать просмотр этого слова слева направо до тех пор, пока не встретятся повторяющиеся буквы. Если такие буквы встретились, пропустить их и продолжить просмотр с конца слова в обратном порядке (справа налево), пока снова не встретится набор повторяющихся букв. Если такой набор встретился, продолжить просмотр с того места, которое следует за первым набором повторяющихся букв и т.д. "Протокол" просмотра строки вывести на экран; вместо последовательности повторяющихся букв выводить один символ подчеркивания.
Допустимые символы - прописные русские буквы.
Пример.
Вариант 16.
Найти в исходной строке все вхождения (но не более девяти) заданной подстроки и заменить их на другую строку с указанием номера очередного вхождения.
Допустимые символы - прописные русские буквы; символ-разделитель '_'.
Пример.
Вариант 17 ("Анаграммы").
По заданному с клавиатуры слову построить все его анаграммы, т.е. слова (возможно, бессмысленные), состоящие из всех букв исходного слова, но расположенных в произвольном порядке. Например, "бук" и "куб" - анаграммы.
В качестве разделителя при выводе использовать символ подчеркивания ('_'). (Для простоты можно вводить слово, не содержащее повторяющиеся буквы.)
Допустимые символы - прописные русские буквы.
Пример.
Вариант 18.
По заданному с клавиатуры слову напечатать все слова (возможно, бессмысленные), которые можно составить из букв введенного слова. В качестве разделителя при выводе полученных слов использовать символ подчеркивания ('_'). (Для простоты можно вводить слова, не содержащие повторяющиеся буквы.)
Допустимые символы - прописные русские буквы.
Пример.
Вариант 19.
1. Зашифруйте вводимое с клавиатуры предложение следующим образом: сначала выбираются два произвольных слова из базы, находящейся в тексте программы или вводимой с клавиатуры, затем слово из шифруемого предложения, потом опять два слова из базы, после чего - опять слово из предложения и т.д. "База" - набор слов, допустимых при выполнении программы, либо набор пар слов, как в приведенном ниже примере.
2. Напишите дешифратор.
Допустимые символы - прописные русские буквы; символ-разделитель '_'.
Пример.
Шифруемое предложение:
База шифра:
Результат шифровки:
Вариант 20.
В программе английским буквам поставлены в соответствие наиболее часто ими передаваемые звуки, записанные русскими буквами, например а - э, b-б, с-с, d-д, е-э, f-ф, g - г, h - (пустой символ), i - и, j - ж и т.д. С клавиатуры задается некоторое предложение на английском языке. (Слова разделяются символами подчеркивания: '_'.) Программа выводит "по ее мнению" правильный вариант произношения каждого слова. Если пользователь соглашается с вариантом произношения, предложенным программой, он нажимает <Enter>. Если не соглашается, - вводит свой вариант произношения.
Допустимые символы - прописные английские буквы; символ-разделитель '_'.
Пример.
(В кавычках - выводимые программой произношения)
Вариант 21.
Имеется некоторая база данных, в которой некоторым английским словам поставлены в соответствие их русские эквиваленты, например "THIS" - "ЭТО", "IS" - "", "А" - "", "TABLE" -"СТОЛ" и т.д. С клавиатуры задается некоторое предложение на английском языке (слова разделяются символами подчеркивания: '_'). Программа ищет каждое слово у себя в базе данных и выдает его перевод. Если введенное слово в базе не обнаружено, в результирующую строку записывается исходное английское слово.
Допустимые символы - прописные английские буквы; символ-разделитель '_'.
Пример выполнения программы:
Если, например, в базе нет перевода слова TABLE, результат выполнения программы должен быть таким:
Вариант 22.
С клавиатуры вводится исходная строка. Если в строке имеются цифры, то она считается зашифрованной и нужно выполнять пункт 2 этого задания.
1. Если исходная строка не содержит цифр (т.е. символов с кодами 48(0х) ÷ 57(0х)), то она по определению считается незашифрованной. Вам необходимо заменить все символы с кодами 33(0x21) ÷ 99(0х63) на их двузначные коды.
Символы с другими кодами выводятся без изменения. Допустимые символы - символы с кодами от 33(0x21) до 255(0xFF), за исключением цифр (48(0х30) ÷ 57(0х39)).
Пример выполнения программы:
2. Если исходная строка содержит цифры, то она по определению считается зашифрованной. Напишите дешифратор. При невозможности дешифрации напечатайте сообщение об ошибке и укажите место в строке, где произошла ошибка.
Примерный диалог с программой:
Вариант 23.
Из двух заданных с клавиатуры слов составить различные виды кроссвордов. При невозможности составить кроссворд (во введенных словах нет ни одной одинаковой буквы) напечатать сообщение об ошибке.
Допустимые символы - прописные русские буквы.
Пример выполнения программы:
Вариант 24.
С клавиатуры вводится предложение, слова в котором разделены символом подчеркивания ('_'). Подсчитайте число вхождений в предложение используемых букв, запишите результат в строку (парами: буква - цифра) и напечатайте ее.
Допустимыми являются все символы, за исключением цифр.
Пример выполнения программы:
Вариант 25.
С клавиатуры вводится заданное количество слов. Найти все пары слов, одно из которых оканчивается на то же сочетание букв, на которое начинается другое, и вывести результат наложения этих слов друг на друга.
Допустимые символы — прописные русские буквы.
Пример выполнения программы:
Вариант 26.
С клавиатуры вводятся четыре массива слов:
1) существительные в именительном падеже единственного числа (СТОЛЯР-КРАСНОДЕРЕВЩИК, ТОРМОЗ, ДИСКОВОД, ...);
2) глаголы несовершенного вида в 1 -м лице единственного числа (ЕСТ, САЖАЕТ, ТРАВИТ, ВАРИТ, КОСИТ, ПИЛИТ, ...);
3) качественные прилагательные во множественном числе (ЯДОВИТЫЕ, ПРЕКРАСНЫЕ, КОШМАРНЫЕ, НЕВЗРАЧНЫЕ, УБОЙНЫЕ, УБОГИЕ,...);
4) существительные в винительном падеже множественного числа (КОЛОНКИ, ДИСКЕТЫ, ВЕТВИ, ЗАБОРЫ, БАНКИ,...).
Выбирая из каждого массива с помощью датчика случайных чисел по одному слову, составить и напечатать заданное количество текстовых строк.
Допустимые символы - прописные русские буквы.
Пример диалога с программой:
Вариант 27.
С клавиатуры вводится предложение. Выведите это предложение на экран, расположив буквы "по вашей любимой функции" (экспонента, квадратный корень и т.п.).
Допустимые символы - прописные русские буквы; знаки препинания.
Пример (выбрана синусоида):
Вариант 28.
С клавиатуры вводится предложение, слова в котором разделены символом подчеркивания ('_'). Напечатайте все предложения, которые получаются при перестановке слов исходного предложения.
Допустимые символы - прописные русские буквы; символ –разделитель '_'.
Пример.
Вариант 29.
С клавиатуры или из файла вводится текст - некоторая статья. После этого задается содержимое письма, которое вы хотите "скроить" из текста предложенной статьи. Вам необходимо выяснить, можно ли слова письма "вырезать" из текста статьи.
Если некоторое слово "вырезать" возможно - напечатать его большими буквами, если нет - маленькими. Границы "вырезов" отмечать символом ' |'.
Допустимые символы - прописные русские буквы; символы-разделители ('_' или пробел).
Пример.
Текст:
Результат: