Направления программирования. История создания языка Си. Особенности языка, страница 21

scanf (“ %lf ”, &vect[ i ]);

}    // Все изменения передаются в вызывающую функцию.

п.12.3.Рекурсивные функции.

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

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

Пример:                                                            Вычислим 4!:       fact1 (n=4)

n!=1*2*3*4*…..*n                                                                        4*fact2(3)

            1,  n=0                                                                                 fact2 (n=3)

n!=                                            Возврат в предыдущий            3*fact3(2)

         n*(n-1), n ? 0                                          вызов.                  fact3 (n=2)

2*fact4(1)         

int fact (int n)                                                                                  fact4 (n=1)

{                                                                                                      1*fact5(0)

if (n==0) return (1);                                                                      fact5 (n=0)

 


или (!n)

else return (n * fact (n-1));

}

Язык Си по своей природе стремится поддерживать рекурсивность и требует минимальных усилий при программировании рекурсии.

п.12.4.Локальные и глобальные данные.

Любая переменная, описанная вне какой-либо функции, называется глобальной. Для такой переменной область действия простирается от точки ее описания до конца файла, в котором она описана. Если внутри блока описана переменная, имя которой совпадает с именем глобальной переменной, то внутри этого блока глобальная переменная недоступна. Для глобальных переменных память отводится один раз и остается занятой до конца выполнения программы.

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

п.13.Файлы.

п.13.1.Потоки данных.

Потоки данных в Си используются для организации ввода/вывода данных на различных компьютерных системах. Потоки данных являются последовательностью символов, перетекающих либо в программу (ввод), либо из нее (вывод). Каждый из символов представлен одним байтом.

Пример: Потоки можно сравнить с отрезками садового шланга; их можно подсоединять к стандартным файлам Си, внутреннее устройство которых не имеют значения для вашей программы.

В Си потоки используются везде, где данные поступают или выводятся из программы. Источники данных – это клавиатура и дисковые файлы, в то время как приемниками могут быть экран, принтер и файлы на диске. На самом деле с каждым из потоков ассоциируется специальный файл. Различные потоки данных можно также различать по специфическому назначению данных, которые они переносят.

Программа на Си имеет непосредственный доступ к пяти предопределенным потокам данных, каждый из которых связан со специфическим файлом устройства:

stdin – стандартный ввод (устройство клавиатура)

stdout - стандартный вывод (устройство экран)

stderr - стандартный листинг ошибок (устройство экран)

stdprn - стандартный принтер (например LPT1 в DOS)

stdoux - стандартный вспомогательный последовательный порт (например COM1 в DOS)

Типы потоков.