Министерство образования и науки российской федерацииГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ«РОСТОВСКИЙ ГОСУДАРСТВЕННЫЙ СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ»Алгоритмы и программы Методические указания для подготовительных курсовРостов-на-Дону 2011УДК 618.03.06 Алгоритмы и программы: Методические указания для подготовительных курсов.– Ростов-на-Дону: Рост. гос. строит. ун-т, 2011.– 44 с.Изложены понятия алгоритма, структур и типов данных, рассматриваются средства и приемы составления программ. В качестве языка программирования в примерах используется VBA. Предназначено для преподавателей, работающих в центре довузовской подготовки РГСУ, и слушателей этого центра. УДК 618.03.06Составители: канд. физ.-мат. наук, доц. О. А. Ильичева канд. физ.-мат. Наук, доц. М. Н. Богачева Рецензенты: д-р техн. наук, проф. Г.И. Белявский, д-р техн. наук, проф. А.В. Чернов© Ростовский государственный строительный университет, 2011^ Понятие алгоритма Алгоритм. Фундаментальной концепцией информатики является понятие алгоритма. Алгоритм – это конечная последовательность инструкций (действий, предписаний), предназначенных для решения поставленной задачи. Инструкции должны быть точными: два исполнителя одного и того же алгоритма должны прийти к одному и тому же результату. Совокупность всех исходных данных, к которым алгоритм применим, называется областью применимости алгоритма. Каждый алгоритм задает функцию, относящую каждому элементу области применимости соответствующий результат, т.е. область применимости совпадает с областью определения этой функции. Тогда говорят, что алгоритм вычисляет эту функцию. Функция, которая вычисляется некоторым алгоритмом, называется вычислимой. Множество значений вычислимой функции, определенной на N (натуральный ряд), образует перечислимое множество (значения функции перечисляются алгоритмом). Область применимости и область результатов любого алгоритма – перечислимые множества. Не всякая математическая задача может быть решена с помощью алгоритма. Это связано с невычислимостью (неперечислимостью) некоторых областей, на которых определены решения этих задач. Например, существуют перечислимые подмножества натурального ряда с неперечислимым дополнением. Задачи, не решаемые с помощью алгоритма, называют алгоритмически неразрешимыми. К числу таких задач относятся, например, проблема распознавания эквивалентности (равенства) слов (существуют конечный алфавит, конечный набор правил составления и преобразования слов в этом алфавите, но нельзя построить алгоритм, который по двум произвольным словам этого алфавита всегда определит преобразуются они или нет к одному и тому же слову). Другая известная алгоритмически неразрешимая задача – проблема остановки – не существует алгоритма, отвечающего на вопрос: остановится или нет некоторая программа, запущенная на некотором наборе начальных данных (не распознается наличие в программах бесконечных циклов). Проблема самоприменимости также неразрешима (нельзя с помощью алгоритма распознать для машины, преобразующей слова, распознает она или нет шифр самой себя). Задачи, решаемые алгоритмами, относятся к области исследований конструктивной математики.^ Средства записи алгоритмов. Записать алгоритм можно на естественном языке, в виде схемы, на каком-либо (специальном) языке программирования, к числу которых относятся и языки машинных команд, ассемблеры, автокоды. Одним из популярных схемных средств представления алгоритмов являются блок-схемы. Блок-схема – это диаграмма специального вида, на которой фигуры обозначают операторы (действия алгоритма), а стрелки – последовательность исполнения операторов. Основные алгоритмические структуры (операторы) – конструкции, с помощью которых можно записать алгоритм, – это: присваивание, условный оператор, оператор цикла и последовательность операторов. В различных языках программирования эти конструкции могут изображаться по-разному (иметь разный синтаксис), но отличия, как правило, несущественны. 2. Основные алгоритмические конструкции2.1. ПоследовательностьПоследовательность операторов означает последовательное их исполнение друг за другом. На блок-схемах эта конструкция изображается стрелкой . В языках программирования последовательно выполняемые операторы отделяются друг от друга символом «;» или (как в VBA) символом конца строки (каждый оператор начинается с новой строки). 2.2. Оператор присваиванияОбычный синтаксис оператора присваивания: , где может иметь вид «» или «» (как, например, в VBA). Выполняется присваивание так: вычисляется выражение в правой части этого оператора и полученное значение присваивается переменной левой части (переменная получает это значение, «стирая» предыдущее). Например, последовательность операторов присваивания (в языке VBA):а = 4+7а = а+2в = 2а = в*3 + аисполняется так: вычисляется 4+7, результат 11 присваивается переменной а. Прежнее значение а стирается, новое значение а есть 11. Во второй строке к этому значению прибавляется 2, результат выражения есть 13 (11+2=13). Это значение присваивается переменной а, теперь уже значение а есть 13. В третьей строке в получает значение 2. Наконец, в четвертой строке снова пересчитывается значение переменной а: вычисляется выражение в*3 + а (вместо в и а подставляются их значения 13 и 2), результат 2*3 + 13 = 19 присваивается переменной а (говорят, 19 «заносится» в переменную а или «запоминается» в а). Результат выполнения всей последовательности: а=19, в= 2. Присваивание можно трактовать как запоминание (сохранение) вычисляемых в ходе исполнения алгоритма значений для последующего их использования. Сохраняясь в переменной, значение приобретает имя, например, в предыдущем примере далее в алгоритме вместо числа 19 можно использовать его (временное) имя a, вместо числа 2 – имя в. Обратную операцию – извлечение значения из переменной называют разыменованием. На блок-схеме присваивание представляется прямоугольником со входом и выходом. Внутри прямоугольника записывается сам оператор. Например, а = в*3 + а выглядит так: Вся последовательность предыдущего примера изображается так: Иногда для сокращения блок-схем несколько подряд идущих операторов присваивания изображают в одном прямоугольнике, например:2.3. Условный оператор (ветвление)Эта алгоритмическая структура представляет собой разветвление алгоритма в зависимости от значения (истинности или ложности) некоторого условия. Обычный синтаксис условного оператора: понимается так: «если условие истинно, то выполнить действия1, иначе (если условие ложно), выполнить действия2». Слова «если», «то», «иначе» в разных языках могут иметь разное обозначение, но в большинстве языков это «if», «then», «else». В VBA синтаксис условного оператора:If Then Else End If. Условный оператор может быть «неполным», без ветки . Тогда, если условие ложно, управление передается следующему в общей последовательности оператору. На блок-схемах эти два случая изображаются так: Здесь знаки «+» и «-» обозначают «да» (условие выполняется) и «нет» (условие не выполняется). Например, вычисление y, заданного формулой можно представить следующей блок-схемой: На языке программирования VBA эта конструкция выглядит так: If x y=x*x0>Else y=x+1End IfОбратите внимание, что операторы после Then (ветка «+») и Else (ветка «-») начинаются с новой строки, а сам условный оператор заканчивается фразой End If – признаком конца конструкции ветвления. Пример использования неполного условного оператора: суммируются числа, вводимые с клавиатуры; если число отрицательное, оно прежде заменяется единицей. Пусть переменная а хранит значение введенного числа, а переменная S хранит сумму введенных чисел. Фрагмент блок-схемы решения такой задачи: На языке программирования VBA эта конструкция выглядит так: If a a=1End If S=S+aКаждая из ветвей условного оператора может содержать произвольное количество операторов, среди которых могут быть снова ветвления (вложенные «если»). Например, следующая программа:x=10If x>5 Then x=x-5If x>7 Then x=x+4: y=xElse x=x*x-1: y=x+8End IfElse x=x-4: y=1End Ifвыполняется так: переменная x получает в результате присваивания значение 10. Затем проверяется условие x>5? В данном случае оно выполняется, поэтому исполняются операторы после then: вначале x получает новое значение 5, затем проверяется (вложенное) условие x>7? Оно ложно, тогда последовательно исполняются операторы, идущие после else: x=x*x-1 и y=x+8, результат x=24, y=32. На этом внутренний «if» заканчивается, ветка «else» внешнего «if» не исполняется, общий результат остается тем же: x=24, y=32. Если же изменить начальное присваивание, например, вместо x=10 записать x=2, то исполнение программы будет идти по другой ветке, соответствующей внешнему «else»: x=x-4, y=1, и результат будет другой: x=-2, y=1. Блок-схема для этой программы имеет вид: Какие операции можно включать в условие? Условие – это логическая формула, значение которой может быть вычислено. Простейшее условие – это отношение: больше (>), меньше (=), меньше или равно (). Более сложные условия составляются из простых с помощью операций конъюнкции (в VBA это And), дизъюнкции (Or), отрицания (Not), импликации (Imp). Например, условие х меньше пяти, но больше или равно двум, записывается как (x=2).2.4. Оператор циклаЦикл означает повторяющийся набор действий. Например, суммируется набор из двадцати чисел, вводимых с клавиатуры. Действия «ввести число» и «добавить его к сумме» будут повторяться 20 раз. В задаче: складывать числа, вводимые с клавиатуры, до тех пор, пока не встретится 0, эти действия будут повторяться столько раз, сколько выполняется (истинно) условие: «введенное число не равно нулю». Для обозначения повторений в записи алгоритмов используют конструкции, называемые циклами: цикл с параметром (счетчиком), цикл с предусловием и цикл с постусловием. Цикл с предусловием является наиболее общей конструкцией: этого оператора достаточно, чтобы записать любые циклические действия алгоритмов. Повторяющаяся группа действий называется телом цикла, однократное выполнение этой группы – шагом цикла. Часть конструкции, в которой определяется продолжать выполнение цикла или нет, называют заголовком цикла. Заголовок, как правило, содержит условие, истинность или ложность которого требует повторения операторов тела цикла. Если условие задано так, что оно выполняется всегда, например, 4^ Цикл с предусловием. Заголовок этого цикла содержит условие, которое проверяется всякий раз перед очередным исполнением тела цикла. Если условие истинно, тело исполняется, если ложно, управление передается следующему за циклом оператору в алгоритме. Таким образом, тело цикла исполняется столько раз, сколько раз истинно условие цикла. Блок-схема этого оператора:Циклы с предусловием называют обычно циклами типа While или циклами ПОКА (работает, пока условие выполняется). Синтаксис этих циклов в VBA: ^ While Wend илиDo While Loop Например, исполнение фрагмента программы:a = 7While a > 0a = a - 1Wend даст в результате значение а = 0, т.к. тело цикла a = a – 1 выполнялось столько раз, сколько выполнялось условие a > 0. Последний раз оно выполнилось, когда a =1, в результате a = 1 – 1=0. Проверка условия (0>0) показала «ложь», и управление передалось операторам, следующим за Wend (граница цикла While). Таким образом, значение а осталось равным 0. Если заменить первый оператор фрагмента a = 7 на a = 0, то цикл не выполнится ни разу, т.к. условие a > 0 ложно. Тело цикла не исполнится ни разу, если условие не выполняется уже вначале. В некоторых задачах необходимо, чтобы тело цикла хотя бы раз отработало. Можно, конечно, операторы тела цикла «продублировать», написав их еще раз до оператора цикла, тогда они исполнятся независимо от истинности условия. Но, если их много, программа выглядит громоздко. Для таких случаев удобно использовать цикл с постусловием.^ Цикл с постусловием. В таких циклах условие проверяется после того, как операторы тела цикла хотя бы раз отработают. Блок-схема этого цикла такова: В отличие от цикла с предусловием данный цикл работает до выполнения условия, пока оно не верно, т.е. здесь истинность условия означает выход из цикла. Циклы с постусловием называют Until-циклами, циклами ПОКА НЕ или циклами ДО (работают до того, как условие выполнится). Синтаксис этих циклов в VBA:^ Do Loop Until .Программа предыдущего примера, но с Until-циклом: a = 7Do a = a - 1Loop Until a даст другой результат: а = -1, т.к. после того, как значение а стало равным 0, тело цикла отработало еще раз (условие a При использовании рассмотренных видов циклов необходимо помнить, что в теле цикла должны быть операторы, которые влияют на значение условия и, в конце концов, приведут к изменению его значения. Неизменные, «окаменевшие» условия, если они истинны, приведут к зацикливанию программы.^ Цикл с параметром. Эти циклы используются, когда число повторений известно заранее – количество шагов задано, например, 20, 100, N или может быть вычислено как результат какого-либо выражения до исполнения цикла. Параметром в цикле является счетчик шагов. Счетчик (это значение специально выделенной переменной) может изменяться на единицу с каждым шагом или получать некоторое заданное приращение, например, 0.15. Цикл тогда исполняется до тех пор, пока значение счетчика не достигнет указанного в заголовке цикла предельного (конечного) значения. Циклы с параметром называют часто циклами типа For, т.к. в большинстве языков программирования их заголовок начинается со слова For. Для VBA синтаксис этого цикла:For = To 0>Next или, если используется счетчик с приращением значения, отличным от 1:For = To Step Next Здесь переменная-счетчик – это имя переменной, взятой для счета шагов; начальное значение, конечное значение – выражения, в частности, целые числа или переменные, значения которых берутся в качестве начала и, соответственно, конца отсчета повторений тела цикла; приращение – выражение, значение которого на каждом шаге добавляется к счетчику цикла. Приращение может быть и отрицательной величиной, тогда оно вычитается из счетчика, и начальное значение в этом случае должно быть больше конечного. Оператор цикла с параметром работает следующим образом: тело цикла исполняется столько раз, сколько значение счетчика меньше или равно конечному значению. После каждого шага цикла к счетчику добавляется 1, если приращение не указано, или значение приращения, если оно указано. Условие на счетчик после этого проверяется и, если конечное значение не превышено, тело цикла вновь исполняется. После присваивания счетчику начального значения условие также проверяется. Обозначим начальное значение счетчика i как i0, конечное значение – N, приращение - h. Тогда блок-схема этого оператора имеет вид:Следовательно, цикл с параметром является частным случаем цикла с предусловием типа While. Пример использования цикла-^ For в программе VBA:k = 2 m = 4For i = k + 1 To m * 2 + 1 Step 0.5 k = k + iNextЭтот цикл выполняется, начиная со значения счетчика i, равного 3, и продолжается, пока счетчик не превзойдет величину 9 (4*2+1=9); на каждом шаге значение счетчика увеличивается на 0.5, поэтому число шагов будет не 7, а 13. В результате значение k = 80. Несмотря на то, что значение k на каждом шаге меняется, начальное значение k+1=3 не пересчитывается и к нему исполнение цикла не возвращается.^ Досрочный выход из цикла. При использовании циклических конструкций может возникнуть необходимость досрочного выхода из цикла. Например, получен искомый результат, а условие цикла еще истинно и позволяет продолжить исполнение этого оператора. В языке VBA оператором досрочного выхода является Exit, причем в циклах For он имеет вид Exit For, а в циклах, начинающихся с Do, он имеет вид Exit Do. Например, программа a = 7Do a = a – 1If a = 5 ThenExit DoEnd IfLoop Until a даст на выходе значение 5, т. к. цикл принудительно прервался, когда значение переменной а стало равным пяти. Того же результата можно достичь и в программе с циклом For:k = 2 m = 4For i = k + 1 To m * 2 + 1 Step 0.5 k = k + iIf k = 5 ThenExit ForEnd IfNextВложенные циклы. Тело любого оператора цикла может содержать другие циклы. Такие конструкции называют вложенными циклами. Вложенные циклы (цикл в цикле) применяют обычно в задачах, когда требуется связать или сравнить каждый элемент одного множества с каждым элементом другого множества. Блок- схема вложенных циклов для, например, циклов с предусловием выглядит так: Здесь тело внешнего цикла (цикла 1) состоит из оператора внутреннего цикла (цикла 2). Условие выхода из всей конструкции – это условие внешнего цикла. На каждом шаге внешнего цикла полностью «отрабатывает» внутренний цикл. Таким образом, если внешний цикл перечисляет элементы некоторого множества X, а внутренний – элементы множества Y, то за i-й шаг работы первого цикла для i-го элемента xi из X могут быть проверены все элементы yj из Y, т.к. второй цикл не завершит работу, пока истинно его условие (Условие 2 на схеме). Пример программы с вложенными циклами в VBA:For i = 1 To 7For j = 1 To 5If i Cells(i, j) = 1End IfNextNext Здесь Cells(i, j) – имя ячейки листа Excel, расположенной в строке i и столбце j. Эта программа «рисует» единицами треугольник на листе Excel: перебираются все строки листа от первой до седьмой и для каждой строки проверяются все пять столбцов: они заполняются единицами, если текущий номер строки меньше или равен текущему номеру столбца, и не заполняются ничем в противном случае. Циклы в теле другого цикла имеют точно такой же статус при исполнении, как и любой другой оператор, поэтому «вкладывать» один в другой можно циклы любого типа, и глубина вложения (количество вложенных друг в друга циклов) может ограничиваться лишь реализацией языка программирования. 2.5. Операторы ввода-выводаЭти действия выполняют ввод и вывод информации (значений переменных) в ходе работы программ. Операторы ввода-вывода с точки зрения выразимости алгоритма не имеют самостоятельного значения, т.к. могут быть заменены набором соответствующих присваиваний. Для написания программ они существенны, поскольку исполняются особым образом, с привлечением дополнительных устройств. Для более точного представления алгоритмов в блок-схемах эти операторы имеют специальное изображение, например, илиКроме того, для обозначения начала и конца алгоритма используют фигуры и В языке VBA ввод значения переменной x можно осуществить с помощью функции InputBox, например:x = InputBox(''Введи значение x'')Вывод в специальное окно экрана можно реализовать оператором MsgBox, например:MsgBox x В итоге на экран выведется только значение переменной x, например, 5. Оператор MsgBox ''x = '' & x выведет на экран фразу: x = 5. Можно осуществить ввод и вывод, используя лист Excel. Ячейки листа имеют имена Cells(i,j), где i – номер строки, j – номер столбца. Например, ввод значения переменной x из ячейки А1 выглядит в программе так: x = Cells(1,1),а вывод результата – значения x в ячейку, например, С2 (вторая строка, третий столбец) реализуется так:Cells(2,3) = x3. Структуры и типы данных3.1. Типы и объектыПонятие «данные» обычно связывают с информацией, перерабатываемой алгоритмом. Эта информация может быть неоднородной, данные могут иметь различную структуру, которая зависит от решаемой задачи. Соответственно, размещение таких данных в памяти компьютера и доступ к ним будет различным. Языки программирования должны иметь средства для представления и обработки данных различной природы. Например, программы анализа анкет служащих работают с таблицами, содержащими сведения о сотрудниках, поэтому языки представления алгоритмов обработки таких данных должны иметь операции, позволяющие извлекать из ячеек таблицы их содержимое, компоновать части таблиц, связывать таблицы друг с другом. Программы, вычисляющие физические параметры производственного цикла, работают с последовательностями действительных чисел. Над числовыми значениями должны быть определены, по крайней мере, арифметические операции сложения, умножения, вычитания, деления. Алгоритмы переработки текстов имеют дело с наборами символов, над которыми возможны другие операции: конкатенация («склеивание») символов в слова, вырезка части слова или предложения, замена части слов и т.п. Сами программы также можно рассматривать как данные, имеющие свою структуру и свойства и допускающие определенные операции, например, вызов одной программы из другой. Из этих соображений возникло понимание типа данных как множества значений, характеризуемое множеством операций над ними. Например, тип целых чисел (Integer в VBA) включает все целые числа и арифметические операции (хотя деление может вывести из этого типа данных). Символьный тип (String) включает символьные значения и операции склейки символов и специальные операции обработки строк. Логический тип (Boolean) состоит из двух значений True (истина) и False (ложь) и допускает все логические операции – отрицание (Not), конъюнкцию (And), дизъюнкцию (Or), импликацию (Imp). Дальнейшее развитие концепции типа данных привело к понятию объектно-ориентированного программирования, в котором решение задач (как и весь «окружающий мир») представлено совокупностью взаимодействующих друг с другом объектов разных типов. Здесь тип – это множество объектов, имеющих общее поведение и общую структуру (свойства). Например, людей можно считать объектами типа «Человек». Этот тип обладает определенной структурой, воплощенной в его свойствах: вес, рост, количество рук, объем мозга и т.п. К человеку можно применять операции (методы), определяющие его поведение – ходить, спать, говорить, учиться и т.п. Какие именно свойства и методы рассматривать зависит от задачи. Например, в задаче «определить, кто придет первым в стометровке, если известно, что толстый бегает медленнее худого», важны такие свойства, как вес и метод бегать, но не важны устройство кишечника и операция хлопать в ладоши, которые в другой задаче могли играть главную роль. Таким образом, разработчик программы (приложения) решает какие типы данных ему нужны и может самостоятельно их определить, задав соответствующие свойства и операции, применимые к объектам этих типов. Современные языки программирования предоставляют средства для задания собственных, пользовательских, типов данных. Объекты некоторого типа Т – конкретные представители этого типа данных. Например, Сидоров А.А., Иванов Б.Б – объекты типа «Человек», ВАЗ 2109 с номером У 3040 – объект типа «Автомобиль», соседский кот Барсик – объект типа «Коты». Именно к объектам можно применять методы (операции) соответствующего типа данных. Также и свойства типа: только применительно к конкретному объекту свойство может получить определенное значение. Если использовать принятый в языках программирования синтаксис обращений к методам и свойствам: объект.метод и объект.свойство = значение, то допустимы, например, такие конструкции в программах: Сидоров.Бегать, Барсик.Кусаться, Барсик.Вес = 3. Применение операции копирования к объекту – диапазону A1:A3 листа Excel в VBA будет выглядеть так: Range("A1:A3").Copy. Метод Copy применим к любому объекту типа данных Диапазон (Range). Этот тип задан в программе приложения Excel (описан разработчиками этого приложения), для пользователей же Excel он является встроенным, стандартным, как, например, тип Integer. Типы данных в языках программирования можно условно разбить на следующие группы: примитивные типы (целые, вещественные числа, логические и символьные значения); конечные последовательности однотипных элементов (линейные, двумерные, многомерные массивы); конечные последовательности разнотипных элементов (записи, структуры); динамические последовательности со специальными операциями доступа (очереди, стеки, списки); сложные типы, ориентированные на специальные предметные области (электронные таблицы, листы Excel, диапазоны ячеек листов, базы данных и т.п.); произвольные типы, определяемые пользователем (например, самолет, автомобиль, животное, собаки, студенты). Программы обращаются к данным, хранящимся в памяти компьютера с помощью имен, реализуемых в понятии переменной. Переменная имеет тип, указывающий на то, какого сорта (типа) значения она может обозначать (говорят, хранить), и значение – конкретный объект. В компьютере каждой объявленной в программе переменной отводится область памяти, которую эта переменная будет именовать. Размер этой памяти зависит от типа переменной. Например, для переменной типа Integer это два байта, для переменной типа Double (число с плавающей точкой удвоенной точности) – восемь байтов, для массива из десяти целых чисел – блок памяти объемом 210 = 20 байтов. Таким образом, каждое хранимое значение имеет в компьютере физический адрес памяти, которая в данный момент его содержит и (в программе) имя переменной, которая им обладает (ссылается на этот адрес). Например, при присваивании a = b значение переменной b пересылается по адресу, отведенному для переменной a. Чтобы компьютер правильно выполнил эту пересылку, необходимо, чтобы значение, «сидящее» в b «поместилось» в память, отведенную для значений переменной a. Это означает, что типы этих переменных должны совпадать или быть совместимыми. Совместимость означает, что можно разместить данное без потери его значения или смысла. Например, присваивание a = b для a типа Integer и b типа Double невозможно реализовать без существенной потери значения b. Ошибки, возникающие при таких присваиваниях, называют типовыми ошибками. Если типы используемых переменных объявлены в программе заранее, то эти ошибки можно выловить на этапе компиляции (перевода программы в машинный код). Такой контроль типов называют статическим, в отличие от динамического, когда типовые «разборки» начинаются при исполнении программ (исполнении готового машинного кода). Статический контроль типов повышает эффективность программ, поэтому большая часть языков программирования требует описания типов переменных в программах до того, как эти переменные будут использованы в операторах. В VBA описание переменных сопровождается ключевым словом Dim и выглядит так: Dim As .Например, Dim a As Double, b As Boolean, c As Integer. Эти описания помещаются в начале программы, до первого оператора. Для реализации возможности совмещения типов используют так называемые операции приведения типов. Приведение, если оно возможно, означает преобразование значения одного типа в значение другого типа. Преобразуется именно значение, типы же переменных остаются прежними. Как правило, могут «приводиться» типы меньшего или равного физического размера к большему. В противном случае, если приведение допускается, то заранее оговаривается, каким образом большее значение будет урезано. В языках программирования существуют специальные операции (функции) приведения типов. Например, в VBA к таким функциям относятся CStr (преобразование к символьному типу String), CInt (преобразование к целочисленному типу Integer). Применять функцию CInt(x) можно к числовому аргументу x (значение x тогда округляется до целого) или к числовой строке x (значение строки, например, x=”123” преобразуется в число 123). Нечисловые строки, например, x=”abcd” не могут быть приведены к целому числу, и выражение CInt(x) даст типовую ошибку. Функция CStr(x), примененная к числовому аргументу x, например, x=35.4, преобразует это число в строку “35.4”, и к ней тогда можно применять любые строковые операции, например, склейку – конкатенацию (&) строк: результат выражения CStr(x) & "abcd" будет 35.4abcd.3.2. Доступ к даннымДля каждого типа данных должны быть определены специальные операции (говорят, функции) доступа к значениям этого типа. Создавая программу, разработчик должен знать каким образом можно извлечь нужное значение. Для встроенных, стандартных типов языка функции доступа (программы, реализующие извлечение значения) также встроены, их синтаксис дается в описании языка программирования. Для пользовательских типов реализация (программа) функций доступа является неотъемлемой частью описания типа. ^ Доступ к значениям примитивных типов осуществляется просто указанием имени переменной, содержащей значение, или указанием самого значения непосредственно. Например, в выражении b+7*(d-c) для b, d, c, имеющих числовой тип, значения переменных извлекаются из ячеек памяти, именуемой этими переменными. Для более сложных, структурированных, типов часто требуется иметь доступ к отдельным компонентам (элементам) этих структур. В зависимости от «устройства» типа доступ может быть осуществлен по имени элемента, по его порядковому номеру в последовательности.^ Доступ к значениям элементов массивов. Массивы – это упорядоченные конечные последовательности элементов одного и того же типа. Например, массив целых чисел, массив символов, массив автомобилей. Массив может быть одномерным (линейным) или многомерным. В памяти компьютера массиву отводят блок памяти, в котором элементы массива располагаются друг за другом. Переменная, содержащая массив, ссылается на адрес начала этого блока. Доступ к элементу массива осуществляется по его порядковому номеру в последовательности. Таким образом, чтобы получить значение, например, третьего элемента некоторого массива нужно указать имя переменной, содержащей массив, и номер (говорят, индекс) три. Например, в VBA: А(3) – третий элемент массива А. Пусть переменная В содержит массив пяти целых чисел: 24, 8, 6, 77, 3. Тогда В(3) – имя, назвав которое можно получить значение 6, т.е. В(3) = 6. Этот массив можно изобразить так: В В(1) В(2) В(3) В(4) В(5) 24 8 6 77 3 Если выполнить присваивание, например, В(3) = В(5), то значением элемента В(3), как и В(5), будет число 3, прежнее значение 6 «сотрется». Обозначение В(i) можно считать именем i-го элемента массива В. Для двумерного массива доступ к элементу можно получить, указав номер строки и номер столбца, на пересечении которых он находится, например, M(4,3) – имя элемента четвертой строки и третьего столбца двумерного массива M. Чтобы можно было правильно реализовать присваивания элементам массивов, нужно знать тип этих элементов. Так, если В – массив целых чисел, то недопустимо присваивание В(2) = “Маша ела кашу”. Для того, чтобы обеспечить правильную работу программы и распределение памяти, компьютер должен знать «размер» каждого элемента массива и их количество. Поэтому минимум того, что необходимо сообщить при описании массива, это – имя переменной массива, количество и тип элементов. Например, описание в VBA линейного массива А, состоящего из десяти элементов – целых чисел выглядит так: ^ Dim A(10) As Integer, а описание двумерного массива М из пяти строк и семи столбцов символьных значений – так:Dim M(5,7) As StringТаким образом, слово «массив» не имеет статуса типа данных, это скорее способ конструирования «массивоподобных» типов. Тип массива определяется количеством и типом его элементов (иногда, если в языке программирования разрешается нумеровать элементы не целыми числами, а, например, константами или буквами, то и типом индексов). Так, переменные А и В, описанные как массивы из десяти целых чисел: Dim A(10) As Integer, Dim В(10) As Integer имеют один и тот же тип, поэтому для любого i=1, 2, …, 10 допустимо присваивание А(i) = В(i). В некоторых языках программирования допустимо и присваивание содержимого массива «целиком»: A = B. Если же переменная В описана как массив действительных чисел: Dim В(10) As Single, то теперь переменные А и В имеют разные типы, и присваивание А(i) = В(i) недопустимо из-за типовой ошибки. Если описать переменную В как массив целых чисел, но другой длины, например, Dim В(20) As Integer, то А и В также будут иметь разные типы, но присваивания компонент А(i) = В(j), В(j) = А(i) для i 10, j 20 допустимы, т.к. элементы этих массивов имеют один и тот же тип (Integer). Присваивание же значения элементу А(i) для i > 10 приведет к ошибке, т.к. такого элемента у массива А нет. ^ 4. Программы и программные единицыСтруктуру программы и системные действия по ее обработке можно изобразить схемой: ^ Структура программы: Операционная система + компилятор Описание переменных – указание их имен и типов данных Отводится память (ℛ) под переменные Ввод данных и начальные присваивания Эта память частично заполняется значениями Операторы, представляющие алгоритм Машинные команды, взаимодействуют с памятью ℛ Вывод результата и/или метка конца программы Визуализация данных из ℛ (печать, экран, специальные носители) При написании программы стоит помнить некоторые технологические правила: 1. При составлении алгоритма сразу определите его вход и выход: исходный набор данных и тот, который требуется получить. 2. Если задача сложная, попытайтесь разбить ее на несколько более простых задач. Для каждой части также определите ее вход и выход. 3. При обнаружении в алгоритме циклических конструкций четко определите условие выхода из цикла и набор повторяющихся операторов – тело цикла. Проверьте, не приводит ли условие к зацикливанию. Проверьте также, не приводит ли приращение счетчика к выходу за пределы массивов, если они используются в цикле. 4. Все переменные, используемые в программе, следует описать в начале программы, до их использования. Тогда компилятор будет следить за соответствием типов. 5. Имена для переменных лучше выбирать так, чтобы они «говорили» о назначении этих переменных или, хотя бы, о типе их значений. Удобнее читать программу (и исправлять в ней ошибки), в которой вместо «всеядных» x, y, z используются информативные имена «цена», «среднее», «температура» или их понятные сокращения. 6. Переменные, используемые в правых частях операторов присваивания, в частности, переменные для накопления знач