Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Названия цветов 1 страница




Целочисленное представление

Литералы

Значение цветового типа в виде литерала состоит из трёх частей, представляющих собой числовые значения интенсивности трех основных компонент цвета: красного, зеленого и синего. Значение такого вида начинается с символа C и обрамляется одинарными кавычками.

Числовые значения интенсивности компоненты цвета лежат в диапазоне от 0 до 255 и могут записываться как в десятичном, так и в шестнадцатеричном виде.

Примеры: C'128,128,128' (серый), C'0x00,0x00,0xFF' (синий), C'0xFF,0x33,0x00' (красный).

Целочисленное представление записывается в виде шестнадцатеричного или десятичного числа. Шестнадцатеричное число имеет вид 0xRRGGBB, где RR - значение интенсивности красной компоненты цвета, GG - зелёной, а BB - синей. Десятичные константы не имеют прямого отражения в RGB. Они представляют собой десятичное значение шестнадцатеричного целочисленного представления.

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

Примеры: 0xFFFFFF (белый), 0x008000 (зеленый), 16777215 (белый), 32768 (зеленый).

 


Рис. 11. В современных редакторах можно взять параметры цвета для литерального и целочисленного представления цветового значения константы.

Самым простым способом задания цвета является указание его названия в соответствии с таблицей Web-цветов. В этом случае значение цвета представляется словом, поставленным в соответствие цвету, например, Red - красный.

В памяти компьютера значения констант и переменных типа color занимают 4 байта. Пример использования такой переменной в программе:

color Paint_1 = C'128,128,128'; // Переменной присвоено значение серого цвета

color Colo = C'0x00,0x00,0xFF'; // Переменной присвоено значение синего цвета

color BMP_4 = C'0xFF,0x33,0x00' // Переменной присвоено значение красного цвета

 

color K_12 = 0xFF3300; // Переменной присвоено значение красного цвета

color N_3 = 0x008000; // Переменной присвоено значение зелёного цвета

color Color = 16777215; // Переменной присвоено значение белого цвета

color Alfa = 32768; // Переменной присвоено значение зелёного цвета

 

color A = Red; // Переменной присвоено значение красного цвета

color B = Yellow; // Переменной присвоено значение желтого цвета

color Colorit = Black; // Переменной присвоено значение черного цвета

color B_21 = White; // Переменной присвоено значение белого цвета

Тип datetime

 

Значение типа datetime - это значение даты и времени.

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

Константа обрамляется одинарными кавычками и начинается с символа D. Допускается использование усечённого значения: либо без даты, либо без времени, либо пустое значение. Диапазон изменения значений: от 1 января 1970 года до 31 декабря 2037 года. В памяти компьютера значения констант и переменных типа datetime занимают 4 байта. Значение представляет собой количество секунд, прошедших с 00:00 1 января 1970 года.

Пример использования в программе переменной типа datetime:

datetime Alfa = D'2004.01.01 00:00'; // Новый Год

datetime Tim = D'01.01.2004'; // Новый Год

datetime Tims = D'2005.05.12 16:30:45'; // 12 мая 2005г. 16 час.30 мин.45 сек.

datetime N_3 = D'12.05.2005 16:30:45'; // 12 мая 2005г. 16 час.30 мин.45 сек.

datetime Compile = D''; // равнозначно D'[дата компиляции] 00:00:00'

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

 

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

Объявление переменной - это первое упоминание переменной в программе. При объявлении переменной указывается её тип.

Инициализация переменной - это присвоение ей при её объявлении значения, соответствующего её типу. Любая переменная может быть инициализирована. Если явно не задано никакое начальное значение, то численная переменная инициализируется нулем (0), а переменная строкового типа инициализируется пустой строкой.

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

Объявление переменной может осуществляться в отдельной строке:

int Var_1; // Объявление переменной в отдельной строке

Эта запись означает, что будет использоваться переменная Var_1 (собственно объявление переменной) и тип этой переменной - int.

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

int Var_1, Box, Comm; // Объявление нескольких переменных в одной строке

Эта запись означает, что будут использоваться переменные Var_1, Box и Comm и тип этих переменных - int, то есть перечисленные переменные будут учтены программой как переменные целого типа.

 

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

double Var_5 = 3.7; // Инициализация переменной в операторе присваивания

Эта запись означает, что будет использоваться переменная Var_5 вещественного типа с начальным значением 3.7.

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

Название переменной никак не связано с типом переменной, т.е. по названию переменной невозможно судить о её типе. Одно и то же название переменной в разных программах может быть использовано для переменных любого типа. Но в пределах одной программы тип любой переменной может быть объявлен только один раз. В ходе выполнения программы тип объявленной переменной не изменяется.

