Light Style© by Fisana

Перейти к содержимому


РАММ сервис NordFx: копируй сделки лучших трейдеров форекс


NordFX

Фотография

Начальное обучение (Теория)


  • Пожалуйста, авторизуйтесь, чтобы ответить
34 ответов в этой теме

#1 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 17 Декабрь 2009 - 07:35

Начальное обучение языку С++
ICQ 296461926

#2 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 18 Декабрь 2009 - 04:33

Инкримент и декримент

В С++ существуют операторы инкримента и декримента. Операций инкримента и декримента реализуются с помощью соответствующих операторов (++) и (--). Инкримент - это прибавление к переменной единицы .
Декримент – это вычитание из переменной единицы.
Например:
myask = 25;
myask ++;

Значение переменой myask стало 26.
В С++ операторы инкримента и декримента можно использовать в префиксной и постфиксной записи
myask = 25;
myNewAsk= myask++;
// постфиксная запись
В этом случае сначала используется исходное значение переменной равное 25, и оно присваивается переменной myNewAsk, а затем инкрементируется и значение переменной становиться 26.
myask = 25;
myNewAsk= ++myask;
// префиксная запись
В этом случае сначала исходное значение переменной увеличивается на единицу и становиться равным 26 и оно присваивается переменной myNewAsk.

Контрольные вопросы:
1) Чему будут равны значение переменных после выполнения следующего кода?
myask = 25;
myNewAsk=++ myask++;

ICQ 296461926

#3 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 19 Декабрь 2009 - 08:33

Операторы (операторы присваивания и математические операторы)

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

Операторы присваивания
Операторы присваивания (=) позволяет заменить значение операнда, расположенного с левой стороны от знака равенства, значением, вычисляемым с правой стороны от него. Так выражение:
x=a+b;
присваивает операнду х значение, которое является результатом сложения значений переменных а и b. Операнд стоящий слева от оператора присваивание, называется адресным операндом. Операнд стоящий справа от оператора присваивание, называется операционным операндом.
Так можно записать
х=20;//правильно
Такая запись не правильная
20=х;// не правильно

Математические операторы:
В С++ используются 5 математических операторов: сложения(+), вычитания(-), умножения(*), целочисленного деления(/) и деления по модулю(%)
Операция сложения и вычитания возвращают сумму и разность двух операндов
x=a+b;
x=a-b;
целочисленное деление это деление без остатка
x=21/4;
В результате х принимает значение 5. А чтобы получить остаток надо разделить число 21 по модулю.
х=21%4;
В результате х принимает значение 1

Контрольные вопросы:
Чему равно значение переменных myAsk и myBid после выполнения следующего кода?
int myAsk=5;
int myBid;
myBid = myAsk+3;
myAsk = myBid+2;

ICQ 296461926

#4 Илья Мурамец

Илья Мурамец

    пробегал

  • Пользователи ST test (off)
  • Pip
  • 9 сообщений

Опубликовано 19 Декабрь 2009 - 01:05

Типы данных
char - Символьный тип; значением переменных может быть символ алфавита, цифра, знак препинания или знак арифметической операции. Диапазон значений: от -128 до +127. Длина - 1 байт.
int - Целочисленный тип. Диапазон значений: от -32768 до +32767. Длина - 2 байта.
long - Целочисленный тип. Диапазон значений: от -2147483648 до +2147483647. Длина - 4 байта.
float - Действительный тип. Диапазон значений: 3.4E-38 до 3.4E+38. Длина - 4 байт. Действительный тип - для работы с вещественными числами, которые представляются в форме записи с десятичной точкой
double -Действительный тип. Диапазон значений: 3.4E-38 до 3.4E+38. Длина - 8 байт.
string - Строка символов, составляющая предложение. Длина не ограничена.
Целесообразность выбора типа переменной остается на разработчике. Так допустим нету смысла оперировать типами long, если значения не выходят из диапазона или брать double, если нам нужна не большая точность.

