В программе есть странная строка while(getchar ( ) ! = '\n'); /* очистить строку ввода */
Она включена для того, чтобы использовать особенность функции scanf( ), которая игнорирует символы пробела и новой строки. Когда вы отвечаете на запрос об элементе valueв структуре book, то вводите что-нибудь вроде
12.50 [ввод]
При этом передается последовательность символов
12.50\n
Функция scanf( )собирает символы 1, 2, . , 5, 0, но опускает символ \n, стоящий там, и ожидает, что следом придет еще какой-нибудь оператор чтения. Если пропустить нашу странную строку, то следующим оператором чтения будет gets(libry [count].title)в операторе управления циклом. Он прочел бы оставшийся символ новой строки как первый символ, и программа решила бы, что мы послали сигнал останова. Поэтому мы и вставили такую странную строку. Если вы поняли это, то увидите, что она "проглатывает" символы до тех пор, пока не найдет и не получит символ новой строки. Функция ничего не делает с данным символом, только принимает его от устройства ввода. Это приводит к тому, что функция gets( )снова начинает работать. Вернемся теперь к изучению структур.
Иногда бывает удобно, чтобы одна структура содержалась или была "вложена" в другую. Например, Шалала Пироски строит структуру, содержащую информацию о ее друзьях. Один элемент структуры - это, конечно, имя друга. Однако имя можно представить самой структурой с разными элементами для имени и фамилии. На рис. 14.4 приведен сокращенный пример деятельности Шалалы.
/* пример вложенной структуры */
#define LEN 20
#define M1 "Спасибо за прекрасный вечер,"
#define M2 "Вы, конечно, правы, что"
#define M3 " -своеобразный парень. Мы должны собраться"
#define М4 " отведать очень вкусный"
#define M5 "и немного повеселиться."
struct names { /*первый структурный шаблон */
char first[LEN];
char last[LEN], };
struct guy { /* второй шаблон */
struct names handle; /* вложенная структура */
char favfood[LEN];
char job[LEN];
float income;
};
main( ) {
static struct guy fellow = { /*инициализация переменной */
{" Франко," " Уотэл"},
" баклажан",
" вязальщик половиков",
15435.00 };
printf("Дорогой %s, \n \n," fellow.handle.first);
printf(" %s %s.\n", M1, fellow.handle.first);
printf(" %s %s\n" , M2, fellow.job);
printf(" %s \n" , M3);
printf(" %s %s %s\n\n", M4, fellow.favfood, M5);
printf(" %40s %s \n", " " , " До скорой встречи" );
printf(" %40s %s\n", " ", Шалала");
}
РИС. 14.4. Программа вложенной структуры.
Вот результат работы программы:
Дорогой Франко,
Спасибо за прекрасный вечер, Франко.
Bы, конечно, правы. что вязальщик половиков - своеобразный парень.
Мы должны собраться отведать очень вкусный баклажан и немного повеселиться.
До скорой встречи,
Шалала
Во-первых, следует рассказать о том, как поместить вложенную структуру в шаблон. Она просто описывается точно так же, как это делалось бы для переменной типа int:
struct names handle;
Это означает, что handleявляется переменной типа struct names. Конечно, файл должен также содержать шаблон для структуры типа names.
Во-вторых, следует рассказать, как мы получаем доступ к элементу вложенной структуры. Нужно дважды использовать операцию " ." :
fellow.handle.first = = " Франко";
Мы интерпретируем эту конструкцию, перемещаясь слева направо;
(fellow.handle).first
То есть первым находим элемент fellow, далее элемент handleструктуры fellow, а затем его элемент first. Теперь рассмотрим указатели.
Любители указателей будут рады узнать, что указатели можно использовать и для структур. Это хорошо по крайней мере по трем причинам. Во-первых, точно так же как указатели на массивы, они легче в использовании (скажем, в задаче сортировки), чем сами массивы, а указателями на структуры легче пользоваться, чем самими структурами. Во-вторых, структура не может использоваться в качестве аргумента функции, а указатель на структуру может. В-третьих, многие удобные представления данных являются структурами, содержащими указатели к другим структурам.
Следующий короткий пример (рис. 14.5) показывает, как определять указатель на структуру и как использовать его для получения элементов структуры.
/* указатель на структуру */
#define LEN 20 struct names {
Читать дальше