Имена объектов программы должны быть осмысленными.

Пример.

tip razmer adres

Hе нужно!

xx aa a1 a2

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

Пример.

BegKm EndKm FieldName

В венгерской нотации перед именем записывается тип объекта программы.

Пример.

intBegKm intEndKm charFieldName

Не применяйте в программе сходные имена!

Пример.

value values

ax1 axi

k K

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

Пример.

fund1 Tab15

Имя не должно совпадать с главным словом либо с именем библиотечной функции.

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

Пример. Язык PL/1.

if if = then then

then=else;

Else

else=if;

приёмы и язык программирования

Деятельно применяйте эргономичные и понятные изюминки языка.

Пример.

Caa=b=0; k++; x+=c; //Многократное присваивание – это комфортно!

Basicax=5 : y=x^3-2 ‘2-3 связанные маленькие руководства в 1 строчок

Изучайте и применяйте библиотечные функции. Малоупотребительные комментируйте.

Пример.

// pow(x,n) – возведение x в степень n

3. Не используйте трюки!

Пример. Формирование единичной матрицы.

for(k=0; k

for(m=0; m

x[k][m]=((k+1)/(m+1))*((m+1)/(k+1)); // Это трюк!

}

}

То же самое возможно записать так.

for(k=0; k

for(m=0; m

x[k][m]=0;

}

x[k][k]=1;

}

4. Не игнорируйте предупреждения и старайтесь их ликвидировать!

Предупреждение при трансляции как правило показывает место вероятной неточности.

Conversion may lose signicant digits a При преобразовании смогут быть утрачены значащие цифры. Появляется, к примеру, при попытке присваивания short=long либо Integer=Long (Basic).

Parameter ‘doc’ is never used a Параметр ‘doc’ ни при каких обстоятельствах не употребляется. Значительно чаще появляется по окончании модификации делаемых руководств программы, в то время, когда необходимость в параметре doc отпала, а в объявлении либо в перечне параметров процедуры он сохранился.

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

Пример.

y=2*(a+b) / sqrt((a+b)*(a+b)+(c+d)*(c+d));

Не изменяйте значение параметра цикла в тела цикла.

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

Избегайте руководств перехода.

Эти руководства нарушают естественный порядок исполнения программы. Придерживайтесь принципа: текст программы нужно просматривать как книгу: слева направо и сверху вниз.

Не применяйте помеченные руководства, на каковые нет ссылок.

Единственный суть для того чтобы применения меток – это дополнительное комментирование. Для чего тогда комментарии языка?

Объявляйте все переменные очевидно.

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

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

При последующей модификации одного фрагмента программы такие переменные смогут привести к ошибке в другом фрагменте.

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

Для них с осторожностью нужно использовать операции равняется и не равняется.

Пример. Цикл с вещественным параметром.

For x=0 To2 Step0.05

……………………

Next x

При x=2 проход по циклу может не выполниться. Нужно записывать так:

For x=0 To 2.02 Step 0.05

……………………

Next x

Применяйте исчерпывающие испытания.

В случае, если переменная обязана принимать значения 1|2|3, не нужно считать, что ее значение равняется 3, если оно не равняется 1 и не равняется 2, т.к. вероятны неточности.

Стиль в языках С и Basic

По оценке автора:

ОВ – очень ответственная совет;

В – совет средней важности;

МВ – совет довольно малой важности.

Степень важности рекомендаций определялась на основании оценки их влияния на написание надежной (с минимумом неточностей) программы.

1. (В) Имена. Применять паскалевскую либо венгерскую нотации.

2. (В) Описатели. В случае, если постановка задачи не требует повышенной точности представления, применять для данных с плавающей точкой типы float (ЖД) и Single (Basic).

3. Литералы.

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

#define TRUE 1

#define FALSE 0

Не нужно забывать, что логические данные в программе на языке Basic занимают в памяти 2 байта, значения сохраняются в виде True (-1), False (0), а на языке C они занимают в памяти 1 байт и сохраняются в виде true (1), false (0).

(В) Старайтесь избегать в тексте программы литералов, заменяйте их символическими константами посредством директивы #define (язык C) либо #const(язык Basic).

4. (В) Массивы.

Для языка C направляться отметить такие особенности.

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

Пример.

#define SIZE 50

float Matrix[SIZE][SIZE];

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

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

Пример.

Dim Matrix(,) As Single

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

Пример.

ReDim Matrix(10, 10)? 10-верхняя граница индекса

? Память под матрицу 11х11

Такая инструкция в теле процедуры может употребляться многократно. Более детально область и синтаксис применения инструкции ReDim будет изложена разделе 10.6. «Динамические массивы».

Минимальное значение индекса кроме этого в любой момент равняется 0, исходя из этого не нужно использовать разрешенную правилами инструкцию вида: ( to ). Это ведет к избыточному выделению памяти.

5. (ОВ) В языке C нужно не забывать об изюминках остатка и / операторов деления %при работе с целыми операндами. При делении целого на целое итог в любой момент целый. Оператор % применяйте лишь для целых операндов.

6. (В) Для логических операторов и || в языке C вычисление выражения заканчивается, когда итог выяснен, а для подобных операторов Andи Orв языке Basic проверяются оба операнда.

Пример.

Выражение i

7. (ОВ) В языке Cпри применении библиотечных функций не забудьте включить файл прототипов.

Пример.

#include

#include

8.(В) Помните об эргономичных возможностях языка С: многократном присваивании, операторах: ++ — = (для Basicтоже).

9. Ввод-вывод:

C(ОВ):

— при вводе информации функцией scanf в перечне разрешённых необходимо использовать оператор нахождения адреса ;

— помните завершать ввод данных инструкции scanf клавишей Enter (закрывает буфер ввода);

— помните завершать управляющую строчок инструкции printf знаком ‘\n’ (перевод на новую строчок);

— при малоизвестном диапазоне выводимых значений данных с плавающей точкой применяйте спецификацию g.

Basic(В)

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

Пример.

Imports System.Math

Imports System.Console

…………………………….

y=Cos(x)+Sin(x)

WriteLine(y={0:g5}, y)

Вопросы для контроля и самопроверки

Вопросы для самопроверки

1. Как разумно размещать инструкции текста программы?

2. Какую роль играются отступы при размещении положенных руководств?

3. В чем сущность венгерской нотации имен?

4. На что, возможно, показывает предупреждение при трансляции?

5. В чем различие в применении операторов И и Либо в языках Cи Basic?

6. Чем отличается воздействие оператора деления / в языках Cи Basic?

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

1. В каких местах необходимо осуществлять перенос инструкции, если она не входит в строчок?

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

3. По какой причине нежелательно применять в программе схожие имена?

4. Для чего необходимо очевидно объявлять все объекты программы?

5. По какой причине направляться избегать руководств перехода?

6. В чем преимущество работы с массивами в языке Basic?

Эти. ДОПОЛНЕНИЕ

Материал данного раздела содержит данные о совокупностях и типах данных, своеобразных для конкретного языка программирования, исходя из этого ниже рядом с заглавием раздела в скобках будет указываться принадлежность обрисовываемой конструкции к языку: C++и B – Basic.

Перечислимый тип

10.1.1. Тип enum (C++)

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

enum {[=],

[ [=]]…};

Пример.

enum spectr{RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET};

После этого возможно определять переменные этого типа:

spectr color1, color2;

Главное слово enum есть сокращением от enumeration – перечисление.

Запись из примера эквивалентна введению символических констант вида:

#define RED 0

#define ORANGE 1

#defineYELLOW 2

#defineGREEN 3

#define BLUE 4

#defineVIOLET 5

Переменные типа spectr смогут принимать лишь указанные значения. При попытке присваивания им другого значения выдается неточность.

Пример.

color1=GREEN; // Возможно

color2=WHITE; // Неточность!

В случае, если при объявлении типа символическим константам из перечня не задается значений, то первая из них по умолчанию приобретает значение 0, последующие на 1 больше. В случае, если какой-либо из констант задается значение, а последующим нет, то они приобретают следующее по порядку целое значение.

Пример.

enum RussianCop{five=5, ten=10, fifty=50};

enum RussianRoub{One=1, Two, Five=5, Ten=10, Fifty=50, Hundred=100, FiveHundred=500, Thousand=1000, FiveThousand=5000};

enum mark{BAD=2, MIDDLE, GOOD, FINE};

Практически разумными при работе с данными перечислимых типов являются лишь следующие операторы: присваиваниеacolor1=VIOLET; и сравнениеacolor1==color2.

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

10.1.2. Тип enum (B)

Фактически подобен такому же типу языка C++.

Формат объявления типа:

Enum

[=]

[[=] ]

……………………………………………….

End Enum

Пример.

Enum spectr

Red

Orange

Yellow

Green

