Си пример программы структура

Привет, сегодня поговорим про структуры данных в языке си ы использования, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое структуры данных в языке си ы использования , настоятельно рекомендую прочитать все из категории Алгоритмизация и программирование. Структурное программирование. Язык C. Структуры («записи») представляют собой агрегаты разнородных данных (полей разного типа); в отличие от массивов, где все элементы имеют один и тот же тип.

struct < int x, y; /* два целых поля */ char s[10]; /* и одно — для строки */ > s1;
Структурный тип может иметь имя:
struct XYS < int x, y; /* два целых поля */ char str[10]; /* и одно — для строки */ >;

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

struct XYS s2, *sptr =

Доступ к полям структуры производится по имени поля (а не по индексу, как у массивов):
имя_структурной_переменной.имя_поля

Язык Си для начинающих / #7 — Структуры данных


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

не а #define ВЕС 0 struct < int вес, рост; > x; #define РОСТ 1 x.рост = 175; int x[2]; x[РОСТ] = 175;
s1.x = 13; strcpy(s2.str, «Finish»); sptr->y = 27;
Структура может содержать структуры другого типа в качестве полей:

struct XYS_Z < struct XYS xys; int z; > a1; a1.xys.x = 71; a1.z = 12;

Структура того же самого типа не может содержаться в качестве поля — рекурсивные определения запрещены. Зато нередко используются поля — ссылки на структуры такого же типа (или другого). Это позволяет организовывать списки структур:

struct node < int value; struct node *next; >;
Очень часто используются массивы структур:
struct XYS array[20]; int i = 5, j; array[i].x = 12; j = array[i].x;

Статические структуры можно описывать с инициализацией, перечисляя значения их полей в <> через запятую:

extern struct node n2; struct node n1 = < 1, , n2 = < 2, , n3 = < 3, NULL >;

В этом примере n2 описано предварительно для того, чтобы . s2 = s1;
в отличие от массивов, которые присваивать целиком нельзя:
int a[5], b[5]; a = b; /* ОШИБОЧНО ! */
Пример обращения к полям структуры:

