Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Структуры и функции

В исходном K&R-стандарте языка Си использование структур ограничено. Структуры могут передаваться в качестве аргументов только с использованием указателей, о которых мы будем говорить дальше в этой главе. Кроме того, отсутствует возможность прямого присваивания одной структуры другой, например, следующим образом:

cdrom = disc;

В современных компиляторах Си и Си++ такая возможность существует. Теперь можно непосредственно присваивать одну структурную переменную другой.

Большинство компиляторов Си++ и компиляторы Си, поддерживающие стандарт ANSI, позволяют передавать и возвращать структуру целиком. В Листинге11.3 продемонстрировано, как можно передать структуру функции. Значения членов структуры вводятся в main(), затем вся структура передается функции putdisc() для вывода. При вызове функции используется структурная переменная disc:

putdisc(disc);

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

putdisc(disk)

struct CD disk;

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

Листинг 11.3. Передача структуры.

/*CD3.c*/

struct CD

{

char name[20];

char description[40];

char category[12];

float cost;

int number;

} disc;

main()

{

puts("Введите сведения о диске\n\n");

printf("Введите название: ");

gets(disc.name);

printf("Введите описание: ");

gets(disc.description);

printf("Введите категорию: ");

gets(disc.category);

printf("Введите цену: ");

scanf("%f", &dics.cost);

printf("Введите номер ячейки: ");

scanf("%d", &disc.number);

putdisc(disc);

}

putdisc(disk)

struct CD disk;

{

puts("Введена следующая информация о диске:\n\n");

printf("Название: %s\n", disc.name);

printf("Описание: %s\n", disc.description);

printf("Категория: %s\n", disc.category);

printf("Цена: %6.2f\n", disc.cost);

printf("Номер п/п: %d\n", disc.number);

}

В Листинге 11.4 демонстрируется, как функция возвращает структуру. Члены структуры вводятся в функции getdisc(), а затем передаются назад в main() с помощью инструкции

return(inputdisc);

Обратите внимание, что тип записи структуры (CD) используется и в определении функции, и в определении переменных функции getdisc(). Это вызвано тем, что при возврате переменных, отличных от типов int или char, тип переменной следует указать в определении функции. Типом возвращаемой переменной в данном случае является структура CD, так что функция определяется следующим образом:

struct CD getdisc();

Структура, используемая в функции, также относится к типу CD, поэтому она определяется как:

struct CD inputdisc;

Обратите также внимание на то, что функция getdisc() определяется как глобальная, вместе со структурной переменной disc. Такой тип определения требуется в тех случаях, когда функция возвращает структуру.

Листинг 11.4. Возвращение структуры.

/*CD4.c*/

struct CD

{

char name[20];

char description[40];

char category[12];

float cost;

int number;

} disc, getdisc();

main()

{

disc = getdisc();

puts("Введена следующая информация о диске:\n\n");

printf("Название: %s\n", disc.name);

printf("Описание: %s\n", disc.description);

printf("Категория: %s\n", disc.category);

printf("Цена: %6.2f\n", disc.cost);

printf("Номер п/п: %d\n", disc.number);

}

struct CD getdisc()

{

struct CD inputdisc;

puts("Введите сведения о диске\n\n");

printf("Введите название: ");

gets(inputdisc.name);

printf("Введите описание: ");

gets(inputdisc.description);

printf("Введите категорию: ");

gets(inputdisc.category);

printf("Введите цену: ");

scanf("%f", &inputdiscdics.cost);

printf("Введите номер ячейки: ");

scanf("%d", &inputdisc.number);

return(inputdisc);

}