лекции (2010) (by Ульянов Алексей_ Лихогруд Николай_ Сергеев Николай) (1160852), страница 7
Текст из файла (страница 7)
Со временем стало понятно, что ввод вывод – частьоперационной системы. И правильнее средства ввода и вывода держать в стандартных библиотекахоперационных систем, нежели встраивать в синтаксис языка, и при нужде в свой код эти библиотеки простонапросто подключать. Это делает код более переносимым(мобильным). Так поступили в С, С++.Множества также впервые появились в Паскале.Cтандартный базис операций на множествами:••set of T : T – множествоa in T: принадлежит ли a множеству T?•••••* S1+S2: объединение множествS1*S2 : пересечение множествS1-S2 : разность двух множеств[x] + S: добавить элемент х в множествоS - [x]: вычесть элемент из множестваКлассический пример применения множества - нахождение простых чисел с помощью решета Эратосфена.Однако удобно ли это? В Паскале множества были реализованы в виде битовой шкалы - структуре данных,реализованной на каком-либо целочисленном типе данных, где каждым бит отвечал за присутствие илиотсутствие данного числа в множестве.
Вследствие того, что все целочисленные типы данных имеют не более64 бит, такая структура могла оперировать с множествами небольшой мощности. Поэтому множества вПаскале были маленькими, ущербными.Как еще можно реализовать множества? Вариантов много : Хэш - таблицы, сбалансированные деревьяпоиска, битовые шкалы, что ещё придумаете. Но надо понимать, что не существует универсальнойреализации для любого случая.Постепенно множество тоже ушло в стандартную библиотеку(STL C++: MAP, SET, MULTISET)Строки: В стандарте Паскаля строка - упакованный массив символов.
В С - строка массив символов, точнеечисел, который заканчивается нулевым символом. Хотя существовали операции для сравнения двух строк, всеже строки рассматривались как частный случай массива. И что интересно, по мере развития языковпрограммирования строки не ушли в стандартную библиотеку, а стали частью синтаксиса языка. Давайтерассмотрим причины произошедшего? В чем специфика строк?Первое: операции. Сама частая операция над строками это их конкатенация, потом идет поиск подстроки встроке, вырезка части строки и тому подобное.В массиве же самая частая операция - это операция индексации - обращение к определенному элементумассива.
Было принято такое решение – сделать строки неизменяемыми с помощью индексации. И теперьединственный вариант изменить часть строки - предварительно её скопировать - механизм CopyOnWrite.Управление последовательностью действий.Любая программа использует циклы, условные выражения, операторы условия и т.д. - всё это операторы,управляющие последовательностью действий.
Здесь же рассматриваются такие вопросы, как порядоквычислений в арифметических выражениях, оператор GOTO, структуры ветвления.До 67 - го года все программисты были наполовину математиками, все рисовали Блок - Схемы, переводилиэти блок - схемы в двоичные коды, активно использовали оператор GOTO.
Однако в 67 году вышла статьсяголландского учёного Дейскстры о вредности оператора GOTO, и много после этого поменялось. А именно,это событие зародило начало структурному программированию. Надо сказать, что в 67 - ом году впервыепрограммистов ограничили, их как бы ущемели, сказали, что использовать GOTO - вредно, и надо именноупрощать структуру кода, ведь главное это изобретать, а не сидеть часами над кодом. В 68 году вышла статья"Заметки о структурном программировании". В 66 году была доказана полнота множества операторов:присваивания + оператор while , то есть любую блок-схему можно было реализовать используя только дваэтих оператора. Теоретический базис был положен, и нашел свое отражение в таких языках как С и Паскаль,которые являются структурными языками. Структуру можно определить как черный ящик, у которого естьвход и есть выход, а то что происходит с входом заложено внутри черного ящика.
У программистов принято восновном делить всю программу на три больших блока: подготовка - считывание данных и томуподобное,обработка, и собственно вывод.Альтернативы GOTO:* Ветвление.* Циклы* Процедуры* Переходы - return, break, continue, goto* Составной оператор(блок)Напомню блок - это объявление + операторы.Не во всех языках был реализован составной оператор. Во многих языках(АДА, Модула 2, Оберон) отказалисьот понятия составного оператора, там группа операторов явно замыкается специальным оператором(напримерIF (TRUE)<OPERATOR1><OPERATOR2>...<OPERATORN>END)То есть они придумали альтернативное решения для составного оператора - замыканиеоператоров(завершающий элемент).1. Оператор if.Сразу же о проблеме, с которой столкнулись разработчики - вложенные if else.
Решение else прикрепляется к ближайшему if, если мы хотим избежать этого то нужно использоватьсоставнойоператор. Надо различать понятие БЛОК и Составной оператор: блок – составляет область видимости, а всоставном операторе нет области видимости.Простое ветвление:С,C++:if (B) thenOperator1elseOperator2АДА:if B thenS1;S2;S3;...End ifОберон:IF B THENS1;S2;S3;S4...ELSES1;S2;S3;S4...ENDSHELLif...fiИногда применяется многовариантное ветвление(многосложное)if B1 then S1else if B2 then S2else if B3 then S3else if B4 then S4...Она эстетически не красивая, опытные программисты записывают её в столбик.if B1 then S1else if B2 then S2else if B3 then S3else if B4 then S4...Теперь попробуете записать эту же самую конструкцию на языке в котором нет понятия составногооператора, там это выглядит ещё ужаснее, появляется много закрывающих опероторов в конце.2.
Оператор выбора - дискретный случай.в Паскале:Case Expr ofсписок вариантов, Вариант имеет вид const: оператор;EndВ чистом Паскале нет else(default) константы.В С, C++, Java, C#:switch (expr) of {case 1: ... break;...case n: ... break;default: ... break;}Java не поддерживает GOTO, однако в данной конструкции она неявно используется. break - указатель напереход на конец структуры, если его нет, то дальше выполнится следующий case. Если в С++, С, Java - breakбыло писать не обязательно после каждого case, то в С# стало обязательным(ошибка компиляции). Если в С#мы хотим после завершения данного case перейти на следующий надо использовать оператор перехода.Модула - 2:CASE EXPR OF1: ... |2..4 : ...
|ELSE ...ENDАда:Case expr ofwhen <список констант иди диапазонов> => оператор1...when <список констант иди диапазонов> => операторNwhen others => операторыEnd case;3. Операторы циклы.Выделяют 4 вида цикла:1. ПокаWhile B loop .. End loop (ADA)WHILE B DO .. END (Modula - 2)While (B) S(C, C++)While B do S(Pascal)2. ДоREPEAT UNTIL B; (Modula - 2)do S while (B); (С, C++)3. FOR for v:= r1 to t2 do S(Pascal).Возможно использование downtofor (подготовка; проверка на выход; действия после каждой итерации)(C++, C)в Java, C# аналогично С, только там на каждой итерации осуществляется квазистатический контроль,то есть A[i] - должен на самом деле существовать, чтобыне вызвать ошибки.FOR V:= E1 TO E2[STEP E3(целое значение)] DO END(Модула - 2) можно было задавать шаг.Он мог быть как отрицательным так и положительным. E1, E2 - типы, к которым применимаоперация сложения и вычитания.
В одно время сложилось тенденция, что цикл for - вообще, как таковой ненужен, можно обойтись другими видами цикла, но в 1993 - вышел Оберон - 2, который по идее являетсяминимальным полным языком для написания любой программы, куда вошел и цикл for.for v in <диапазон> loop .. end loopfor i in A'RANGE loop S:= S + A(i); end loopfor i in A'FIRST..A'LAST loop S:= S + A(i); end loop; (Ада)Так как квазистатический контроль на каждой итерации цикла считается неэффективным в С# былпридуман еще один вариант цикла for - особая форма цикла.foreach (T o in C) S;int a[];foreach (int x in a) S = S + x;C - произвольная коллекция.тип T должен наследоваться от IEnumerable, в которой входит такой метод, как получитьследующий элемент. В Java сей цикл был реализован в 2005 году.4.
Бесконечный циклLOOP... IF B THEN ... EXITEND (Модула - 2)while (1) {... break...}for(;;) {... break ...} (C++, C)Loop...when B => exit...end loop (Ada)Раньше не было понятно применение бесконечного цикла, сейчас появилось много сервисов, которыеработают по 24 часа в сутки, там к примеру для приёма сообщений и их обработки используется бесконечныйцикл.Не обязательно присутствие всех 4 видов цикла в языка, так в АДЕ отсутствует ДО.Чаще всего работа с циклом строится по следующей схеме:1. Подготовка к вводу2. Обработка3. На каждой итерации проверка на завершение.В Циклах используются вспомогательные операторы break и continue.break - оператор выхода из циклаcontinue - переход на следующую итерацию циклаgoto - перейти на помеченное место в программе.
В Модуле - 2, Java.Обероне отсутствует. Нельзя по goto выйти за пределы функции или процедуры, в которой он находится.Лекция. Лихогруд Н.Н.Операторы переходаgotobreak;continue;(в Модуле-2 EXIT)return;В современных языках программирования goto является только локальнымДля организации не локальных переходов:setjmp, longjmp – В Си++ используются для обработки ошибок.throw, trace– Обработка исключенийТакже существуют специальные операторы для организации параллелеризмаLock(obj) {блок} – Си#. Поток управления блокируется, если блок кем-то используетсяaccept, select– АдаБазисы:Язык Ассемблера <––> Си <––>Си++ < ––> Java, C#Языки программирования в первую очередь различаются за счёт средств развития и их защиты.Каков минимальный набор средств развития?FORTRANПроцедуры (подпрограммы,далее – п/п)МодульностьМежмодульные связи:По данным – общие блокиПо управлению – вызов п/пЭтого уже достаточно для создания больших сложных программ, но без защиты новых абстракцийГлава 5.