Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции (Ведищев) + шпоры к экзамену / лекции по программированию за 1 курс.doc
Скачиваний:
170
Добавлен:
20.06.2014
Размер:
805.38 Кб
Скачать

Тело функции.

Составной оператор или блок. Он содержит операторы, определяющие действие функции и объявление переменных, используемых в этих операторах. Все переменные, объявленные в теле функции , имеют по умолчанию класс памяти auto, можно явно присвоить другой класс памяти. При вызове функции выделяется память для её локальных переменных и, если указано, проводится их инициализация. Управление передается 1 оператору составного оператора. Выполнение продолжается до тех пор, пока не встретится return или конец тела функции, то есть составного оператора. Управление возвращается в точку вызова функции. Если функция возвращает значение, то должен выполняться return с выражением, иначе возвращаемое значение не определено.

Вызов функции.

Передает управление и фактические аргументы заданной функции.

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

I фактический аргумент – I формальному параметру

II - II

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

Фактические аргументы.

Фактические аргументы могут быть любым значением базового типа, либо быть struct, union, указателем. Все фактические аргументы передаются по значению. Для массивов и функции передаются указатели на эти объекты. Возможность доступа не к копиям значений, а к самим переменным обеспечивают указатели, содержащие адреса переменных. Фактические аргументы вычисляются и преобразуются следующим образом:

    1. если имеется объявление со списком типов аргументов – прототип, то при вызове функции выполняется преобразование по умолчанию над типом каждого фактического аргумента, заданном в списке типов аргументов. Факт приводится к преобразованному типу (float→double, затем фактический аргумент→double ). Независимо от аргументов тип соответствующего формального параметра в списке параметров также подвергается преобразованию по умолчанию. Затем полученный тип фактического аргумента сравнивается с типом соответствующего формального параметра. В случае несоответствия преобразования нет, но компилятор выдает предупредительное выражение как и в случае, как и в операторе присваивания не совпадают типы левого и правого операндов.

    2. Если прототип отсутствует, преобразование по умолчанию производится отдельно для каждого аргумента, не имеющего соответствующего имени типа. Если список типов аргументов завершается и задано больше фактических аргументов, то лишние фактические аргументы преобразуются по умолчанию. Если список не завершен…, а передается больше аргументов, то компилятор выдает сообщение об ошибке. Если список содержит void, то наличие фактических аргументов приводит к сообщению об ошибке. Для доступа к аргументам, указанным после объявленных формальных параметров, используют макроопределения.

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

Любая функция в С-программе может быть вызвана рекурсивно (может вызвать сама себя). Компилятор не ограничивает число таких вызовов. При каждом вызове выделяются новые области памяти, для static и extern переменных нет. Число рекурсивных вызовов имеет фактические ограничение, связанное с размером стека.

Файл.

Последовательность является одной из фундаментальных структур данных. В языках высокого уровня для обозначения последовательности компонентов одного и того же типа применяют термин «файл». В любой момент времени один-единственный компонент, другие могут быть получены путем последовательного просмотра файла. Число компонентов, называемых длиной файла, не фиксируется, что позволяет отнести файл к динамическим структурам данных. Файл может ни содержать ни одного элемента. Называется пустым.

Над файлами выполнены 2 типа действий:

  1. просмотр (последовательное продвижение по файлу сначала). В процессе просмотра изменять значения компонентов на новые запрещается.

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

Задача.

Вставить в файл целых чисел после 10-го элемента 25 целых чисел, хранящихся в массиве.

Обновить в файле элементы с 11 по 35. реализовать оба варианта.

Решение.

Создается новый файл – пустой. Обновляемый просматривается. Считывается первые 10 элементов, записываются во вновь созданный файл. Затем туда же дописывается 25 элементов. Затем файл просматривается до признака конца файла. Считанные файлы добавляются.

В случае обновления просмотр продолжается во время создания. Старый файл создается заново (пустой). Его обновленная версия просматривается, считываемые файлы записываются в исходный файл.

Открытие.

Сопоставление файловой переменной с областью действия во внешней памяти, что выполняется средствами ОС. Количество открытых файлов ограничивается значением, хранящийся в переменной среды окружения ОС (имя переменной в MS-DOS) files.

Файл может быть открыт и в режиме просмотра, и в режиме создания. Исторически определялось, что файлы будут храниться на накопителе с последующим доступом (магнитные ленты), в настоящее время с произвольным доступом. Однако лазерные диски сохранили последовательный доступ. В связи с тем, что используются устройства с произвольным доступом в С имеется возможность открытия файлов для добавления элементов.

Добавление элементов в файл обеспечивается особенностью хранения файловой системы на ВЗУ. Каждый файл размещается в 1 или нескольких кластерах.

Кластер – минимальная логическая единица на ВЗУ, доступная для считывания и записи. Кластер состоит из 1 или нескольких секторов.

Сектор – минимальная физическая единица хранения доступная ЗУ.

Информация о принадлежащих файлу кластерах хранится в специализированном массиве данных, называемом FAT(file allocation table – таблица размещения файлов). Структура FAT такова, что позволяет хранить номера кластеров, принадлежащих файлу (тех, в которых размещается файл) таким образом, что последовательный порядок их размещения не обязателен, т.е. используется связное хранение информации. Для каждого файла хранится № начального кластера. Если файл занимает больше 1 кластера, то в таблице с №-ом кластера в ячейке хранится № следующего кластера. В последнем кластере хранится признак конца файла. Каждый файл имеет имя, список имен и № 1-го кластера файла. Храниться в специальном файле, называемом директория (каталог). Корневой каталог начинается с заданного участка. FAT и её копия хранятся в заданном участке диска.

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

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

Программа FAT в современной ОС имеются другие файловые системы NTFS, применяемая WINDOWS NT, 2000, ХР, UNIX (собственная файловая система). Они также основаны на связном хранении информации о кластерах, но структура их сравнения обладает дополнениями, повышающими их надежность, безопасность.

Службы индексирования ускоряют поиск файлов на диске. Будущее файловой системы Longhorn. Следующие идеи будут основаны на идеях БД.

В режиме создания указатель на текущий элемент устанавливается в начало файла. Операция записи файла складывается из 2 действий:

  • записать элемент;

  • переместить указатель в позицию следующего элемента.

Открытие файла в режиме просмотра делает доступным для чтения первый элемент файла. Операция чтения складывается из:

    • считывания из буфера значения элемента;

    • запись на его место значения следующего элемента.

// обычно буфер имеет размер для хранения ряда элементов и обновление происходит после прочтения буфера.

В соответствии с данной моделью просмотра и создания файла последовательного доступа и были определены ограничения над операциями.

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

Таким образом, операция просмотра начинается с открытия и заканчивается закрытием файла (используют функции ОС). Обязательно требование о закрытии всех открытых файлов, в противном случае возможна потеря работоспособности ОС, так как все операции с файлами с использованием системной памяти.

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