14 6 Типы данных, переменные, константы Следующая тема для обсуждения – переменные и константы. Сначала расскажем о переменных. В каждом проекте (программе), как правило, необходимо использовать часть компьютерной памяти, чтобы хранить в ней информацию. Для того, чтобы знать, где какие данные мы сохранили, принято эти области памяти именовать привычным для нас способом (как в алгебре). Мы в своем примере сохранили машинной памяти два числа, а затем могли их использовать где-то в дальнейшем в других частях программы (сложить эти числа). При этом мы использовали переменные с именами Х1 и Х2, для того чтобы было понятно как можно обращаться к этим числам. Следовательно, переменные позволяют организовать имеющуюся информацию требуемым образом и многократно использовать ее в случае необходимости. Переменная — это именованная область памяти, отведенная для временного хранения данных. При выполнении программы можно изменить значение переменной. Используя это определение легко понять, что под переменные отводится определенное количество памяти, и если пишутся серьезные и профессиональные программы, то возникает вопрос о правильном распределении ресурсов памяти при работе программы. Например, если мы знаем, что будем оперировать с простыми числами, то нам не нужно тратить для этих данных много памяти, а если требуется высокая точность вычислений, то необходимо запоминать все числа с большим количеством знаков после запятой. Кроме того, желательно указать программе (во избежание ошибок) какие действия допустимы с этими переменными. Так в программах числа можно складывать, делить, умножать и т.д. а строки текста и символы можно только объединять друг с другом. Это привело к необходимости при написании программ определять и заранее объявлять тип переменных или тип данных. Visual Basic для приложений позволяет описать и использовать переменные различных типов. Выбор типа основывается на требованиях создаваемого приложения. При этом необходимо найти наилучшее соотношение затрат памяти, скорости выполнения и ограничений, накладываемых использованием выбранных типов данных. В VBA имеются следующие типы числа, строки, логические значения, даты и объекты, а также наиболее общий тип данных — тип Variant. Остановимся на числовых типах данных Числовые типы данных различаются размером и диапазоном допустимых значений. Размер — это количество байтов, которое занимает переменная данного типа в памяти. Диапазон допустимых значений определяет наибольшее и наименьшее значение для переменных данного типа. В таблице 3 приводятся параметры основных числовых типов данных. Таблица 3 Основные числовые типы данных Visual Basic Тип данных Размер Диапазон Byte 1 байт От 0 до 255 Integer 2 байта От-32768 до 32767 Long 4 байта От-2147 483 648 до 2147483647 Single 4 байта От -3.402823Е38 до -1.401298Е-45 для отрицательных чисел от 1.401298Е-45 до 3.402823Е38 для положительных чисел Double 8 байт От -1,79769313486232Е308 до –4,94065645841247Е324 для отрицательных чисел от 4,94065645841247Е-324 до 1,79769313486232Е308 для положительных чисел Обратите внимание, что переменные типа Byte, Integer и Long не могут иметь дробных значений, а переменная типа Byte — отрицательных. Попытка присвоить переменной значение, которое не входит в диапазон допустимых значений для заданного для нее типа, вызывает ошибку при выполнении программы. 15 Необходимо отметить, что числа также можно хранить в переменных типа Variant Помимо числовых типов существуют следующие типы данных. Тип данных String (строковые) используется для хранения строк переменной длины или фиксированной длины. Строки переменной длины – наиболее удобный тип строк. Максимальная длина такой строки равна приблизительно 2 миллиардам символов, а ее размер равен длине строки плюс 10 байтов. Переменные типа Boolean (логические) занимают 2 байта памяти и принимают только два значения – True или False. Переменные типа Data (Дата, 8 байт) являются числами с плавающей запятой двойной точности и могут хранить как дату, так и время. Целая часть такого числа представляет дату, а дробная – время дня. Переменные типа Object (объект, 4 байта) – это указатели на объекты приложения, которые могут быть использованы в программе. Если тип данных не объявляется, то программа воспринимает этот тип как Variant. При использовании типа Variant упрощается обработка чисел. Конечно, тип данных Variant самый простой, однако, не всегда наилучший. Чтобы увеличить скорость выполнения и эффективно использовать память, не следует забывать о других типах данных. Строго говоря, в VBA не требуется описывать большинство переменных перед их применением. Переменные называются неявно описанными, если они используются в программе без объявления. Таким переменным присваивается тип Variant, а затем они применяются как любые другие переменные этого типа. Однако рекомендуется явно описывать все переменные. Ниже мы показываем, как задать обязательное объявление переменных перед их использованием. Чаще других используется для описания переменных в VBA иинструкция Dim. Упрощенный синтаксис инструкции Dim: Dim <имя Переменной> [Аs тип] Вместо параметра <имя Переменной> Вы должны подставить имя описываемой переменной. А вместо необязательной части инструкции [As тип] Вы можете набрать тип переменной. И опять важное замечание. Любой язык программирования очень требователен к синтаксису команд. В каждой команде есть обязательные слова и символы, а есть то, что набирать необязательно. Так вот, необязательная часть команды размещается в квадратных скобках, и Вы, если в Вашей программе эта часть не нужна, ее не используете. Посмотрите примеры описания Dim A As Integer Dim В, С, D Аs Single Dim E В данном примере переменная А описывается как целое число, а переменная D — как переменная типа single. Переменные B, C, и Е являются переменными типа Variant. Инструкцию Dim можно разместить как в процедуре, так и в разделе описания модуля (General) . Объявление переменной в процедуре делает ее личной переменной процедуры, а описание в модуле — переменной уровня модуля. Место расположения инструкции Dim указывает на область определения переменной. Более подробно о способах описания переменных мы будем говорить позже. 6.1 Требования к именам переменных Имена должны начинаться с буквы. Настоятельно рекомендуем применять латинские символы и не использовать кириллицу. Имя не может содержать пробел, точку, восклицательный знак,(1), или символы ^,&, $,#.,%. . Это отчасти связано с тем, что некоторые из этих символов указывают на 16 определенный тип, например, строковые переменные без объявления обозначаются так – a$, st$, тип Integer – z%, vv% и т.д. Имена не должны содержать более 255 символов.' Не рекомендуется использовать имена, совпадающие с названиями функций, инструкций и методов языка Visual Basic, так как при этом прекращается выделение в тексте одноименных ключевых слов языка. Не допускается использование повторяющихся имен на одном уровне области определения. В языке VBA не различаются строчные и прописные буквы, в отличие от некоторых других языков, например, языка программирования С. Хотя может показаться, что лучше использовать переменные с именами, например, А, B, C или X, Y, Z , описательные названия упрощают чтение и понимание программ, если в последующем потребуется внести изменения в программу. 6.2 Действия над переменными: Арифметические – +(сложение), -(вычитание), *(умножение), /(деление), ^(возведение в степень), \(целочисленное деление), mod (вычисление остатка от целочисленного деления); Логические Сравнения - <, >, =, is Объединения строк - & или + Константы Константа похожа на переменную тем, что она также является именованной областью памяти, хранящей информацию, которая используется в программах. Различие же между ними заключается в том, что изменение значения константы не допускается. Необходимо отметить, что в VBA можно как описать собственные константы, так и использовать стандартные. При описании константы требуется присвоить ей значение Const Pi as Double = 3.14159 Private Const MaxTic As Integer = 100 В дальнейшем эта константа может использоваться в программе, и попытка ее изменения может вызовит ошибку. VBA имеет множество собственных констант, их использование улучшает восприятие и понимание текста программ. Так, например, если мы хотим использовать какой-нибудь цвет для окраски фона или шрифта, мы вместо числового кода цвета может использовать соответствующую константу. Имена и значения цветовых констант приведены в таблице Таблица 4. Константы VBA для обозначения цветов. Константа Числовое значение (16-ричная Цвет кодировка) VbBlack 0x0 Черный VbRed 0xFF Красный VbGreen 0xFF00 Зеленый VbYellow 0xFFFF Желтый VbBlue 0xFF0000 Синий VbMagenta 0xFF00FF Розовый VbCyan 0xFFFF00 Голубой VbWhite 0xFFFFFF Белый Например, в следующей строке определяется красный цвет фона элемента управления Label1 Label1.BackColor=Vbred. С описанием стандартных констант можно познакомиться в справочной системе VBA. 17 Теперь давайте проделаем очередное упражнение. Мы сейчас в электронной таблице создадим небольшой проект, в котором осуществляется ввод букв в элемент управления Label1 и ячейку таблицы без помощи клавиатуры. Этот пример иллюстрирует удачное сочетание возможностей электронной таблицы, элементов управления и языка VBA. Итак, ставится задача – ввести в ячейку электронной таблицы какую-либо строку без помощи клавиатуры. 6.3 Упражнение 4 Известно, что каждая буква хранится в памяти компьютера в виде числового кода. Для строчных букв русского алфавита для кодирования отведен диапазон чисел от 224 (буква «а») до 255 (буква «я»). Первый шаг – использовать элемент управления, который позволяет выводить в ячейку числа из этого диапазона. Для этого используется элемент «Полоса прокрутки» (ScrollBar1), у которого есть очень интересное свойство LinkedCell. Используя это свойство, можно числовое значение, создаваемое полосой прокрутки в зависимости от положения ползунка копировать в ячейку рабочего листа. 1. Откройте чистую рабочую книгу Excel и убедитесь, что находитесь на рабочем листе «Лист1» 2. Вызовите панель элементов управления и если есть необходимость, перейдите в режим конструктора 3. Через эту же панель откройте окно свойств 4. Создайте на рабочем листе элемент Надпись (Label) и дайте ему имя Lbl1, а свойство Caption очистите от символов. 5. Создайте элемент Полоса прокрутки (ScrollBar). Разместите её горизонтально, и если она выделена, то в окне свойств можно будет менять свойства этого объекта. 6. Используя окно свойств, установите следующие свойства объекта ScrollBar1 Min=224 Max=255 LinkedCell=A4 7. Выйдите из режима конструктора (Отожмите соответствующую кнопку на панели элементов управления) и, передвигая ползунок полосы прокрутки убедитесь, что в ячейке А4 происходит изменение числа от 224 до 255. 8. Следующее действие – превратить это число в букву. Используем возможности самой электронной таблицы. В ячейку В4 запишем формулу =Символ(А4). Теперь в этой ячейке будет отображаться тот символ, код которого находится в в ячейке А4. В этом Вы можете убедиться, «поработав» с полосой прокрутки. Заметим, что мы уже многого достигли, не написав ни одной строчки кода. Возможности ЭТ исчерпаны, и мы переходим в окно проекта для написания кода. 9. Вернитесь в режим конструктора и дважды щелкните по элементу Lbl1. В среде программирования VBA раскроется окно со строчками Private Sub Lbl1_Click() End Sub 10. Объявим внутри этой процедуры строковую переменную с именем bukva. Поэтому после первой строки с названием процедуры вторая строчка нашего кода будет такой Dim bukva As String 11. Перенесем значение из ячейки В4 в переменную bukva bukva = Cells(4, 2) 12. Добавим в элемент Lbl1 этот символ к тем, что уже там были. Код будет таким Lbl1.Caption = Lbl1.Caption + bukva 18 13. Проверяем правильность набора кода Private Sub Lbl1_Click() Dim bukva As String bukva = Cells(4, 2) Lbl1.Caption = Lbl1.Caption + bukva End Sub 14. Программа готова. Теперь для работы приложения достаточно, вернувшись в электронную таблицу и не забыв отключить режим конструктора, перемещая ползунок полосы прокрутки выбрать в ячейке B4 необходимую букву и щелкнуть по элементу Lbl1. Повторяя многократно эту операцию можно сформировать целое слово. Заметим, что для удаления набранного слова достаточно использовать еще один объект – Кнопку, а в качестве кода в процедуре, срабатывающей при щелчке по этой кнопке, использовать строку Lbl1.Caption=” ” Обратим Ваше внимание на то, что полоса прокрутки нам понадобилась для изменения числового значения в ячейке ЭТ. Если Вы хорошо знаете возможности Excel, то Вы догадаетесь, это замечательное свойство полосы прокрутки можно использовать достаточно эффективно и в других ситуациях. Готовый вариант программы находится в файле «Полоса прокрутки» 7 Основные конструкции языка Наступила пора познакомиться с теми основными понятиями, приемами и методами, которыми пользуется любой программист, независимо от того, на каком языке он пишет. Начнем с конструкций языка или как еще говорят с алгоритмов. Само понятие алгоритма, широко употребляемое в среде программистов, означает некий план работы для компьютера. При этом предполагается, что если компьютер (имеется в виду программа) выполнит этот план, то цель алгоритма будет достигнута. На сам алгоритм накладываются определенные условия например, он должен учитывать «способности» компьютера, иметь конкретную цель и т.д. В программировании, в настоящее время выделились следующие группы алгоритмов – линейные, повторяющиеся, алгоритмы перехода и вложенные. Линейные алгоритмы – это последовательность инструкций в программе, выполняемых последовательно друг за другом и не представляющие особого интереса. Те небольшие программки, которые мы с Вами создали в упражнениях, по своей структуре являются линейными. Рассмотрим повторяющиеся алгоритмы или циклы. Циклы целесообразно применять в том случае, если одни и те же команды должны повторяться определенное количество раз или при достижении определенного условия. Например, при многократном сложении чисел, при рисовании не одной линии, а нескольких, при изменении свойств нескольких ячеек или значений целого ряда однотипных переменных (массива). Рассмотрим случай, когда возникла необходимость раскрасить несколько ячеек рабочего листа в красный цвет. Для определенности пусть это будут ячейки второго столбца, а закрашивать нужно начиная с третьей строки до десятой через одну ячейку. Используя макрос и справочную систему VBA, можно записать код для закраски ячейки 3 строки 2-го столбца – Cells(3,2).Interior.Color=VbRed. Для того чтобы применить эту команду к другим ячейкам этого же столбика, нужно знать строчку – начало, строчку – конец, и в процессе закрашивания знать номер строки, на которой находится закрашиваемая ячейка, то есть должен быть включен счетчик. При этом коде для закраски значение строки в должно меняться. В данном случае мы знаем, сколько раз надо повторять команды, а также во время повторения команд хотим воспользоваться значением счетчика повтора, поэтому имеет смысл использовать конструкцию For...Next. 19 7.1 Конструкция For…Next Синтаксис этой конструкции имеет следующий вид For <переменная_счетчик> =< начальное знач> To <конечное знач> [Step <шаг>] [тело цикла] Next [<переменная_счетчик>] Применительно к нашему случаю эту инструкцию можно записать следующим образом For K= 3 то 10 step 2 Cells(K,2).Interior.Color=VbRed. Next K Когда программа дойдет до строчки For K= 3 то 10 step 2, то переменной К будет присвоено значение 3. Затем будет выполнена команда закрашивания ячейки в третьей строке (К=3), После этого при выполнении команды Next K произойдет проверка – не стало ли К больше 10. Если этого не произошло, то К становится равным 3+2=5. Напомним, что 2 – это шаг. Затем опять выполняется команда закрашивания, но уже для ячейки пятой строки. То есть начинается циклическое выполнение команды изменения цвета. Это выполнение будет продолжаться до тех пор, пока К не превысит значение 10. Как видите, в инструкции For…Next содержатся следующие элементы: <Счетчик> обязательный параметр. Здесь ставится имя числовой переменной, которая будет изменяться от начального до конечного значения с определенным шагом. <Начало> обязательный параметр. Это может быть число или имя какой-то переменной. <Конец> обязательный параметр и тоже может быть числом или именем переменной. Это значение должно отличаться от <начала> <Шаг> необязательный параметр. Показывает значение, на которое изменяется счетчик при каждом выполнении тела цикла - числовое значение или имя числовой переменной. Если это значение не задано, по умолчанию шаг равен единице. инструкции, которые должны повторяться - Необязательный параметр. Одна или несколько инструкций между For и Next, которые выполняются указанное число раз. При использовании этой инструкции необходимо также учитывать, что аргумент <шаг> может быть как положительным, так и отрицательным. Цикл будет повторяться при положительном или нулевом шаге пока счетчик <= конец, а при отрицательном - пока счетчик >= конец. Изменение значения переменной счетчик внутри цикла усложняет чтение и отладку программы, но с другой стороны использование этой переменной внутри цикла совершенствует программу. Если предполагается по каким – либо причинам (условиям) досрочный выход из цикла, то внутри цикла можно вставить инструкцию Exit For. Как правило, эта инструкция часто применяется вместе с проверкой некоторого условия (например, If...Then). Эта инструкция передает управление команде, непосредственно следующей за командой Next. Допускается организация вложенных циклов For...Next (один цикл For...Next располагается внутри другого). Счетчик каждого цикла должен иметь уникальное имя. В качестве иллюстрации приведем пример, когда происходит закрашивание нескольких ячеек, расположенных на определенном участке таблицы. Private Sub Cmd3_Click() Range("a1:r20").Clear For K = 3 To 10 Step 2 Приведенные примеры реализованы в файле For j = 2 To 15 Step 3 «Циклы.xls», размещено на прилагаемом Cells(K, j).Interior.Color = vbBlue диске. Next j Next K End Sub 20 7.2 Конструкция Do…Loop Теперь давайте познакомимся с конструкцией Do...Loop. Это конструкция повторяет команды до тех пор, пока выполняется (или не выполняется) какое – то определенное условие. Например, необходимо закрашивать ячейки в каком либо столбике, начиная с третьей строки, пока не встретим ячейку с данными (текст или число). В одной из ячеек этого столбика набрано слово «Stop» Посмотрите на пример, в котором происходит закрашивание ячеек 2 столбца, пока не встретится это слово. Пример оформим в виде таблицы, чтобы дать подробные пояснения. Начало процедуры Private Sub Cmd1_Click() Объвляем х как строковую переменную Dim Х As String Очищаем группу ячеек от предыдущих Range("a1:r50").ClearFormats закрашиваний и форматов. Текст из ячеек при этом не удаляются. Переменная Х «пуста» Х = "" Эта переменная будет играть роль счетчика. K=2 Ключевая строка конструкции Do…Loop. Do While Х = "" Включает в себя условие, что переменная х должна быть пустой строкой. Если Х пуста, то начинается выполнение K=K+1 команд внутри цикла и мы «вручную» увеличиваем счетчик на единицу. Закрашивание начнется с третьей строки. Закрашиваем ячейку в строке с номером К. Cells(K, 2).Interior.ColorIndex = K Цвет фона определяем через свойство ColorIndex (номер цвета). Теперь цвет зависит от значения К. Считываем в Х содержимое ячейки Х = Cells(I, 2) Вторая ключевая строка – возвращение к Loop началу цикла Конец процедуры End Sub Этот пример Вы тоже можете посмотреть в файле «Циклы.xls» Особенность этого варианта в том, что цикл будет выполняться, если выполняется условие. В общем виде эта конструкция оформляется в программе следующим образом Do While [<условие>] [инструкции] [Exit Do] [инструкции] Loop В роли <условия> используется любое строковое или числовое выражение, которое может принимать истинное или ложное значение (True или False). Предлагаем примеры условий X1 > 5 Y2 =< 2 – проверяется условие, что Y2 не больше 2 Z=8 К <> 16 - проверяется условие, что K не равно 16. R>5 and R<26 – проверяется условие, что 5<R<26 A1=<3 or A1>=6 – проверяется условие, что A1 не больше 3 или не меньше 6 В роли [инструкций] выступают команды, которые должны выполняться внутри цикла. Обратите внимание, что внутри цикла может быть размещена строка [Exit Do], исполнение которой приводит к немедленному выходу из цикла. 21 При создании подобного цикла необходимо позаботиться о таких инструкциях выполнение которых приведет к изменению условий внутри цикла, так чтобы цикл мог когда – то прекратиться. Если условие не указывать, то цикл будет бесконечным и программа «зависает». Для прерывания «зависшей» программы необходимо нажать сочетание клавиш <Ctrl>+<Break>. Если в первой строке конструкции вместо While набрать Until, то цикл будет выполняться, пока не выполняется условие. Нижеприведенный пример отличается от предыдущего тем, что в нем используется конструкция Do Until…Loop. Private Sub Cmd2_Click() Dim x As String Range("a1:r50").ClearFormats x = "" K=2 Do Until x = "Stop" K=K+1 Cells(I, 3).Interior.ColorIndex = K x = Cells(K, 3) Loop End Sub Кроме того, отметим, что VBA допускает проверку условия не в первой строке конструкции, а в последней строке. Тогда синтаксис этой конструкции выглядит следующим образом Do [инструкции] [Exit Do] [инструкции] Loop [{While | Until} условие] 7.3 Конструкция If...Then...Else Переходим к алгоритму условного перехода. Этот алгоритм применяется в тех случаях, когда по ходу программы возникает необходимость или возможность выбора дальнейших инструкции для выполнения. Например, если подкоренное выражение стало отрицательным, то вычисление корня производить нельзя или когда сумма налога оказалась выше начислений. Синтаксис этой конструкции таков If <условие> Then [инструкции] [Else [инструкции_else]] End If Нижеприведенный пример, отличается от предыдущего тем, что прекращается выполнение цикла, если параметр К стал больше 7. Это обеспечивается строкой кода If K = 8 Then Exit Do. Private Sub Cmd3_Click() Dim x As String Range("a1:r50").ClearFormats x = "" K=2 Do Until x = "Stop" 22 K=K+1 Cells(I, 4).Interior.ColorIndex = K If K = 8 Then Exit Do x = Cells(K, 4) Loop End Sub Предлагаем познакомиться с примером, где допущена ошибка и цикл не будет завершен, потому что ячейка с текстом будет пропущена из-за того что параметр К изменяется с шагом 2. Для аварийного выхода из цикла (в качестве демонстрации используется также строка с Exit Do Private Sub Cmd4_Click() Dim x As String Range("a1:r50").ClearFormats x = "" K=2 Do While x = "" K=K+2 Cells(K, 5).Interior.ColorIndex = K x = Cells(K, 5) If K > 40 Then Exit Do Loop В ряде случаев, когда приходится выбирать между несколькими условиями для одной и той же переменной и в зависимости от этого выполнять различные команды, можно использовать более сложную конструкцию Select Case. Сведения об этой конструкции можно найти в справочной системе VBA. С развитием объектно-ориентированного программирования появились новые конструкции. К ним относятся и With…End With. 7.4 Конструкция For Each...Next Как правило однотипные объекты (ячейки, листы рабочей книги, слова текстового документа) объединяются в коллекции. Если возникает необходимость выполнить какие-то одинаковые команды с каждым из объектов в коллекции, то конструкция For Each...Next может в этом помочь. Синтаксис этой конструкции следующий For Each <элемент> In <группа> [инструкции] [Exit For] [инструкции] Next [<элемент>] Вместо <элемент> Вы должны вставить имя переменной и потом внутри конструкции использовать это имя, если хотите указать на объект из коллекции. Вместо <группа> Вы подставляете имя коллекции объектов, которые Вы собираетесь обрабатывать. Познакомьтесь с примером, когда ячейки из диапазона c4:h10 окрашиваются в цвет, номер (индекс) которого равен номеру строки, в которой располагается ячейка. Отметим, что <элемент> обозначается в примере через переменную X и после такого обозначения эта переменная воспринимается как ячейка рабочего листа, обладающая соответствующими свойствами. Private Sub CommandButton1_Click() Range("a1:k20").Clear 23 For Each X In Range("c4:h10") – в этой строке в роли коллекции выступает объект Range, который действительно в свою очередь является коллекцией ячеек. X.Interior.ColorIndex = X.Row – выражение X.Row означает «номер строки, в которой располагается эта ячейка. Next x End Sub Этот пример находится в файле «Коллекции» (Пример 1). Но коды в этом файле защищены паролем, так как 3-й пример Ваша команда должна реализовать самостоятельно. 7.5 Конструкция With…End With Если возникает необходимость изменить сразу несколько свойств у одного и того же объекта, то можно использовать конструкцию With…End With со следующим, достаточно простым синтаксисом With <объект> [инструкции] End With Вместо <объект> Вы указываете имя конкретного объекта, свойства которого надо менять. Например With Cells(4,5). При этом в других строчках, где ссылаемся на свойства этого объекта, его имя указывать не нужно Предлагаем Вашему вниманию пример, где обрабатываются все ячейки из коллекции Range("c4:h10"). Внутри цикла For Each эти ячейки имеют имя Х. В переменную z (z = X.Column + X.Row) заносится сумма номеров строки и столбца, в которых находится эта ячейка. Затем, используя конструкцию With … End With, в эту ячейку записываем z (.Value=z) и изменяем цвет фона ячейки. Private Sub CommandButton1_Click() Range("a1:k20").Clear For Each X In Range("c4:h10") z = X.Column + X.Row With X .Interior.ColorIndex = X.Row .Value = z End With Next X End Sub Реализацию этого примера Вы найдете в «Коллекции.xls”(Пример 2)». Вам также полезно будет самостоятельно рассмотреть пример 3, где объединены три управляющие конструкции. Задания Задание 1. Измените код в Полосе прокрутки так, чтобы текст «наращивался» не справа (как обычно), а слева, то есть наоборот, последняя буква стояла бы впереди предыдущей. Другими словами – известно, что арабы пишут справа налево. Сделайте все по арабски! Задание 2. Напишите код для реализации примера 3 из файла «коллекция».