Понятие структуры в языке Си 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Понятие структуры в языке Си



Тема 6. Структуры

Цель: познакомиться со способами создания структурного типа данных i переменных структурного типа, с операторами доступа к элементам структурных переменных, с вложенными структурами i массивами структур в языке Си, с оператором SizeOf и декларацией typedef.

Понятие структуры в языке Си

Объявление типа структуры

Декларация переменных структурного типа

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

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

Оператор sizeof

Декларация typedef

Понятие структуры в языке Си

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

В языке Си термин "структура" соответствует понятию "запись" в языках программирования.

Пример 1: строка таблицы журнала студенческой группы.

 

Пример 2: точка в пространстве.

 

Пример 3: круг на плоскости.

 

Для того, чтобы работать со структурой, необходимо:

1. объявить структурный тип;

2. декларировать переменные этого типа.

Объявление типа структуры

Синтаксис:

struct [<имя = тег>]

{<Декларация_члена 1>;

<Декларация_члена 2>;

...

<Декларация_члена n>;

};

Декларация структуры - это описание типа данных.
Если указано имя, то это и есть имя типа.
Имена тегов и имен членов структуры могут совпадать с именами других переменных программы.
Такое описание только описывает образец (шаблон) структуры данного типа, но ремонт, товары НЕ вiдiляе.

Пример 4: точка А в пространстве.

struct struct point

{Int xa {int xa;

int ya; int ya;

int za; int za;

};};

/ * Без тега * / / * с тегом * /

/ * Новый тип - struct point * /

Пример 5: круг на плоскости.

struct struct circle

{Float x0 {float x0;

float y0; float y0;

float r; float r;

};};

/ * Без тега * / / * с тегом * /

/ * Новый тип - struct circle * /

Декларация переменных структурного типа

Синтаксис:

I. <Декларация типа структуры> <список переменных>;

Это сочетание способов, в котором в одной декларации описывается структурный тип и переменные этого структурного типа.

II. struct <тег> <список переменных>

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

Пример 6: описать прямую, проходящую через точки А i В,

Используя ранее введенный тип для представления точки в пространстве.

struct struct point

{Int xa {int xa;

int ya; int ya;

int za; int za;

} A, b;};

struct point a, b;

Инициализации структурных переменных можно выполнить при ее объявлении (по аналогии с массивами):

Пример 7: круг с центром (2, 3) и радиусом 5,5.

/ * Без тега * / / * с тегом * /

struct circle pr = {2.0, 3.0, 5.5}

{Float x0;

float y0;

float r;

} Pr = {2.0, 3.0, 5.5};

Пример 8: расстояние от (0,0) до точки pt.

struct

{Float x;

float y;

} Pr = {20,15}

double dist;

dist = sqrt ((double) pt.x * pt.x + (double) pt.y * pt.y);

printf («От начала координат");

printf ("до точки (% f,% f)", pt.x, pt.y);

printf ("расстояние% f", dist);

Структуры можно вкладывать друг в друга (нет ограничения на глубину вложения).

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

Пример 9: задания прямоугольника координатами точек двух углов.

struct rectange

{

struct point pt1;

struct point pt2;

};

srtuct rectange poly;

float a; / * длина стороны а * /

a = poly.pt2.x - poly.pt1.x;

printf ("Длина стороны a =% f \ n", a);

 

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

Структуры можно объединять в массивы (получаем таблицу):

Пример 10: список студентов с результатами экзаменов.

# Define KST 35

struct list

{Char * fio;

int math;

int phys;

int r_l;

};

struct list group [KST];

Пример 11: Объявление таблицы с инициализацией.

struct list gr [] =

{

{"Андреев", 5, 5, 5},

{"Борисенко", 5, 4, 4},

..........

{"Якименко", 4, 4, 4}

};

 

Оператор sizeof

В декларации списка студентов мы определили размер этого списка (массива структур) с помощью поименованной константы KST:

# Define KST 35

Еще один вариант определения размера этого массива такой. Размер этого массива полностью определен во время компляцiи I дорвнюе произведения количества элементов массива на размер его отдельного элемента, поэтому число элементов массива вычисляется:

число элементов массива = <размер> group / <размер> struct list

В языке Си есть оператор sizeof (унарный, префiксний, правоасоцiативний, высший приоритет). Он работает во время компляцiи. Он применяется для исчисления размера любого объекта:

· sizeof <обкт>

· sizeof (<имя типа данных>)

Результат этого оператора целое, равной размеру (в байтах) объекта или типа данных.

Объектом может быть:

· переменная;

· массив;

· структура.

Именем типа данных может быть:

· имя базового типа (int, long, float,...);

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

Поэтому в операторi препроцессору define возможные записи:

# Define KST (sizeof group / sizeof (struct list))

# Define KST (sizeof group / sizeof group [0])

Второй оператор содержит не <имя типа данных>, а объект (первый элемент массива group).

 

Декларация typedef

Эта декларация позволяет давать новые имена типам данных.

Синтаксис:

typedef <старое имя типа> <новое имя типа>;

Семантика:

<Старое имя> i <новое имя> становятся синонимами.

Пример 12: объявление таблицы с результами экзаменов студентов.

typedef INT Ekz;

typedef CHAR * String;

typedef Struct List

{String fio;

Ekz math;

Ekz phys;

Ekz r_l;

} Liststud;

Liststud Group [KST];

Этот пример iлюстуе использования того имени типа данных, который был декларирован в typedef.

Синтаксис:

<Тип, объявленный typedef> <список змнних>

Принято имя типа-синоньма, объявление в typedef, начинать с большой буквы, чтобы отличать его от базовых типов.

Причины использования typedef:

1. эстетическая: одним именем заменяется сложная декларация типа данных;

2. стремление сделать текст программы более ясным. Например, вместо

3. struct list * pstr; / * указатель на структуру типа list * /

можно объявить:

typedef struct list * Plist;

/ * указатель (P List) на структуру типа list * /

Plist pstr;

4. typedef використують для обеспечения машинной независимости программы на языке Си. Например, зависят от реализации величины цiлочисельних типов данных (int, short, long) i действительных (double, long double). При переносi на другую платформу меняют только декларации typedef, а не декларации всех переменных (целых i действительных).

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

 

 

Понятие функции в языке Си

Определение функции

Вызов функции

Инструкция return (возврат)

Прототип функции

Понятие функции в языке Си

Вспомним универсальный метод решения задач на ЭВМ - метод пошаговой детализации. С его помощью входное задача разбивается на пiдзадачi, между этими пiдзадачамы распределяются обязанности i определяется, как эти пiдзадачi взаимодействуют:

задача {

· пiдзадача 1

· пiдзадача 2

·.............

· пiдзадача n}

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

 

Определение функции

Прежде чем использовать функцию, ее нужно определить

Синтаксис:

<Тип результата> <имя функции> ([<декларация аргументов>]) { <Декларации> / * тело <Инструкции> функции * / };

Могут быть опущены отдельные компоненты этого определения:

    1. если опущено <тип результата>, то по умолчанию тип результата функции - int;
    2. если опущена <декларация аргументов>, то список аргументов пуст (), в этом случае функция без аргументов;
    3. если опущенi <декларации> в <теле функции>, то в такой функции нет локальных переменных;
    4. если опущенi <инструкции> в <теле функции>, то не имеет исчисления результата для этой функции - это "пустая функция" (заглушка)
Пример 1: минимальная функция. dummy () {};

Оператор () - высший приоритет, лiвоасоцiативний.

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

Вызов функции

<Имя функции> ([<список аргументов>])

Значение, возвращаемое функцией, может быть в функции, вызывающей, проигнорировано.

Пример 3: / * вызов printf: * / printf ("как инструкция"); / * Printf возвращает результат: * / if (res = printf ("как выражение")) dummy (); / * успех * /else exit (-1); / * выход в MS-DOS * /

Инструкция return (возврат)

Возвращает результат из вызываемой функции, в с функцию, которая вызывает.

Синтаксис:

return <выражение>; / * если выражение простой * /return (<выражение>); / * если выражение сложное * /

Семантика:

  • приведение к типу результата, который объявлен в функции, вызывающей;
  • функция, которая вызывает, может игнорировать значение, которое возвращает функция, вызываемая;
  • <Выражение> после фразы return может быть отсутствующим, тогда эта функция не возвращает;
  • returnможет быть отсутствующим. В этом случае возврат управления в функцию, которая вызывает, происходит при встрече последней закрывающей скобки '}';
  • в функции возможны несколько инструкцийreturn, если они возвращают значение одного типа;
  • если же различные инструкцииreturnвозвращают функцию, вызывающий, данные разных типов, то программист отвечает за качество работы такой функции;
  • если функция не возвращает результат, то в ее объявлении задается типvoid(пусто) как тип результата i в ее теле не нужна инструкция возвратаreturn.

Прототип функции

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

Синтаксис:

<Тип результата> <имя функции> ();

или более "жесткий" вариант:

<Тип результата> <имя функции> (<декларации типов аргументов>);

Поэтому в примере 4 в функции main необходима декларация:

INT max_int (int, int); / * 1 * /

Она сообщает, что в функции main Ожидается вызов функции max_int с двумя цiлочисельнимы аргументами, которая возвращает результат целого типа.

Этот прототип также можно записать иначе:

INT max_int (); / * 2 * /INT max_int (int a, int b); / * 3 * /

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

 


 


Способы передачи аргументов

Аргументы командной строки

Способы передачи аргументов

В абсолютном большинстве языков программирования существует три способа передачи аргументов

  • по значению;
  • по имени;
  • по ссылке.

Аргументы командной строки

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

Аргументы (формальные) функции main:

  • argc (argument count): количество аргументов командной строки;
  • argv (argument vector): указатель на массив строк, содержащий самые аргументы.
Пример 20: программа echo для печати аргументов командной строки,которые между собой разделены символом _ (чтобы отличить строку результатаот входного). Если командная строка содержит C:> echo Главная функция то программа echo напечатает C:> echo_Головна_функцiя

Для программы echo операционная система построит такие фактические аргументы:

  • argv [0] всегда именем исполняемого файла.
  • argv [argc] должно быть пустым указателем (NULL).
Пример 21: текст программы echo (вариант 1). # include main (int argc, char * argv []) {Int i; for (i = 0; i <argc; i + +) printf ("% s% s", argv [i], (i <argc-1)? "_":""); printf ("\ n"); return 0; } Пример 22: текст программы echo (вариант 2). # include main (int argc, char * argv []) {While (- argc> = 0) printf ("% s% s", + + + argv, (argc> 1)? "_":""); printf ("\ n"); return 0; }

! Аргументы командной строки являются строками.

 

 

Тема 6. Структуры

Цель: познакомиться со способами создания структурного типа данных i переменных структурного типа, с операторами доступа к элементам структурных переменных, с вложенными структурами i массивами структур в языке Си, с оператором SizeOf и декларацией typedef.

Понятие структуры в языке Си

Объявление типа структуры



Поделиться:


Последнее изменение этой страницы: 2017-01-27; просмотров: 887; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.171.121 (0.064 с.)