Вы находитесь на странице: 1из 5

Лабораторная практика № 4

Применение структур в языке программирования С

Цель работы: Изучить структурированный тип в языке C. Написать


программу, использующую операции со структурами.

Теоретические положения

Комбинированный тип данных традиционно в языке Си называют структурой –


это производный тип данных, представляющий собой набор именованных элементов,
объединенных общим именем. Элементы структуры могут быть любого типа,
допустимого в Си, перечисленные в любой последовательности. Битовые поля также
могут быть элементами структуры. Структуры дают возможность легко управлять
сложными данными.
Структура описывается следующим образом:
struct имя структуры { список элементов };
где список элементов определяется как
тип имя; тип имя; тип имя; …,
где
тип — это тип переменной имя,
имя — это идентификатор переменной.
Компилятор использует описание структуры для доступа к её элементам.
Чтобы выделить память под структуру необходимо определить переменную с данным
типом структуры.
Например:
1) struct pattern /* имя структуры */
{
int var1;
int var2; /* элементы структуры */
char fio[15];
} structure1; /* переменная типа pattern */

2) struct patt /* имя структуры */


{
int n;
char f[10]; /* элементы структуры */
};
struct patt structure2; /* объявление переменной типа patt */

Структуру можно явно определить как новый тип данных:


#typedef struct{ int n; char f[10];} Mystruct; /*новый тип Mystruct */
Mystruct structure3; /* объявление переменной типа Mystruct */

1
Доступ к элементам (полям) структуры

Доступ к элементам структуры осуществляется при помощи операторов


выбора ( . и ). Для доступа к элементам структуры используются выражения:
s.m; /* прямой оператор выбора элемента */
sptr->m; /* косвенный оператор выбора элемента */
(*sptr).m; /* аналогичен косвенному оператору */

Здесь s – это идентификатор некоторой структуры, sptr — указатель на


структуру s, m - это идентификатор некоторого элемента структуры.
Рассмотрим пример инициализации и использования структуры:
#include <stdio.h>
#include <string.h>

struct student
{
char name[10];
char surname[15];
int age;
} stud; //переменная stud объявлена как структура типа student

void main ()
{
struct student *s; /* указатель на структуру student*/
s=&stud; /* инициализация указателя*/
strcpy(s->name,"Larry"); /*обращение как к указателю на структуру*/
strcpy(s->surname,"Johnson");
(*s).age=34; /*обращение как к переменной*/
printf("\n Name: %s Surname: %s Age=%i",s->name,s->surname,s->age);
}

Задание

Написать программу, реализующую описание структур и необходимых


действий над ними, исходя из варианта задания.

Варианты заданий

1) struct card
{
/* масть карт */
enum {spades, clubs, diamonds, hearts} suit;
/* достоинство карт */
enum {six, seven, eight, nine, ten, jack, queen, king, ace} value;
} c1, c2;
Описать логическую функцию Kick(с1, с2, сs), проверяющую, бьёт ли карта с1
карту с2, с учётом того, что масть cs является козырной.
2) struct peak
{
char name[15]; // название вершины
2
int height; // высота вершины
} list[30];
Описать процедуру, печатающую название самой высокой вершины из списка.
3) struct point
{
float x,y;
}A, B;
Описать переменную d равную расстоянию между точками A и B.
4) Описать переменную "студент", содержащую: имя, фамилию, отчество,
название учебного заведения, номер группы. Создать список студентов (N>10).
Определить фамилии студентов, учащихся в одной и той же группе, в одном и том же
учебном заведении.
5) Описать переменную "адрес", содержащую: название города, название
улицы, номер дома, корпус, номер квартиры. Создать массив адресов. Поменять
местами номер дома в N-ом адресе и номер квартиры в M-ом адресе.
6) Описать переменную "студент" (см. вариант 4). Создать список студентов
(N>10). Определить названия учебных заведений, в которых учатся однофамильцы и
если у них одинаковые имена, сообщить, что они тёзки.
7) Описать переменную "служащий", состоящую из: имени, фамилии, отчества
служащего, даты рождения, полученного образования, домашнего адреса, профессии.
Создать список служащих (N>10). Определить имена людей с высшим образованием.
Выдать данные о служащем, который имеет ту или иную профессию.
8) Описать переменную "круг", в которой содержатся все данные для
построения круга в декартовой системе координат. Определить площадь и длину
окружности круга.
9) Описать комплексное число. Умножить одно комплексное число на другое.
10) Описать переменную «экзаменационная ведомость» (предмет, номер
группы, список студентов данной группы, их оценки). Определить отличников,
хорошистов, троечников и двоечников.
11) Создать структуры, определяющие положение точки в декартовой и
полярной системе координат. Описать процедуру, преобразующую координаты точки
на плоскости из декартовых в полярные.
12) Создать структуры, определяющие положение точки в декартовой и
полярной системе координат. Описать процедуру, преобразующую координаты точки
на плоскости из полярных в декартовые.
13) Создать список студентов в группе. Определить средний рост и вес
студентов.

