Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

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

Читайте также:
  1. I. ВВЕДЕНИЕ. ПРОБЛЕМЫ И ОСОБЕННОСТИ РАЗВИТИЯ СПОРТИВНОГО ТУРИЗМА НА СОВРЕМЕННОМ ЭТАПЕ.
  2. II.3 Характерные особенности фразеологизмов
  3. III. В особенности нужно решительно помогать детям тупым и глупым от природы.
  4. IV. ОСОБЕННОСТИ ПСИХОМОТОРНОГО РАЗВИТИЯ РЕБЕНКА ДО 3Х ЛЕТ
  5. V. Повторите методические рекомендации для студентов по методике обследования пациента, учитывая возрастные особенности.
  6. V2: Особенности спроса и предложения факторов производства.
  7. А.Д.: А вы о людях можете рассказать, с которыми служили вместе с вами? Вот Белоусов, например? Какой он человек был, черты характеа какие-то особенности?

Примером структуры может послужить любой объект, для которого описывается ряд его характеристик, имеющих значение в данной программе. Например, для книг это может быть название, автор, количество страниц; для окружности — координаты центра, диаметр, цвет. На языке программирования C объявление вышеупомянутых структурных типов данных может выглядеть так:

struct book {

char title[50];

char author[30];

int pages;

};

struct circle {

int x, y;

float dia;

char color[10];

};

В данном случае мы как бы создаем новый тип данных, но еще не объявляем переменных этих типов.

struct circle a, b, c;

struct book mybook;

Здесь объявляются три структуры типа circle и одна структура типа book.

Каждая переменная типа circle содержит четыре элемента (или поля) — x, y, dia, color. Можно сказать, что они представляют собой вложенные переменные. Причем эти переменные разных типов. Таким образом переменная-структура позволяет объединить под одним именем ряд разнородных данных. Обычно это нужно для удобства обработки данных. Если нельзя было бы создавать структуры, то пришлось бы создавать множество независимых переменных или ряд массивов, явной взаимосвязи между которыми не было бы. Структуру же позволяют объединять взаимосвязанные данные.

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

a.x = 10; a.dia = 2.35;

printf("%.2f ", a.dia);

 

 

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

struct book lang_c = {"Language C", "Ritchi", 99};

Значение переменной-структуры можно присвоить переменной того же типа:

struct book { char *title, *author; int pages; };

struct book old, new;

old.title = "GNU/Linux"; old.author = "people"; old.pages = 20213;

new = old;

new.pages += 2000;

printf("%d, %d\n", old.pages, new.pages);

В четвертой строке кода данные переменной old присваиваются new. В итоге вторая структура содержит копию данных первой.

Структуры и функции

Структуры-переменные можно передавать в функции в качестве параметров и возвращать их оттуда. Структуры передаются по значению, как обычные переменные, а не по ссылке, как массивы.

Рассмотрим программу, в которой одна функция возвращает структуру, а другая — принимает ее в качестве параметра:

#include <stdio.h>

#include <math.h>

struct circle { int x, y; float dia; char color[10]; };

struct circle new_circle();

void cross (struct circle);

main () {

struct circle a;

a = new_circle();

cross(a);

}

struct circle new_circle() {

struct circle new;

printf("Координаты: "); scanf("%d%d", &new.x, &new.y);

printf("Диаметр: "); scanf("%f", &new.dia);

printf("Цвет: "); scanf("%s", new.color);//gets(new.color);

return new;

}

void cross (struct circle c) {

double hyp;

hyp = sqrt((double) c.x * c.x + (double) c.y * c.y);

printf("Расстояние от центра круга до начала координат: %.2lf\n", hyp);

if (hyp <= c.dia / 2) puts("Круг пересекает начало координат");

else puts("Круг не содержит точки начала коорднат");

}

Объявляется структура circle как глобальный тип данных. Таким образом любая, а не только main(), функция может создавать переменные этого типа.

Функция new_circle() возвращает структуру, а функция cross() принимает структуру по значению. Следует отметить, что можно создавать функции, которые как принимают (возможно, несколько структур) так и возвращают структуру.

В функции new_circle() создается переменная new типа struct circle, поля которой заполняются пользователем. Функция возвращает значение переменной new в функцию main(), где это значение присваивается переменной a, которая также принадлежит типу sctruct circle.

Функция cross() определяет, пересекает ли круг начало координат. В ее теле вычисляется расстояние от центра круга до начала координат. Это расстояние является гипотенузой прямоугольного треугольника, длина катетов которого равна значениям x и у. Далее, если гипотенуза меньше радиуса, то круг пересекает начало координат, т.е. точку (0, 0).

В функции main() при вызове cross() данные, содержащиеся в переменной a, копируются и присваиваются переменной c.

 

Указатели и структуры

В отличие от массивов, структуры передаются в функции по значению. Это не всегда рационально, т.к. структуры могут быть достаточно большого размера, и копирование таких участков памяти может замедлять работу программы. Поэтому часто структуры в функцию передают по ссылке, при этом можно использовать как указатель, так и операцию получения адреса.

struct book new; // переменная-структура

struct book *pnew; // указатель на структуру

reader(&new); // передаем адрес

pnew = &new;

reader(pnew); // передаем указатель

Тогда функция reader() должна иметь примерно такое объявление:

void reader (struct book *pb);

 


Дата добавления: 2015-10-13; просмотров: 112 | Нарушение авторских прав


Читайте в этой же книге: Язык программирования Си | Представление данных в памяти компьютера. | Явное преобразование типов | Простые и составные инструкции. | Динамические массивы. Особенности обработки динамических массивов. | ИНДЕКСАЦИЯ В МАССИВАХ | Указатели на функции. Особенности использования. | Классификация динамических структур данных | Память. Классы памяти. Модификаторы классов памяти. Область видимости, время жизни и место размещения объекта в памяти. | Достоинства, отличительные особенности и сравнительная характеристика языка программирования Си. |
<== предыдущая страница | следующая страница ==>
Строки. Операции над строками. Указатели на строки.| Основы файловой системы: файл, каталог, дисковод, полное имя файла, внутреннее представление информации в файле. Типы файлов.

mybiblioteka.su - 2015-2024 год. (0.013 сек.)