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

Тема 11. Структуры данных в Си.

График выполнения и сдачи заданий по дисциплине | Типы данных в языке Си. | Использование функции printf( ) и scanf( ). | Операторы языка Си | Тема 3. Управляющие структуры. Структуры повторения While, do – While, For. Управляющие операторы break и continue. | Тема 4. Массивы. Разработка программ с использованием одномерных и двумерных массивов. | Тема 6. Классы памяти и разработка программ. | Тема 7. Указатели в Си. | Тема 8. Использование указателей при обработке одномерных и двумерных массивов. | Тема 13. Работа с файлами в Си. |


Читайте также:
  1. А стоит ли читать модную «молитву задержания»? В молитвословах, изданных Патриархией, ее нет, но множество листовок призывает с помощью этой молитвы задержать приход антихриста.
  2. Адаптер данных (объект DataAdapter)
  3. Адаптеры данных и связанные таблицы
  4. Анализ и оценка удовлетворительности структуры баланса проводятся на основе расчета следующих показателей
  5. АНАЛИЗ НОМИНАТИВНЫХ ДАННЫХ
  6. Анализ состава и структуры имущества
  7. АНАЛИЗ СТРУКТУРЫ И СТИМУЛЯЦИИ ПОВЕДЕНИЯ

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

struct <rname>

{

<type> <fname>;

…………

<type> <fname>;

}

где rname – имя типа структуры, имя типа структуры можно не указывать, в фигурных скобках приводится список элементов структуры с указанием их типов. После определения структурного шаблона осуществляется определение переменной в следующем виде:

struct <rname> <vnames>;

vnames – имя структурной переменной.

Пример:

struct sved

{

char fam[25];

char adr[20];

int gr;

};

struct sved inf;

Структурный шаблон может приводится как внутри определения функции, так и вне функции. Шаблон, приведенный внутри функции, может использоваться только внутри этой функции. Если структурный шаблон располагается вне функции, то этот шаблон может использоваться всеми функциями программы, следующими за его определением. Например, в другой функции можно определить другую структурную переменную inf1 в виде struct sved inf1;

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

struct

{

char fam[25];

char adr[20];

int gr;

} inf;

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

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

static struct sved inf;

В этом случае используется статическая память, и можно инициализировать структуру следующим способом:

static struct sved inf= {“Попов”,

“Сатпаева, 20”,

1978}

Пример: (доступ к элементам структуры)

#include <stdio.h>

main()

{ struct

{ char fam[25];

char adr[20];

int gr;

} inf;

printf(“Введите фамилии: \n”);

gets(inf.fam); /*доступ к элементу fam*/

printf(“Введите адрес: \n”);

gets(inf.adr);

printf(“Введите год рождения: \n”);

scanf(“%d”,&inf.gr);

printf (“%s, %s, %d\n”, inf.fam, inf.adr, inf.gr); }

Массивы структур. При решении задач используются массивы структур, то есть структурная переменная является элементом массива. Описание массивов структур выполняется следующим образом:

struct sved inf[10];

Элементы массива inf[10] являются структурами типа sved.

При определении элементов массивов структур, как и в случае отдельных структур, имя структуры отделяется от имени элемента структуры символом “.”(операция получения элемента). Например:

inf[0].fam – первый элемент массива

inf[1].fam – второй элемент массива

…………………..

inf[9].fam – 10-й элемент массива

(inf[1] – имя структурной переменной)

#include <stdio.h>

#define num 10

struct cved

{ char fam[25];

char adr[20];

int gr; };

main()

{ struct sved inf[num];

int l=0, i;

while (l<num)

{ printf(“Ввод фамилии \n”);

gets (inf[l].fam);

printf(“Адрес: \n”);

gets (inf[l].adr);

printf(“год рождения \n”);

scanf(“%d”, &inf[l].gr);

l++; }

printf(“Сведения о студентах группы \n”);

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

printf(“%s, %s, %d\n”, inf[i].fam, inf[i].adr, inf[i].gr); }

Рассмотрим вложенные структуры

#include <stdio.h>

#define num 5

#define len 15

#define is “Наука”

struct isd

{ char namisd[len];

int godisd; }

struct knig

{ char author[len];

char title[len]

struct isd isdat; }

main()

{ static struct knig masking[num]={{“Петров В.”,

“Информатика”

{“Наука”, 1998}},

{“Савельев В.”,

“Физика”,

{“Наука”,1985}}};

int i;

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

if (masking[i].isdat.nanidd==IS)

printf (“%s %s \n”, masking[i].author, masking[i].title); }

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

Struct knig *ptrst;

Создан указатель ptrst для ссылок на любые структуры типа knig.

Имеют место:

Ptrst==&masking[0];

*ptrst==masking[0];

ptrst->author – это эквивалентно masking[0].author.

Если ptrst является указателем на структуру masking[0], то следующие обозначения эквивалентны

Masking[0].author==(*ptrst).author==ptrst->author

Ptrst+1 ссылается на masking[1].Необходимо отметить, что в данном примере 1 к указателю ptrst прибавляет 47 к адресу, потому, что каждая структура типа ААА занимает 47 байт.

Рассмотрим пример, в котором адрес структуры используется в качестве аргумента функции:

struct ZP

{ char *name;

char *mec;

float nach;

float prem; } SOTR={ “Зуев П”,”январь” 1020.45, 250.15 };

main()

{ float s, fadd();

printf (“Зуеву П. за январь всего начислено %6.2а тенге \n“, fadd(&sotr)); }

float fadd (ptrst)

struct zp *ptrst;

{ float s=0;

s=ptrst->nach+ptrst->prem;

return (s); }

Заметим, что применяется операция & для получения адреса структуры. В отличие от имени массива имя структуры само по себе не является синонимом своего адреса. Рассмотрим массив структур. Имя массива является синонимом его адреса, потому его можно передавать функции.

Struct zp

{ char *name;

char *mec;

float nach;

float prem; } sort[6]={ {“Зуев П.”,”январь”, 8020.45, 1250.15},

……………

{“Потапов М.”,”январь”,6000.50, 1500.20} };

main()

{ float ITS, fadd ();

printf (“Группе сотрудников за январь всего начислено %10.2f тенге \n”, fadd(sort)); }

float fadd (ptrst)

struct zp *ptrst;

{ float ITS;

int i;

for (i=0, ITS=0; i<6; i++; ptrst++)

ITS+=ptrst ->nach+ptrst->prem;

Return (ITS); }

Основная литература: 1осн[393-397], 2осн[406-436], 3осн[108-128]

Дополнительная литература: 9доп[200-209], 11доп[13-16]

Контрольные вопросы:

1. Что такое структуры данных?

2. В каких случаях целесообразно использовать вложенные структуры?

3. Какие преимущества дает использование оператора присоединения?

4. Каков структурный шаблон описания структуры данных?

5. Каким образом осуществляется доступ компонентам структуры данных?

 


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


<== предыдущая страница | следующая страница ==>
Тема 9. Символы и строки в Си.| Тема 12. Динамические структуры данных.

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