Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы(все развернут....doc
Скачиваний:
25
Добавлен:
25.12.2018
Размер:
1.12 Mб
Скачать

Использование массивов в качестве параметров процедур

Как известно, массив можно рассматривать не только как группу упорядоченных переменных, объединенных одним именем, но и как одну переменную, называемую полной переменной. Если имеются две полные переменные “A” и “B”, одинаковые по размерам и типу хранимых ими значений, то значение “A” может быть присвоено переменной “B” с помощью одного оператора присваивания B:=A; т.е. не обязательно передавать значения из одного массива в другой поэлементно. Таким образом, массивам внутри процедуры можно передавать значения извне с помощью формальных и фактических параметров, оформленных в виде полных переменных. При использовании массивов в качестве параметров процедур существует ряд ограничений. Во-первых, нельзя обрабатывать одной и той же процедурой массивы разных типов и размеров. Во-вторых, в заголовке процедур для указания типов формальных параметров- полных переменных запрещается использовать безымянные типы

  1. Понятие функции. Перегрузка функций в С++.

Перегрузка функций позволяет вашим программам определять несколько функций с одним и тем же именем и типом возвращаемого значения. Например, следующая программа перегружает функцию с именем add_values. Первое определение функции складывает два значения типа int. Второе определение функции складывает три значения. В процессе компиляции C++ корректно определяет функцию, которую необходимо использовать:

#include <iostream.h>

int add_values(int a,int b)

{     return(a + b);  )

int add_values (int a, int b, int c)

(     return(a + b + c);  )

void main(void)

{     cout << "200 + 801 = " << add_values(200, 801) << endl;     cout << "100 + 201 + 700 = " << add_values(100, 201, 700) << endl;  }

Одним из наиболее общих случаев использования перегрузки является применение функции для получения определенного результата, исходя из различных параметров. Например, предположим, что в вашей программе есть функция с именем day_of_week, которая возвращает текущий день недели (0 для воскресенья, 1 для понедельника, ..., 6 для субботы). Ваша программа могла бы перегрузить эту функцию таким образом, чтобы она верно возвращала день недели, если ей передан юлианский день в качестве параметра, или если ей переданы день, месяц и год:

int day_of_week(int julian_day)

{     // Операторы  }

int day_of_week(int month, int day, int year)

{     // Операторы  }

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

Перегрузка функций улучшает удобочитаемость программ

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

  1. Понятие строковой или символьной информации. Функции обработки строковых данных в С++.

Во многих языках есть специальный тип данных - строки (string). В языке С++ отдельного типа строки символов нет, а реализована работа со строками путем использования массивов символов (типа char). В языке С++ символьная строка – это одномерный массив типа char, который заканчивается нулевым байтом. Нулевой байт-это байт, все биты которого равны нулю. Для нулевого байта определена специальная символьная константа ‘\0’. Это следует учитывать при описании массива, т. к. если строка должна содержать n символов, то в описании следует указать n+1 элемент. В конце символьной строки не надо ставить символ ‘\0’ , это сделает сам компилятор. Символ ‘\0’ обозначается так же NULL.

Библиотечные функции для работы со строками содержатся в заголовочном файле string.h. Наиболее часто используемые функции:

функция strcpy(s1, s2) используется для копирования содержимого строки s2 в строку s1

вызов функции strcat() имеет вид: strcat(s1, s2). Эта функция присоединяет строку s2 к строке s1

функция strcmp(s1, s2) сравнивает строки s1 и s2 и возвращает значение 0, если строки равны. Сравнение происходит посимвольно

функция strlen(s) возвращает длину строки, при этом нулевой байт не учитывается

функция strupr(s) выводит строку s в верхнем регистре

функция strlwr(s) выводит строку s в нижнем регистре

функция atof(s) преобразует строку s в вещественное число

функция atoi(s) преобразует строку s в целое число

функция itoa(v,s,n) преобразует целое число v в строку s в системе счисления по основанию n

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

Массив из нескольких слов можно рассматривать как матрицу из символов, тогда каждое слово – это строка матрицы. Первая буква каждого слова (строки матрицы) имеет номер 0

  1. Файловые операции ввода/вывода в С++.

Файл – это именованная область на диске для хранения различных данных (символьных или числовых).

Заголовочный файл iostream.h определяет классы istream и ostream (входной и выходной поток). Аналогично заголовочный файл fstream.h определяет классы ifstream и ofstream (входной и выходной файловый поток). Для вывода данных в файл используется выходной файловый поток ofstream, при этом указывается имя файла в виде символьной строки.

Для работы с файлами в C++ надо подключить заголовочный файл fstream. В C++ файл можно открыть присоединением к потоку. Если поток объявлен объектом класса ifstream, то он открыт для ввода, если же объектом класса ofstream, то он открыт для вывода.

 Используя выходной файловый поток, можно писать (читать) информацию в файл (из файла) с помощью оператора вставки << (оператора извлечения >>).

Определение конца файла

Чтобы определить конец файла используется функция еоf потокового объекта. Эта функция возвращает значение 0, если конец файла еще не встретился, и 1, если нет. Используя цикл while, ваши программы могут непрерывно читать содержимое файла, пока не найдут конец файла, как показано ниже:

while (! input_file.eof())

{ // Операторы

}

Проверка ошибок при выполнении файловых операций

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

Для этого используется функция fail() файлового объекта. Если в процессе файловой операции ошибок не было, функция возвратит 0.

ifstream input_file("FILENAME.DAT"); if (input_file.fail())

{ cerr << "Ошибка открытия FILENAME.EXT" << endl; exit(1); }

Закрытие файла

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

input_file.close ();

Когда файл закрывается, все данные, которые ваша программа писала в этот файл, сбрасываются на диск, и обновляется запись каталога для этого файла.

Управление открытием файла

Открытие файла обычно осуществляется с параметрами

ifstream output_file("FILENAME.EXT", ios::app);

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

Выполнение операций чтения и записи

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

input_file.read(buffer, sizeof(buffer)) ; output_file.write(buffer, sizeof(buffer));

Например, следующая программа STRU_OUT.CPP использует функцию write для вывода содержимого структуры в файл EMPLOYEE.DAT:

struct employee

{ char name[64]; int age; float salary; } worker = { "Джон Дой", 33, 25000.0 };

ofstream emp_file("EMPLOYEE.DAT") ; emp_file.write((char *) &worker, sizeof(employee));