Программирование для гуманитариев

Процедурная парадигма

Разбить на страницы
Показывать лекцию целиком

Цель лекции:

  • Познакомить читателей с основными конструкциями процедурной парадигмы программирования;
  • Научить читателей программировать, читать алгоритмы, создавать программы на языках программирования, входящих в процедурную парадигму;
  • 4.1. Особенности этой парадигмы

    4.1.1. Конструкции языка

    В качестве основных конструкций языков, построенных на "процедурной парадигме", используются:

  • Оператор присвоения значений;
  • Операторы условия " if … then ";
  • Операторы ветвления " if … then … else … ";
  • Операторы цикла: "пока" ( while );
  • Оператор цикла: "делать … пока" ( do … while );
  • Оператор цикла с индексом;
  • Оператор множественного выбора;
  • Оператор выхода из цикла: " break ";
  • Оператор новой итерации: " continue ";
  • Оператор безусловного перехода: " goto ";
  • Оператор вызова процедуры/функции;
  • Операторы ввода-вывода;
  • Составной оператор;
  • Оператор выхода из процедуры.
  • Рассмотрим эти операции поподробнее.

    4.1.1.1. Оператор присваивания

    Основной оператор "присвоения значений" переменным обозначается как " = " или " := ". Его синтаксис следующий:

    <переменная> = <выражение>

    где <переменная> - идентификатор, задающий имя переменной определенного типа, а <выражение> - новое значение переменной, представляющее собой константу, переменную, арифметическое, логическое, символьное выражение либо вызов функции.

    Замечание. При присвоении переменной нового значения старое значение теряется безвозвратно. Это надо помнить. Также значение теряется при выходе из блока или функции, в котором была объявлена переменная.

    Оператор присвоения значений обозначается в блок-схеме как прямоугольник.

    Примечание: при реализации оператора присвоения значений тип данных, под которым определена переменная, может не совпадать с типом данных, возвращаемых выражением. Поэтому может потребоваться операция принудительного приведения типов. По поводу операций приведения типов смотри [лекцию 5] данного курса.

    4.1.1.2. Оператор условия

    Этот оператор служит для реализации реакции алгоритма на некоторое условие: значения переменной, или событие в ЭВМ и ее окружении. Синтаксис оператора следующий:

    IF <условие> THEN <оператор>

    где <условие> - переменная булевского (логического) типа или операция отношения между целыми, вещественными, символьными константами, переменными и выражениями, а <оператор> - любой допустимый оператор языка, группа этих операторов в скобках (в блоке) либо (в старых языках программирования) - оператор безусловного перехода на метку. Оператор вычисляется в случае истинности условия в этом операторе.

    Примечание: меткой называется номер строки, число либо идентификатор, стоящий перед оператором и указывающий, куда будет перенаправлено выполнение программы после оператора перехода. Замечание: на операции отношения в арифметике плавающей точки накладываются ограничения, а именно - исключение из рассмотрения операций отношения "равно" и "не равно". Поскольку вещественные числа представляются в виде "фрагмента" бесконечной дроби, чувствительного к ошибкам округления, то, например, выражение: 2.0 * 2.0 - может не равняться константе 4.0. Следовательно, отношение "равно" переменных с плавающей точкой будет всегда "ложь", а отношение "не равно" - всегда истина. То же самое относится и к операторам отношения: "больше или равно" и "меньше или равно".

    Оператор: "условие" на блок-схеме представляется так, как показано на рис 4.1:

    (рис 4.1) Оператор "условие" на блок-схеме.

    Оператор условия является самым "древним" оператором изменения последовательности действий операторов алгоритма. Он применялся еще в релейной ЭВМ К. Цюзе.

    Примеры написания условия:

    [Пример 01]

    /* 1. Переменная D больше нуля? (Да/Нет) */
    
    D > 0
    
    /* 2. Переменная x лежит в пределе значений от -1 до +1 (на языке Си) */
    
    x >= -1  x <= 1
    
    REM 2. То же самое на языке Бейсик
    
    X >= -1 AND X <= 1
    
    /* 3. Файл, связанный с дескриптором: fstream, не прочитан до конца (переменная eof не равна 0, язык Си) */
    
    !eof( fstream )

    4.1.1.3. Оператор "ветвления"

    Этот оператор очень похож на оператор условия. Его синтаксис следующий:

    if <условие> then <оператор-истина> else <оператор-ложь>

    где <условие> - то же, что и в [разделе 4.1.1.2], <оператор-истина> - оператор или группа операторов, выполняемых в случае истинности условия, а <оператор-ложь> выполняется в случае невыполнения условия оператора ветвления. После выполнения оператора ветвления продолжается выполнение последовательности операторов, нарушенной при вызове оператора ветвления.

    На блок-схеме оператор "ветвления" представлен так, как показано на рис 4.2.

    (рис 4.2) Оператор ветвления на блок-схеме.

    Оператор ветвления появился сравнительно недавно, в 1970 году в языке: "Паскаль".

    4.1.1.4. Оператор цикла: "Пока"

    Операторы цикла предназначены для многократного повторения одних и тех же операций (операторов) в программе. Цикл завершается после выполнения условий окончания цикла, после чего следуют остальные операторы алгоритма. Если выхода из цикла нет, то говорят, что программа: "зацикливается".

    Самым "строгим" циклом (в смысле его соответствия правилам структурированной парадигмы программирования) является цикл: "Пока". Его синтаксис следующий:

    while <условие> do <оператор>

    где <условие> - условие входа в цикл и его окончания (в случае несовпадения значения выражений этому условию продолжения цикла). Условием может быть переменная логического типа, или операция отношения между целыми, вещественными, символьными константами и переменными, и выражений с ними, <оператор> - любой допустимый оператор или блок операторов языка программирования. Примеры операторов цикла на языке Си представлены в примере 02.

    [Пример 02]

    /* 1. Чтение и печать всех строк из текстового файла (до тех пор, пока не кончился файл) */
    
    /* Описание констант */
    
    const short MAXSTR = 255;
    
    /* Описание переменных */
    
    FILE *stream;
    char str[MAXSTR];
    
    …
    
    while( !eof( stream ) ) 	// Пока не достигнут конца
    {			// потока stream цикл
    	fgets( str, MAXSTRING, stream ); // Читается файл в строку
    	puts( str );	// печать строки на экране дисплея
    } // Конец цикла
    
    …
    
    /* 2. Реализация функции "эникейщиков" (цикла пока не нажата клавиша). */
    
    char c; // Символ ввода
    с = '\0'; // условие продолжения цикла
    while( !c ) c=getc(); // Бесконечный цикл, пока не введен с клавиатуры символ c.

    На блок-схеме оператор цикла: "пока" - имеет вид, приведенный на рис 4.3:

    (рис 4.3) Оператор цикла: "пока", - на блок-схеме.

    Как видно из указанных примеров, для реализации цикла "пока" должны быть выполнены следующие условия:

  • условие входа в цикл;
  • условие выхода из цикла;
  • последнее условие должно меняться в теле цикла.
  • Вообще цикл "пока" соответствует модификатору "звездочка" в регулярном выражении (то есть повторению ноль или более раз). О синтаксисе регулярных выражений смотри следующие лекции (в частности, лекции 11, 12).

    4.1.1.5. Оператор цикла: "до … пока"

    Этот оператор аналогичен оператору цикла "пока", за исключением того, что операторы в теле цикла будут исполняться минимум один раз. Синтаксис этого оператора следующий:

    do <оператор> while <условие>

    где <условие> - условие окончания цикла (см. раздел 4.1.1.4), а <оператор> - любой допустимый оператор или блок операторов языка программирования, который выполняется определенное число раз ("тело цикла"). В теле цикле должно находиться условие, прекращающее цикл. В противном случае цикл будет повторяться бесконечное число раз (будет "зацикливаться").

    На блок-схеме цикл: "до … пока" имеет следующий вид (см. рис 4.4):

    (рис 4.4) Оператор цикла: "до … пока" на блок-схеме.

    Цикл: "до … пока" соответствует модификатору "плюс" ("+") в регулярном выражении (повторению один или более раз).

    Примечание: правилом "хорошего тона" в программировании является не использование цикла: "до … пока", - а замена его циклом: "пока" (с соответствующим изменением алгоритма). Хотя автор выступает против этого правила: созданные с помощью цикла: "до … пока" алгоритмические конструкции более просты в понимании.

    4.1.1.6. Оператор цикла с индексом

    Не смотря на то, что цикл с параметром - одна из первых синтаксических конструкций, не существует единого стандарта на его запись. В "наиболее общей форме" этот цикл записывается так:

    для <пер> от <начало> до <конец> шаг <шаг> делать <оператор>

    где <пер> является переменной целого типа, принимающая значение переменной - индекса. Вне цикла ее значение не определено (попросту, ее нельзя использовать вне цикла). <начало> означает начальное значение индекса в цикле, <конец> - конечное значение индекса в цикле, а <шаг> - приращение цикла на каждой итерации (по-умолчанию используется приращение переменной цикла, равное "+1"). <начало>, <конец> и <шаг> могут принимать значения констант и переменных, однако переопределение этих параметров в цикле запрещено. Параметр <оператор> имеет то же значение, что и в описании цикла: "пока" (см. [раздел 4.1.1.4]).

    Конструкция, приведенная в [4.6], задает переменной <пер> последовательность значений: <начало>, <начало>+<шаг>, <начало>+2·<шаг>, …, <конец> на каждой итерации. При этом "тело цикла" повторяется int((<конец>-<начало>)/<шаг>)+1 число раз (см. формулу 4.7), Это число должно быть больше нуля.

    n := int( (<конец>-<начало>)/<шаг>)+1
    Примечание: если по формуле 4.7 получается отрицательное число, компилятор выдаст сообщение об ошибке. Если оно находится в пределах [0;1], то число повторений не определено (все зависит от реализации языка). Примечание: этот цикл соответствует модификатору: " {n} " в регулярных выражениях (n-точное число повторений). Оператор "цикл с параметром" может быть реализован циклом: "пока" - следующим образом (см. Пример 03):

    [Пример 03]

    /* Объявление переменных цикла: */
    
    int i, imax=10;
    
    /* Присвоение начального значения переменной: */
    
    i = 0;
    
    /* Объявление цикла и условия остановки цикла: i >= 10 */
    while( i < imax )
    {
    
    // Тело цикла;
    
    i++; // Инкремент переменной i (увеличение ее значения на единицу)
    } /* Конец цикла */

    В Примере 04 приведен код подпрограммы, задающий обратный порядок следования символов в строке языка Си без использования специальных функций:

    [Пример 04]

    /* Определение констант */
    const short MAXSTRLENGTH = 255;
    
    /* Определение переменных */
    char c; //Временная переменная
    str[MAXSTRLENGTH]; // искомая строка
    int i, nmax, imax; // Индекс массива и максимальное число итераций
    
    /* Определение числа повторений */
    imax = strlen(str);
    nmax = imax/2; // Для неполных строк
    /* Цикл: */
    for( i = 0; i < nmax; i++)
    {
    	c = str[i];
    	str[i] = str[imax-i];
    	str[imax-i] = c;
    /* В цикле меняются первые и последние элементы */
    }
    /* Конец цикла */
    Примечание: определение типов, операций, функций и т.п. смотри в лекции 5.

    На блок-схеме цикл с параметром имеет следующий вид (см. рис 4.5).

    (рис 4.5) Оператор цикла с параметром на блок-схеме

    На языке Quick Basic алгоритм из примера 04 будет записан следующим образом:

    [Пример 05]

    STRINGS$ = "Demo"
    REM Определяется длина строки переменной STRINGS$
    IMAX% = LEN(STRINGS$) + 1
    REM Определяется число циклов
    NMAX% = IMAX% / 2
    REM Цикл:
    FOR I% = 1 TO NMAX%
    C$ = MID$(STRINGS$, I%, 1)
    MID$(STRINGS$, I%, 1) = MID$(STRINGS$, IMAX% - I%, 1)
    MID$(STRINGS$, IMAX% - I%, 1) = C$
    NEXT I%
    REM Конец цикла
    PRINT STRINGS$
    END

    Цикл с параметром используются в следующих случаях:

  • При задании точного числа повторений тела цикла;
  • Для последовательного изменения "индекса массива" (при операциях с ними в теле цикла). Об индексах массива см. лекцию 7.
  • 4.1.1.7. Оператор множественного выбора

    Этот оператор используется для выбора одной из нескольких альтернатив выполнения алгоритма, задающихся значением целой переменной. Его синтаксис примерно следующий:

    Для <переменная> выбор <откр_скобка>
    при <значение1>:
    	<тело 1>; break;
    при <значение2>:
    	<тело 2>; break;
    …
    иначе:
    	<последнее тело>;
    <закр_скобка>

    где <откр_скобка><закр_скобка> - "составной оператор" (см. [раздел 4.1.1.13]); <переменная> - переменная целого типа или типа, приводимого к целому (например, перечисления, одиночный символ и т.п.); <значение n> - одно из возможных значений этой переменной, < тело n> - последовательность действий для этого значения переменной; и <последнее тело> - последовательность операций в случае, если переменная не принимает ни одного из значений в блоке: при.

    Замечание: оператор множественного выбора может "моделироваться" повторением оператора ветвления, например:

    [Пример 06]

    если <значение 1> то <тело 1>
    иначе если <значение 2> то <тело 2>
    иначе если …
    иначе <последнее тело>

    где <тело> - оператор или последовательность операторов, заключенных в скобки.

    Замечание: оператор множественного выбора не часто встречается в символьных вычислениях. Вместо него чаще используется конструкция из примера 06. (рис 4.6) Множественный выбор на блок-схеме.

    4.1.1.8. Оператор выхода из цикла: "break"

    Иногда в реализации алгоритма возникают условия, когда нужно выйти из цикла до завершения всех его итераций. Именно для этих целей служит оператор выхода из цикла. Его синтаксис следующий:

    break;

    Этот оператор прекращает действие текущего цикла, и переводит выполнение программы в точку за прерванным циклом (в тело программы или в тело "родительского" цикла).

    Замечание: если по условию нужно выйти изо всех циклов ("кессонный выход"), лучше использовать оператор безусловного перехода goto (см. раздел 4.1.1.10). Примечание: в языке Perl изменен порядок выхода из цикла и синтаксис операций. Подробнее смотри [59].

    4.1.1.9. Оператор новой итерации: "continue";

    Часто в реализации алгоритма требуется прервать выполнение тела цикла и перейти к следующей итерации. Эта операция реализована в разных языках по-разному. На языке Си его синтаксис следующий:

    continue;

    Конкретную реализацию этой конструкции смотри [59,31,51,74].

    Замечание. в языках, не имеющих конструкции: " continue ", (например - в Quick Basic), данную операцию можно "моделировать" с помощью безусловного перехода " goto " на метку после последнего оператора тела цикла.

    Приведем пример, как можно использовать операции " break " и " continue " в бесконечном цикле на языке Си:

    [Пример 07]

    char c; // Определение переменной
    
    while(1) 		// бесконечный цикл
    {
    	c=getc() 	// Чтение символа с клавиатуры
    	// Выход, если введен символ ("эникейщиком")
    	if( c ) then break; else continue;
    }

    4.1.1.10. Оператор безусловного перехода: "goto"

    Этот оператор является самым первым оператором для изменения последовательности выполняемых действий. В настоящее время его применение считается "дурным тоном", поэтому его использования необходимо избегать. Однако он незаменим в следующих случаях:

  • В языке отсутствуют другие конструкции алгоритма, более "структурированные" (например, в языке Ассемблер);
  • Необходимо выполнить "кессонный" выход из цикла при возникновении "исключительной ситуации".
  • Примечание: "Кессонный выход" из вложенного цикла подразумевает прекращение итераций и выход не только из "текущего цикла" (в котором возникла исключительная ситуация), но также из "родительского цикла" и даже вообще из всех циклов, заставив ЭВМ продолжать выполнение программы вслед за вложенными циклами. "Кессонным" этот выход называется так потому, что он как бы соответствует "немедленному подъему водолаза на поверхность", без предварительной адаптации его к пониженным давлениям. В результате этого подъема у водолаза может наблюдаться "кессонная болезнь", которая заключается в закупоривании сосудов пузырьками сжатого воздуха. Поскольку этот подъем небезопасен, его используют редко. То же самое относится к "кессонному выходу из цикла": при возможности его следует избегать.

    Синтаксис оператора безусловного перехода следующий:

    goto <метка>

    где <метка> - смотри первое примечание (в разделе 4.1.1.2).

    На блок-схеме безусловный переход указывается линией со стрелкой.

    4.1.1.11. Оператор вызова процедуры/функции

    Этот оператор является "основным" оператором процедурного программирования. Его синтаксис:

  • для вызова подпрограмм
    <имя подпрограммы>(<фактические параметры>)
  • для вызова функции
    <переменная> = <имя функции>(<фактические параметры>)
  • Здесь <имя подпрограммы> (<имя функции>) - имя, под которым процедура (подпрограмма или функция) встречается в программе, <переменная> - возвращаемое функцией значение переменной, а <фактические параметры> - список передаваемых программе параметров-констант и переменных (их значений).

    При вызове процедур тип и число переменных - фактических параметров должно совпадать с числом и типом формальных параметров, заданных при объявлении процедуры. Объявление процедуры следующее:

    [<тип>]<имя процедуры>(<формальные параметры>) <тело процедуры>

    где <тип> - тип возвращаемого функцией результата (отсутствует при вызове подпрограммы), а <формальные параметры> - передаваемые через стек значения переменных. Синтаксис формальных параметров:

    <формальные параметры> ::= <тип> <имя>{,<тип> <имя>}*

    где <тип> - тип переменной - формального параметра (должен совпадать с типом фактического параметра), <имя> - имя переменной - формального параметра (может отличаться от имени/значения фактических параметров), остальные знаки - специальные символы РБНФ (не пишутся в образце).

    Замечание: в языке Си есть разница между объявлением и описанием процедуры. При объявлении дается структура, указанная в формуле 4.14, но без тела функции. Описание функции представляет собой структуру [4.14], но содержащие операторы алгоритма в теле функции. Объявление функции должно предшествовать не только его описанию, но и использованию. В остальных языках, как правило, объявления и описания совпадают. Замечание. Фактические параметры могут передаваться по значению и по ссылке. При передаче по значению значение переменной - фактического параметра заносится в стек, и формальный параметр принимает значение уже из стека. При выходе из процедуры значение переменной в стеке уничтожается. Передача данных по ссылке - это, фактически, передача "разыменованного указателя на переменную". При выходе из процедуры значение переменной - формального параметра сохраняется и передается фактическому параметру. Подробнее о передаче параметров смотри в лекции 7. Хотя передача параметров по ссылке выглядит предпочтительнее, ее использование ведет к усложнению машинного кода и снижению безопасности системы. Примечание: "Джентльменское соглашение" о последовательности записи формальных параметров следующие:
  • Сначала идут передаваемые по значению переменные, потом - передаваемые по значению указатели, и в конце - передаваемые по ссылке переменные и указатели;
  • Вначале идут переменные с исходными значениями, затем - переменные, изменяющие значения исходных переменных, и лишь затем - счетчики, дескрипторы (файлов, областей памяти) и т.п.
  • Вызов процедуры на блок-схеме изображается так, как показано на рис 4.7

    (рис 4.7) Обозначение вызова процедуры на блок-схеме.Замечание. Тип возвращаемого функцией значения может переопределяться (см. раздел лекции 7).

    4.1.1.12. Операторы ввода-вывода

    В большинстве языков ввод-вывод осуществляется с помощью функций или операторов, очень похожих на функцию.

    Здесь автор отмечает, что ввод-вывод данных может быть прямым (сразу на консоль или в файл), буферизированным, или "потоковым" (через определенный буфер, связанный с файлом либо устройством и расположенный в оперативной памяти компьютера) и, наконец, "графическим", через заранее определенный GUI API ("программный интерфейс приложения для графического пользовательского интерфейса"). Для каждого из этих типов вывода существуют свои API (функции и библиотеки). Подробнее о функциях ввода-вывода смотри [59, 31, 51, 74, 86-91].

    Вид операторов ввода и вывода данных на блок-схеме представлен на рис 4.8.

    (рис 4.8) Обозначение операторов ввода-вывода на блок-схеме.

    4.1.1.13. Составной оператор

    Блок операторов представляет собой допустимую последовательность операторов, заключенных в скобки (например, в Си/C++ это фигурные скобки: "{…}") или между лексемами: "Begin … End" (как в Паскале и Алголе).

    На блок-схеме такие операторы никак не выделяются, а представляют собой просто последовательности операторов.

    Составной оператор применяется в следующих случаях:

  • В операциях условия, цикла, ветвления, множественного выбора, когда вместо одного оператора необходимо выполнить несколько операций (блок);
  • Необходимо определить "локальные переменные", определяемые лишь внутри блока;
  • Нужно написать тело функции или процедуры.
  • Новые переменные определяются только в начале блока, и их действие заканчивается после выхода из блока.

    4.1.1.14. Оператор выхода из процедуры

    Этот оператор имеет следующий синтаксис:

    return [<значение>]

    где <значение> - выдаваемое после окончания функции ее значение (только для функций).

    Оператор " ).

    (рис 4.9) Изображение оператора: "выход из функции" на блок-схеме.

    4.1.1.15. Резюме

    Итак, мы познакомились с основными алгоритмическими конструкциями, присутствующими в языках программирования процедурной парадигмы. Более подробно о синтаксисе этих конструкций в конкретных языках программирования смотри [59, 31, 51, 74, 92, 78]. Там же смотрите примеры программ.

    А мы движемся дальше, к общему представлению программ на процедурных языках и описанию "метаязыков".

    4.1.2. Особенности метаязыка для процедурной парадигмы

    Для визуализации алгоритмов, созданных с помощью процедурной парадигмы, используют:

  • блок-схемы;
  • "школьный" язык программирования, созданный Кушниренко.
  • Рассмотрим эти способы поподробнее:

    4.1.2.1. Блок-схемы

    Это "старый" способ визуализации алгоритмов. Его преимущества очевидны при "неструктурированном" программировании (например, на языке "Ассемблер"). Вот его составные части:

  • Начало программы отмечается символом, указанным на рис 4.9 a, а окончание отмечается изображением, указанным на рис 4.9 b;
  • Переход к следующему по-порядку оператору осуществляется при помощи линий со стрелками;
  • Разрыв линий указывается с помощью фигуры на рис 4.10;(рис 4.10) Фигуры, указывающие на "разрывы" линий, отмечающих последовательность операторов.
  • Основные конструкции алгоритмов на блок-схемах представлены фигурами, изображенные на рисунках: 4.1 - 4.7;
  • Операторы ввода-вывода данных представлены фигурами, изображенными на рис 4.8.
  • Все остальные операторы представлены прямоугольником, указанным на рис 4.11.(рис 4.11) Обозначение операторов на блок-схеме.
  • Ниже приведена блок-схема алгоритма нахождения наибольшего общего делителя по алгоритму Евклида.

    [Пример 08]

    (рис 4.12) Блок-схема алгоритма Евклида.Примечание. Блок-схему алгоритма всегда следует прикладывать как приложение к тексту программы на "неструктурированных" языках программирования, таких как "Ассемблер" и "BasicA" (ранняя реализация Бейсика от Microsoft).

    4.1.2.2. "Школьный" язык программирования

    Этот "язык записи алгоритмов" был предложен в 1986 году Кушниренко [55] специально для обучения программированию в средних школах. Этот язык оказался настолько "мощным" для описания алгоритмов процедурной парадигмы, что он используется (с небольшими изменениями) до сих пор.

    В приложении I представлены основные конструкции этого языка. В примере 09 представлена запись алгоритма из примера 08 на "школьном" языке.

    [Пример 09]

    В приложении II находятся требования к "описательной части" школьного языка программирования, не вошедшие в приложение III

    4.1.2.3. Требования для "структурирования" алгоритма

    Вот еще одно "неписанное правило" структурированного программирования:

    "Каждый оператор внутри блока операторов должен выделяться дополнительным фиксированным отступом от левой границы текста на одну позицию табуляции (символ "\t"). При закрытии блока операторов позиция отступа "уменьшается назад" на одну позицию табуляции."

    Для иллюстрации этого правила смотри Пример 09 на "школьном" языке программирования.

    4.1.2.4. Резюме метаязыков

    В предыдущих разделах мы ознакомились с основными "метаязыками" программирования, используемых при записи алгоритмов, вместе с их возможными областями применения. Вы получили представления о блок-схемах, "школьном языке программирования", познакомились с основными правилами "структурированной парадигмы". Более подробно о процедурной парадигме программирования смотри, например, [64].

    4.2. Резюме процедурной парадигмы

    Итак, процедурная парадигма содержит в себе семейство императивных языков программирования, позволяющих на "низком" и "высоком" уровне создавать алгоритмы для обработки "произвольных" данных. Процедурная парадигма идеально подходит для программирования в рамках "командного интерфейса", когда пользователь подает компьютеру команду на выполнение действий, а компьютер выдает результат ее исполнения.

    Поскольку командный интерфейс немного устарел, то, в настоящее время командная парадигма используется ограниченно: только для написания драйверов, утилит командной строки, макросов и скриптов.

    4.3. Глоссарий

    Термин Англ. Термин Разъяснение
    принудительное приведение типов forced reduction of types Явное, не зависящее от реализации языка программирования изменение типов данных для выражений и функций этого языка. Принудительным приведением типов нужно пользоваться с осторожностью, поскольку эти операции не генерируют ошибок (переполнения, исчезновения значащих разрядов, например). Но часто это единственный способ заставить работать функцию.
    оператор присваивания (значений) assignment statement (of values) Оператор (или операция) назначения нового значения переменной. Этим новым значением может быть значение константы, переменной, арифметического, логического, символьного выражения либо функции. При присвоении переменной значения старое ее значение теряется безвозвратно!
    имя переменной variable name Идентификатор, который "именует" значение переменной, хранящейся в оперативной памяти компьютера.
    оператор условия operator of condition Оператор, изменяющий линейную последовательность операций в случае наступления какого-либо условия, и выполняющий последовательность действий, прописанную программистом при наступлении условия. В случае не наступления условия линейная последовательность действий продолжается.
    условие condition Некоторое "событие в ЭВМ и ее окружении", изменение значения одной из переменных, реакция на результат выполнения арифметического или логического выражения, подачи команды на вход программы, окончания файла, начало и конец операции ввода-вывода и т.п., которые требуют изменения последовательности действий в алгоритме. Условия используются в операторах условия, ветвления, циклов, при множественном выборе.
    значение переменной variable value Содержимое ячейки оперативной памяти компьютера, на которую указывает имя переменной, определенной в одном из языков программирования. В отличие от значения константы это значение может изменяться. При этом старое значение полностью и безвозвратно уничтожается! Замечание: тип значения переменной определяется не ее значением, а ее объявлением.
    событие (в ЭВМ) event (in the computer) Наступление конкретного исхода наблюдения за работой системы. События бывают внешними (нажатие клавиши на клавиатуре, щелчок клавишей мыши или перемещение его курсора, получение сигнала-запроса на прием данных от модема или сетевого адаптера и т.п.), а могут быть и внутренними (запрос программы на отрисовку на экране своего "рабочего окна", сообщение таймера, сообщение системы, что программа "зависла", сообщение оборудования об отказе и т.п.). Управление системой "по событиям" является основополагающей частью объектно-ориентированного программирования. В командном интерфейсе события используются реже.
    окружение компьютера computer environment Текущие параметры конфигурации, с которыми загружается компьютер. Включает в себя переменные среды, файлы конфигурации программ, файлы "реестра Windows". Окружение компьютера может быть системным и пользовательским.
    системное окружение system environment Переменные среды, файлы конфигурации "общесистемных" программ и "демонов", записи в реестре Windows, применимые для всех пользователей данного компьютера.
    пользовательское окружение user environment Переменные среды, файлы конфигурации "пользовательских" программ и "демонов", записи в реестре Windows, применимые для конкретного пользователя данного компьютера.
    булевский тип Boolean type Тип переменных, способные принимать только два значения: "Истина" или "Ложь".
    логический тип logical type То же, что и булевский тип данных
    операция отношения ratio relationship Отношение между двумя объектами в математике, логике и программировании. Отношения бывают арифметическими, логическими и символьными.
    символьные отношения character ratio Отношение между двумя целыми числовыми кодами, представляющие строки в ЭВМ. Доступны следующие отношения: "равно", "не равно", "больше", "больше или равно", "меньше", "меньше или равно", "содержит", "не содержит". Значение операторов символьных отношений зависит не только от значения элементов строк (символов) но и от длины этих строк.
    безусловный переход unconditional transition Оператор в программе, прерывающий линейную последовательность действий и передающий управление коду, расположенному после указанной в операторе метки. В структурированном программировании оператор безусловного перехода можно использовать только для "кессонного" выхода из цикла.
    строка row Горизонтально расположенная последовательность символов.
    оператор перехода transition operator Оператор, изменяющий линейную последовательность действий алгоритма. Им может быть один из следующих операторов: оператор условия, ветвления и безусловного перехода.
    бесконечная дробь unending fraction Десятичная дробь, имеющая бесконечное число знаков после запятой. Если эти знаки повторяются с определенной периодичностью, то говорят о рациональной дроби. В противном случае мы получаем иррациональное число (дробь).
    оператор ветвления operator of branching Оператор перехода, который в зависимости от условия реализует две альтернативные последовательности в алгоритме.
    группа операторов group of the operators Несколько операторов, объединенных в соответствии с логикой алгоритма в единый блок.
    блок block Часть последовательности инструкций программы, ограниченные "скобками" и рассматривающиеся обработчиками языка как один операнд. С помощью операндов, например, определяется тело циклов и операций ветвления.
    истинность (условия) truth of condition Логическое выражение, состоящее из операций арифметического и логического отношения, а также вызова возвращающих значения функций, принимающих положительное (истинное) значение.
    цикл "пока" while cycle Цикл, тело которого выполняется произвольное число раз, в зависимости от истинности условия окончания цикла. Если цикл выполняется бесконечное число раз, то говорят, что "программа зациклилась". Цикл "пока" может не выполняться ни один раз, если не соблюдается условие входа в цикл.
    условие окончания цикла condition of the cycle termination Условие, после наступления которого тело цикла перестает выполняться, и происходит переход на первый следующий за телом цикла оператор.
    зацикливание recycling Ситуация, возникающая при реализации циклов: "пока" и "до…пока", а также при неправильной установки безусловных переходов, когда тело цикла выполняется бесконечное число раз. Это свидетельствует об ошибке в алгоритме программы.
    условие входа в цикл condition of the cycle beginning Условие, необходимое для того, чтобы цикл "пока" выполнился хотя бы один раз. Как правило, условие входа в цикл соответствует условию выходу из него.
    модификатор (в регулярном выражении) modifier (of a regular expression) Дополнительный символ регулярного выражения, указывающий, сколько раз могут входить символы в указанный образец. Модификаторами регулярных выражений могут быть символы: *, +, ?, {, }, (, ), [,].
    модификатор "*" modifier "*" Модификатор регулярного выражения, указывающий, что предыдущий символ или группа символов могут повторяться множество раз (от нуля до бесконечности).
    цикл "до…пока" "do…while" cycle Цикл, аналогичный циклу "пока", тело которого будет выполняться хотя бы один раз. Условие входа в цикл: "до…пока" всегда истинно.
    модификатор "+" modifier "+" Модификатор регулярного выражения, указывающий, что предыдущий символ или группа символов могут повторяться множество раз (от одного до бесконечности), но хотя бы один раз должен присутствовать.
    цикл с параметром cycle with parameter Цикл, повторяющееся определенное заданное наперед число раз, в зависимости от значений параметра-индекса.
    индекс index Переменная, задаваемая при инициализации цикла с параметром и изменяющаяся на одно определенное значение после конца каждой итерации. Индекс нельзя изменять внутри цикла. Значение переменной-индекса при выходе из цикла не определено.
    переопределение redefinition Операция, при которой тип и значение идентификатора переменной (или функции) меняется. Переопределение переменных обычно можно (но нежелательно!) проводить лишь в начале описания блока операторов.
    оператор множественного выбора multiply branch operator Оператор, реализующий несколько (более двух) альтернатив в выполнении операторов алгоритма в зависимости от значения "ключевой" переменной. Ключевая переменная может иметь целый тип, тип-перечисление или быть одиночным символом.
    перечисление enumeration Целый тип данных, способный принимать только небольшое ("перечисляемое") множество значений-констант. Эти константы определяются при описании данного типа данных на языке программирования.
    одиночный символ single character Целое число, представляющее символ в одной из кодировок. Все символы кодируются только целыми числами.
    итерация iteration Однократное выполнение (прогон) всего тела цикла в результате работы цикла с параметром, циклов "пока" и "до…пока".
    прерванный цикл broken cycle Цикл, тело которого перестает выполняться на одной из итераций притом, что условие окончания цикла не выполняется. После этого продолжает выполняться программа позади последнего оператора тела цикла. Обычно оператор "обычного" прерывания цикла называется: "break".
    кессонный выход caisson exit Выход сразу из нескольких вложенных циклов "наверх", позади тела последнего цикла. Обычно осуществляется оператором безусловного перехода на метку.
    тело цикла body of the cycle Последовательность операторов (не всегда линейная) внутри блока "составного оператора", который выполняется внутри цикла. Как правило, в цикле можно использовать либо одиночный оператор, либо составной оператор-блок с телом цикла.
    множественный выбор multiple choice Оператор предназначен для выбора одной из нескольких альтернатив в исполнении алгоритма, задающихся значением целой переменной или переменной, приводимых к целому значению.
    альтернатива (выполнения алгоритма) alternative (of algorithm executions) Выбор из нескольких "не пересекаемых" путей алгоритма, или выбор из нескольких взаимно исключающих вариантов выполнения алгоритмов.
    значение, приводимое к целому value, reduced to an integer Значение переменной в ячейке памяти некоторого типа, представленное в виде целого числа. Среди приводимых к целому типов значений относят символьные и "перечисляемые" типы значений.
    моделировать simulate Воссоздать существенные составные части предмета ("модель") и условия его "внешнего окружения", на которых будут осуществлять ("моделировать") особенности его поведения. При этом модель и ее окружение может не совпадать с оригиналом ни по внешнему виду, ни по "масштабу". На моделях можно исследовать те особенности функционирования реальных объектов, которые проверять на оригиналах затруднительно либо опасно.
    родительский цикл parent's cycle Цикл, в теле которого находится другой ("дочерний") вложенный в него цикл. Для выхода из родительского цикла обычно нужно завершить выполнение "дочернего" цикла или провести "кессонный" выход из цикла.
    возвращаемый результат returned result Единственный вариант-значение функции, которое возвращается основной программе в случае определенного сочетания параметров функции и/или события или окружения в компьютере. В Си-подобных языках возвращаемое значение задается оператором: return "значение".
    специальные символы РБНФ special symbols of EBNF Специальные символы, используемые при объявлении правил грамматики в расширенной Бэкусовой нормальной форме. К ним относятся символы: [, ], {, }, ::=, (, ), |, "" и некоторые другие.
    описание description Один из двух основных видов элементов программы на языке программирования (другим является оператор). Описание вводит ("представляет") объект программе, назначает его имя и тип данных.
    описание (процедуры) description (of a procedure) Описание процедуры определяет имя функции, тип возвращаемое ей значения, тип и количество формальных параметров, а также (в теле функции) задает алгоритм ее функционирования (путем программирования).
    исходные значения (фактических параметров) initial values (of the actual parameters) Первоначальное значение фактических параметров, которые были переданы функции при ее вызове. При этом исходные значение для переменных, переданных по значению, не меняется, а исходные значения переменных, переданных по ссылке или как указатели, может измениться после выхода из функции.
    указатель на переменную variable pointer Представляет собой переменную, содержащий адрес указанной переменной в оперативной памяти компьютера.
    разыменованный (указатель) dereferencing (pointer) Разыменованный указатель - это переменная, содержащая значение переменной в ячейке памяти, на которую указывает указатель. Эта значение не является ни копией значения, ни адресом переменной. Конкретная реализация таких указателей зависит от реализации языков программирования.
    счетчик counter Переменная, значение которой увеличивается или уменьшается в процессе вычислений, и при равенстве этого значения некоторой величине запускается внешний процесс: подпрограмма, функция, операторы условия, выхода из цикла, безусловный переход.
    дескриптор 1 descriptor Переменная, которая содержит в себе некоторый номер, по которому операционная система выделяет некоторый ресурс или определяет некоторый процесс. Внимание! Значение дескриптора не является ни значением элемента, ни его адресом.
    дескриптор 2 handle То же, что и дескриптор 1. Этим словом обозначаются дескрипторы в Windows.
    операторы ввода-вывода input-output operators Операторы, служащие для обмена информацией между ЭВМ и периферийными устройствами. Чаще всего ввод-вывод подразумевает преобразование сигналов ЭВМ в форму, "понятную" человеку.
    прямой ввод-вывод direct input-output Прямой ввод-вывод подразумевает непосредственное управление процессором (возможно, при помощи драйверов и прерываний операционной системы) операций ввода-вывода на консоль, модем, файл или принтер. При этом выдаются полностью все инструкции управления устройством, и программист пишет код для всех подготовительных операций. Прямой ввод-вывод является гибким средством, позволяет полностью использовать возможности системы, но является трудоемким и плохо "переносимым между системами программирования".
    буферизированный bufferized См. потоковый ввод-вывод
    потоковый ввод-вывод stream input-output Ввод-вывод, управляемой операционной системой, при котором вводимые и выводимые данные, получаемые или отдаваемые устройству, накапливаются в некотором промежуточном буфере в оперативной памяти, откуда его считывает или записывает в него прикладная программа. Для каждого устройства создается хотя бы один буфер ("поток"). Ввод-вывод данных из потока не управляется программистом.
    составной оператор compound operator См. блок, группа операторов.
    тело функции body of the function Программа, описывающая алгоритм работы функции (или процедуры), с учетом определенных в ней формальных параметров и возвращаемого результата выполнения.
    выход из процедуры exit from the procedure Операция прерывания выполнения тела процедуры (функции) и немедленный возврат в вызывающую эту функцию программу (возможно, с возвращением результата операции).
    блок-схема block-scheme Графический способ представления алгоритма, при котором операторы представляются в виде геометрических фигур, а последовательность их выполнения указана стрелками. Является наиболее наглядным способом визуализации алгоритма неструктурированного программирования.
    школьный язык программирования school programming language Язык визуализации алгоритмов, разработанный в конце 80-х годов XX века для обучения программированию школьников процедурной парадигмы в рамках школьного курса информатики.
    визуализация алгоритмов algorithm visualization Наглядное представление алгоритмов в виде форматированного текста, блок-схем, деревьев, ориентированного графа и т.п., с целью его лучшего понимания, кодирования и проверки.
    неструктурированное программирование non-structural programming Языки программирования, в реализациях которых для изменения последовательности действий используются только операции условия и безусловных переходов. Примерами таких языков являются: Assembler, gwbasic и некоторые другие.
    наибольший общий делитель (НОД) the greatest common divisor В алгебре - наибольшее число-делитель, на которое без остатка длятся два натуральных числа. НОД часто используется в алгебре, например, для приведения дробей к общему знаменателю.
    алгоритм Евклида Euclid algorithm Алгоритм нахождения наибольшего общего делителя.
    структурирование structuring Выделение "структуры" программы в виде последовательности отступов и выступов для различных операторов и синтаксических конструкций. Является главным инструментов структурированного программирования.
    позиция табуляции tabulation position Горизонтальная позиция, на которую смещается текст при встрече в текстовом файле символа "горизонтальная табуляция". Этот отступ обычно можно настроить в опциях текстового редактора.
    знак горизонтальной табуляции horizontal tabulation character Знак в стандартном ASCII коде, имеющий порядковый номер "09" и обозначаемый в Си подобных языках как '\t'. Относится к так называемым "пробельным" символам.

    4.4. Приложения

    4.4.1. Приложение I. Основные конструкции "школьного языка программирования"

    Общий вид алгоритма

    алг имя алгоритма (аргументы и значения);
    	дано условие применимости алгоритма;
    	надо цель выполнения алгоритма;
    начало
    …
    конец

    Команды алгоритмического языка.

    нц пока (условие)
    	тело цикла (последовательность команд);
    кц
    
    нц
    	тело цикла (последовательность команд);
    кц пока (условие)
    
    нц для  i от i1 до i2 шаг i3
    	тело цикла (последовательность команд);
    кц
    
    если( условие )
    	то серия 1;
    	иначе серия 2
    все
    
    если( условие )
    	то серия 1;
    все
    
    выбор
    	при условие 1: серия 1;
    	при условие 2: серия 2;
    	при условие n: серия n;
    	иначе: серия n+1;
    все
    
    утв условие;
    ввод имена величин;
    вывод тексты, имена величин, выражения, нс;
    вызов: имя алгоритма ( аргументы и имена результатов);
    присваивание: имя величины := выражение;

    Типы величин.

  • цел - целые;
  • вещ - вещественные;
  • лог - логические;
  • сим - символьные;
  • лит - строка (общего типа);
  • таб тип - таблица с элементами указанных типов;
  • Виды величин

    Аргументы ( арг ) - описываются в заголовке алгоритма;

    Результаты ( рез ) - описываются в заголовке алгоритма;

    Значения функций ( знач ) описываются указанием типа перед именем алгоритма-функции;

    Промежуточные - описываются в строке нач алгоритма;

    Общие - описываются после строки исп исполнителя.

    Общий вид исполнителя.

    исп имя
    	описание общих величин исполнителя;
    	команды для задания начальных значений общих величин;
    	алгоритм исполнителя;
    кон

    4.4.2. Приложение II. Требования к описательной части "школьного языка программирования"

    В данном языке обязательны к описанию следующие элементы:

  • Тип исполнителя, выполняющего алгоритм;
  • Специальные требования к исполнителю ЭВМ;
  • Используемые в программе библиотеки и функции;
  • Задействованные в алгоритме переменные и функции, не входящие в указанные выше библиотеки (то есть глобальные переменные функции, созданные пользователем в своих целях);
  • Страницы:

    Цель лекции:

  • Познакомить читателей с основными конструкциями процедурной парадигмы программирования;
  • Научить читателей программировать, читать алгоритмы, создавать программы на языках программирования, входящих в процедурную парадигму;
  • 4.1. Особенности этой парадигмы

    4.1.1. Конструкции языка

    В качестве основных конструкций языков, построенных на "процедурной парадигме", используются:

  • Оператор присвоения значений;
  • Операторы условия " if … then ";
  • Операторы ветвления " if … then … else … ";
  • Операторы цикла: "пока" ( while );
  • Оператор цикла: "делать … пока" ( do … while );
  • Оператор цикла с индексом;
  • Оператор множественного выбора;
  • Оператор выхода из цикла: " break ";
  • Оператор новой итерации: " continue ";
  • Оператор безусловного перехода: " goto ";
  • Оператор вызова процедуры/функции;
  • Операторы ввода-вывода;
  • Составной оператор;
  • Оператор выхода из процедуры.
  • Рассмотрим эти операции поподробнее.

    4.1.1.1. Оператор присваивания

    Основной оператор "присвоения значений" переменным обозначается как " = " или " := ". Его синтаксис следующий:

    <переменная> = <выражение>

    где <переменная> - идентификатор, задающий имя переменной определенного типа, а <выражение> - новое значение переменной, представляющее собой константу, переменную, арифметическое, логическое, символьное выражение либо вызов функции.

    Замечание. При присвоении переменной нового значения старое значение теряется безвозвратно. Это надо помнить. Также значение теряется при выходе из блока или функции, в котором была объявлена переменная.

    Оператор присвоения значений обозначается в блок-схеме как прямоугольник.

    Примечание: при реализации оператора присвоения значений тип данных, под которым определена переменная, может не совпадать с типом данных, возвращаемых выражением. Поэтому может потребоваться операция принудительного приведения типов. По поводу операций приведения типов смотри [лекцию 5] данного курса.

    4.1.1.2. Оператор условия

    Этот оператор служит для реализации реакции алгоритма на некоторое условие: значения переменной, или событие в ЭВМ и ее окружении. Синтаксис оператора следующий:

    IF <условие> THEN <оператор>

    где <условие> - переменная булевского (логического) типа или операция отношения между целыми, вещественными, символьными константами, переменными и выражениями, а <оператор> - любой допустимый оператор языка, группа этих операторов в скобках (в блоке) либо (в старых языках программирования) - оператор безусловного перехода на метку. Оператор вычисляется в случае истинности условия в этом операторе.

    Примечание: меткой называется номер строки, число либо идентификатор, стоящий перед оператором и указывающий, куда будет перенаправлено выполнение программы после оператора перехода. Замечание: на операции отношения в арифметике плавающей точки накладываются ограничения, а именно - исключение из рассмотрения операций отношения "равно" и "не равно". Поскольку вещественные числа представляются в виде "фрагмента" бесконечной дроби, чувствительного к ошибкам округления, то, например, выражение: 2.0 * 2.0 - может не равняться константе 4.0. Следовательно, отношение "равно" переменных с плавающей точкой будет всегда "ложь", а отношение "не равно" - всегда истина. То же самое относится и к операторам отношения: "больше или равно" и "меньше или равно".

    Оператор: "условие" на блок-схеме представляется так, как показано на рис 4.1:

    (рис 4.1) Оператор "условие" на блок-схеме.

    Оператор условия является самым "древним" оператором изменения последовательности действий операторов алгоритма. Он применялся еще в релейной ЭВМ К. Цюзе.

    Примеры написания условия:

    [Пример 01]

    /* 1. Переменная D больше нуля? (Да/Нет) */
    
    D > 0
    
    /* 2. Переменная x лежит в пределе значений от -1 до +1 (на языке Си) */
    
    x >= -1  x <= 1
    
    REM 2. То же самое на языке Бейсик
    
    X >= -1 AND X <= 1
    
    /* 3. Файл, связанный с дескриптором: fstream, не прочитан до конца (переменная eof не равна 0, язык Си) */
    
    !eof( fstream )

    4.1.1.3. Оператор "ветвления"

    Этот оператор очень похож на оператор условия. Его синтаксис следующий:

    if <условие> then <оператор-истина> else <оператор-ложь>

    где <условие> - то же, что и в [разделе 4.1.1.2], <оператор-истина> - оператор или группа операторов, выполняемых в случае истинности условия, а <оператор-ложь> выполняется в случае невыполнения условия оператора ветвления. После выполнения оператора ветвления продолжается выполнение последовательности операторов, нарушенной при вызове оператора ветвления.

    На блок-схеме оператор "ветвления" представлен так, как показано на рис 4.2.

    (рис 4.2) Оператор ветвления на блок-схеме.

    Оператор ветвления появился сравнительно недавно, в 1970 году в языке: "Паскаль".

    4.1.1.4. Оператор цикла: "Пока"

    Операторы цикла предназначены для многократного повторения одних и тех же операций (операторов) в программе. Цикл завершается после выполнения условий окончания цикла, после чего следуют остальные операторы алгоритма. Если выхода из цикла нет, то говорят, что программа: "зацикливается".

    Самым "строгим" циклом (в смысле его соответствия правилам структурированной парадигмы программирования) является цикл: "Пока". Его синтаксис следующий:

    while <условие> do <оператор>

    где <условие> - условие входа в цикл и его окончания (в случае несовпадения значения выражений этому условию продолжения цикла). Условием может быть переменная логического типа, или операция отношения между целыми, вещественными, символьными константами и переменными, и выражений с ними, <оператор> - любой допустимый оператор или блок операторов языка программирования. Примеры операторов цикла на языке Си представлены в примере 02.

    [Пример 02]

    /* 1. Чтение и печать всех строк из текстового файла (до тех пор, пока не кончился файл) */
    
    /* Описание констант */
    
    const short MAXSTR = 255;
    
    /* Описание переменных */
    
    FILE *stream;
    char str[MAXSTR];
    
    …
    
    while( !eof( stream ) ) 	// Пока не достигнут конца
    {			// потока stream цикл
    	fgets( str, MAXSTRING, stream ); // Читается файл в строку
    	puts( str );	// печать строки на экране дисплея
    } // Конец цикла
    
    …
    
    /* 2. Реализация функции "эникейщиков" (цикла пока не нажата клавиша). */
    
    char c; // Символ ввода
    с = '\0'; // условие продолжения цикла
    while( !c ) c=getc(); // Бесконечный цикл, пока не введен с клавиатуры символ c.

    На блок-схеме оператор цикла: "пока" - имеет вид, приведенный на рис 4.3:

    (рис 4.3) Оператор цикла: "пока", - на блок-схеме.

    Как видно из указанных примеров, для реализации цикла "пока" должны быть выполнены следующие условия:

  • условие входа в цикл;
  • условие выхода из цикла;
  • последнее условие должно меняться в теле цикла.
  • Вообще цикл "пока" соответствует модификатору "звездочка" в регулярном выражении (то есть повторению ноль или более раз). О синтаксисе регулярных выражений смотри следующие лекции (в частности, лекции 11, 12).

    4.1.1.5. Оператор цикла: "до … пока"

    Этот оператор аналогичен оператору цикла "пока", за исключением того, что операторы в теле цикла будут исполняться минимум один раз. Синтаксис этого оператора следующий:

    do <оператор> while <условие>

    где <условие> - условие окончания цикла (см. раздел 4.1.1.4), а <оператор> - любой допустимый оператор или блок операторов языка программирования, который выполняется определенное число раз ("тело цикла"). В теле цикле должно находиться условие, прекращающее цикл. В противном случае цикл будет повторяться бесконечное число раз (будет "зацикливаться").

    На блок-схеме цикл: "до … пока" имеет следующий вид (см. рис 4.4):

    (рис 4.4) Оператор цикла: "до … пока" на блок-схеме.

    Цикл: "до … пока" соответствует модификатору "плюс" ("+") в регулярном выражении (повторению один или более раз).

    Примечание: правилом "хорошего тона" в программировании является не использование цикла: "до … пока", - а замена его циклом: "пока" (с соответствующим изменением алгоритма). Хотя автор выступает против этого правила: созданные с помощью цикла: "до … пока" алгоритмические конструкции более просты в понимании.

    4.1.1.6. Оператор цикла с индексом

    Не смотря на то, что цикл с параметром - одна из первых синтаксических конструкций, не существует единого стандарта на его запись. В "наиболее общей форме" этот цикл записывается так:

    для <пер> от <начало> до <конец> шаг <шаг> делать <оператор>

    где <пер> является переменной целого типа, принимающая значение переменной - индекса. Вне цикла ее значение не определено (попросту, ее нельзя использовать вне цикла). <начало> означает начальное значение индекса в цикле, <конец> - конечное значение индекса в цикле, а <шаг> - приращение цикла на каждой итерации (по-умолчанию используется приращение переменной цикла, равное "+1"). <начало>, <конец> и <шаг> могут принимать значения констант и переменных, однако переопределение этих параметров в цикле запрещено. Параметр <оператор> имеет то же значение, что и в описании цикла: "пока" (см. [раздел 4.1.1.4]).

    Конструкция, приведенная в [4.6], задает переменной <пер> последовательность значений: <начало>, <начало>+<шаг>, <начало>+2·<шаг>, …, <конец> на каждой итерации. При этом "тело цикла" повторяется int((<конец>-<начало>)/<шаг>)+1 число раз (см. формулу 4.7), Это число должно быть больше нуля.

    n := int( (<конец>-<начало>)/<шаг>)+1
    Примечание: если по формуле 4.7 получается отрицательное число, компилятор выдаст сообщение об ошибке. Если оно находится в пределах [0;1], то число повторений не определено (все зависит от реализации языка). Примечание: этот цикл соответствует модификатору: " {n} " в регулярных выражениях (n-точное число повторений). Оператор "цикл с параметром" может быть реализован циклом: "пока" - следующим образом (см. Пример 03):

    [Пример 03]

    /* Объявление переменных цикла: */
    
    int i, imax=10;
    
    /* Присвоение начального значения переменной: */
    
    i = 0;
    
    /* Объявление цикла и условия остановки цикла: i >= 10 */
    while( i < imax )
    {
    
    // Тело цикла;
    
    i++; // Инкремент переменной i (увеличение ее значения на единицу)
    } /* Конец цикла */

    В Примере 04 приведен код подпрограммы, задающий обратный порядок следования символов в строке языка Си без использования специальных функций:

    [Пример 04]

    /* Определение констант */
    const short MAXSTRLENGTH = 255;
    
    /* Определение переменных */
    char c; //Временная переменная
    str[MAXSTRLENGTH]; // искомая строка
    int i, nmax, imax; // Индекс массива и максимальное число итераций
    
    /* Определение числа повторений */
    imax = strlen(str);
    nmax = imax/2; // Для неполных строк
    /* Цикл: */
    for( i = 0; i < nmax; i++)
    {
    	c = str[i];
    	str[i] = str[imax-i];
    	str[imax-i] = c;
    /* В цикле меняются первые и последние элементы */
    }
    /* Конец цикла */
    Примечание: определение типов, операций, функций и т.п. смотри в лекции 5.

    На блок-схеме цикл с параметром имеет следующий вид (см. рис 4.5).

    (рис 4.5) Оператор цикла с параметром на блок-схеме

    На языке Quick Basic алгоритм из примера 04 будет записан следующим образом:

    [Пример 05]

    STRINGS$ = "Demo"
    REM Определяется длина строки переменной STRINGS$
    IMAX% = LEN(STRINGS$) + 1
    REM Определяется число циклов
    NMAX% = IMAX% / 2
    REM Цикл:
    FOR I% = 1 TO NMAX%
    C$ = MID$(STRINGS$, I%, 1)
    MID$(STRINGS$, I%, 1) = MID$(STRINGS$, IMAX% - I%, 1)
    MID$(STRINGS$, IMAX% - I%, 1) = C$
    NEXT I%
    REM Конец цикла
    PRINT STRINGS$
    END

    Цикл с параметром используются в следующих случаях:

  • При задании точного числа повторений тела цикла;
  • Для последовательного изменения "индекса массива" (при операциях с ними в теле цикла). Об индексах массива см. лекцию 7.
  • 4.1.1.7. Оператор множественного выбора

    Этот оператор используется для выбора одной из нескольких альтернатив выполнения алгоритма, задающихся значением целой переменной. Его синтаксис примерно следующий:

    Для <переменная> выбор <откр_скобка>
    при <значение1>:
    	<тело 1>; break;
    при <значение2>:
    	<тело 2>; break;
    …
    иначе:
    	<последнее тело>;
    <закр_скобка>

    где <откр_скобка><закр_скобка> - "составной оператор" (см. [раздел 4.1.1.13]); <переменная> - переменная целого типа или типа, приводимого к целому (например, перечисления, одиночный символ и т.п.); <значение n> - одно из возможных значений этой переменной, < тело n> - последовательность действий для этого значения переменной; и <последнее тело> - последовательность операций в случае, если переменная не принимает ни одного из значений в блоке: при.

    Замечание: оператор множественного выбора может "моделироваться" повторением оператора ветвления, например:

    [Пример 06]

    если <значение 1> то <тело 1>
    иначе если <значение 2> то <тело 2>
    иначе если …
    иначе <последнее тело>

    где <тело> - оператор или последовательность операторов, заключенных в скобки.

    Замечание: оператор множественного выбора не часто встречается в символьных вычислениях. Вместо него чаще используется конструкция из примера 06. (рис 4.6) Множественный выбор на блок-схеме.

    4.1.1.8. Оператор выхода из цикла: "break"

    Иногда в реализации алгоритма возникают условия, когда нужно выйти из цикла до завершения всех его итераций. Именно для этих целей служит оператор выхода из цикла. Его синтаксис следующий:

    break;

    Этот оператор прекращает действие текущего цикла, и переводит выполнение программы в точку за прерванным циклом (в тело программы или в тело "родительского" цикла).

    Замечание: если по условию нужно выйти изо всех циклов ("кессонный выход"), лучше использовать оператор безусловного перехода goto (см. раздел 4.1.1.10). Примечание: в языке Perl изменен порядок выхода из цикла и синтаксис операций. Подробнее смотри [59].

    4.1.1.9. Оператор новой итерации: "continue";

    Часто в реализации алгоритма требуется прервать выполнение тела цикла и перейти к следующей итерации. Эта операция реализована в разных языках по-разному. На языке Си его синтаксис следующий:

    continue;

    Конкретную реализацию этой конструкции смотри [59,31,51,74].

    Замечание. в языках, не имеющих конструкции: " continue ", (например - в Quick Basic), данную операцию можно "моделировать" с помощью безусловного перехода " goto " на метку после последнего оператора тела цикла.

    Приведем пример, как можно использовать операции " break " и " continue " в бесконечном цикле на языке Си:

    [Пример 07]

    char c; // Определение переменной
    
    while(1) 		// бесконечный цикл
    {
    	c=getc() 	// Чтение символа с клавиатуры
    	// Выход, если введен символ ("эникейщиком")
    	if( c ) then break; else continue;
    }

    4.1.1.10. Оператор безусловного перехода: "goto"

    Этот оператор является самым первым оператором для изменения последовательности выполняемых действий. В настоящее время его применение считается "дурным тоном", поэтому его использования необходимо избегать. Однако он незаменим в следующих случаях:

  • В языке отсутствуют другие конструкции алгоритма, более "структурированные" (например, в языке Ассемблер);
  • Необходимо выполнить "кессонный" выход из цикла при возникновении "исключительной ситуации".
  • Примечание: "Кессонный выход" из вложенного цикла подразумевает прекращение итераций и выход не только из "текущего цикла" (в котором возникла исключительная ситуация), но также из "родительского цикла" и даже вообще из всех циклов, заставив ЭВМ продолжать выполнение программы вслед за вложенными циклами. "Кессонным" этот выход называется так потому, что он как бы соответствует "немедленному подъему водолаза на поверхность", без предварительной адаптации его к пониженным давлениям. В результате этого подъема у водолаза может наблюдаться "кессонная болезнь", которая заключается в закупоривании сосудов пузырьками сжатого воздуха. Поскольку этот подъем небезопасен, его используют редко. То же самое относится к "кессонному выходу из цикла": при возможности его следует избегать.

    Синтаксис оператора безусловного перехода следующий:

    goto <метка>

    где <метка> - смотри первое примечание (в разделе 4.1.1.2).

    На блок-схеме безусловный переход указывается линией со стрелкой.

    4.1.1.11. Оператор вызова процедуры/функции

    Этот оператор является "основным" оператором процедурного программирования. Его синтаксис:

  • для вызова подпрограмм
    <имя подпрограммы>(<фактические параметры>)
  • для вызова функции
    <переменная> = <имя функции>(<фактические параметры>)
  • Здесь <имя подпрограммы> (<имя функции>) - имя, под которым процедура (подпрограмма или функция) встречается в программе, <переменная> - возвращаемое функцией значение переменной, а <фактические параметры> - список передаваемых программе параметров-констант и переменных (их значений).

    При вызове процедур тип и число переменных - фактических параметров должно совпадать с числом и типом формальных параметров, заданных при объявлении процедуры. Объявление процедуры следующее:

    [<тип>]<имя процедуры>(<формальные параметры>) <тело процедуры>

    где <тип> - тип возвращаемого функцией результата (отсутствует при вызове подпрограммы), а <формальные параметры> - передаваемые через стек значения переменных. Синтаксис формальных параметров:

    <формальные параметры> ::= <тип> <имя>{,<тип> <имя>}*

    где <тип> - тип переменной - формального параметра (должен совпадать с типом фактического параметра), <имя> - имя переменной - формального параметра (может отличаться от имени/значения фактических параметров), остальные знаки - специальные символы РБНФ (не пишутся в образце).

    Замечание: в языке Си есть разница между объявлением и описанием процедуры. При объявлении дается структура, указанная в формуле 4.14, но без тела функции. Описание функции представляет собой структуру [4.14], но содержащие операторы алгоритма в теле функции. Объявление функции должно предшествовать не только его описанию, но и использованию. В остальных языках, как правило, объявления и описания совпадают. Замечание. Фактические параметры могут передаваться по значению и по ссылке. При передаче по значению значение переменной - фактического параметра заносится в стек, и формальный параметр принимает значение уже из стека. При выходе из процедуры значение переменной в стеке уничтожается. Передача данных по ссылке - это, фактически, передача "разыменованного указателя на переменную". При выходе из процедуры значение переменной - формального параметра сохраняется и передается фактическому параметру. Подробнее о передаче параметров смотри в лекции 7. Хотя передача параметров по ссылке выглядит предпочтительнее, ее использование ведет к усложнению машинного кода и снижению безопасности системы. Примечание: "Джентльменское соглашение" о последовательности записи формальных параметров следующие:
  • Сначала идут передаваемые по значению переменные, потом - передаваемые по значению указатели, и в конце - передаваемые по ссылке переменные и указатели;
  • Вначале идут переменные с исходными значениями, затем - переменные, изменяющие значения исходных переменных, и лишь затем - счетчики, дескрипторы (файлов, областей памяти) и т.п.
  • Вызов процедуры на блок-схеме изображается так, как показано на рис 4.7

    (рис 4.7) Обозначение вызова процедуры на блок-схеме.Замечание. Тип возвращаемого функцией значения может переопределяться (см. раздел лекции 7).

    4.1.1.12. Операторы ввода-вывода

    В большинстве языков ввод-вывод осуществляется с помощью функций или операторов, очень похожих на функцию.

    Здесь автор отмечает, что ввод-вывод данных может быть прямым (сразу на консоль или в файл), буферизированным, или "потоковым" (через определенный буфер, связанный с файлом либо устройством и расположенный в оперативной памяти компьютера) и, наконец, "графическим", через заранее определенный GUI API ("программный интерфейс приложения для графического пользовательского интерфейса"). Для каждого из этих типов вывода существуют свои API (функции и библиотеки). Подробнее о функциях ввода-вывода смотри [59, 31, 51, 74, 86-91].

    Вид операторов ввода и вывода данных на блок-схеме представлен на рис 4.8.

    (рис 4.8) Обозначение операторов ввода-вывода на блок-схеме.

    4.1.1.13. Составной оператор

    Блок операторов представляет собой допустимую последовательность операторов, заключенных в скобки (например, в Си/C++ это фигурные скобки: "{…}") или между лексемами: "Begin … End" (как в Паскале и Алголе).

    На блок-схеме такие операторы никак не выделяются, а представляют собой просто последовательности операторов.

    Составной оператор применяется в следующих случаях:

  • В операциях условия, цикла, ветвления, множественного выбора, когда вместо одного оператора необходимо выполнить несколько операций (блок);
  • Необходимо определить "локальные переменные", определяемые лишь внутри блока;
  • Нужно написать тело функции или процедуры.
  • Новые переменные определяются только в начале блока, и их действие заканчивается после выхода из блока.

    4.1.1.14. Оператор выхода из процедуры

    Этот оператор имеет следующий синтаксис:

    return [<значение>]

    где <значение> - выдаваемое после окончания функции ее значение (только для функций).

    Оператор " ).

    (рис 4.9) Изображение оператора: "выход из функции" на блок-схеме.

    4.1.1.15. Резюме

    Итак, мы познакомились с основными алгоритмическими конструкциями, присутствующими в языках программирования процедурной парадигмы. Более подробно о синтаксисе этих конструкций в конкретных языках программирования смотри [59, 31, 51, 74, 92, 78]. Там же смотрите примеры программ.

    А мы движемся дальше, к общему представлению программ на процедурных языках и описанию "метаязыков".

    4.1.2. Особенности метаязыка для процедурной парадигмы

    Для визуализации алгоритмов, созданных с помощью процедурной парадигмы, используют:

  • блок-схемы;
  • "школьный" язык программирования, созданный Кушниренко.
  • Рассмотрим эти способы поподробнее:

    4.1.2.1. Блок-схемы

    Это "старый" способ визуализации алгоритмов. Его преимущества очевидны при "неструктурированном" программировании (например, на языке "Ассемблер"). Вот его составные части:

  • Начало программы отмечается символом, указанным на рис 4.9 a, а окончание отмечается изображением, указанным на рис 4.9 b;
  • Переход к следующему по-порядку оператору осуществляется при помощи линий со стрелками;
  • Разрыв линий указывается с помощью фигуры на рис 4.10;(рис 4.10) Фигуры, указывающие на "разрывы" линий, отмечающих последовательность операторов.
  • Основные конструкции алгоритмов на блок-схемах представлены фигурами, изображенные на рисунках: 4.1 - 4.7;
  • Операторы ввода-вывода данных представлены фигурами, изображенными на рис 4.8.
  • Все остальные операторы представлены прямоугольником, указанным на рис 4.11.(рис 4.11) Обозначение операторов на блок-схеме.
  • Ниже приведена блок-схема алгоритма нахождения наибольшего общего делителя по алгоритму Евклида.

    [Пример 08]

    (рис 4.12) Блок-схема алгоритма Евклида.Примечание. Блок-схему алгоритма всегда следует прикладывать как приложение к тексту программы на "неструктурированных" языках программирования, таких как "Ассемблер" и "BasicA" (ранняя реализация Бейсика от Microsoft).

    4.1.2.2. "Школьный" язык программирования

    Этот "язык записи алгоритмов" был предложен в 1986 году Кушниренко [55] специально для обучения программированию в средних школах. Этот язык оказался настолько "мощным" для описания алгоритмов процедурной парадигмы, что он используется (с небольшими изменениями) до сих пор.

    В приложении I представлены основные конструкции этого языка. В примере 09 представлена запись алгоритма из примера 08 на "школьном" языке.

    [Пример 09]

    В приложении II находятся требования к "описательной части" школьного языка программирования, не вошедшие в приложение III

    4.1.2.3. Требования для "структурирования" алгоритма

    Вот еще одно "неписанное правило" структурированного программирования:

    "Каждый оператор внутри блока операторов должен выделяться дополнительным фиксированным отступом от левой границы текста на одну позицию табуляции (символ "\t"). При закрытии блока операторов позиция отступа "уменьшается назад" на одну позицию табуляции."

    Для иллюстрации этого правила смотри Пример 09 на "школьном" языке программирования.

    4.1.2.4. Резюме метаязыков

    В предыдущих разделах мы ознакомились с основными "метаязыками" программирования, используемых при записи алгоритмов, вместе с их возможными областями применения. Вы получили представления о блок-схемах, "школьном языке программирования", познакомились с основными правилами "структурированной парадигмы". Более подробно о процедурной парадигме программирования смотри, например, [64].

    4.2. Резюме процедурной парадигмы

    Итак, процедурная парадигма содержит в себе семейство императивных языков программирования, позволяющих на "низком" и "высоком" уровне создавать алгоритмы для обработки "произвольных" данных. Процедурная парадигма идеально подходит для программирования в рамках "командного интерфейса", когда пользователь подает компьютеру команду на выполнение действий, а компьютер выдает результат ее исполнения.

    Поскольку командный интерфейс немного устарел, то, в настоящее время командная парадигма используется ограниченно: только для написания драйверов, утилит командной строки, макросов и скриптов.

    4.3. Глоссарий

    Термин Англ. Термин Разъяснение
    принудительное приведение типов forced reduction of types Явное, не зависящее от реализации языка программирования изменение типов данных для выражений и функций этого языка. Принудительным приведением типов нужно пользоваться с осторожностью, поскольку эти операции не генерируют ошибок (переполнения, исчезновения значащих разрядов, например). Но часто это единственный способ заставить работать функцию.
    оператор присваивания (значений) assignment statement (of values) Оператор (или операция) назначения нового значения переменной. Этим новым значением может быть значение константы, переменной, арифметического, логического, символьного выражения либо функции. При присвоении переменной значения старое ее значение теряется безвозвратно!
    имя переменной variable name Идентификатор, который "именует" значение переменной, хранящейся в оперативной памяти компьютера.
    оператор условия operator of condition Оператор, изменяющий линейную последовательность операций в случае наступления какого-либо условия, и выполняющий последовательность действий, прописанную программистом при наступлении условия. В случае не наступления условия линейная последовательность действий продолжается.
    условие condition Некоторое "событие в ЭВМ и ее окружении", изменение значения одной из переменных, реакция на результат выполнения арифметического или логического выражения, подачи команды на вход программы, окончания файла, начало и конец операции ввода-вывода и т.п., которые требуют изменения последовательности действий в алгоритме. Условия используются в операторах условия, ветвления, циклов, при множественном выборе.
    значение переменной variable value Содержимое ячейки оперативной памяти компьютера, на которую указывает имя переменной, определенной в одном из языков программирования. В отличие от значения константы это значение может изменяться. При этом старое значение полностью и безвозвратно уничтожается! Замечание: тип значения переменной определяется не ее значением, а ее объявлением.
    событие (в ЭВМ) event (in the computer) Наступление конкретного исхода наблюдения за работой системы. События бывают внешними (нажатие клавиши на клавиатуре, щелчок клавишей мыши или перемещение его курсора, получение сигнала-запроса на прием данных от модема или сетевого адаптера и т.п.), а могут быть и внутренними (запрос программы на отрисовку на экране своего "рабочего окна", сообщение таймера, сообщение системы, что программа "зависла", сообщение оборудования об отказе и т.п.). Управление системой "по событиям" является основополагающей частью объектно-ориентированного программирования. В командном интерфейсе события используются реже.
    окружение компьютера computer environment Текущие параметры конфигурации, с которыми загружается компьютер. Включает в себя переменные среды, файлы конфигурации программ, файлы "реестра Windows". Окружение компьютера может быть системным и пользовательским.
    системное окружение system environment Переменные среды, файлы конфигурации "общесистемных" программ и "демонов", записи в реестре Windows, применимые для всех пользователей данного компьютера.
    пользовательское окружение user environment Переменные среды, файлы конфигурации "пользовательских" программ и "демонов", записи в реестре Windows, применимые для конкретного пользователя данного компьютера.
    булевский тип Boolean type Тип переменных, способные принимать только два значения: "Истина" или "Ложь".
    логический тип logical type То же, что и булевский тип данных
    операция отношения ratio relationship Отношение между двумя объектами в математике, логике и программировании. Отношения бывают арифметическими, логическими и символьными.
    символьные отношения character ratio Отношение между двумя целыми числовыми кодами, представляющие строки в ЭВМ. Доступны следующие отношения: "равно", "не равно", "больше", "больше или равно", "меньше", "меньше или равно", "содержит", "не содержит". Значение операторов символьных отношений зависит не только от значения элементов строк (символов) но и от длины этих строк.
    безусловный переход unconditional transition Оператор в программе, прерывающий линейную последовательность действий и передающий управление коду, расположенному после указанной в операторе метки. В структурированном программировании оператор безусловного перехода можно использовать только для "кессонного" выхода из цикла.
    строка row Горизонтально расположенная последовательность символов.
    оператор перехода transition operator Оператор, изменяющий линейную последовательность действий алгоритма. Им может быть один из следующих операторов: оператор условия, ветвления и безусловного перехода.
    бесконечная дробь unending fraction Десятичная дробь, имеющая бесконечное число знаков после запятой. Если эти знаки повторяются с определенной периодичностью, то говорят о рациональной дроби. В противном случае мы получаем иррациональное число (дробь).
    оператор ветвления operator of branching Оператор перехода, который в зависимости от условия реализует две альтернативные последовательности в алгоритме.
    группа операторов group of the operators Несколько операторов, объединенных в соответствии с логикой алгоритма в единый блок.
    блок block Часть последовательности инструкций программы, ограниченные "скобками" и рассматривающиеся обработчиками языка как один операнд. С помощью операндов, например, определяется тело циклов и операций ветвления.
    истинность (условия) truth of condition Логическое выражение, состоящее из операций арифметического и логического отношения, а также вызова возвращающих значения функций, принимающих положительное (истинное) значение.
    цикл "пока" while cycle Цикл, тело которого выполняется произвольное число раз, в зависимости от истинности условия окончания цикла. Если цикл выполняется бесконечное число раз, то говорят, что "программа зациклилась". Цикл "пока" может не выполняться ни один раз, если не соблюдается условие входа в цикл.
    условие окончания цикла condition of the cycle termination Условие, после наступления которого тело цикла перестает выполняться, и происходит переход на первый следующий за телом цикла оператор.
    зацикливание recycling Ситуация, возникающая при реализации циклов: "пока" и "до…пока", а также при неправильной установки безусловных переходов, когда тело цикла выполняется бесконечное число раз. Это свидетельствует об ошибке в алгоритме программы.
    условие входа в цикл condition of the cycle beginning Условие, необходимое для того, чтобы цикл "пока" выполнился хотя бы один раз. Как правило, условие входа в цикл соответствует условию выходу из него.
    модификатор (в регулярном выражении) modifier (of a regular expression) Дополнительный символ регулярного выражения, указывающий, сколько раз могут входить символы в указанный образец. Модификаторами регулярных выражений могут быть символы: *, +, ?, {, }, (, ), [,].
    модификатор "*" modifier "*" Модификатор регулярного выражения, указывающий, что предыдущий символ или группа символов могут повторяться множество раз (от нуля до бесконечности).
    цикл "до…пока" "do…while" cycle Цикл, аналогичный циклу "пока", тело которого будет выполняться хотя бы один раз. Условие входа в цикл: "до…пока" всегда истинно.
    модификатор "+" modifier "+" Модификатор регулярного выражения, указывающий, что предыдущий символ или группа символов могут повторяться множество раз (от одного до бесконечности), но хотя бы один раз должен присутствовать.
    цикл с параметром cycle with parameter Цикл, повторяющееся определенное заданное наперед число раз, в зависимости от значений параметра-индекса.
    индекс index Переменная, задаваемая при инициализации цикла с параметром и изменяющаяся на одно определенное значение после конца каждой итерации. Индекс нельзя изменять внутри цикла. Значение переменной-индекса при выходе из цикла не определено.
    переопределение redefinition Операция, при которой тип и значение идентификатора переменной (или функции) меняется. Переопределение переменных обычно можно (но нежелательно!) проводить лишь в начале описания блока операторов.
    оператор множественного выбора multiply branch operator Оператор, реализующий несколько (более двух) альтернатив в выполнении операторов алгоритма в зависимости от значения "ключевой" переменной. Ключевая переменная может иметь целый тип, тип-перечисление или быть одиночным символом.
    перечисление enumeration Целый тип данных, способный принимать только небольшое ("перечисляемое") множество значений-констант. Эти константы определяются при описании данного типа данных на языке программирования.
    одиночный символ single character Целое число, представляющее символ в одной из кодировок. Все символы кодируются только целыми числами.
    итерация iteration Однократное выполнение (прогон) всего тела цикла в результате работы цикла с параметром, циклов "пока" и "до…пока".
    прерванный цикл broken cycle Цикл, тело которого перестает выполняться на одной из итераций притом, что условие окончания цикла не выполняется. После этого продолжает выполняться программа позади последнего оператора тела цикла. Обычно оператор "обычного" прерывания цикла называется: "break".
    кессонный выход caisson exit Выход сразу из нескольких вложенных циклов "наверх", позади тела последнего цикла. Обычно осуществляется оператором безусловного перехода на метку.
    тело цикла body of the cycle Последовательность операторов (не всегда линейная) внутри блока "составного оператора", который выполняется внутри цикла. Как правило, в цикле можно использовать либо одиночный оператор, либо составной оператор-блок с телом цикла.
    множественный выбор multiple choice Оператор предназначен для выбора одной из нескольких альтернатив в исполнении алгоритма, задающихся значением целой переменной или переменной, приводимых к целому значению.
    альтернатива (выполнения алгоритма) alternative (of algorithm executions) Выбор из нескольких "не пересекаемых" путей алгоритма, или выбор из нескольких взаимно исключающих вариантов выполнения алгоритмов.
    значение, приводимое к целому value, reduced to an integer Значение переменной в ячейке памяти некоторого типа, представленное в виде целого числа. Среди приводимых к целому типов значений относят символьные и "перечисляемые" типы значений.
    моделировать simulate Воссоздать существенные составные части предмета ("модель") и условия его "внешнего окружения", на которых будут осуществлять ("моделировать") особенности его поведения. При этом модель и ее окружение может не совпадать с оригиналом ни по внешнему виду, ни по "масштабу". На моделях можно исследовать те особенности функционирования реальных объектов, которые проверять на оригиналах затруднительно либо опасно.
    родительский цикл parent's cycle Цикл, в теле которого находится другой ("дочерний") вложенный в него цикл. Для выхода из родительского цикла обычно нужно завершить выполнение "дочернего" цикла или провести "кессонный" выход из цикла.
    возвращаемый результат returned result Единственный вариант-значение функции, которое возвращается основной программе в случае определенного сочетания параметров функции и/или события или окружения в компьютере. В Си-подобных языках возвращаемое значение задается оператором: return "значение".
    специальные символы РБНФ special symbols of EBNF Специальные символы, используемые при объявлении правил грамматики в расширенной Бэкусовой нормальной форме. К ним относятся символы: [, ], {, }, ::=, (, ), |, "" и некоторые другие.
    описание description Один из двух основных видов элементов программы на языке программирования (другим является оператор). Описание вводит ("представляет") объект программе, назначает его имя и тип данных.
    описание (процедуры) description (of a procedure) Описание процедуры определяет имя функции, тип возвращаемое ей значения, тип и количество формальных параметров, а также (в теле функции) задает алгоритм ее функционирования (путем программирования).
    исходные значения (фактических параметров) initial values (of the actual parameters) Первоначальное значение фактических параметров, которые были переданы функции при ее вызове. При этом исходные значение для переменных, переданных по значению, не меняется, а исходные значения переменных, переданных по ссылке или как указатели, может измениться после выхода из функции.
    указатель на переменную variable pointer Представляет собой переменную, содержащий адрес указанной переменной в оперативной памяти компьютера.
    разыменованный (указатель) dereferencing (pointer) Разыменованный указатель - это переменная, содержащая значение переменной в ячейке памяти, на которую указывает указатель. Эта значение не является ни копией значения, ни адресом переменной. Конкретная реализация таких указателей зависит от реализации языков программирования.
    счетчик counter Переменная, значение которой увеличивается или уменьшается в процессе вычислений, и при равенстве этого значения некоторой величине запускается внешний процесс: подпрограмма, функция, операторы условия, выхода из цикла, безусловный переход.
    дескриптор 1 descriptor Переменная, которая содержит в себе некоторый номер, по которому операционная система выделяет некоторый ресурс или определяет некоторый процесс. Внимание! Значение дескриптора не является ни значением элемента, ни его адресом.
    дескриптор 2 handle То же, что и дескриптор 1. Этим словом обозначаются дескрипторы в Windows.
    операторы ввода-вывода input-output operators Операторы, служащие для обмена информацией между ЭВМ и периферийными устройствами. Чаще всего ввод-вывод подразумевает преобразование сигналов ЭВМ в форму, "понятную" человеку.
    прямой ввод-вывод direct input-output Прямой ввод-вывод подразумевает непосредственное управление процессором (возможно, при помощи драйверов и прерываний операционной системы) операций ввода-вывода на консоль, модем, файл или принтер. При этом выдаются полностью все инструкции управления устройством, и программист пишет код для всех подготовительных операций. Прямой ввод-вывод является гибким средством, позволяет полностью использовать возможности системы, но является трудоемким и плохо "переносимым между системами программирования".
    буферизированный bufferized См. потоковый ввод-вывод
    потоковый ввод-вывод stream input-output Ввод-вывод, управляемой операционной системой, при котором вводимые и выводимые данные, получаемые или отдаваемые устройству, накапливаются в некотором промежуточном буфере в оперативной памяти, откуда его считывает или записывает в него прикладная программа. Для каждого устройства создается хотя бы один буфер ("поток"). Ввод-вывод данных из потока не управляется программистом.
    составной оператор compound operator См. блок, группа операторов.
    тело функции body of the function Программа, описывающая алгоритм работы функции (или процедуры), с учетом определенных в ней формальных параметров и возвращаемого результата выполнения.
    выход из процедуры exit from the procedure Операция прерывания выполнения тела процедуры (функции) и немедленный возврат в вызывающую эту функцию программу (возможно, с возвращением результата операции).
    блок-схема block-scheme Графический способ представления алгоритма, при котором операторы представляются в виде геометрических фигур, а последовательность их выполнения указана стрелками. Является наиболее наглядным способом визуализации алгоритма неструктурированного программирования.
    школьный язык программирования school programming language Язык визуализации алгоритмов, разработанный в конце 80-х годов XX века для обучения программированию школьников процедурной парадигмы в рамках школьного курса информатики.
    визуализация алгоритмов algorithm visualization Наглядное представление алгоритмов в виде форматированного текста, блок-схем, деревьев, ориентированного графа и т.п., с целью его лучшего понимания, кодирования и проверки.
    неструктурированное программирование non-structural programming Языки программирования, в реализациях которых для изменения последовательности действий используются только операции условия и безусловных переходов. Примерами таких языков являются: Assembler, gwbasic и некоторые другие.
    наибольший общий делитель (НОД) the greatest common divisor В алгебре - наибольшее число-делитель, на которое без остатка длятся два натуральных числа. НОД часто используется в алгебре, например, для приведения дробей к общему знаменателю.
    алгоритм Евклида Euclid algorithm Алгоритм нахождения наибольшего общего делителя.
    структурирование structuring Выделение "структуры" программы в виде последовательности отступов и выступов для различных операторов и синтаксических конструкций. Является главным инструментов структурированного программирования.
    позиция табуляции tabulation position Горизонтальная позиция, на которую смещается текст при встрече в текстовом файле символа "горизонтальная табуляция". Этот отступ обычно можно настроить в опциях текстового редактора.
    знак горизонтальной табуляции horizontal tabulation character Знак в стандартном ASCII коде, имеющий порядковый номер "09" и обозначаемый в Си подобных языках как '\t'. Относится к так называемым "пробельным" символам.

    4.4. Приложения

    4.4.1. Приложение I. Основные конструкции "школьного языка программирования"

    Общий вид алгоритма

    алг имя алгоритма (аргументы и значения);
    	дано условие применимости алгоритма;
    	надо цель выполнения алгоритма;
    начало
    …
    конец

    Команды алгоритмического языка.

    нц пока (условие)
    	тело цикла (последовательность команд);
    кц
    
    нц
    	тело цикла (последовательность команд);
    кц пока (условие)
    
    нц для  i от i1 до i2 шаг i3
    	тело цикла (последовательность команд);
    кц
    
    если( условие )
    	то серия 1;
    	иначе серия 2
    все
    
    если( условие )
    	то серия 1;
    все
    
    выбор
    	при условие 1: серия 1;
    	при условие 2: серия 2;
    	при условие n: серия n;
    	иначе: серия n+1;
    все
    
    утв условие;
    ввод имена величин;
    вывод тексты, имена величин, выражения, нс;
    вызов: имя алгоритма ( аргументы и имена результатов);
    присваивание: имя величины := выражение;

    Типы величин.

  • цел - целые;
  • вещ - вещественные;
  • лог - логические;
  • сим - символьные;
  • лит - строка (общего типа);
  • таб тип - таблица с элементами указанных типов;
  • Виды величин

    Аргументы ( арг ) - описываются в заголовке алгоритма;

    Результаты ( рез ) - описываются в заголовке алгоритма;

    Значения функций ( знач ) описываются указанием типа перед именем алгоритма-функции;

    Промежуточные - описываются в строке нач алгоритма;

    Общие - описываются после строки исп исполнителя.

    Общий вид исполнителя.

    исп имя
    	описание общих величин исполнителя;
    	команды для задания начальных значений общих величин;
    	алгоритм исполнителя;
    кон

    4.4.2. Приложение II. Требования к описательной части "школьного языка программирования"

    В данном языке обязательны к описанию следующие элементы:

  • Тип исполнителя, выполняющего алгоритм;
  • Специальные требования к исполнителю ЭВМ;
  • Используемые в программе библиотеки и функции;
  • Задействованные в алгоритме переменные и функции, не входящие в указанные выше библиотеки (то есть глобальные переменные функции, созданные пользователем в своих целях);
  • Вернуться к учебному плану