Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Все лекции программирование

.pdf
Скачиваний:
25
Добавлен:
13.03.2016
Размер:
1.94 Mб
Скачать

struct addr

{

char name[30]; char street[40]; char city[20]; char state[3];

unsigned long int zip; };

struct addr addr_info;

Пример

struct addr { char name[30]; char street[40]; char city[20]; char state[3];

unsigned long int zip; } addr_info, binfo, cinfo;

struct {

char name[30]; char street[40]; char city[20]; char state[3];

unsigned long int zip; } addr_info;

Доступ к членам структуры

Доступ к отдельным членам структуры осуществляется с помощью оператора “.”. В общем виде использование оператора точка для доступа к члену структуры выглядит таким образом:

имя-объекта.имя-члена

Например:

addr_info.zip = 12345; scanf("%s",addr_info.name);

for (i=0;i<30;i++) printf("%c\n",addr_info.name[i]);

Присваивание структур

Информация, которая находится в одной структуре, структуре того же типа при помощи единственного необходимости присваивать значения каждого члена в

может быть присвоена другой оператора присваивания. Нет отдельности. Как выполняется

присваивание структур, показывает следующая программа:

#include <stdio.h>

int main(void)

{

struct { int a; int b; } x, y;

x.a = 10; y = x;

printf("%d", y.a); return 0;

}

c:\>Example.exe

10

Массивы структур

Структуры можно объединять в массивы. Чтобы объявить массив структур, вначале необходимо определить структуру (то есть определить агрегатный тип данных), а затем объявить переменную массива этого же типа. Например, чтобы объявить 100-элементный массив структур типа addr, который был определен ранее, напишите следующее:

struct addr addr_list[100];

Чтобы получить доступ к определенной структуре, необходимо указывать имя массива с индексом. Например, чтобы вывести ZIP-код из третьей структуры, необходимо написать следующее:

printf("%d", addr_list[2].zip);

addr_list[2].name[0] = 'X';

 

 

Пример

 

 

 

 

 

#include <stdio.h>

void

init_list(

void

)

 

#include <stdlib.h>

{

 

 

 

 

#define MAX 100

register int t;

struct addr {

for(t=0; t<MAX; ++t) addr_list[t].name[0] = '\0';

char name[30];

}

 

 

 

 

char street[40];

 

 

 

 

 

char city[20];

int menu_select(void)

char state[3];

{

 

 

 

 

unsigned long int zip;

char s[80];

} addr_list[MAX];

int c;

void init_list(void), enter(void);

printf("1. Input your name\n");

void delete(void), list(void);

printf("2. Delete your name\n");

int menu_select(void), find_free(void);

printf("3. Print list\n");

 

 

printf("4. Exit\n");

int main(void) {

do {

char choice;

printf("\nEnter the required item: ");

init_list();

gets(s);

for(;;) {

c = atoi(s);

choice = menu_select();

} while(c<0 || c>4);

switch(choice) {

return c;

 

case 1: enter();

}

 

 

 

 

 

break;

 

 

 

 

 

 

case 2: delete();

 

 

 

 

 

 

break;

 

 

 

 

 

 

case 3: list();

 

 

 

 

 

 

break;

 

 

 

 

 

 

case 4: exit(0);

 

 

 

 

 

}

}

 

 

 

 

 

return 0; }

 

 

 

 

 

Пример

void enter(void)

{

int slot; char s[80];

slot = find_free(); if(slot==-1) {

printf("\nList is full"); return;

}

printf("Enter your name: "); gets(addr_list[slot].name); printf("Enter your street: "); gets(addr_list[slot].street); printf("Enter your city: "); gets(addr_list[slot].city); printf("Enter your state: "); gets(addr_list[slot].state); printf("Enter your zip code: "); gets(s);

addr_list[slot].zip = strtoul(s, '\0', 10);

}

int find_free(void)

{

register int t;

for(t=0; addr_list[t].name[0] && t<MAX; ++t) ; if(t==MAX) return -1;

return t;

}

void delete(void)

{

register int slot; char s[80];

printf("Enter number: "); gets(s);

slot = atoi(s);

if(slot>=0 && slot < MAX) addr_list[slot].name[0] = '\0';

}

void list(void)

{

register int t;

for(t=0; t<MAX; ++t) { if(addr_list[t].name[0]) {

printf("%s\n", addr_list[t].name); printf("%s\n", addr_list[t].street); printf("%s\n", addr_list[t].city); printf("%s\n", addr_list[t].state); printf("%lu\n\n", addr_list[t].zip);

}

}

printf("\n\n");

}

Пример. Результат выполнения

Передача структур функциям

struct fred { char x;

int y; float z;

char s[10]; } mike;

func(mike.x); func2(mike.y); func3(mike.z); func4(mike.s); func(mike.s[2]);

.

.

void func(struct fred mike)

{

printf("%d", mike.y);

}

Использование указателей на

структуры

Как и другие указатели, указатель на структуру объявляется с помощью звездочки *, которую помещают перед именем переменной структуры. Например, для ранее определенной структуры addr следующее выражение объявляет addr_pointer указателем на данные этого типа (то есть на данные типа addr):

struct addr *addr_pointer;

Чтобы с помощью указателя на структуру получить доступ к ее членам, необходимо использовать оператор стрелка ->. Вот, например, как можно сослаться на поле zip:

addr_pointer ->zip

Вложенные структуры

Когда структура является членом другой структуры, то она называется вложенной. Например, в следующем примере структура address вложена в emp:

struct emp {

struct addr address; float wage;

} worker;

Здесь структура была определена как имеющая два члена. Первым является структура типа addr, в которой находится адрес работника. Второй член – это wage, где находятся данные по его зарплате. В следующем фрагменте кода элементу zip из address присваивается значение 93456.

worker.address.zip = 93456;