Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тельнов по билетам.docx
Скачиваний:
5
Добавлен:
07.04.2023
Размер:
3.61 Mб
Скачать

IV билет)

1)Язык Си: объявление функций, передача аргументов. Примеры.

Сигнатура функции:

[ <класс памяти> ] [<тип результата> ] <имя-функции> ([<список-аргументов>]) [throw(<список-объектов-исключений>)];

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

Пример

double f1 (float, char); это прототип функции f1

int main () {

int n; char c;

……………………..

f1 ( (float) n, c ); это вызов функции f1

…………………….. }

double f1 ( float x, char y ) это определение функции f1

{……………………..}

здесь x и y формальные аргументы, n и c - фактические аргументы

При вызове функции в специальной области памяти - программном стеке создаются временные копии фактических аргументов. Вызванная функция работает с копиями фактических аргументов. Оригиналы аргументов остаются неизменными. Этот механизм называется передача аргументов «по значению».

Если требуется работать с оригиналами аргументов, имеется механизм передачи аргументов «по ссылке».

Пример

interchange (char*, char*); прототип функции

main() {

char a = ‘a’;

char b = ‘b’

……………………..

interchange (&a, &b); вызов функции

……………………..

}

interchange (char* p1, char* p2) определение функции

{

char z;

z = *p1; *p1=*p2; *p2 = z;

}

Ещё примеры функций:

char* f2 (void); функция не имеет аргументов и в качестве

результата работы возвращает значение

типа char* (указатель на символ)

void f3 (char**, unsigned); функция имеет два аргумента типа

char** и unsigned, никаких значений не

возвращает

void* f4 (void*, …); функция имеет произвольное количество

аргументов, но не менее одного. Тип

первого аргумента - указатель на любой

объект. Тип результата - указатель на

любой объект.

void f5 (int x, int& y) пример явного задания механизма передачи

аргумента “по ссылке” изменяется значение

копии аргумента “x” изменяется значение

самого аргумента “y”

2)Язык Си: Работа с файловой системой. Примеры.

Прототипы функций описаны в заголовочных файлах <io.h> и <direct.h>.

Получить имя текущей папки (директории) можно так:

char* _getcwd ( char *buf, int maxlen );

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

Возвращает указатель на буфер с именем текущей рабочей директории или NULL, если произошла ошибка в/в.

изменить текущую папку (директорию):

int _chdir ( char *pathname);

Возвращает 0 в случае успеха или -1 при возникновении ошибки в/в.

создать папку (директорию):

int _mkdir ( char *pathname);

Возвращает 0 в случае успеха или -1 при возникновении ошибки в/в.

удалить папку (директорию):

int _rmdir ( char *pathname);

Возвращает 0 в случае успеха или -1 при возникновении ошибки в/в.

Для выборки файлов из текущей рабочей папки (директории)

применяется следующая структура (уточнять её для конкретных IDE):

struct_finddata_t{

unsignded; // атрибуты выбираемых файлов

long time_create; // дата и время создания файла

long time_access; // дата и время последнего доступа к файлу

long time_write; // дата и время последней записи в файл

unsigned long size; // длина файла в байтах

char name[260]; // полный путь к файлу, включая его имя

};

Значения поля attrib могут быть комбинацией следующих констант:

_А_Normal // обычный файл

_А_RDONLY // файл, доступный только для чтения

_А_HIDDEN // скрытый файл

_А_SYSTEM // системный файл

_А_SUBDIR // подпапка (поддиректория)

_А_АRCH // архивный файл

выборка первого файла из текущей рабочей папки:

long_findfirst ( char *filespec,struct_finddata_t *fileinfo );

В аргументе filespec (спецификация имени файла) задается шаблон имени

выбираемого файла, в шаблоне имени могут использоваться метасимволы '*' и '?'.

Возвращает ненулевой дескриптор поиска (handle) в случае успеха (т.е. был найден файл, который удовлетворяет атрибутам attrib, заданным в _finddata_t ) или -1 при возникновении ошибки в/в.

выборка следующего (очередного) файла из текущей рабочей папки:

int_findnext ( long handle, struct_finddata_t *fileinfo );

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

Возвращает 0 в случае успеха (т.е. был найден очередной файл, который удовлетворяет атрибутам attrib, заданным в _finddata_t ) или -1 при возникновении ошибки в/в.

Пример вывода списка файлов текущей папки (шаблон "*.*"):

#include <io.h>

#include <stdio.h>

void main(void) {

struct _finddata_32_t finddata; // структура для выборки файлов

long handle; int flag= 0;

finddata.attrib=_A_NORMAL; // выбираем только обычные файлы

handle= _findfirst("*.*",&finddata); // поищем первый файл

if (handle) // если файлы есть, выведем

while (!flag) { // их имена и размеры

printf("%s %lu\n",finddata.name ,finddata.size );

flag = _findnext(handle, &finddata ); // ищем следующий файл

}

else printf("%s\n","Файлов не найдено" ); // нужных файлов не найдено

}

Перед практическим использованием данного примера уточните имена структур и функций (finddata,findfirst,findnext) для конкретного релиза Visual Studio.