Примеры объявления и инициализации переменных

 

Объявление переменных может осуществляться в нескольких строках или в одной строке.

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

 


Рис. 12. Примеры объявления переменных в отдельной строке.

 

Объявление типа переменных производится один раз при первом упоминании переменной. При втором и последующих упоминаниях переменной её тип не указывается.

 


Рис. 13. Примеры объявления переменных в отдельной строке.

 

Допускаются объявление и инициализация переменных в операторах.

 


Рис. 14. Примеры инициализации переменных.

 


Рис. 15. Инициализация переменной в заголовке составного оператора.

Операции и выражения

 

Чтобы понять, какое значение имеют в языке MQL4 операции и выражения, не требуется никаких особых аналогий. Практически это - то же самое, что операции и выражения в простой арифметике. Каждому человеку понятно что в записи f = n + m элементы f, n и m являются переменными, значки = и + являются знаками операций, а n + m - выражением.

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

Понятия "операнд", "операция", "знак операции" и "выражение"

 

Операнд - это константа, переменная, элемент массива или значение, возвращаемое функцией (понятие "функция" рассматривается в разделе Функции, понятие "масив" - в разделе Массивы; на данном этапе обучения достаточно понимать под операндами уже известные нам константы и переменные).

Операция - это действие, производимое над операндами.

Знак операции - предопределённый символ или группа символов, предписывающие выполнить некоторую операцию.

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

Виды операций

 

В языке MQL4 различают следующие виды операций:

арифметические операции;

операции присваивания;

операции отношения;

логические операции;

побитовые операции;

операция запятая;

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

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

Арифметические операции

 

К символам арифметических операций относятся следующие:

Символ Операция Пример Аналог
+ Сумма величин x + 2  
- Вычитание величин или изменение знака x - 3, y = - y  
* Умножение величин 3 * x  
/ Частное от деления x / 5  
% Остаток от деления minutes = time % 60  
++ Добавление 1 к значению переменной y++ y = y + 1
-- Вычитание 1 из значения переменной y-- y = y - 1

 

Операции присваивания

 

К символам операций присваивания относятся следующие:

Символ Операция Пример Аналог
= Присваивание значения x переменной y у = x  
+= Увеличение значения переменной у на x у += x y = y + x
-= Уменьшение значения переменной y на x y -= x y = y - x
*= Умножение значения переменной y на x y *= x y = y * x
/= Деление значения переменной y на x y /= x y = y / x
%= Остаток от деления значения переменной y на x y %= x y = y % x

 

Операции отношения

 

К символам операций отношения относятся следующие:

Символ Операция Пример
== Истина, если x равно y x == y
!= Истина, если x не равно y x!= y
< Истина, если x меньше y x < y
> Истина, если x больше y x > y
<= Истина, если x меньше или равно y x <= y
>= Истина, если x больше или равно y x >= y

 

Логические операции

 

К символам логических операций относятся следующие:

Символ Операция Пример Пояснения
! НЕ (логическое отрицание) ! х ИСТИНА(1), если значение операнда ЛОЖЬ(0), и ЛОЖЬ(0), если значение операнда не ЛОЖЬ(0).
|| ИЛИ (логическое ИЛИ) x < 5 || x > 7 ИСТИНА(1), если истинно любое из значений
&& И (логическое И) x == 3 && y < 5 ИСТИНА(1), если истинны все значения

 

Побитовые операции

 

Побитовые операции выполняются только с целыми числами. К побитовым операциям относятся следующие:

Дополнение значения переменной до единицы. Значение выражения содержит 1 во всех разрядах, в которых значения переменной содержат 0, и 0 во всех разрядах, в которых значения переменной содержат 1.

b = ~n;

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

x = x >> y;

Двоичное представление x сдвигается влево на y разрядов; освобождающиеся справа разряды заполняются нулями.

x = x << y;

Побитовая операция И двоичных представлений x и y. Значение выражения содержит 1 (ИСТИНА) во всех разрядах, в которых и x, и y содержат не ноль; и 0 (ЛОЖЬ) во всех остальных разрядах.

b = ((x & y)!= 0);

Побитовая операция ИЛИ двоичных представлений x и y. Значение выражения содержит 1 во всех разрядах, в которых x или y не содержат 0, и 0 - во всех остальных разрядах.

b = x | y;

Побитовая операция "исключающее ИЛИ" (eXclusive OR) двоичных представлений x и y. Значение выражения содержит 1 в тех разрядах, в которых x и y имеют разные двоичные значения, и 0 - во всех остальных разрядах.

b = x ^ y;

 

Операция запятая

 

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

for(i=0,j=99; i<100; i++,j--) Print(array[i][j]); // Оператор цикла

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

My_function (Alf, Bet, Gam, Del) // Вызов функции с аргументами

Операторы и функции рассматриваются в разделах Операторы, Функции и в главе Операторы.

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

Вызов функции подробно рассматривается в разделе Вызов функции.

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

Операции над однотипными операндами

 

Если бы ученику начальной школы сообщили, что, решая задачу о количестве карандашей, он должен строить свои рассуждения на таких понятиях, как операнды, операции и выражения, он, наверное, счёл бы, что от него хотят невозможного. Глядя на символы операций, кто-то может решить, что программирование - некий таинственный, сложный процесс, доступный только избранным. На самом деле в программировании нет ничего сложного, достаточно лишь разобраться в сущности нескольких понятий. Чтобы в этом убедиться, рассмотрим несколько примеров.

 

Задача 1. У Васи 2 карандаша, у Пети 3 карандаша. Сколько всего карандашей у мальчиков?:)

Решение. Обозначим количество карандашей у Васи как переменную А, количество карандашей у Пети – как переменную В, а результат – через переменную С.

Ответ будет таким: С = А + В

В разделе Типы данных мы рассматривали варианты объявления переменных. Карандаши - это предметы, т.е. нечто такое, что в принципе может существовать в виде части (половина карандаша, например). Поэтому карандаши будем учитывать как действительные переменные, т.е. переменные типа double.

Программный код можно записать, например, так:

double A = 2.0; // Количество карандашей у Васи

double B = 3.0; // Количество карандашей у Пети

double C = A + B; // Общее количество

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

Типом значения выражения

A + B

будет тип тех переменных, которые составляют выражение, в данном случае - тип double.

Аналогичным будет ответ для разности величин (на сколько больше карандашей у Пети, чем у Васи?):

double A = 2.0; // Количество карандашей у Васи

double B = 3.0; // Количество карандашей у Пети

double C = B - A; // Разность действительных чисел

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

double C = B * A; // Умножение действ. чисел

double C = B / A; // Деление действительных чисел

Аналогичные вычисления могут производиться и с целыми числами.

 

Задача 2. Ученики выходят к доске для ответа. Вася выходил 2 раза, Петя выходил 3 раза. Сколько всего раз мальчики выходили к доске?

Решение. Обозначим количество ответов Васи как переменную Х, количество ответов Пети как переменную Y, а результат - через Z.

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

Решение задачи можно записать так:

int X = 2; // Количество ответов Васи

int Y = 3; // Количество ответов Пети

int Z = X + Y; // Общее количество

В случае вычисления разности, произведения и частного от деления целых чисел знак операции "-" используется так же просто:

int X = 2; // Целое число

int Y = 3; // Целое число

int Z = Y - X; // Разность целых чисел

int Z = Y * X; // Произведение целых чисел

int Z = Y / X; // Частное от деления целых чисел

С переменными типа string возникает несколько иная ситуация:

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

Решение. В MQL4 разрешено складывать значения строковых констант и переменных. В случае сложения переменных типа string строки просто приплюсовываются друг к другу в той последовательности, в которой они упоминаются в выражении.

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

string W1 = "Северный"; // Строка 1
string W2 = "Парикмахерская"; // Строка 2
string Ans = W1 + W2; // Сумма строк

Значением переменной Ans будет строка следующего вида:

СеверныйПарикмахерская

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

Любые другие арифметические операции с переменными строкового типа запрещены:

string Ans= W1 - W2; // Не допускается
string Ans= W1 * W2; // Не допускается
string Ans= W1 / W2; // Не допускается

 

Приведение типов

 

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

Рассмотрим несколько задач, касающихся приведения типов.

Задача 4. У Васи 2 карандаша, Петя выходил для ответа 3 раза. Сколько всего?

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

Задача 5. На одном углу дома расположен гастроном с названием "Северный", а у Васи 2 карандаша.:)

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

1. Сколько всего? 2. Что написано на доме?

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

Типы данных int, bool, color, datetime и double относятся к числовому типу. Внутренним (машинным) представлением констант и переменных типов int, double, bool, color и datetime является число. При этом переменные типов int, bool, color и datetime представлены в памяти машины как целые числа, а переменные типа double - как числа двойной точности с плавающей точкой, т.е. действительные числа. Значением констант и переменных типа string является набор символов (рис. 16).

Значения типов int, bool, color и datetime представлены в памяти машины как целые числа. Значения типа double представлены в памяти машины как действительные числа. Значения типа string представлены в памяти машины как последовательность символов. Значения типов int, bool, color, datetime и double являются значениями числового типа. Значения типа string являются значениями символьного типа.

 


Рис. 16. Представление разных типов данных в памяти машины.

Выше указывалось, что значения переменных типов int, bool, color и datetime представлены в памяти машины как целые числа, а double - как действительные числа. Выясняя вопрос о типе выражения, в котором участвуют переменные разных типов, допустимо вести разговор только относительно трёх типов данных: int, double и string. Значения типов bool, color и datetime будут проявлять себя в выражении так же, как значения типа int.

Итак, каким будет значение выражения, если его составляют операнды разных типов? В языке MQL4 принято правило неявного приведения типов:

если в выражении содержатся операнды разных типов, то тип выражения преобразовывается в тип, имеющий более высокий приоритет; типы int, bool, color и datetime имеют одинаковый приоритет, тип double - более высокий приоритет, тип string - самый высокий приоритет; если тип выражения справа от знака операции присвоения не совпадает с типом переменной слева от знака операции присвоения, то значение выражения приводится к типу переменной слева от знака операции присвоения; это называется приведением к целевому типу; приведение значений типа string к любому другому целевому типу запрещено.

Вернёмся к Задаче 4. Возможны два варианта решения.

Вариант 4.1. Вычисляется результат целого типа:

double A = 2.0; // Количество карандашей у Васи
int Y = 3; // Количество ответов Пети
int F = A + Y; // Общее количество

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

A + Y

участвуют операнды двух типов данных: А - действительного типа double и Y - целого типа int.

В соответствии с правилом неявного преобразования типов значением этого выражения будет число действительного типа double. Обратите внимание: мы говорим только о типе выражения A+Y, но не о типе переменной F, стоящей слева от знака операции присвоения. Значением этого выражения будет действительное число 5.0. Для определения типа выражения A+Y применена первая часть правила неявного приведения типов.

После вычисления выражения A+Y исполняется операция присвоения. В данном случае также имеется несовпадение типов: тип выражения A+Y - double, а тип переменной F - int. В процессе выполнения операции присвоения: сначала тип выражения A+Y будет приведен к типу int (в соответствии с правилом вычисления целых чисел) и равен целому числу 5, а затем этот результат станет значением целой переменной F. Вычисления выполнены в соответствии со второй частью правила неявного приведения типов - приведения к целевому типу. Конечный результат вычислений и преобразований таков: значением целой переменной F является целое число 5.

Вариант 4.2. Аналогичная ситуация возникает и в случае, если искать результат в виде значения действительного типа:

double A = 2.0; // Количество карандашей у Васи
int Y = 3; // Количество ответов Пети
double F = A + Y; // Общее количество

Представленный случай отличается от предыдущего тем, что целевой тип переменной F (слева от знака операции присвоения), в данном случае - тип double, совпадает с типом double выражения A+Y, поэтому целевого преобразования типов не происходит. Результатом вычислений (значением действительной переменной F) будет действительное число 5.0.

Теперь посмотрим, каким будет решение Задачи 5. При инициализации переменных вопросов не возникает:

string W1 = "Северный"; // Строка 1
double A = 2; // Количество карандашей у Васи

Вариант 5.1. Допустимое решение задачи:

string W1 = "Северный"; // Строка 1
double A = 2; // Количество карандашей у Васи
string Sum = W1 + A; // Неявное преобразование справа

Здесь в правой части складываются значения двух переменных, одна из которых имеет тип string, а другая - тип double. В соответствии с правилом неявного приведения типов значение переменной А сначала будет приведено к типу string (т.к. у этого типа более высокий приоритет), а после этого произойдёт сложение (конкатенация) однотипных значений. Типом вычисленного значения в правой части от знака операции присвоения будет тип string. На следующем этапе это значение будет присвоено строковой переменной Sum. В результате значением переменной Sum будет следующая строка:

Северный2.00000000

Вариант 5.2. Такое решение является ошибочным:

string W1 = "Северный"; // Строка 1
double A = 2; // Количество карандашей у Васи
double Sum = W1 + A; // Это недопустимо

В данном случае нарушен запрет приведения к целевому типу значения типа string. Типом значения выражения W1+A, как и в предыдущем примере, является тип string. При исполнении операции присвоения должно быть произведено целевое приведение типа. Однако, в соответствии с правилом, целевое понижение типа string запрещено. Это - ошибка, которая будет обнаружена редактором MetaEditor на этапе создания программы (при компиляции).

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




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 433; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.118 сек.