3
14) Даны комплексное число z (пара вещественных чисел) и вещественное
число Eps>0. Вычислить с точностью Eps значение следующей комплексной
функции: e z  1  1z!  z2!  z3!  ...  zn! .
2 3 n

15) Найдите корни квадратного трёхчлена с заданными комплексными


коэффициентами.
16) Создать структуру (см. вариант 6). Упорядочить список по алфавиту
пофамильно.
17) Создать структуру (см. вариант 6). Упорядочить список по алфавиту по
возрастанию номеров групп.
18) Задать переменную "круг" (см. вариант 8). Определить в каких четвертях
плоскости лежит данная окружность. В какой четверти лежит его большая часть.
19) Задать две переменные "круг" (см. вариант 8). Определить пересекаются ли
две окружности, если да, то определить точки (точку) пересечения.
20) struct complex
{
float real_p, imaginary_p; // действительная и мнимая часть
// комплексного числа
} x, l;
struct coefficient
{
complex a, b, c;
} p;
Описать функцию, которая вычисляет значение квадратного трёхчлена
ax2+bx+c с коэффициентами из р в комплексной точке х.
21) Описать рациональные числа (поля содержат числитель и знаменатель).
22) Задана последовательность вещественных чисел. Создать переменную, поля
которой содержат:
a) последовательность положительных элементов и их количество;
b) количество нулевых элементов;
c) последовательность отрицательных элементов и их количество.
23) struct time
{
int hour, minute;
} t1, t2;
Определить логическую функцию, проверяющую, предшествует ли время t1
времени t2.
24) struct time
{
int hour, minute;
} t1, t2;
Описать функцию, которая вычисляет время между t1 и t2.
25) Вычислить квадратный корень из комплексного числа.
26) Описать переменную "расписание", содержащую:

4
a) день недели
b) количество пар в этот день
c) время начала и конца пары
d) предмет
e) фамилию преподавателя
27) Описать переменную "валюта", содержащую:
a) название страны
b) название валюты
c) достоинство купюры
d) номерной знак (серия и номер)
28) Описать переменную "автомобиль", содержащую:
a) марка машины
b) Ф. И. О. владельца
c) номерной знак
29) В библиотеке имеются: книги, газеты, журналы. Для каждого печатного
издания указать:
a) название
b) год выпуска (для книги), дату выпуска (для газет и журналов)
c) автора (для книги), редактора (для газеты), редколлегию (для
журнала)
d) объём
30) Составить таблицу, содержащую данные о 20 участниках забега,
включающую в себя: фамилию участника, время (в часах, минутах и секундах).
Выбрать три лучших результата и вывести на экран фамилии и время призёров.
31) Расположить в порядке возрастания произвольную последовательность
игральных карт (масти возрастают в порядке: бубны, червы, винны, трефы) с учётом
козырной масти.
32) Описать переменную "квартира", для которой указать:
1. количество комнат
2. названия комнат
Для каждой комнаты указать:
1. площадь
2. количество мебели
Для каждого элемента мебели:
1. стоимость
2. название
3. материал
5