Объявление переменных.
Прежде чем использовать в программе новую переменную, вы должны ее объявить:
int i;
float f;
double d;
char c;
string s;
long l;


Переменные одного типа можно также через запятую:
int i,j,k;
char c, c2;

Инициализация переменных.
Инициализация -это присвоение переменной какого-то начального значения.
i = 1;
i = j = 1;
f = 2.3;
c = 'q';
s = 'some string';

Объявить и инициализировать переменную можно одним оператором:
int i = 1;
int i = 1, j = 2;

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


Константы.
Целая константа: это десятичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину в одной из следующих форм: десятичной, восьмеричной или шестнадцатеричной.
const c10 127 - десятичная константа.
const c8 0117 - восьмеричная константа. Начинается с 0 всегда.
const c16 0x2B - шестнадцатеричная константа. Начинается с 0x всегда.

Символьная константа: представляется символом заключенном в апострофы.
const cQ 'Q' - буква Q.
const cNewLine '\n' - символ новой строки.

Строковая константа(литерал) - последовательность символов заключенные в кавычки.
const cLiteral "This is literal constant l"


Используемые символы
Символы, используемые для образования ключевых слов и идентификаторов:
'A-Z', 'a-z', '0-9', '_'.
Одинаковые прописные и строчные буквы считаются различными символами. Переменная или ключевое слово не может начинаться с числа.
int i1; //правильно
int _1; //правильно
int 1i; //вызовет ошибку

#5 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 23 Декабрь 2009 - 03:05

Комментарии и ключевые слова
Комментарии - это текст который игнорируется при компиляции. Комментарий включается в программу, чтобы вам или кому-то еще было проще её понимать. В С++
есть два способа делать комментарии:
a)Размещение комментария после двойной косой черты(//)
Например:
printf("Hello World!\n");//Это комментарий!
б)Размещение комментария между открывающей (/*) и закрывающей (*/)парой символов
Например:
/*Этот комментарий
Занимает целых
три строки*/
Комментарии можно использовать и для временного отключения части кода при отладке.

Ключевые слова
Каждое ключевое слово несет компилятору специальную информацию. На некоторые ключевые слова, например слово void, int, float, double, char и другие нельзя использовать в качестве
имен объектов или переменных. В большинстве компиляторов ключевые слова выделяются (цветом или начертанием)
Например:
int double;
Я хочу объявить перемнную с именем double и с типом int. Компилятор в этом случае выдаст ошибку.
Правильно надо было написать например так.
int dаuble;
Слово double я вляется ключевым, а слово dаuble нет.
Ключевые слова:
auto
bad_cast
bad_typeid
bool
break
case
catch
char
class
const
const_cast
continue
default
delete
do
double
dynamic_cast else
enum
except
explicit
extern
false
finally
float
for
friend
goto
if
inline
int
long
mutable
namespace new
operator
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
stuct
switch
template
this throw
true
try
type_info
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
while
ICQ 296461926

#6 Илья Мурамец

Илья Мурамец

    пробегал

  • Пользователи ST test (off)
  • Pip
  • 9 сообщений

Опубликовано 23 Декабрь 2009 - 05:08

Функции
Функция - это совокупность объявлений и операторов, обычно предназначенная для решения определенной задачи. Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова. В любой программе на С++ должна быть функция с именем main (главная функция), именно с этой функции, в каком бы месте программы она не находилась, начинается выполнение программы.
Синтаксис функции:
[тип] имя-функции ([список-параметров])
{тело-функции}

Пример:
void main()

#7 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 12 Январь 2010 - 08:09

СТАРШИНСТВО ОПЕРАЦИЙ

При выполнении арифметических операций в C++ необходимо знать, что C++ выполняет операции в определенном порядке, основанном на старшинстве операций. Например, операция умножения выполняется до сложения. Чтобы лучше понять старшинство операций, рассмотрите следующие выражения:

result =5+2*3;

В зависимости от порядка, в котором C++ выполняет умножение и сложение, результат будет разным:

result =5+2*3;
=7*3;
= 21;
result =5+2*3;
=5+6;
= 11;


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

Ниже идет перечисление старшинства операций C++. Операции, находящиеся в верхней части, имеют более высокий приоритет.

Операция ..... Имя......................... Пример
++ ........... Приращение после .......variable++
++ ........... Приращение до.............++variable
-- ............. Уменьшение после........variable--
--.............. Уменьшение до.............-- variable
* .............. Умножение...................expression * expression
/............... Деление........................expression / expression
%............. Взятие по модулю.........expression % expression
+.............. Сложение (плюс)...........expression + expression
-............... Вычитание (минус)........expression-expression

Управление порядком, в котором C++ выполняет операции

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

cost = price_a + price_b * 1.06;

К сожалению, в этом случае C++ сначала выполнит умножение (price_b * 1.06), а затем прибавит значение price_a.

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

result =(2+3)* (3+4);

C++ вычисляет данное выражение в следующем порядке:

result = (2 + 3) * (3 + 4);
= (5) * (3 + 4);
= 5 * (7);
=5*7;
= 35;


Подобным образом группируя выражения внутри круглых скобок, вы можете управлять порядком, в котором C++ выполняет арифметические операции. Аналогично предыдущему примеру, ваша программа может сложить две стоимости внутри круглых скобок, как показано ниже:

cost = (price_a + price_b) * 1.06;
ICQ 296461926

#8 AndrejsZ

AndrejsZ

    записался

  • Пользователи ST test (off)
  • PipPip
  • 23 сообщений

Опубликовано 21 Январь 2010 - 10:04

В зависимости от порядка, в котором C++ выполняет умножение и сложение, результат будет разным:

result =5+2*3;
=7*3;
= 21;
result =5+2*3;
=5+6;
= 11;

Добрый день,
Один маленький стилистический ньюанс, не сочтите за придирку))
Читатель может немного запутаться и понять, что С++ позволяет оба варианта порядка расчёта, поэтому, ИМХО лучше указать, что вариант 1, является неверным. Кстати, он также неверен с любой точки зрения и арифметики тоже))

Предлагаю написать так:

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

Всего Вам Доброго!
С уважением,
Андрей

#9 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 26 Январь 2010 - 08:10

Массивы
В большинстве случаев в программах необходимо хранить множество значений, например 50 валютных пар и значений на данный момент их покупки и продажи , или 1000 значений изменения цены за определенный период. Если вашим программам необходимо хранить несколько значений, они должны использовать специальную структуру данных, называемую массивом. Для объявления массива необходимо указать имя, тип массива и количество значений, которые массив будет хранить. Массив представляет собой структуру данных, которая позволяет одной переменной хранить несколько значений.
При объявлении массива вы должны указать тип значений, хранящихся в массиве, а также количество значений (называемых элементами массива).
Все элементы внутри массива должны быть одного и того же типа, например, int, float или char.
Для сохранения значения внутри массива вам следует указать номер элемента массива, в котором вы хотите сохранить свое значение.
Чтобы обратиться к значению, хранящемуся внутри массива, ваши программы указывают имя массива и номер элемента.
При объявлении массива программы могут использовать оператор присваивания для инициализации элементов массива.
Программы могут передавать переменные-массивы в функции точно так же, как они передают любой другой параметр.
ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ МАССИВА

Массив представляет собой переменную, способную хранить одно или несколько значений. Массив должен иметь тип (например, inl, char или float) и уникальное имя. В дополнение к этому вам следует указать количество значений, которые массив будет хранить. Все сохраняемые в массиве значения должны быть одного и того же типа. Другими словами, ваша программа не может поместить значения типа float, char и long в один и тот же массив. Следующее объявление создает массив с именем bidUSDzaChas, который будет содержать 100 значений покупки доллара за час:

float bidUSDzaChas [100] ; //------> Размер массива

Когда компилятор C++ встречает объявление этой переменной, он распределит достаточно памяти для хранения 100 значений типа float. Значения, хранящиеся в массиве, называются элементами массива.
Массивы хранят несколько значений одного и того же типа
Вместо того чтобы заставлять программу работать со 100 переменными с уникальными именами, C++ позволяет вам определить одну переменную — массив —, которая может хранить несколько связанных значений.
Например, следующие операторы объявляют три разных массива:

float part_cost[50];
int employee_age[100];
float stock_prices[25];


Обращение к элементам массива
Как вы уже знаете, массив позволяет вашим программам хранить несколько значений в одной и той же переменной. Для обращения к определенным значениям, хранящимся в массиве, используйте значение индекса, которое указывает на требуемый элемент. Например, для обращения к первому элементу массива float bidUSDzaChas вы должны использовать значение индекса 0. Для обращения ко второму элементу используйте индекс 1. Подобно этому, для обращения к третьему элементу используйте индекс 2. Первый элемент массива всегда имеет индекс 0, а значение индекса последнего элемента на единицу меньше размера массива.
bidUSDzaChas [0] // обращение к первому элементу массива
bidUSDzaChas [1] // обращение ко второму элементу массива

int values[5]; // Объявление массива
values[0] = 100; // присваивание значения 100 первому элементу массива
values[1] = 200;
values[2] = 300;
values[3] = 400;
values [4] = 500;


ИНИЦИАЛИЗАЦИЯ МАССИВА ПРИ ОБЪЯВЛЕНИИ

При объявлении массива вы можете указать первоначальные значения, поместив их между левой и правой фигурными скобками, следующими за знаком равенства. Например, следующий оператор инициализирует массив values:
int values[5] = { 100, 200, 300, 400, 500 };
Подобным образом следующее объявление инициализирует массив с плавающей точкой:
float PodderzkaUSD [3] = { 1.4389, 1.4480, 1.4530};
Если вы не указываете первоначальное значение для какого-либо элемента массива, большинство компиляторов C++ будут инициализировать такой элемент нулем. Например, следующее объявление инициализирует первые три из пяти элементов массива:
int values[5] = { 100, 200, 300 };
Программа не инициализирует элементы values[3] и values[4]. В зависимости от вашего компилятора, эти элементы могут содержать значение 0. Если вы не указываете размер массива, который вы инициализируете при объявлении, C++ распределит достаточно памяти, чтобы вместить все определяемые элементы. Например, следующее объявление создает массив, способяый хранить четыре целочисленных значения:
int numbers[] = { 1, 2, 3, 4 };

Контрольные вопросы:
Объявлен массив int values[5] = { 100, 200, 300, 400, 500 }; Чему будет равен values[6]?
ICQ 296461926

#10 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 08 Февраль 2010 - 03:51

Заголовочные файлы C++

Каждая создаваемая вами программа на C++ начинается с одного или нескольких операторов #include. Эти операторы указывают компилятору включить содержимое заданного файла (заголовочного файла) в вашу программу, как если бы программа содержала операторы, которые находятся во включаемом файле. Заголовочные файлы содержат определения, используемые компилятором для операций различных типов. Существуют заголовочные файлы, которые определяют операции В/В (ввода/вывода) C++, системные функции (например, функции, возвращающие текущие дату и время) и многое другое.

Заголовочные файлы, подобно программам на C++, представляют собой файлы в формате ASCII, содержимое которых вы можете просмотреть. Чтобы лучше понять содержимое заголовочных файлов, найдите время для того, чтобы посмотреть заголовочный файл IOSTREAM.H, содержимое которого вы будете использовать в каждой создаваемой вами программе на C++. Обычно заголовочный файл IOSTREAM.H расположен в подкаталоге с именем INCLUDE, который находится в каталоге, содержащем файлы компилятора C++.