typedef struct _Point < short x, y; /* координаты точки */ char *s; /* метка точки */ >Point; Point p; Point *pptr; short *iptr; struct _Curve < Point points[25]; /* вершины ломанной */ int color; /* цвет линии */ >aLine[10], *linePtr = . pptr = /* указатель на структуру p */ p.x = 1; p.y = 2; p.s = «Grue»; linePtr->points[2].x = 54; aLine[5].points[0].y = 17;
В ы р а ж е н и е значение ———+————+————+————+———- p.x | pptr->x | (*pptr).x | (x | 1 ———+————+————+————+———- x | ошибка ————+—————-+——————+———- iptr= pptr->x | iptr= x) | адрес поля ————+—————-+———+———+———- *pptr->s | *(pptr->s) | *p.s | p.s[0] | ‘G’ ————+—————-+———+———+———- pptr->s[1] | (s[1] | p.s[1] | ‘r’ ————+—————-+——————+———- s[1] | ошибка ————+—————-+——————+———- (*pptr).s | pptr->s | p.s | «Grue» ————+—————-+——————+———- *pptr.s | ошибка ————————————————+———-
Вообще (field = p.field pptr->field = (*pptr).field

Язык программирования Си. Урок 1. Базовая структура программы

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

struct a< int x, y; char *s; > A; union b< int i; char *s; struct a aa; > B;
Структура: ________________________ A: | A.x int | Три поля ———————— расположены подряд. | A.y int | Получается как бы ———————— «карточка» с графами. | A.s char * | ———————— А у объединений поля расположены «параллельно», на одном месте в памяти. _______________________________________________________ B: | B.i int | B.s char * | B.aa : B.aa.x int | ————| | struct a : B.aa.y int | —————| : B.aa.s char * | |___________________________|

Это как бы «ящик» в который можно поместить значение любого типа из перечисленных, но не ВСЕ ВМЕСТЕ («и то и это», как у структур), а ПО ОЧЕРЕДИ («или/или») . Об этом говорит сайт https://intellect.icu . Размер его достаточно велик, чтоб вместить самый большой из перечисленных типов данных. Мы можем занести в union значение и интерпретировать его как другой тип данных это иногда используется в машинно-зависимых программах. Вот пример, выясняющий порядок байтов в shortчислах:

Читайте также:
Какие программы являются вредоносными для компьютера

union lb < char s[2]; short i; > x; unsigned hi, lo; x.i = (02 hi = x.s[1]; lo = x.s[0]; printf( «%d %dn», hi, lo);
#include union < int i; unsigned char s[sizeof(int)]; > u; void main()< unsigned char *p; int n; u.i = 0x12345678; for(n=0, p=u.

s; n < sizeof(int); n++, p++)< printf(«%02X «, *p); >putchar(‘n’); >
или порядок слов в long числах:
union xx < long l; struct ab < short a; /* low word */ short b; /* high word */ > ab; > c; main()< /* На IBM PC 80386 печатает 00020001 */ c.ab.a = 1; c.ab.b = 2; printf(«%08lxn», c.l ); >

5.1.

Найдите ошибки в описании структурного шаблона:
structure

5.2.

Разработайте структурный шаблон, который содержал бы название месяца, трехбуквенную аббревиатуру месяца, количество дней в месяце и номер месяца. Инициализируйте его для невисокосного года.

struct month < char name[10]; /* или char *name; */ char abbrev[4]; /* или char *abbrev; */ int days; int num; >; struct month months[12] = < /* индекс */ , /* 0 */ , /* 1 */ . , /* 11 */ >, *mptr = /* или *mptr = months */ main()< struct month *mptr; printf( «%sn», mptr[1].name ); printf( «%s %dn», mptr->name, mptr->num ); >

Напишите функцию, сохраняющую массив months в файл; функцию, считывающую его из файла. Используйте fprintf и fscanf.

В чем будет разница в функции чтения, когда поле name описано как char name[10] и как char *name? Ответ: во втором случае для сохранения прочитанной строки надо заказывать память динамически при помощи malloc() и сохранять в ней строку при помощи strcpy(), т.к. память для хранения самой строки в структуре не зарезервирована (а только для указателя на нее).

Найдите ошибку в операторах функции main(). Почему печатается не «Февраль», а какой-то мусор? Указание: куда указывает указатель mptr, описанный в main()? Ответ: в «неизвестно куда» — это локальная переменная (причем не получившая начального значения — в ней содержится мусор), а не то же самое, что указатель mptr, описанный выше!

Уберите описание mptr из main. Заметим, что для распечатки всех или нескольких полей структуры следует ЯВНО перечислить в printf() все нужные поля и указать форматы, соответствующие типам этих полей. Не существует формата или стандартной функции, позволяющей распечатать все поля сразу (однако такая функция может быть написана вами для конкретного типа структур). Также не существует формата дляscanf(), который вводил бы структуру целиком. Вводить можно только по частям — каждое поле отдельно.

5.3.

Напишите программу, которая по номеру месяца возвращает общее число дней года вплоть до этого месяца.

5.4.

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

5.5.

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

5.6.

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

5.7.

Что печатает программа?

struct man < char name[20]; int salary; >workers[] = < < «Иванов», 200 >, < «Петров», 180 >, < «Сидоров», 150 >>, *wptr, chief = < «начальник», 550 >; main()< struct man *ptr, *cptr, save; ptr = wptr = workers + 1; cptr = &chief; save = workers[2]; workers[2] = *wptr; *wptr = save; wptr++; ptr—; ptr->salary = save.salary; printf( «%c %s %s %s %sn%d %d %d %dn%d %d %cn», *workers[1].name, workers[2].name, cptr->name, ptr[1].name, save.name, wptr->salary, chief.salary, (*ptr).salary, workers->salary, wptr — ptr, wptr — workers, *ptr->name ); >
С Петров начальник Сидоров Сидоров 180 550 150 150 2 2 И

5.8.

Разберите следующий пример:
#include struct man < char *name, town[4]; int salary; int addr[2]; >men[] = < < «Вася», «Msc», 100, < 12, 7 >>, < «Гриша», «Len», 120, < 6, 51 >>, < «Петя», «Rig», 140, < 23, 84 >>, < NULL, «» , -1, < -1, -1 >> >; main()< struct man *ptr, **ptrptr; int i; ptrptr = &ptr; *ptrptr = /* men+1 */ printf( «%s %d %s %d %cn», ptr->name, ptr->salary, ptr->town, ptr->addr[1], ptr[1].town[2] ); (*ptrptr)++; /* копируем *ptr в men[0] */ men[0].name = ptr->name; /* (char *) #1 */ strcpy( men[0].town, ptr->town ); /* char [] #2 */ men[0].salary = ptr->salary; /* int #3 */ for( i=0; i < 2; i++ ) men[0].addr[i] = ptr->addr[i]; /* массив #4 */ /* распечатываем массив структур */ for(ptr=men; ptr->name; ptr++ ) printf( «%s %s %dn», ptr->name, ptr->town, ptr->addr[0]); >

  1. Как производится работа с указателем на указатель (ptrptr).
  2. При копировании структур отдельными полями, поля скалярных типов (int, char, long, . указатели) копируются операцией присваивания (см. строки с пометками #1 и #3). Поля векторных типов (массивы) копируются при помощи цикла, поэлементно пересылающего массив (строка #4). Строки (массивы букв) пересылаются стандартной функцией strcpy (строка #2). Все это относится не только к полям структур, но и к переменным таких типов. Структуры можно также копировать не по полям, а целиком: men[0]= *ptr;
  3. Запись аргументов функции printf() лесенкой позволяет лучше видеть, какому формату соответствует каждый аргумент.
  4. При распечатке массива структур мы печатаем не определенное их количество (равное размеру массива), а пользуемся указателем NULL в поле name последней структуры как признаком конца массива.
  5. В поле town мы храним строки из 3х букв, однако выделяем для хранения массив из 4х байт. Это необходимо потому, что строка «Msc» состоит не из 3х, а из 4х байтов: ‘M’,’s’,’c’,’’.
Читайте также:
Программа пресса на 30 дней для девушек в домашних условиях

При работе со структурами и указателями большую помощь могут оказать рисунки. Вот как (например) можно нарисовать данные из этого примера (массив men изображен не весь):

—ptr— —ptrptr- ptr | * | <——|—* | —|— ——— | / =========men[0]== / men:|name | *—|——>»Вася» | |—————| | |town |M|s|c|| | |—————| | |salary| 100 | | |—————| | |addr | 12 | 7 | —————- =========men[1]== —>|name | *—|——> «Гриша» .

5.9.

Составьте программу «справочник по таблице Менделеева», которая по названию химического элемента выдавала бы его характеристики. Таблицу инициализируйте массивом структур.

Я хотел бы услышать твое мнение про структуры данных в языке си ы использования Надеюсь, что теперь ты понял что такое структуры данных в языке си ы использования и для чего все это нужно, а если не понял, или есть замечания, то нестесняся пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Алгоритмизация и программирование. Структурное программирование. Язык C

Источник: intellect.icu

Структуры

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

Определение структуры

Для определения структуры применяется ключевое слово struct , а сам формат определения выглядит следующим образом:

struct имя_структуры < компоненты_структуры >;

Имя_структуры представляет произвольный идентификатор, к которому применяются те же правила, что и при наименовании переменных.

После имени структуры в фигурных скобках помещаются компоненты структуры — объекты, которые составляют структуру.

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

Например, определим простейшую структуру:

struct person < int age; char * name; >;

Здесь определена структура person , которая имеет два элемента: age (представляет тип int ) и name (представляет указатель на тип char ).

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

Использование структуры

После определения структуры мы можем ее использовать. Для начала мы можем определить объект структуры — по сути обычную переменную, которая будет представлять выше созданный тип:

// определение структуры person struct person < int age; char * name; >; int main(void) < // определение переменной, которая представляет структуру person struct person tom; >

Здесь определена переменная tom, которая представляет структуру person . И при каждом определении переменной типа структуры ей будет выделяться память, необходимая для хранения ее элементов.

Читайте также:
Написать программу которая в зависимости от введенного числа

Инициализация структуры

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

    По позиции : значения передаются элементам структуры в том порядке, в котором они следуют в структуре:

struct person tom = ;
struct person tom = ;

Обращение к элементам структуры

Также после создания переменной структуры можно обращаться к ее элементам — получать их значения или, наоборот, присваивать им новые значения. Для обращения к элементам структуры используется операция «точка»:

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

Теперь объединим все вместе в рамках программы:

#include struct person < int age; char * name; >; int main(void) < struct person tom = ; printf(«Age: %d t Name: %s», tom.age, tom.name); return 0; >

Консольный вывод программы:

Age: 23 Name: Tom

Можно инициализировать элементы структуры по отдельности:

#include struct person < int age; char * name; >; int main(void)

Объединение определение структуры и ее переменных.

Структуры в Си

Изображение баннера

Структура — это объект в котором может быть несколько других объектов причём разных типов.

Рассмотрим такой объект как веб сайт.

Назовём структуру Website

Сайтов могут быть тысячи и всю эту информацию нужно как-то хранить.

Можно создать массив, но какого типа? url скорее всего char, year int, admin char, rating double

Делать несколько массивов очень накладно.

Чтобы решить эту задачу подойдут структуры. Достаточно объявить тип структуры, напримр Website, перечислить какие объекты мы хотим хранить и какие у них типы. Затем можно создавать новые объекты типа structure объявлять, что они типа Website и обращаться к их вложенным объектам.

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

Website — это называние структуры, что-то вроде типа. Аналог это int, char, float. Только этот тип Вы создаёте сами.

У каждого будет имя, год и рейтинг.

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

#include #include struct Website < char name[80]; int year; float rating; >// пока что никаких объектов не создано — мы просто определили структуру с именем Website. // эта структура содержит три члена (поля) разного типа. site0 , site1 = // 1. Только теперь, когда мы объявили две переменные site0 и site1 типа Website // у нас появились объекты данной структуры // члены site1 инициализированы а вот // site0 пока что «пуст» ; int main () < printf («site1 — Name: %s year: %d rating: %.1fn», site1 . name , site1 . year , site1 . rating ); // 2. Cтандартный способ присвоить значения объектам структуры struct Website site2 = ; printf («site2 — Name: %s year: %d rating: %.1fn», site2 . name , site2 . year , site2 . rating ); // 3. Присвоим значения объектам по отдельности struct Website site3 ; // С int и float всё просто site3 . year = 2010; site3 . rating = 310.1; // А вот с char нужно поработать дополнительно strcpy ( site3 . name , «TopBicycle.ru»); printf («site3 — Name: %s year: %d rating: %.1fn», site3 . name , site3 . year , site3 . rating ); // 4. Заполним структуру с клавиатуры с помощью функции scanf(); struct Website site4 ; printf («Enter the name, year and rating for site4n»); scanf («%s %d %f», site4 . name , site4 . rating ); printf («site4 — Name: %s year: %d rating: %.1fn», site4 . name , site4 . year , site4 . rating ); // 5. Копируем структуру site0 = site4 ; printf («site0 — Name: %s year: %d rating: %.1fn», site0 . name , site0 . year , site0 . rating ); return 0; >

О функции scanf() Вы можете прочитать здесь

gcc -o struc struct.c

site1 — Name: AndreyOlegovich.ru year: 2010 rating: 310.1 site2 — Name: HeiHei.ru year: 2018 rating: 30.0 site3 — Name: TopBicycle.ru year: 2010 rating: 310.1 Enter the name, year and rating for site4 aredel.com 2018 10 site4 — Name: aredel.com year: 2018 rating: 10.0 site0 — Name: aredel.com year: 2018 rating: 10.0

Источник: www.andreyolegovich.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru