22335

Структуры в языке Си: основные понятия. Массивы структур. Указатели на структуры. Вложение структур. Структуры и функции. Объединения. Перечисления. Определение и использование новых типов данных. Классы имен

Лекция

Информатика, кибернетика и программирование

Указатели на структуры. Структуры и функции. СТРУКТУРЫ В ЯЗЫКЕ СИ: ОСНОВНЫЕ ПОНЯТИЯ При решении задач вычислительной математики информационного обеспечения и системного программирования очень часто приходится сталкиваться с наборами данных имеющими достаточно сложную логическую организацию.

Русский

2013-08-04

45 KB

9 чел.

ЛЕКЦИЯ 8

Структуры  в языке Си: основные понятия. Массивы  структур. Указатели на структуры. Вложение структур. Структуры и функции. Объединения. Перечисления.  Определение  и использование новых типов   данных. Классы имен.

$ 1. СТРУКТУРЫ В ЯЗЫКЕ СИ: ОСНОВНЫЕ ПОНЯТИЯ

При решении задач  вычислительной  математики,  информационного   обеспечения  и  системного  программирования  очень часто приходится  сталкиваться с наборами данных, имеющими достаточно сложную логическую организацию. Таковыми, например, являются всевозможные каталоги,  статистические таблицы, информационные белютени  и  наборы  данных,   создаваемые  компилятором  при обработке программ на языках высокого  уровня. В то же время, оперативная память  ЭВМ  организована  крайне     примитивно  в логическом отношении, представляя собой последовательность занумерованных ячеек длинной в один байт каждая. Такое несоответствие логической сложности  возникающих  в  приложениях  структур   данных  и  возможностей  их машинного представления неизбежно должно  вызывать значительные трудности при разработке программного  обеспечения,  заставляя  программистов  всякий раз решать непростую задачу  отображения этих структур данных на линейную структуру  памяти  ЭВМ.   Возможный  путь решения возникающей проблемы состоит в создании языков программирования, поддерживающих  такую  логическую  организацию   данных,  которая  наиболее типична для широкого круга прикладных задач. К подобным языкам, в частности, относится и язык Си, обладающий  чрезвычайно мощными средствами представления и обработки сложных агрегатов данных. В Лекциях 3 и 4 мы уже рассмотрели одно- и многомерные  массивы  переменных,  определив  их как упорядоченные последовательности элементов данных одного типа. Не вызывает никаких сомнений, что понятие  массива является одним из важнейших понятий всякой языковой системы,  предназначенной для формализованного описания  вычислительных  

алгоритмов.  Однако  статичность и однородность массивов в том виде, как  они были определены ранее,  несколько  ограничивает  возможность  их  применения для описания внутренних логических связей реальных информационных  систем. В этой лекции рассматриваются более сложные агрегаты данных, называемые структурами, для которых требование однородности уже не имеет места. Сами же структуры могут быть объединены  в  массивы  или вкладываться одна в другую, предоставляя тем самым возможность необычайно гибкой логической организации данных.  Под структурой в языке Си понимается набор одной  или  большего   числа  переменных, возможно имеющих различный тип и объединенных под   единым именем, называемым именем структуры.  Последнее  должно  быть  правильным  идентификатором в смысле грамматики языка (см. Лекцию 1,  $ 3). Описание всякой структуры в программе начинается  с  ключевого     слова struct и в простейшем случае имеет следующий формат:

     struct { member-declaration list } identifier <, identifier ... >;

где  struct  есть  ключевое  слово языка Си, а в угловые скобки (<>)   заключена необязательная часть конструкции. Здесь member-declaration   list есть одно или более описаний переменных, каждая из которых  называется  элементом  структуры,  а identifier - суть имя переменной,  определяемой как имеющей тип структура. Так, например, инструкция

                     struct  { char  name[30];

                               int   group; }  student;

определяет  структуру  с именем student, элементами которой являются  массив символов name и целочисленная переменная group. Каждое из описаний в member-declaration list имеет тот же самый  формат,  что  и  рассмотренные ранее описания обычных переменных или  массивов, однако здесь недопустимо использование  описателей  класса   памяти  (см. Лекцию 7, $ 2) и инициализирующих выражений (см. Лекцию  3, $ 3). Вся эта совокупность описаний, заключенная в фигурные скобки, определяет общую схему структуры и называется ее шаблоном.  Всякий  элемент структуры, входящий в состав шаблона, должен иметь свое  собственное, уникальное в пределах данного шаблона, имя.          Память под размещение отдельных элементов структуры  выделяется   компилятором последовательно, начиная с первого из них, чем гарантируется  непрерывное хранение структуры в целом. Так в нашем примере,  целочисленная переменная group, занимающая два байта, будет размещена сразу же после последнего элемента символьного массива name.   Доступ к элементам структуры осуществляется путем  указания  ее     идентификатора,  за  которым следует символ точка (.), и имени конкретного элемента этой структуры. Такая операция носит название  операции получения элемента структуры, а ее приоритет так же высок, как   и приоритет операции доступа к отдельным элементам массива (см. Лекцию 3, $ 1). Например, обозначение

                               student.group

