Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решенные оветы на теорию Си.docx
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
166.91 Кб
Скачать

21. Структуры и объединения. Особенности использования.

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

Обычно создание в программе одной переменной структурного типа не имеет особого смысла. Чаще структурами пользуются, когда необходимо описать множество похожих объектов, имеющих разные значения признаков. Значения каждого объекта следует объединить вместе (в структуру) и тем самым отделить от значений других объектов. Например, описание ряда книг или множества людей. Таким образом мы можем организовать массив, где каждый элемент представляет собой отдельную структуру, а все элементы принадлежат одному и тому же структурному типу.

Пример:

struct computer { char *type; char *proc; int qty; };

void viewer (struct computer *);

void changer (struct computer *);

main () {

struct computer comps[N]= {

"Desktop", "earlier then P4", 10,

"Desktop", "P4", 30 ,

"Desktop", "Core", 20 ,

"Desktop", "AMD", 2 ,

"Notebook", "Core", 1 };

viewer(comps);

changer(comps);

viewer(comps);

}

void viewer (struct computer *comp) {

int i;

for (i=0; i < N; i++, comp++)

printf("%2d) %-8s - %-15s: %3d\n", i+1, comp->type, comp->proc, comp->qty);

}

void changer (struct computer *comp) {

int i, differ;

printf("Введите номер модели: ");

scanf("%d", &i); i--;

printf("На сколько уменьшить или увеличить: ");

scanf("%d", &differ);

(comp+i)->qty += differ;

}

Массив структур инициализируется при его объявлении.

Функции viewer() и changer() принимают указатели на структуру computer.

В теле viewer() указатель инкрементируется в заголовке цикла; таким образом указывая на следующий элемент массива, т.е. на следующую структуру.

В выражении (comp+i)->qty скобки необходимы, т.к оператор -> имеет более высокий приоритет. Скобки позволяют сначала получить указатель на i-ый элемент массива, а потом обратиться к его полю.

Декрементирование i в функции changer() связано с тем, что индексация начинается с нуля, а номера элементов массива, которые пользователь видит на экране, с единицы.

Для того, чтобы уменьшить количество компьютеров, при запросе надо ввести отрицательное число.

22. Структуры. Массивы структур. Передача массивов структур в функции.

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

Структура – это способ связать воедино данные разных типов и создать пользовательский тип данных.

Общий вид:

struct my_struct

{

<тип> <имя 1-го элемента>;

<тип> <имя 2-го элемента>;

…………

<тип> <имя последнего элемента>;

} [<имя переменной типа заданной структуры (возможно массива)>];

Массив структур - обыкновенный массив элементов типа определённой нами структурой (подобный массиву любого другого типа), например

my_struct first[99];

даст нам массив first из 100 элементов типа my_struct. Как можно отсюда заметить, индексируется массив структур с 0.

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

void main()

{

[какой-то код]

my_struct example1[N];

my_struct *example2;

int N = 10, M = 20; // размеры массивов

print(example1, N); // N нужно передать, чтобы функция знала

init(example2, N); // размер массива

[какой-то код]

}

void print(my_struct *st, int N)

{

// печать массива структур

}

void init(my_struct *st, int M)

{

// инициализация массива

}