Примечание: Никогда не изменяйте содержимое заголовочных файлов. Это может привести к ошибкам компиляции в каждой создаваемой вами программе.
ICQ 296461926

#11 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 10 Февраль 2010 - 07:10

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

if (условие_выполняется) оператор;
Например:
if(bidEURUSD==1,4303)//если цена EUR/USD достигла отметки 1,4303
{
//выполняем какие-то операции
}
Операции сравнения C++

==....Если два значения равны (bidEURUSD==1,4303)
!=.....Если два значения не равны (oldbidEURUSD != newbidEURUSD) //например старое значение цены не равно новому
> .....Если первое значение больше второго (askGBPUSD > 1,5808) //например цена GBP/USD находиться выше 1,5808
< .....Если первое значение меньше второго (EMA < 1,6089) //например значение скользящей меньше 1,6089
>= ...Если первое значение больше или равно второму (maxPriceGBPUSD >= 1,45) //например максимальное значение цены GBP/USD за день больше или равно 1,45
<= ...Если первое значение меньше или равно второму (AccountBalance <= 5000) //например если состояние счета меньше или равно 5000

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

#12 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 11 Февраль 2010 - 08:17

Программа принимает решение(Продолжение)
ОПЕРАТОР else
if (bidEURUSD>1,3989)//если цена инструмента стала больше 1,3989
stopLoss=1,4009;//то стоп-лосс переносим на 20 пунктов вверх

Оператор if, определяет, что если цена инструмента EUR/USD стала больше 1,3989, то условие было истинным и стоп-лосс будет перенесен на 20 пунктов вверх. В противном случае, т. е. если цена инструмента EUR/USD не становилась больше 1,3989, программа просто завершались. В большинстве случаев программам потребуется указать один набор операторов, выполняющийся, если условие истинно, и второй набор, выполняющийся, если условие ложно. Для указания операторов, которые должны выполняться, когда условие ложно, программы должны использовать оператор else(иначе). Ниже приведен формат оператора else:

if (условие_истинно)
оператор;
else
оператор;

Например:
if (bidEURUSD>1,3989)//если цена инструмента стала больше 1,3989
stopLoss=1,4009;//то стоп-лосс переносим на 20 пунктов вверх
else
stopLoss=1,3969;//то стоп-лосс переносим на 20 пунктов вниз

Использование операции НЕ в C++
Программа проверяет определенное условие, в ряде случаев она должна выполнить некоторые операторы, если это условие истинно. С другой стороны, может потребоваться, чтобы программа выполнила операторы, если условие является не истинным. Операция C++ НЕ — восклицательный знак (!) — позволяет программам проверить, является ли условие не истинным. Например, следующий оператор проверяет, не стало ли значение МАСD равно 0:

if (! МАСD )
//операторы

Операция НЕ превращает ложь в истину, а истину в ложь. Например, предположим, что у МАСD не равно 0. Следовательно, переменная МАСD должна содержать значение 0. Если C++ оценивает условие с помощью операции НЕ, он использует текущее значение переменной (0) и применяет операцию НЕ. Операция НЕ превращает значение 0 в 1 (истину). Таким образом, полное условие превращается в истину и выполняется соответствующий оператор.
ICQ 296461926

#13 Mr.Bags

Mr.Bags

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 142 сообщений

Опубликовано 13 Февраль 2010 - 10:02

