Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на билеты по программированию.docx
Скачиваний:
51
Добавлен:
06.03.2016
Размер:
104.23 Кб
Скачать

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

int simple_function()

float simple_function()

char simple_function()

В первом случае функция должна вернуть целое число (int), во втором - вещественное число (float), а в третьем случае - символ (char).

Возвращаемые значения используются для передачи данных из функции в вызывающее окружение. Вызывающее окружение - это то место, откуда вызывается данная функция, подробнее ниже. Идентификатор (имя) функции задаётся точно также, как и любой другой идентификатор. В данном примере мы создали функцию с идентификатором simple_function (simple - простой). Список аргументов функции записывается в круглых скобках после имени функции. В данном примере список аргументов пуст. Список аргументов записывается через запятую. Каждый элемент списка состоит из типа и идентификатора. Рассмотрим пример заголовка функции со списком из двух аргументов: int simple (int a, float b) В скобках мы записали два аргумента: a и b. У аргумента a тип int, а у аргумента b тип float. Аргументы используются, когда в функцию нужно передать какие-либо данные из вызывающего окружения. Тело функции располагается сразу под заголовком и заключено в фигурные скобки. В теле функции может содержаться сколько угодно операторов. Но обязательно должен присутствовать оператор return. В функцию передаётся два аргумента: a и b типа int. В теле функции они используются как обычные переменные (они и являются обычными переменными). Давайте договоримся: снаружи функции, переменные, которые передаются в неё, мы будем называть аргументами, а эти же переменные в теле функции - параметрами. В теле функции определяется переменная c. А затем, в эту переменную мы помещаем значение суммы двух параметров. Вызов функции: состоит из идентификатора функции и списка аргументов в круглых скобках. Вот несколько вызовов функции sum:int x = 5; int y = 4; Место, откуда вызывается функция, называется вызывающим окружением. Вызывающим окружением функции sum является функция main, а вызывающим окружением функции main является отладчик или операционная система. Функция может обмениваться данными с (44)вызывающим окружением благодаря списку аргументов и возвращаемому значению: вызывающее окружение передаёт данные в функцию с помощью аргументов, а функция передаёт данные в вызывающее окружение с помощью возвращаемого значения. Тип передаваемого в функцию значения должен совпадать с типом указанным в списке аргументов. Обратите внимание, что для тела if и else if не стоит скобочек. Скобочки ветвлений можно опускать, если в теле ветвления всего один оператор. Прототип функций совпадает с заголовком определения, но в прототипе можно опустить имена переменных в списке аргументов. Следующие объявления равносильны:

int move_x(int dx);

int move_x(int);

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

45. Формальные параметры – данные, с которыми работает подпрограмма (ПП). Это внутренние данные для ПП. Они перечисляются в заголовке ПП и связаны с фактическими параметрами. Фактические параметры – данные, передаваемые в ПП и возвращаемые из нее. Это внешние для ПП данные, с которыми имеет дело вызывающая часть программы. В ПП им соответствуют формальные параметры. Указываются в списке фактических параметров при обращении к ПП. Синонимы:

  • Параметры = формальные параметры.

  • Аргументы = фактические параметры.

Для формальных и фактических параметров необходимо соблюдать соответствия:

  • одинаковое количество,

  • одинаковый порядок следования,

  • совместимость типов по присвоению.

Категории формальных параметров

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

  • Параметры-переменные (в списке формальных параметров имеют атрибут var). Передаются ПП через адреса, и могут изменяться ею. Используются для возврата результатов в вызывающую программу.

  • Выходные параметры-переменные (в списке формальных параметров имеют атрибут out). Подобны параметрам-переменным, но передаются только из ПП в программу.

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

  • Процедуры или функции. Это параметры процедурного типа. Задаются именами.

  • Параметры без типа. За правильность использования отвечает программист.

  • Умалчиваемые параметры. Их в списке фактических параметров можно пропускать. В списке формальных параметров для них нужно задать тип и значение.

