Все лекции программирование
.pdfstruct 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;