Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по программ(мои).doc
Скачиваний:
10
Добавлен:
01.03.2025
Размер:
969.73 Кб
Скачать

3.Перегрузка операторов, правила перегрузки операторов, приоритеты

Операторы рассматриваются как ф-ции, которые имеют прототип: тип operator имя_оператора (список_параметров); operator – ключевое слово. Поэтому операторы, как и ф-ции, можно перегружать.

Перегрузка операторов должна удовл. требованиям:

- нельзя вводить новых операторов;

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

- нельзя изменять количество параметров оператора;

- приоритеты перегр. опер. не изм-ся;

- оператор не может иметь аргументов по умолчанию, за исключ. оператора вызова ф-ции ();

- оператор не может иметь неопред. кол-ва параметров, за исключ. оператора вызова ф-ции ().

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

Перегружаются почти все операторы, исключая:

- . – точка, оператор доступа к члену класса;

- .* - оператор доступа к члену класса через указатель;

- :: - оператор разреш. области видимости;

- :? – условный оператор;

Нельзя перегружать препроцессорные операторы.

Приоритеты операторов

В зависимости от сочетания операторов, в исполяемом алгоритме изменяется его порядок, а изменение этого порядка зависит от самих операторов.

() [] . ~ -> Слева направо

! &(ун) *(ун) -(ун) ~(ун) ++ -- @(ун) Справа налево

% * / Слева направо

+ - @ Слева направо

<< >> Слева направо

< > <= >= %< %> %<= %>= Слева направо

!= == %== %!= Слева направо

&,^,|,&&,||,?(,,) Слева направо

Билет 23

1.Внутреннее представление данных в ЭВМ: символьных, двоичных, десятичных, адресных констант.

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

Элементарная ячейка памяти ЭВМ имеет длину 8 бит (1 байт). Каждый байт имеет свой номер (его называют адресом). Бит может принимать одно из двух значений: 0 или 1.

Представление и обработка символьных данных в Си: каждый символ текста представляется отдельным байтом, каждому значению байта как целого числа (коду символа в диапазоне 0..255 или 00..FF) ставится в соответствие символ текста. Для работы с текстом используется базовый тип данных char.

Для представления символов русского алфавита надо использовать unsigned char, так как коды русских букв превышают величину 127.

2.Описание файла.

Если в качестве устройств ввода/вывода ограничиться только клавиатурой и экраном, то в таком случае будет сложно обработать большие объемы входных данных. Выходные данные, отображенные на экране, тоже безвозвратно теряются. Для устранения подобных проблем удобно сохранять данные на запоминающих устройствах, предназначенных для долговременного хранения данных (диски, флэшки и т.п.).

На дисках данные хранятся в виде структур данных, обслуживаемых операционной системой, – в виде файлов. Файл – это именованная область внешней памяти, в которой хранится логически завершенный объем данных. В языке С файл – это неструктурированная линейная последовательность байтов. Файлы широко применяются при решении различных задач. Каждый файл имеет имя и расширение, которого может и не быть (в MS DOS максимальная длина соответственно: 8 и 3 символа).

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

Функции ввода/вывода для работы с файлами стандартной библиотеки языка С, которые позволяют читать данные из файлов и записывать данные в файлы, делятся на два класса:

1. Ввод/вывод верхнего уровня (с использованием понятия «поток»). Эти функции обеспечивают буферизацию работы с файлами. Это означает, что при чтении или записи информации обмен данными осуществляется не между программой и указанным файлом, а между программой и промежуточным буфером, расположенным в оперативной памяти.

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

Для пользователя файл, открытый на верхнем уровне, представляется как последовательность считываемых или записываемых байтов. Чтобы отразить эту особенность организации ввода/вывода, предложено понятие «поток» (англ. stream). Когда файл открывается, с ним связывается поток. Далее выводимая информация записывается «в поток», а считываемая – берется «из потока».

Когда файл открывается для ввода/вывода, он связывается со структурой типа FILE, определенной с помощью typedef в файле <stdio.h>. Эта структура содержит всю необходимую информацию о файле (его имя, открыт ли файл для чтения или записи, указатель текущей позиции в файле, адрес буфера, были ли ошибки при работе с файлом и не встретился ли конец файла). При открытии файла с помощью стандартной функции fopen() возвращается указатель на структуру типа FILE. Этот указатель, называемый указателем потока (файла), используется для последующих операций с файлом. Его значение передается всем библиотечным функциям, используемым для ввода/вывода через этот поток.

2. Ввод/вывод низкого уровня (с использованием понятия «дескриптор» или «префикс»). Функции низкого уровня не выполняют буферизацию и форматирование данных, они позволяют непосредственно пользоваться средствами ввода/вывода операционной системы.

При низкоуровневом открытии файла с помощью функции open() с ним связывается файловый дескриптор (англ. handle). Дескриптор является целым числом, характеризующим размещение информации об открытом файле во внутренних таблицах операционной системы (FCB – File Control Block). Дескриптор используется при последующих операциях с файлом.

Файлы делятся на текстовые и двоичные.

Текстовый файл – это файл, в котором каждый символ хранится в виде одного байта (кода, соответствующего символу). Текстовые файлы разбиваются на несколько строк с помощью специального символа «конец строки» (пара символов CR LF или 0Dh 0Ah).

Двоичный файл – файл, данные которого представлены в бинарном виде. При записи в двоичный файл символы и числа записываются в виде последовательности байтов (в своем внутреннем двоичном представлении в памяти компьютера).

Пример открытия текстового файла по имени "test.txt" для записи:

FILE *fp;

if ((fp = fopen("test", "w")) == NULL)

{printf(“Ошибка открытия файла\n”);

exit(1);// завершение работы программы}

Для обоих классов функций файлового ввода-вывода возможны 2 режима доступа к файлу: текстовый и двоичный. Режим доступа к файлу задается при его открытии. В текстовом режиме производится преобразование пары символов CR LF (0Dh 0Ah) – при чтении из файла в один символ новой строки ‘\n’(0xA), а при записи в файл обратно в пару символов. Кроме того, при вводе символа Ctrl-Z (1Ah) считается, что достигнут конец файла и ввести информацию после этого символа в текстовом режиме нельзя. В двоичном режиме никакого преобразования байтов не происходит и не делается никаких предположений об их смысле. Доступ к файлу может быть последовательным и произвольным (прямым). Последовательный доступ – файл читается/пишется последовательно байт за байтом. Прямой доступ – чтение/запись возможны из произвольного места файла с установкой указателя чтения/записи в нужное место файла.