Blue

Violet

End Enum

Объявление переменных имеет форму:

Dim color1, color2 As spectr

использования и Правила объявления переменных этого типа абсолютно совпадают с правилами языка C++. Имеются лишь 2 отличия:

— значения переменных и перечисляемых констант относятся к типу long;

— при присвоении переменной значения не из перечня констант неточности не появляется.

10.2. Тип decimal (B)

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

Примерный диапазон представления (по полной величине):

1e-28 – 7.93e+28.

Литералы данного типа определяются добавлением в финиш значения знака d.

Значение по умолчанию (как для всех числовых типов) равняется 0.

Пример объявления переменных.

Dim sum1, TotalSum as Decimal

………………………………………

sum1 = 12345.678905e-15D

По окончании завершения ввода текста среда масштабирует введенное значение и преобразует его.

sum1 = 0.000000000012345678905D

Эти сведенья нужны при вычислениях и денежных расчётах с фиксированной точкой с заданной точностью и позволяют задавать предельное число значащих цифр.

Замечание. До версии Visual Basic.NET (2008) в языке существовал тип данных Currency, предназначенный с целью проведения финансовых расчетов, что относился к десятичным данным с фиксированной точкой (4 символа по окончании точки). В связи с тем, что платформа Visual Studioявляется многоязыковой средой разработки (языки C++,VB,C#,F#) и требует однообразные типы данных для них, указанный тип, начиная с версии VS2008, был заменен на тип данных Decimal.

10.3. Тип date (B)

Эти этого типа в памяти представляются особым форматом, совершенно верно знать что нет необходимости. Любой элемент занимает в памяти 8 байтов. Диапазон представления дат от 1 января 0001 года до 31 декабря 9999 года, времени – от 0:00:00 до 23:59:59.

Литералы данного типа заключаются между знаками #. Они смогут записываться в разных форматах, но по окончании окончания ввода среда преобразует введенный формат даты/времени в формат, принятый в США: m/d/yyyy h:mm:ss {AM|PM}, где m — № месяца (1 либо 2 цифры в зависимости от значения), d — № дня в месяце (подобно), yyyy – год, h – час (1 либо 2 цифры), mm – 60 секунд, ss – секунды, AM (ante meridiem – до полудня), PM (post meridiem – по окончании полудня) – указатели 12-часовой шкалы.

Пример.

#01 Jan2001# a #1/1/2001#

#13:03:03# a #1:03:03 PM#

#13/11/2001 5:54:56# a #11/13/2001 5:54:56 AM#

Подобное преобразование может привести к неточности. К примеру, запись вида #9/3/2001# будет интерпретироваться как: 3 сентября 2001 года, в то время как, быть может, имелось в виду 9 марта 2001 года (принятый в РФ краткий формат даты). Исходя из этого разумно записывать литералы даты/времени как строки. Наряду с этим преобразования формата в среде не будет.

Пример.

09.03.2001 18:34:30 a 9 марта 2001 года 6 часов 34 мин. 30 секунд вечера

При выводе значений (печать, экран) употребляются установленные в пункте ПускaПанель управленияaЯзык и региональные стандарты форматы (для даты – краткий, к примеру, 11.03.2001).

Пример объявления переменных.

Dim BirthDay AsDate

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

Dim day1, day2 As Date, day3 As Integer

day1 = #3/9/1999#

day2 = #3/10/2001#

day3 = day2 — day1

Возьмём 732.

Замечание. Visual Studio.NETразличных предположений есть многоязыковой средой разработки, которую довольно часто именуют платформой .NET Frameworkили Dot NET(dot – точка). Она применяет типы данных, неспециализированные для всех языков. В конкретных языках для обозначения типов данных применяют псевдонимы для этих неспециализированных типов. К примеру, тип Shortсоответствует Int16, тип Integer – Int32. Для типа Date таким неспециализированным типом есть DateTime. Тип DateTimeпредоставляет пользователю разные способы (функции) для обработки данных, содержащих даты и/либо время. При обращении к ним перед именем способа обязан находиться префикс Date либо имя переменной типа Date, для которой выполняется манипуляция.

Ниже приводятся самые популярные функции, свойства и методы, каковые поделены на 3 группы по виду обращения.

Обращение без префикса.

DateString – возвращает системную дату в формате mm-dd-yyyy.

TimeString – возвращает системное время в виде hh:mm:ss.

Now – возвращает системные время и дату в формате установок ОС.

DateAdd(промежуток-литерал String, число, дата) – возвращает дату, отстоящую от дата на число промежутков. Вероятные значения довода промежуток:

— yyyy – год,

— q – квартал,

— m – месяц,

— ww – семь дней,

— d – сутки,

— h – час,

— n – 60 секунд,

— s – секунда.

Пример.

DateAdd(m, 1, #1/31/2000#) a #02/29/2000#

DateDiff(промежуток, дата1, дата2) – возвращает число промежутков между дата2 и дата1. В случае, если дата1 дата2, возвращается число 0. Функция имеет 2 необязательных довода: первый день недели и значение интервала и первая неделя года = w – сутки семь дней. Потребление этих значений изучить самостоятельно.

Пример.

DateDiff(d, #3/9/2000#, #3/10/2001#) a 366

DatePart(промежуток, дата) – возвращает заданную промежутком часть дата. Функция кроме этого имеет 2 необязательных довода: первый первая неделя и день недели года. По умолчанию первым днем семь дней считается Воскресенье. В примере продемонстрировано как посредством символической константы сделать первым днем Понедельник. Подобные константы имеется и для других дней семь дней.

Пример.

DatePart(yyyy, #3/9/2015#, vbMonday) a 2015 ‘ vbMonday=2

DatePart(q, #3/9/2015#, vbMonday) a 1

DatePart(m, #3/9/2015#, vbMonday) a 3

DatePart(d, #3/9/2015#, vbMonday) a 9

DatePart(ww, #3/9/2015#, vbMonday) a 11

DatePart(w, #3/9/2015#, vbMonday) a 1 ‘w – сутки семь дней

DateSerial(год, месяц, сутки) – возвращает значение типа Date.

Пример.

DateSerial(2014, 2, 26) a 26.02.2014 0:00:00

Day(дата) – возвращает сутки месяца.

Weekday(дата[, 1-й сутки недели]) – возвращает порядковый № дня семь дней.

Month(дата) – возвращает № месяца.

Year(дата) – возвращает год.

Today – возвращает системную дату.

Timer – возвращает значение типа Double, показывающее количество секунд, прошедших В первую очередь дней.

DateString – возвращает системную дату в виде строчка.

Пример.

Day(#3/9/2015#) a 9

Weekday(#3/9/2015#, vbMonday) a 1

Month(#3/9/2015#) a 3

Year(#3/9/2015#) a 2015

Hour(время) – возвращает целое от 0 до 23 (час довода).

Minute(время) – возвращает 60 секунд (0 – 59).

Second(время) – возвращает секунды (0 – 59).

Пример.

Hour(#6:34:30 PM#) a 18

Minute(#6:34:30 PM#) a 34

Second(#6:34:30 PM#) a 30

Обращение с префиксом имя переменной.

Употребляется для преобразования значения дата/время в строчок.

Data1.ToString – преобразует значение типа Date в строчок.

Data1.ToShortDateString – то же в маленький формат даты.

Data1.ToLongDateString — то же в долгий формат даты.

Пример.

Dim data1As Date=26.2.2014

data1.ToStringa26.02.2014 0:00:00

data1.ToShortDateStringa26.02.2014

data1.ToLongDateStringa26 февраля 2014 г.

Обращение с префиксом Date.

Date.IsLeapYear(год) – возвращает True, в случае, если год високосный, False, в случае, если нет.

Date.DaysInMonth(год, месяц) – возвращает число дней в месяце заданного года.

10.4. Тип void (С)

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

Пример.

void putmsg( ){

printf(Hello, world!\n);

} /* End putmsg */

Данный тип кроме этого употребляется для создания универсальных указателей void *, о которых отправится обращение в другом разделе.

10.5. Подмассивы (сечения) (C)

В языке Сможно разглядывать многомерный массив как одномерный, элементами которого являются массивы на 1 меньшей размерности.

Пример.

float sales[3][4][5];

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

Допустимы следующие обращения к содержимому этого массива:

sales – массив полностью,

sales[ i ] – к i-му подмассиву 4*5,

sales[ i ][ j ] – к элементу с индексами iи j: массив из 5 элементов,

sales[ i ][ j ][ k ] – скалярная величина: фактически элемент массива sales.

Применение сечений время от времени очень комфортно, в особенности при обращении к процедуре.

Пример. Отыскать индексы больших элементов каждой строки матрицы.

#define M 30

#define N 30

int main( ){

float a[M][N]; int s[M], ind(int, float[ ]);

…………..

for(i=0; i

s[ i ]=ind(n, a[ i ]);// Доводом функции ind есть i-я строчок

}

…………..

}//End main

int ind(int n,float x[ ]){// Параметр имеется одномерный массив длиной в

// строчок

int i, k; float y;

k=0; y=x[0];

for(i=1; i

if(y

y=x[ i ]; k=i;

}

}

return k;

} //End ind

10.6. Динамические массивы (B)

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

Таковой массив объявляется простым образом, но без указания границ индексов, но с указанием размерности, которая, как и тип элементов, не может быть поменяна.

Пример.

Dim DinArray( , ) As Single

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

ReDim [Preserve] ([, ]…)

Инструкция Redim в отличие от инструкции Dim есть делаемой. Последующие руководства смогут поменять границы индексов.

Пример.

Redim DinArray(m-1, n-1)

…………………………..

ReDim DinArray(m,n)

Замечание. Отметим, что в Visual Basic.NET, начиная с версии 2008, нижняя граница измерений массивов в любой момент равна 0, исходя из этого имеет суть изменять лишь их верхние границы (большой индекс).

При исполнении инструкции ReDim все значения элементов, каковые были заданы ранее, теряются. Наряду с этим числовые значения заменяется нулями, строки – безлюдными строчками (). Но, имеется возможность сохранить ветхие значения элементов массива. Для этого в инструкции ReDimнеобходимо употребить главное слово Preserve (сохранить). При применении опции Preserve возможно изменять лишь верхнюю границу последнего измерения.

Пример.

ReDim Preserve DinArray(m-1, n)

Пример. Дан целый массив ai, i=1…m. Организовать массив b из элементов массива a без повторяющихся значений.

b(0)=a(0):n=1

For i = 1 To m — 1

For j = 0 To n — 1

Ifa(i) = b(j) Then Exit For

Next

If j = n Then ‘ Включаем в b

n += 1

ReDim Preserve b(n — 1)

b(n — 1) = a(i)

End If

Next

При переопределении динамических массивов очень комфортно использовать встроенную функцию языка Basic:

UBound([, ]) – верхняя граница. По умолчанию № измерения равен 1.

Пример. Расширить на 1 границы массива DinArray.

ReDim DinArray(Ubound(DinArray)+1, Ubound(DinArray, 2)+1)

объединения и Структуры

Структуры

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

Пример. Структура Работник (Worker):

— таб. номер;

— фамилия и.о.;

— должность;

— сумма.

Формат структуры:

struct []{

}[];

Пример.

struct{ // Сведения о звезде

long nom_GC; // Номер по каталогу GC

float mv; // Блеск (звездная величина)

char spectr[5]; // Спектр. класс

double alfa; // Прямое восхождение

double delta; // Склонение

double mu_alfa; // Собственное перемещение по alfa

double mu_delta; // ——————- ————- по delta

char rem[15]; // Особенности (примечания)

} направляться;

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

Пример. Определение нескольких структур одного строения.

struct{

…….

} ref_star, // Опорная звезда

view_star; // Замечаемая звезда

Довольно часто используется описание (не определение!) типа структуры с последующим его применением при объявлении переменных данного типа. Практически это метод введения типа данных пользователя в отличие от предопределенных типов языка C++. Тип довольно часто именуют ярлыком либо меткой структуры. Как правило без него возможно обойтись, но он нужен при описании рекурсивных структур, каковые излагаются ниже в данном разделе.

Пример. Описание типа star.

struct star{

…………

};

Определение переменных данного типа:

star ref_star, // Опорная звезда

view_star; // Замечаемая звезда

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

Примеры.

struct star{

long nom_GC;

float mv;

char spectr[5];

struct{ // Подструктура

double alfa;

double delta;

} koord; // Координаты

struct{ // Подструктура

double alfa;

double delta;

} move; // Собственное перемещение

char rem[15];

};

struct data{ // Дата

int day; // Сутки месяца

int month; // Номер месяца

int year; // Год

char month_name[4]; // Наименование месяца

};

struct form{ // Анкета

char name[25]; // Фамилия И.О.

char address[30]; // Адрес

char post[20]; // Должность

data birth_date; // Дата рождения

data work_date; // Дата поступления на работу

};

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

Пример.

ref_star.koord.delta

form.birth_date.year

Допустимы массивы структур.

Пример.

struct{ /* Сведения о погоде за год */

struct{

double max, min, mid;

} temperature;

struct{

double max, min, mid;

} humidity;

struct{

double max, min, mid;

} pressure;

short number_of_observations;

} weather[12];

В языке Basic для объявления структур применяют главное слово Structure.

Формат объявления

Dim Structure

End Structure

Это описание нового типа данных. Для определения (выделения памяти) переменных этого типа нужно объявление вида

[, ]…

Пример. Объявление типа

Dim Structure star ? Сведения о звезде

nom_GCAs Long ? Номер по каталогу GC

mvAs Single ? Блеск (звездная величина)

spectr As String ? Спектр. класс

alfaAs Double ? Прямое восхождение

deltaAs Double ? Склонение

mu_alfaAs Double ? Собственное перемещение по alfa

mu_deltaAs Double? ——————- ————- по delta

rem As String ? Особенности (примечания)

End Structure

Объявление переменных

Dim view_star, ref_star Asstar

Обращение к элементам структуры выполняется по тем же правилам, что в языке C++.

Пример.

view_star.mu_alfa

ref_star.rem

Все правила языка Cприменимы и к языку Basic.

10.7.2. Рекурсивные структуры (С++)

Рекурсией, в общем случае, возможно назвать правило, разрешающее выяснить некий объект посредством другого объекта той же структуры. Самый распространены рекурсивные функции, несложным примером которых есть формула вычисления факториала: n!=n*(n-1)!

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

Пример.

struct node{

int data;

node *next;

};

Тут в состав структуры включают указатель на структуру того же типа. Такие структуры именуют рекурсивными. Их использование будет рассмотрено в курсе Структуры данных.

Поля битов (С)

До сих пор минимальными адресуемыми элементами программы являлись объекты размером в 1 байт. Примерами таких объектов являлись эти типа char в языке Cи типа Byte в языке Basic. Но байт содержит 8 битов (бинарных цифр). Язык C разрешает манипулировать с отдельными битами информации. Такая необходимость появляется, по большей части, при программировании аппаратуры, входящей в состав ПК, либо программно-аппаратного комплекса. Средством реализации таковой возможности есть особенный вид структуры, имеющий в качестве элементов так именуемые поля битов.

Записываются такие структуры следующим образом:

struct{

unsigned []: ;

……………………..

}

Пример. Формат регистра состояния ГД RX211.

struct{

unsigned error :1;

unsigned initialize :1;

unsignedaddr :2;

unsigned rx02 :1;

unsigned :2;/* Hе употребляются */

unsigned density :1;

unsigned trreg :1;

unsignedenable :1;

unsigned done :1;

unsigned select :1;

unsigned funct :3;

unsigned go :1;

}save_211;

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

Объединения (смеси) (С)

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

union []{

описание элемента 1;

описание элемента 2;

……………….;

описание элемента n;

}[];

Пример.

union{

float radius; // Окружность

float side[2]; // Прямоугольник

float triangle[3]; // Треугольник

float point[2]; // Точка

}GeomFig;

В любой момент времени в памяти, отведенной объединению, может пребывать лишь один элемент, т.е. память употребляется элементами поочередно. Размер отводимой памяти определяется размером самый длинного элемента. В примере это треугольник – 12 байтов.

Увидим, что обобщением понятия объединения есть тип данных Object в языке Basic.

Переменные структуры

Переменной именуют структуру, в состав которой входит хотя бы 1 смесь.

Неспециализированная схема построения таковой структуры следующая:

struct{

неспециализированные компоненты,

показатель активной компоненты (тэг),

union{

переменные компоненты

};

………………………………………………..

};

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

Пример.

Паспортные эти:

— фамилия имя отчество,

— серия,номер,

— дата рождения,

— место рождения,

— национальность,

— прописка,

— домашнее положение:холост|женат|разведен,

— переменная часть,

— военнообязанный:да|нет.

enum sem_pol{holost, genat, razveden};

struct pasport{

char fio[30];

char nomer[12];

data birthdate;

char mesto[15];

char nation[15];

char propis[40];

enum sem_pol pr;

union{

/* холост — пусто */

/* женат */

struct{

data svadba;

charwife_fio[30];

unsignedchislo_children;

struct{

char name[15];

char pol;

struct data birthdate;

}children[PAZMEP];

}sostav;

/* разведен */

data razvod_day;

}sem_sost;

unsigned charpriziv;

};

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

10 сильных имён — оберегов для мальчиков.


Интересные записи:

Понравилась статья? Поделиться с друзьями: