Структуры

Очень часто в задачах нам нужно объявлять много переменных или массивов, чтобы описать свойства одного предмета. Например, нам нужно описать человека: его рост, возраст и вес. Нам для этого нужно три переменных, но все эти свойства можно поместить в структуру, которая будет хранить эти данные. Другими словами структура позволяет сгруппировать данные для их лучшего представления и хранения. Вот так бы выглядела эта структура в программе:

struct human {
	int height;
	int age;
	int weight;
};  // точка с запятой обязательна

human - это название структуры. После структуры, в отличие от функции, ставится точка с запятой.
Переменные в структуре инициализировать нельзя. По факту мы создали свой тип данных. Чтобы с ним работать, его нужно объявить в главной части программы:

1
2
3
4
5
6
7
8
9
10
11
12

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
struct human {
	int height;
	int age;
	int weight;
};
int main() {
	struct human A;
	return 0;
}

Теперь у нас есть переменная A с типом данных struct human. Чтобы получить доступ к переменным, лежащих в структуре, нам понадобиться оператор точка. Давайте введем данные и прибавим к каждой переменной 2. Результат выведем на экран. Код на Си:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
struct human {
	int height;
	int age;
	int weight;
};
int main() {
	struct human A;
	scanf("%i%i%i", &A.height, &A.age, &A.weight);
	A.height += 2;
	A.age += 2;
	A.weight += 2;
	printf("%i %i %i", A.height, A.age, A.weight);
	return 0;
}

В структурах можно хранить разные типы данных. Давайте к нашей структуре добавим еще и имя человека. Тогда ввод структуры будет выглядеть так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
struct human {
	char name[20];
	int height;
	int age;
	int weight;
};
int main() {
	struct human A;
	scanf("%s%i%i%i", &A.name, &A.height, &A.age, &A.weight);
	return 0;
}

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

Работа с таким массивом никак не отличается от работы с обычными массивами чисел, символов и так далее. Давайте создадим массив структур из предыдущего примера, но оставим только имя и возраст человека. Нам даны данные о n(n ≤ 20) людях, нужно вывести через пробел имена только совершеннолетних людей. Код на Си:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
struct human {
	char name[20];
	int age;
};
int main() {
	int n, i;
	struct human A[20];
	scanf("%i", &n);
	for (i = 0; i < n; i++) {
		scanf("%s%i", &A[i].name, &A[i].age);
	}
	for (i = 0; i < n; i++) {
		if (A[i].age >= 18) {
			printf("%s ", A[i].name);
		}
	}
	return 0;
}

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

Code.C © Copyright Павел Калашников 2021
обратная связь code.c04@mail.ru