Операторы циклов
Операторы цикла задают многократное исполнение кода находящегося внутри цикла.
Циклы как правило используются для обработки массивов
В си используются три типа операторов цикла :
1)Цикл со счетчиком for(начальное значение переменной счетчика; условие выполнения цикла; изменение значения счетчика)
{
Код цикла, выполняемый пока условие истинно.
}
Пример:
int Bars_count=100;
float EURUSD_close[100];// массив хранить 100 последних значение цены закрытия
for(int i=0;i<Bars_count;i++)
{
printf("Значение цены закрытия EUR/USD =%f",EURUSD_close[i]);
}
2) Цикл с пред условием while (условие)
{
Код цикла, выполняемый пока условие истинно.
}
Пример:
int i=0;
int Bars_count=100;
float EURUSD_close[100];// массив хранить 100 последних значение цены закрытия
while(i<Bars_count)
{
printf("Значение цены закрытия EUR/USD =%f",EURUSD_close[i]);
i++;
}
3) Цикл с пост условием do
{
Код цикла, выполняемый пока условие истинно.
}
while (условие)
Пример:
int Bars_count=100;
float EURUSD_close[100];// массив хранить 100 последних значение цены закрытия
int i=0;
do
{
printf("Значение цены закрытия EUR/USD =%f",EURUSD_close[i]);
i++;
}
while(i<Bars_count)
icq 336674712
skype fx_mr.bags

#14 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 21 Февраль 2010 - 07:33

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

Структура в С++ задаётся следующим образом:

struct <имя_структуры>
{
члены (элементы) структуры
};

Например:

struct vec3
{
double x,y,z;
};


определяет структуру, состоящую из трёх членов типа double.
Определение структуры вводит новый пользовательский тип в программу, который может быть использован так же, как любой встроенный тип.
int counter;
vec3 direction;
double length;

В приведённом примере созданы три переменные – counter типа int, direction типа vec3 и length типа double. Каждая переменная типа vec3 состоит из трёх членов: x, y и z, значения которых уникальны для каждой переменной vec3, также как уникальны значения каждой переменной типа int или double.
Доступ к членам структуры осуществляется посредством оператора . (точка):
direction.x = 0;
direction.y = 0;
direction.z = 1;

Формой записи, используемой при инициализации массива, можно воспользоваться и при инициализации членов структуры:
vec3 normal={0.0,0.0,0.0};
ICQ 296461926

#15 nsg

nsg

    живет тут

  • Пользователи ST test (off)
  • PipPipPipPipPip
  • 105 сообщений

Опубликовано 21 Февраль 2010 - 11:19

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

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

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

Для более сложных пользовательских типов данных в языке С++ используются классы.

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

struct Point {
int x,y;
};



Point GetCursorPosition() {
Point cursor;

return cursor;
}

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

void DisplayCursorInfo() {
Point cursor;
cursor = GetCursorPosition();

cout << cursor.x;

cout << cursor.y;

}

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

struct Box3 {
bool visible;

double x_center, y_center, z_center;
double x_size, y_size, z_size;
};


Можно воспользоваться предыдущим объявлением структуры vec3 и написать:

struct Box3 {
bool visible;

vec3 center;
vec3 size;
};


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

void Display(const Box3& box) {
if ( box.visible) {
cout << “Center: (“ << box.center.x << “,” <<

box.center.y << “,” <<
box.center.z << “)” << endl;

}
}


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

Примеры:

struct Line {
vec3 pt1,pt2;

};


struct Circle {

vec3 center;

double radius;

};


struct Plane {

double a,b,c,d;

};



Типичные ошибки при разработке структур

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

Например, неправильной структурой будет:

struct Line {
vec3 pt1,pt2;
double length;
};


В данном случае член length может быть вычислен на основании pt1 и pt2. Хранение значение length в структуре нарушает вторую рекомендацию по использованию структур. Кроме расхода памяти для хранения избыточной информации программист получает намного более сложную проблему: необходимость синхронизации данных. При каждом изменении любого из членов структуры придётся пересчитывать значение length.

Более утончённые примеры ошибок:
// Прямоугольник на плоскости

struct Box2 {

vec2 pt1, pt2, pt3, pt4;
};


// Окружность в трехмерном пространстве

struct CircleIn3D {
Plane plane;
// Плоскость, в которой лежит окружность
vec3 center;
double radius;

};

ICQ 296461926




Посетителей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных пользователей

Рейтинг брокеров форекс: кто лидер, кто аутсайдер и почему?




Masterforex-V NordFX

Rambler's Top100

Принимаем Z-Payment