задает элемент group в составе структуры student,  в  то  время  как   ссылка

                              student.name[9]

выделяет десятый элемент массива name той же структуры.  В отличие от имени массива, имя структуры само по себе не является  синонимом своего имени. По существу это означает, что употребление имени структуры без следующего за ним символа операции получения элемента (.) и его имени не является  допустимым  и  приводит  к  ошибке на этапе компиляции программы. Для получения же адреса начала   структуры  необходимо явным образом применить операцию & (см. Лекцию  4, $ 1) к имени структуры или ее первого элемента. Например, следующие два адресных выражения

                     &student    и    &student.name[0]

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

                              &student.group

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

      struct <tag> { member-declaration list } <identifier <, ... >>;

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

                struct tag identifier <, identifier ... >;

определяющие имя identifier как имеющее тип struct tag.   В следующем примере

               struct DATE  { int   day;

                              int   month;

                              int   year;

                              char  day_name[15];

                              char  mon_name[15]; }  date_1;

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

                           struct DATE  date_2;

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

                  struct STACK  { int    pointer;

                                  float  vector[100]; };

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

                           struct STACK  stack;

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

                              stack.vector[9]

что  соответствует  обращению  к  десятому элементу массива vector в  составе структуры stack.   В  инструкциях описания структур, как и при определении обычных   переменных или массивов, может содержаться дополнительная информация  о классе памяти (см. Лекцию 7, $ 2) в виде соответствующего описателя, стоящего перед ключевым словом struct:

                       static struct STACK  memory;

Способы их назначения и роль в  программе  остаются  в  этом  случае  прежними.  В  частности,  структуры, имеющие класс памяти static или   extern, могут быть инициализированы путем указания в фигурных  скобках  списка  начальных значений всех или нескольких первых элементов  определяемой структуры. Так, например,  возвращаясь  к  структурному   шаблону с именем DATE, можем записать

                   struct DATE  date_3 = { 17, 3, 1989,

                                           "пятница",

                                           "февраль" };

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

$ 2. МАССИВЫ СТРУКТУР

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

примере

        struct BOOK  { char  author[30];  /*  Автор книги         */

                       char  title[256];  /*  Название книги      */

                       int   year;        /*  Год издания         */

                       int  pages;        /*  Количество страниц  */

                     }  catalog[10];      /*  Массив структур     */

имя  catalog  об'явлено  как массив десяти структур с общим шаблоном  BOOK. Организация данных, подобная этой,  может  быть  использована,  например, при составлении библиографических каталогов.   Для  обращения  к  отдельным элементам массива структур его имя   всякий раз необходимо модифицировать при  помощи  квадратных  скобок   ([]),  задающих операцию взятия элемента массива. Конкретный элемент   выбранной из массива структуры выделяется в этом случае обычным  

образом при помощи символа точка (.). Так, обращение вида

                            catalog[3].title[4]

задает пятый символ массива title элементов типа char в составе четвертого  элемента  массива  структур catalog. Применяя к какому-либо   элементу массива операцию & получения адреса

                                &catalog[7]

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

           catalog == &catalog[0].author[0] == catalog[0].author

$ 3. УКАЗАТЕЛИ НА СТРУКТУРЫ

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

      struct <tag> { member-declaration list } *identifier <, ... >;

или

                     struct tag *identifier <, ... >;

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

                struct STUDENT  { char  name[30];

                                  int   group; }  *studptr;

определяя  тем  самым  указатель studptr на структурный тип STUDENT. При этом комбинация *studptr должна рассматриваться как сама  структура  и  формально  можно задать ссылку на ее отдельный элемент, используя операцию точка (.):

                             (*studptr).group

Заметим, что в этом примере, как и  при  определении  указателей  на   массивы  (см. Лекцию 4, $ 3), круглые скобки являются существенными,   поскольку стандартный приоритет операции получения элемента (.) выше  приоритета операции косвенной адресации (*).  Однако последняя запись может и не  иметь  конкретного  смысла,

поскольку создавая указатель на структуру компилятор не выделяет реальную память под хранение ее элементов. Эта ситуация полностью аналогична той, с которой мы столкнулись в Лекции 4, рассматривая эквивалентность  массивов  и  указателей.  В  то  же время, указатели на  структуры обеспечивают принципиальную возможность более гибкого  манипулирования  данными,  нежели  сами структуры, поскольку используя     аппарат указателей память под размещение элементов  структуры  можно   выделять  динамически  при  помощи  функций  alloca(),  malloc() или   realloc() (см. Лекцию 4, $ 4). Так, например, воспользовавшись  первой из этих функций, мы можем написать

        studptr = (struct STUDENT*)alloca(n*sizeof(struct STUDENT));

зарезервировав тем самым блок  памяти,  достаточный  для  размещения   массива n структур с шаблоном STUDENT. Теперь,  используя  обозначения  последнего  примера, попробуем   придать конкретный смысл арифметическим операциям над указателями на     структуры. Вспоминая, что увеличивая на единицу  значение  указателя   на простой тип данных, мы заставляли его ссылаться на очередной элемент данных соответствующего типа, нетрудно понять, что операции вида

                 studptr = studptr + 1    или    studptr++

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

                        studptr + i == &studptr[i]

или в контексте выделения отдельного элемента структуры

               (*(studptr+i)).name[k] == studptr[i].name[k]

Для удобства выделения элементов структур, заданных своими указателями, в языке Си дополнительно введена операция следования, знаком  которой является комбинация -> символов '-' и '>'. Ее приоритет   совпадает с приоритетом обычной операции получения элемента структуры. Используя эту операцию в нашем примере, вместо обозначения

                              (*studptr).name

определяющего адрес массива name в составе  структуры  с  указателем    studptr, следует писать

                               studptr->name

что семантически совершенно эквивалентно предыдущей записи.

$ 4. ВЛОЖЕНИЕ СТРУКТУР

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

         struct  { int     pointer;

                   struct  { int    length;

                             float  array[MAX}; }  vector[DEPTH];

                 }  stack;

в  котором массив структур vector является внутренним по отношению к   структуре stack. С точки зрения общей теории баз данных  приведенное  описание  может  определять  стек динамических ограниченных векторов  элементов типа float. В этом случае элемент pointer структуры  stack   следует рассматривать как указатель вершины стека глубины DEPTH, реализованного  на  базе  массива структур vector. Каждая же структура  этого массива определяет динамический вектор, текущая длина которого  равна length и ограничена сверху константой MAX.  Для ссылки на отдельные элементы вложенных структур  необходимо  руководствоваться общим правилом доступа к полям структуры,

последовательно применяя операцию получения элемента. Так, например, оператор вида

                   stack.vector[stack.pointer].length++;

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

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

                 struct TNODE  { char          word[30];

                                 struct TNODE  *left;

                                 struct TNODE  *right; };

может определять узел бинарного дерева, в котором располагается символьный массив word и из которого можно спуститься вниз по дереву  в  двух возможных направлениях left и right.

$ 5. СТРУКТУРЫ И ФУНКЦИИ

Совершенно очевидно, что отдельные элементы структур, являющиеся  простыми  переменными  или указателями произвольного типа, могут   быть использованы в качестве аргументов при  обращении  к  функциям.  Однако более важным является вопрос о возможности передачи через аппарат формальных/фактических параметров структур в целом. Эту операцию наиболее естественно осуществить, используя понятие указателя на  структуру.  Для  иллюстрации  технических  деталей, связанных с передачей и   обработкой структур, рассмотрим фрагмент программы,  отыскивающей  в  сводном  каталоге  книгу, имеющую наиболее ранний год издания. Общая  организация данных, необходимая для решения этой задачи, может  быть  представлена  при помощи структурного шаблона BOOK, описанного в $ 2  настоящей лекции.

        #include  <stdio.h>

        #define   MAX  300

        struct BOOK  { char  author[30];  /*  Автор книги         */

                       char  title[256];  /*  Название книги      */

                       int   year;        /*  Год издания         */

                       int  pages;        /*  Количество страниц  */

                     };

        main()

        { int     min_year;

          struct  BOOK  catalog[MAX];

          ..........................................................

          ..........................................................

          ..........................................................

          min_year = find(catalog);

          printf("\nСамая старая книга издана в %d году", min_year);

        }

        int  find(book)

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

        { int  cnt;                /*  Параметр цикла             */

          int  min;                /*  Текущее значение минимума  */

          min = book->year;

          for (cnt = 0; cnt < MAX; cnt++, book++)

             if (book->year < min)

                min = book->year;

          return (min);

        }

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

Замечание.  Некоторые реализации языка Си, в частности компилятор IBM C/2, допускают использование структур как единого  целого  в  качестве аргументов функций, передавая по значению отдельные элементы таких структур.

$ 6. ОБЪЕДИНЕНИЯ

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

       union <tag> { member-declaration list } <declarator <, ... >>;

или

                 union tag declarator <, declarator ... >;

Здесь  union  есть  ключевое слово языка Си, а остальные обозначения   использованы в смысле своих прежних значений. Declarator чаще  всего   является идентификатором переменной, возможно модифицированным с помощью квадратных скобок (для массивов объединений) или символа звездочка (для указателей на объединения).  Память,  выделяемая  под  объединения, определяется длиной наибольшего элемента в составе данного объединения. При этом все  члены   объединения  хранятся  в  одной и той же области памяти с неизменным   начальным адресом.   Для иллюстрации использования объединений рассмотрим пример организации данных, обеспечивающих доступ к рабочим регистрам  микропроцессоров Intel 8086/80286.

           union REGS  { struct  { unsigned int   ax;

                                   unsigned int   bx;

                                   unsigned int   cx;

                                   unsigned int   dx;     }  x;

                         struct  { unsigned char  al, ah;

                                   unsigned char  bl, bh;

                                   unsigned char  cl, ch;

                                   unsigned char  dl, dh; }  h;

                       }  regs;

Здесь  элементы внутренних структур x и h размещены в одной и той же   области памяти, в которую будет пересылаться содержимое рабочих  регистров (скажем, при помощи программы, написанной на языке ассемблера). При этом обращение вида

                                 regs.x.ax

моделирует доступ к регистру AX микропроцессора, а выражения

                        regs.h.al    и    regs.h.ah

обеспечивают  соответственно доступ к младшему AL и старшему AH  байтам этого регистра.

$ 7. ПЕРЕЧИСЛЕНИЯ

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

        enum <tag> { enum-list } <identifier <, identifier ... >>;

или

                 enum tag identifier <, identifier ... >;

Здесь enum есть ключевое слово языка Си, а под enum-list  понимается   список разделенных запятыми идентификаторов и необязательных выражений константного типа:

                    identifier <= cjnstant-expression>

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

                           = constant-expression

входящая  в enum-list, позволяет нарушить стандартное правило назначения числовых значений именам из этого списка,  причем  константное  выражение constant-expression должно иметь тип int. Допустимым также   является совпадение числовых значений различных имен в списке.  Теги перечислений определяются по тем же самым правилам, что  и   теги структур и объединений, и могут быть использованы в сокращенной     форме описания, замещая enum-list.  В  следующем  примере  определяется перечисление с именем day и   объявляется переменная workday, имеющая тип перечисление:

                      enum day  { saturday,

                                  sunday = 0,

                                  monday,

                                  tuesday,

                                  wednesday,

                                  thursday,

                                  friday }  workday;

Значение нуль связывается с идентификатором saturday по умолчанию, а     идентификатору  sunday оно же присваивается явным образом. Остальные   пять имен в этом списке последовательно получают значения от 1 до 5.

$ 8. ОПРЕДЕЛЕНИЕ И ИСПОЛЬЗОВАНИЕ НОВЫХ ТИПОВ ДАННЫХ

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

          typedef type-specifier declarator <, declarator ... >;

Здесь type-specifier есть имя простого типа данных или описание шаблона структуры. Допустимым также является использование имен  типов,  определенных  ранее  в инструкции typedef. Declarator, как и прежде,   представляет собой, возможно модифицированное, имя переменной, которое становится именем вновь определяемого этой инструкцией типа данных.  Рассмотрим несколько наиболее характерных примеров  использования инструкции typedef.

         1.  В простейшем случае эта инструкция позволяет переопределить   имена стандартных типов данных, назначив, например,  имя  whole  для   обозначения стандартного типа int:

                           typedef  int  whole;

         2. Наиболее характерным применением инструкции typedef является  назначение  имен вновь определяемым агрегатам данных. Следующее описание

               typedef  struct  { int   poiter;

                                  char  string[81]; } STACK;

 вводит новый тип данных с именем STACK, задающий структуру с  шаблоном из двух элементов.

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

$ 9. КЛАССЫ ИМЕН

В программах на языке Си идентификаторы используются для именования  большого числа различных объектов, таких как константы, переменные, функции, теги и элементы структур, метки и т. д. С целью облегчения выбора имен и снижения вероятности возникновения  конфликтных  ситуаций, компилятор языка подразделяет все множество идентификаторов на несколько взаимно не пересекающихся классов.  В  пределах     одного  и  того же класса всякое имя должно быть уникальным с учетом   области видимости и времени существования связанного с  этим  именем  объекта  программы. С другой стороны, одинаковые имена могут обозначать множество объектов, принадлежащих различным классам, не приводя  при этом к противоречию на этапах компиляции,  сборки  и  выполнения   программы.  Ниже  приводится описание классов памяти, поддерживаемых   компилятором IBM C/2.

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

         2.  Другой существенный класс образуют теги структур, объединений и перечислений, имена которых должны быть различными в  пределах   одного  уровня видимости. Однако допускается совпадение имен тегов с  именами переменных, функций, элементов структур и прочих объектов из   смежных классов.

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

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


 

А также другие работы, которые могут Вас заинтересовать

75027. У Миколая багато роботи, Розробка виховного заходу для учнів початкових класів 56 KB
  Не так давно в Україні Новий рік зустрічали зі Святим Миколаєм більше знаним у народі як Миколай Чудотворець. У зимову ніч з 18 на 19 грудня святий Миколай спускався на срібній вервечці з неба. А скоро прийде Миколай Мати. Біжіть швиденько спати В дорозі Миколай Тільки не забудьте помолитися перед сном.
75028. Норми морального життя. Урок з основ християнської етики 115 KB
  Допомогти дитині зрозуміти Заповіді Божі їх дотримання у своєму житті наше ставлення до них збагатити словниковий запас виховувати любов до Божого слова та виконання всіх заповідей. Що це за шлях істинний це дотримання і збереження Божих Заповідей. Часто вони виникають із Божих заповідей. А зараз прослухайте ще одну притчу про те як Бог дав Ізраїльтянам десять заповідей.
75029. Сімейні обереги. Сценарій дитячої вистави 57.5 KB
  Вчити передавати почуття героїв вистави. Розвивати артистичні здібності, уміння триматися на сцені. Виховувати культуру святкування дня народження, гостинність, доброту. Прищеплювати любов до традицій свого народу...
75030. Українська хата. Обереги, Позакласний захід 48 KB
  Між дверима і піччю стояли кочерга рогач коцюба хлібна лопата. Піч служить українському селянинові тричі: а для опалення житла; б як тепле спальне місце; в для приготування їжі випікання хліба. Піч – мати – головна в хаті берегиня бо хліб народжувала. На неї клали хліб і накривали теж вишиваним рушником.
75031. Оберіг душі й родини, позакласний виховний захід 147 KB
  Зацікавити учнів вивченням історії розвитку лялькимотанки прищепити повагу до культурних традицій родини й країни. Домогтися глибокого осмислення учнями значення лялькимотанки в житті людини. Про історію народної ляльки та про методику виготовлення та використання ми й поговоримо. Ляльки різних народів відрізняються між собою ззовні і матеріалом з якого зроблені – в Африці вона здебільшого кам’яна або дерев’яна десь глиняна а ще десь – зроблена з тканини але суть і призначення ляльки – незмінні і це споріднює більше аніж...
75032. Цікаві моменти історії бухгалтерського обліку, Методична розробка позакласного заходу 80.5 KB
  Метою даної методичної розробки є удосконалення досвіду проведення позааудиторних заходів. Виникнення і розвиток бухгалтерського обліку є невідємною складовою частиною всієї історії людського суспільства. Сучасна наука не дала однозначної відповіді, який момент слід вважати виникненням бухгалтерського обліку...
75033. Здоровый образ жизни школьника, конспект мероприятия 43 KB
  Цель: расширить и закрепить представление учащихся о том что здоровьеглавное богатство каждого человека сформировать и закрепить представление жить здоровым в здоровом обществе учить заботится о своем здоровье воспитывать желание поддерживать здоровый способ жизни.счастье здоровье успехи в учебе деньги сила ум красота. Давайте подумаем что для человека самое главное в жизни Итак самое главное в жизни для человека здоровье. Здоровье это радость жизнижелание жить творить работать учиться радоваться встречи с друзьями.
75034. Знайомство з основними і похідними кольорами. Малювання мешканців підводного світу. План-конспект уроку для 1 класу 98.5 KB
  Мета: Ознайомити дітей з основними і похідними кольорами; провести бесіду про різноманітність форм і забарвлення мешканців підводного світу; вчити отримувати похідні кольори користуючись палітрою зображувати предмети округлої та видовженої форми рибок мушлі водорості; розвивати уяву фантазію; виховувати естетичний смак любов до природи...