лекции (2009), страница 5
Описание файла
Текстовый-файл из архива "лекции (2009)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 5 страницы текстового-файла онлайн
основном делить всю программу на три больших блока: подготовка - считывание данных и тому
подобное,обработка, и собственно вывод.
Альтернативы GOTO:
* Ветвление.
* Циклы
* Процедуры
* Переходы - return, break, continue, goto
* Составной оператор(блок)
Напомню блок - это объявление + операторы.
Не во всех языках был реализован составной оператор. Во многих языках(АДА, Модула 2, Оберон) отказались
от понятия составного оператора, там группа операторов явно замыкается специальным оператором
(например
IF (TRUE)
<OPERATOR1>
<OPERATOR2>
...
<OPERATORN>
END)
То есть они придумали альтернативное решения для составного оператора - замыкание
операторов(завершающий элемент).
1.
Оператор if.
Сразу же о проблеме, с которой столкнулись разработчики - вложенные if else. Решение else -
прикрепляется к ближайшему if, если мы хотим избежать этого то нужно использоватьсоставной
оператор. Надо различать понятие БЛОК и Составной оператор: блок – составляет область видимости, а в
составном операторе нет области видимости.
Простое ветвление:
С,C++:
if (B) then
Operator1
else
Operator2
АДА:
if B then
S1;S2;S3;...
End if
Оберон:
IF B THEN
S1;S2;S3;S4...
ELSE
S1;S2;S3;S4...
END
SHELL
if
...
fi
Иногда применяется многовариантное ветвление(многосложное)
if B1 then S1
else if B2 then S2
else if B3 then S3
else if B4 then S4...
Она эстетически не красивая, опытные программисты записывают её в столбик.
if B1 then S1
else if B2 then S2
else if B3 then S3
else 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 OF
1: ... |
2..4 : ... |
ELSE ...
END
Ада:
Case expr of
when <список констант иди диапазонов> => оператор1
...
when <список констант иди диапазонов> => операторN
when 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).
Возможно использование downto
for (подготовка; проверка на выход; действия после каждой итерации)(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 loop
for i in A'RANGE loop S:= S + A(i); end loop
for 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 ... EXIT
END (Модула - 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 выйти за пределы функции или процедуры, в которой он находится.
Лекция. Лихогруд Н.Н.
Операторы перехода
goto
break;
continue; (в Модуле-2 EXIT)
return;
В современных языках программирования goto является только локальным
Для организации не локальных переходов:
setjmp, longjmp – В Си++ используются для обработки ошибок.
throw, trace – Обработка исключений
Также существуют специальные операторы для организации параллелеризма
Lock(obj) {блок} – Си#. Поток управления блокируется, если блок кем-то используется
accept, select – Ада
Базисы:
Язык Ассемблера <––> Си <––> Си++ < ––> Java, C#
Языки программирования в первую очередь различаются за счёт средств развития и их защиты.
Каков минимальный набор средств развития?
Этого уже достаточно для создания больших сложных программ, но без защиты новых абстракций
Глава 5. Подпрограмма
п5.1 Потоки управления – подпрограммы и сопрограммы
Управление входит через заголовок в блоке и возвращается в точку вызове, после выполнения тела.
CALLER – вызывающий подпрограмму(надпрограмма)
CALLEE – вызываемая подпрограмма
Процедуры (подпрограммы,
NARTROFдалее – п/п)
Модульность
Межмодульные связи:
По данным – общие блоки
По управлению – вызов п/п
SUBROUTINE – подпрограмма
COROUTINE – сопрограмма
Также нарушение априорного порядка выполнения команд может происходить при генерации исключений.
Впервые механизм сопрограмм был придуман для компилятора COBOL. Вспомните задание по Си++ в 4-м
семестре, где нужно было написать транслятор модельного языка:
Лексический анализатор, Синтаксический анализатор, Генератор кода – всё это сопрограммы.
//PP
….
….
call P
//P
….
….
Неравенство
//PP
….
….
resume P
//P
….
….
resume PP
….
Равенство