Инициализация и присваивание структур

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

struct goods {

char * name;//наименование

long price;//оптовая цена

float percent;//наценка в процентах

int vol;//объем партии

char date [9];//дата поставки партии

};

struct goods coat = {

“пиджак черный”, 4000, 7.5, 220, «12.01.97»

};

Стандарт языка С разрешает присваивание структур. Однако для структур не определены операции сравнения даже на равенство. И сравнивать структуры нужно только поэлементно.

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

Наиболее наглядно и естественно доступ к элементам структур обеспечивается с помощью уточненных имен. Конструкция

имя_структуры.имя_элемента

играет роль названия (имени) объекта того типа, к которому отнесен элемент в соответствии с определением структурного типа.

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

Уточненное имя – это выражение с двумя операндами и операцией «точка» между ними. Операция «точка» называется операцией доступа к элементу структуры. У нее самый высокой ранг наряду со скобками (и операцией «стрелка» для доступа к элементам структуры через адресующий ее указатель).

Уточненное имя используется для выбора правого операнда операции «точка» из структуры, задаваемой левым операндом. Левый операнд должен иметь структурный тип, а правый операнд должен быть именем компонента (элемента) данной структуры. Тип результата операции «точка» ‑ это тип именуемого ею компонента структуры.

Указатель на структуру, настроенный на конкретную структуру того же типа, обеспечивает доступ к ее элементам двумя способами:

(* указатель_на_структуру).имя_элемента

или

указатель_на_структуру->имя_элемента

Первый способ традиционный. Он основан на обратимости операции разыменования (*) и получения адреса (&). Важным является наличие скобок, ограничивающих операцию разыменования (*). Скобки необходимы, так как бинарная операция «точка» имеет более высокий приоритет, чем унарная операция разыменования.

Второй способ доступа к элементам структуры с помощью «настроенного» на нее указателя предусматривает применение специальной операции «стрелка» (->). Операция «стрелка» обеспечивает доступ к элементу структуры через адресующий ее указатель того же структурного типа.

Операция «стрелка» двуместная. Применяется для доступа к элементу, задаваемому правым операндом, той структуры, которую адресует левый операнд. В качестве левого операнда должен быть указатель на структуру, в качестве правого – обозначение (имя) компонента этой структуры.

Операция «стрелка» иногда называется операцией косвенного выбора компонента (элемента) структурированного объекта, адресуемого указателем.

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

Определяются массивы структур так же, как и массивы других типов данных. Естественное отличие – служебное слово struct в названии структурного типа.

Для введенного ранее структурного типа можно определить:

struct goods list [10];

Операции над указателями на структуры

Эти операции не отличаются от операций над другими указателями на данные. Если присвоить указателю на структуру конкретного структурного типа значение адреса одного из элементов массива структур того же типа, то, изменяя значение указателя (например, с помощью операций ++ или --), можно равномерно перемещаться по массиву структур.

//Программа вычисляет сумму заданного количества комплексных чисел,

//представленных в программе массивом array[] структур

#include "stdafx.h"

#include "conio.h"

#include "locale.h"

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL,"Russian");

struct complex

{//определение структурного типа complex

float x;//вещественная часть

float y;//мнимая часть

} array [] = {1.0, 2.0, 3.0, -4.0,

-5.0, -6.0, -7.0, -8.0};

struct complex summa = {0.0, 0.0};

struct complex *point = &array[0];

int k, i;

k = sizeof(array)/sizeof(array[0]);

for(i = 0; i<k; i++)

{

summa.x += point->x;

summa.y += point->y;

point++;

}

printf("\n Сумма: real = %5.2f\n imag = %5.2f",

summa.x, summa.y);

getch();

}

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

Сумма: real = -8.00, imag = -16.00

Варианты заданий к практической работе №1

Вариант 1

1.) Описать структуру с именем STUDENT, содержащую следующие поля:

· фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT, записи должны быть упорядочены по возрастанию номера группы;

· вывод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4.0;

· если таких студентов нет, вывести соответствующее сообщение.

Вариант 2

1.) Описать структуру с именем STUDENT, содержащую следующие поля:

· фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT, записи должны быть упорядочены по возрастанию среднего балла;

· вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5;

· если таких студентов нет, вывести соответствующее сообщение.

Вариант 3

1.) Описать структуру с именем STUDENT, содержащую следующие поля:

· фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT, записи должны быть упорядочены по алфавиту;

· вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2;

· если таких студентов нет, вывести соответствующее сообщение.

Вариант 4

1.) Описать структуру с именем AEROFLOT, содержащую следующие поля:

· название пункта назначения рейса;

· номер рейса;

· тип самолета.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT, записи должны быть упорядочены по возрастанию номера рейса;

· вывод на экран номеров рейсов и типов самолетов, вылетающих в пункт назначения, название которого совпало с названием, введенным с клавиатуры;

· если таких рейсов нет, выдать на дисплей соответствующее сообщение.

Вариант 5

1.) Описать структуру с именем AEROFLOT, содержащую следующие поля:

· название пункта назначения рейса;

· номер рейса;

· тип самолета.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из семи элементов типа AEROFLOT, записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;

· вывод на экран пунктов назначения и номеров рейсов, обслуживаемых самолетом, тип которого введен с клавиатуры;

· если таких рейсов нет, выдать на дисплей соответствующее сообщение.

Вариант 6

1.) Описать структуру с именем WORKER, содержащую следующие поля:

· фамилия и инициалы работника;

· название занимаемой должности;

· год поступления на работу.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER, записи должны быть размещены по алфавиту;

· вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;

· если таких работников нет, выдать на дисплей соответствующее сообщение.

Вариант 7

1.) Описать структуру с именем TRAIN, содержащую следующие поля:

· название пункта назначения;

· номер поезда;

· время отправления.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN, записи должны быть размещены в алфавитном порядке по названиям пунктов назначения;

· вывод на дисплей информации о поездах, отправляющихся после введенного с клавиатуры времени;

· если таких поездов нет, выдать на дисплей соответствующее сообщение.

Вариант 8

1.) Описать структуру с именем TRAIN, содержащую следующие поля:

· название пункта назначения;

· номер поезда;

· время отправления.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN, записи должны быть упорядочены по времени отправления поезда;

· вывод на дисплей информации о поездах, направляющихся в пункт, название которого введено с клавиатуры;

· если таких поездов нет, выдать на дисплей соответствующее сообщение.

Вариант 9

1.) Описать структуру с именем TRAIN, содержащую следующие поля:

· название пункта назначения;

· номер поезда;

· время отправления.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа TRAIN, записи должны быть упорядочены по номерам поездов;

· вывод на дисплей информации о поезде, номер которого введен с клавиатуры;

· если таких поездов нет, выдать на дисплей соответствующее сообщение.

Вариант 10

1.) Описать структуру с именем MARSH, содержащую следующие поля:

· название начального пункта маршрута;

· название конечного пункта маршрута;

· номер маршрута.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH, записи должны быть упорядочены по номерам маршрутов;

· вывод на дисплей информации о маршруте, номер которого введен с клавиатуры;

· если таких маршрутов нет, выдать на дисплей соответствующее сообщение.

Вариант 11

1.) Описать структуру с именем MARSH, содержащую следующие поля:

· название начального пункта маршрута;

· название конечного пункта маршрута;

· номер маршрута.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа MARSH, записи должны быть упорядочены по номерам маршрутов;

· вывод на дисплей информации о маршрутах, которые начинаются или кончаются в пункте, название которого введено с клавиатуры;

· если таких маршрутов нет, выдать на дисплей соответствующее сообщение.

Вариант 12

1.) Описать структуру с именем NOTE, содержащую следующие поля:

· фамилия, имя;

· номер телефона;

· день рождения (массив из трех чисел).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE, записи должны быть упорядочены по датам дней рождения;

· вывод на дисплей информации о человеке, номер телефона которого введен с клавиатуры;

· если такого нет, выдать на дисплей соответствующее сообщение.

Вариант 13

1.) Описать структуру с именем NOTE, содержащую следующие поля:

· фамилия, имя;

· номер телефона;

· день рождения (массив из трех чисел).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE, записи должны быть размещены по алфавиту;

· вывод на дисплей информации о людях, чьи дни рождения приходятся на месяц, значение которого введено с клавиатуры;

· если таких нет, выдать на дисплей соответствующее сообщение.

Вариант 14

1.) Описать структуру с именем NOTE, содержащую следующие поля:

· фамилия, имя;

· номер телефона;

· день рождения (массив из трех чисел).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа NOTE, записи должны быть упорядочены по трем первым числам номера телефона;

· вывод на дисплей информации о человеке, чья фамилия введена с клавиатуры;

· если такого нет, выдать на дисплей соответствующее сообщение.

Вариант 15

1.) Описать структуру с именем ZNAK, содержащую следующие поля:

· фамилия, имя;

· знак Зодиака;

· день рождения (массив из трех чисел).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK, записи должны быть упорядочены по датам дней рождения;

· вывод на дисплей информации о человеке, чья фамилия введена с клавиатуры;

· если такого нет, выдать на дисплей соответствующее сообщение.

Вариант 16

1.) Описать структуру с именем ZNAK, содержащую следующие поля:

· фамилия, имя;

· знак Зодиака;

· день рождения (массив из трех чисел).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK, записи должны быть упорядочены по датам дней рождения;

· вывод на дисплей информации о людях, родившихся под знаком, наименование которого введено с клавиатуры;

· если таких нет, выдать на дисплей соответствующее сообщение.

Вариант 17

1.) Описать структуру с именем ZNAK, содержащую следующие поля:

· фамилия, имя;

· знак Зодиака;

· день рождения (массив из трех чисел).

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ZNAK, записи должны быть упорядочены по знакам Зодиака;

· вывод на дисплей информации о людях, родившихся в месяц, значение которого введено с клавиатуры;

· если таких нет, выдать на дисплей соответствующее сообщение.

Вариант 18

1.) Описать структуру с именем PRICE, содержащую следующие поля:

· название товара;

· название магазина, в котором продается товар;

· стоимость товара в рублях.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE, записи должны быть размещены в алфавитном порядке по названиям товаров;

· вывод на дисплей информации о товаре, название которого введено с клавиатуры;

· если таких товаров нет, выдать на дисплей соответствующее сообщение.

Вариант 19

1.) Описать структуру с именем PRICE, содержащую следующие поля:

· название товара;

· название магазина, в котором продается товар;

· стоимость товара в рублях.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа PRICE, записи должны быть размещены в алфавитном порядке по названиям магазинов;

· вывод на дисплей информации о товарах, продающихся в магазине, название которого введено с клавиатуры;

· если такого магазина нет, выдать на дисплей соответствующее сообщение.

Вариант 20

1.) Описать структуру с именем ORDER, содержащую следующие поля:

· расчетный счет плательщика;

· расчетный счет получателя;

· перечисляемая сумма в рублях.

2.) Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из восьми элементов типа ORDER, записи должны быть размещены в алфавитном порядке по расчетным счетам плательщиков;

· вывод на дисплей информации о сумме, снятой с расчетного счета плательщика, введенного с клавиатуры;

· если такого расчетного счета нет, выдать на дисплей соответствующее сообщение.

Домашняя работа

1. Выполнить задание по вариантам.

2. Подбельский В.В., Фомин С.С. Программирование на языке Си: учеб. пособие. стр. 275-306.

Наши рекомендации