47. Аргументы функции main(): argv и argc . Иногда при запуске программы бывает полезно передать ей какую-либо информацию. Обычно такая информация передается функции main() с помощью аргументов командной строки. Аргумент командной строки — это информация, которая вводится в командной строке операционной системы вслед за именем программы. Например, чтобы запустить компиляцию программы, необходимо в командной строке после подсказки набрать примерно следующее: имя_программы - представляет собой аргумент командной строки, он указывает имя той программы, которую вы собираетесь компилировать. Чтобы принять аргументы командной строки, используются два специальных встроенных аргумента: argc и argv. Параметр argc содержит количество аргументов в командной строке и является целым числом, причем он всегда не меньше 1, потому что первым аргументом считается имя программы. А параметр argv является указателем на массив указателей на строки. В этом массиве каждый элемент указывает на какой-либо аргумент командной строки. Все аргументы командной строки являются строковыми, поэтому преобразование каких бы то ни было чисел в нужный двоичный формат должно быть предусмотрено в программе при ее разработке. Пример: На экран выводятся слово Привет и ваше имя, которое надо указать в виде аргумента командной строки: #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc!=2) { printf("Вы забыли ввести свое имя.\n"); exit(1); } printf("Привет %s", argv[1]); return 0; }Когда для программы не требуются параметры командной строки, то чаще всего явно декларируют функцию main() как не имеющую параметров. В таком случае в списке параметров этой функции используют ключевое слово void.

48.  Рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция вызывает функцию , а функция  — функцию . Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Прямая рекурсия – функция вызывает саму себя (int a() {…a()….} Косвенная рекурсия – функция вызывает саму себя с помощью другой функции.

49. Структура — конструкция большинства языков программирования, позволяющая содержать в себе набор переменных различных типов. В языках структуры традиционно называют записями. Доступ к отдельным членам структуры осуществляется с помощью оператора точка (.). Его еще называют оператором доступа к членам структуры.

50. Битовое поле — в программировании число, занимающее некоторый набор битов, напрямую не адресуемый процессором. Например: при 8-битном байте первые два поля протокола IP — версия и IHL — будут битовыми полями. На машинах с 32-битным байтом все поля IP-пакета (кроме IP-адресов отправителя и получателя) будут битовыми.

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

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

Объявления битовых полей

В декларации битового поля используется двоеточие, за которым следует константное выражение определяющее количество битов в поле[1];

struct rgb

{

unsigned r:3;

unsigned g:3;

unsigned b:3;

};

51. Объединение — это область памяти, используемая для хранения данных разных типов. В один момент времени в этой области могут храниться данные только одного типа. Размер объединения будет соответствовать размеру более сложного типа данных. Например, если внутри объединения определены переменные, имеющие типы intfloat и double, то размер объединения будет соответствовать размеру типа double. Объявление объединения имеет следующий формат:

union [<Название объединения>] {    <Тип данных> <Название члена1>;    ...    <Тип данных> <Название членаN>; } [<Объявления переменных через запятую>];

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

[union ]<Название объединения> <Названия переменных через запятую>;

В языке C++ ключевое слово union при объявлении переменной можно не указывать. После объявления переменной компилятор выделяет необходимый размер памяти. Пример объявления объединения и переменной:

union Uni {    int x;    float y;    double z; } union1;

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

52. Перечисления — это набор именованных целых констант.

53. Файловая система в С++. Вязыке Си система ввода/вывода информации реализуется не с помощью ключевых слов, а с помощью библиотечных функций. Благодаря этому система ввода/вывода является очень мощной и гибкой. Во время работы с файлами данные могут передаваться или в своем внутреннем двоичном представлении или в текстовом формате, то есть в более удобочитаемом виде.      В системе ввода/вывода для программ поддерживается единый интерфейс, не зависящий от того, к какому конкретному устройству осуществляется доступ. То есть между программой и устройством находится нечто более общее, чем само устройство. Такое обобщенное устройство ввода или вывода (устройство более высокого уровня абстракции) называется потоком. В то же время конкретное устройство называется файлом. Все потоки ведут себя похожим образом. И так как они в основном не зависят от физических устройств, то та же функция, которая выполняет запись в дисковый файл, может ту же операцию выполнить и на другом устройстве. Например, на консоли.Потоки бывают двух видов: текстовые и двоичные.  Файловая система языка Си состоит из нескольких взаимосвязанных между собой функций. Для их работы в Си требуется заголовочный файл <stdio.h> и такой же аналогичный ему заголовочный файл<iostream.h> требуется для работы в С++. (fopen() –открывает файл, fclose() – закрывает файл, putc()-записывает символ в файл, getc()-читает символ из файла, fgets() - читает строку из файла.)     Заголовок <stdio.h> представляет прототипы функций ввода/вывода в Си и определяет следующие три типа: size_tfpos_t и FILE. Первые два: size_tfpos_t представляют собой разновидности такого типа, как целое без знака. Отдельно рассмотрим третий тип: FILE

Режим

Описание

r

Только чтение. Указатель текущей позиции устанавливается в начало файла.

r+

Чтение и запись. Указатель текущей позиции устанавливается в начало файла.

w

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

w+

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

a

Только запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует функция пытается создать его.

a+

Чтение и запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует функция пытается создать его.

Параметр режим определяет возможность операции чтения/записи в файл.

54. Работа с файлами включает в себя 3 этапа. -Открытие файла; -Обработка (чтение, запись); -Закрытие файла.

Открытие файла осуществляет функция fopen(). Ей необходимо передать два параметра: первый - имя файла (строка), второй - режим (тоже строка). Возвращает функция значение типа Ресурс. В дальнейшем оно будет использоваться другими функциями, работающими с файлами. Если файл находится в текущей директории, то достаточно указать только его имя (без пути). Если же он находится в другом месте, нужно указать полый путь. Для смены текущей директории используется функция chdir(). Ей необходимо сообщить имя каталога, который мы хотим сделать текущим. Если сменить каталог не удастся, функция вернет false.  Чтобы узнать какой каталог текущий в данный момент, используйте getcwd(). Обработка файла обычно включает в себя чтение и/или запись. Давайте рассмотрим несколько функций, осуществляющих чтение файла. fgets(). Первый параметр - указатель на ресурс. Тот самый, который нам вернула функция fopen(). Второй параметр - необязательный - количество байт, которое необходимо считать. Функция считывает указанное количество байт, либо меньше, если раньше встретит конец строки или конец файла. Возвращает она считанную строку. file_get_contents() принимает имя файла и возвращает его содержимое одной строкой. file() принимает имя файла и возвращает его содержимое в виде массива строк. При использовании двух последних функций открывать файл функцией fopen() не надо. Они сами всё сделают. Для записи в файл используются следующие функции: fputs(). Первый параметр - указатель на ресурс, второй - строка, которую мы записываем. file_put_contents() принимает строку - имя файла и строку, которую необходимо записать. Закрывает файл функция fclose(). Ей нужно передать указатель на ресурс. Давайте на примере посмотрим действие этих функций. Пусть в директории /usr/tmp в файле f1.txt хранятся числа. По одному в каждой строке. Нам надо считать это число, увеличить и записать в файл f2.txt.

55. Те́кстовый файл — компьютерный файл, содержащий текстовые данные, как правило, организованные в виде строк. Функции для записи символа в файл. Две эквивалентные функции для ввода символа: putc() и fputc(). Две идентичные функции существуют для того, чтобы сохранить преемственность со старыми версиями Си.  Функция putc() записывает символы в файл, который уже был заранее открыт функцией fopen(). Прототип этой функции имеет вид: int putc(int ch, FILE *указатель файла);  Здесь указатель файла - это возвращенный функцией fopen() указатель,      ch - выводимый в файл символ. Указанный тип int записывает в файл только младший байт слова. 

56. Функция для чтения символа из файла

 Две функции для чтения символа из файла. Это getc() и fgetc().     Функция getc() читает символ из файла, который уже был открыт заранее функцией fopen(). Прототип этой функции имеет вид: int getc(FILE *указатель файла);  Здесь указатель файла - это указатель, имеющий тип FILE, возвращенный функцией fopen().  Функция getc() возвращает целое значение, но читаемый из файла символ находится в младшем байте. Если не произошло ошибки чтения, то старший байт слова обнуляется. Поэтому, чтобы читать символы файла до конца файла, можно использовать следующий программный код:  do {    ch=getc();    } while(ch!=EOF); Функция getc() возвращает EOF и в случае ошибки. Поэтому для определения причины можно воспользоваться функцией ferror()