Что такое дабл-дабл в баскетболе? дабл-дабл и трипл-дабл
Содержание:
- Nullable-типы (нулевые типы) и операция ??
- Целочисленные типыInteger types
- Подсчет ссылок
- Лидеры по количеству трипл-даблов в истории НБА
- Таблицы
- Что такое трипл-дабл в баскетболе
- Краткая история трипл-дабла
- Характеристики типов с плавающей запятойCharacteristics of the floating-point types
- typedef в Qt
- Объявление и инициализация переменных
- Дабл-дабл в современном баскетболе
- Защищенные указатели
- Типы Single/Double/Currency
- Ошибки округленияRound-off errors
Nullable-типы (нулевые типы) и операция ??
Объявление и инициализация Nullable-переменных
В работе с типами-значениями есть одна особенность, они не могут иметь значение null. При наличии любой из следующих строк кода, компиляция программы не будет выполнена:
int nv = null; bool bv = null;
На практике, особенно при работе с базами данных, может возникнуть ситуация, когда в записи из таблицы пропущены несколько столбцов (нет данных), в этом случае, соответствующей переменной нужно будет присвоить значение null, но она может иметь тип int или double, что приведет к ошибке.
Можно объявить переменную с использованием символа ? после указания типа, тогда она станет nullable-переменной – переменной поддерживающей null-значение:
int? nv1 = null; bool? bv1 = null;
Использование символа ? является синтаксическим сахаром для конструкции Nullable<T>, где T – это имя типа. Представленные выше примеры можно переписать так:
Nullable<int> nv1 = null; Nullable<bool> bv1 = null;
Проверка на null. Работа с HasValue и Value
Для того чтобы проверить, что переменная имеет значение null можно воспользоваться оператором is с шаблоном типа:
bool? flagA = true; if(flagA is bool valueOfFlag) { Console.WriteLine("flagA is not null, value: {valueOfFlag}"); }
Также можно воспользоваться свойствами класса Nullable
-
Nullable<T>.HasValue
Возвращает true если переменная имеет значение базового типа. То есть если она не null.
-
Nullable<T>.Value
Возвращает значение переменной если HasValue равно true, иначе выбрасывает исключение InvalidOperationException.
bool? flagB = false; if(flagB.HasValue) { Console.WriteLine("flagB is not null, value: {flagB.Value}"); }
Приведение Nullable-переменной к базовому типу
При работе с Nullable-переменными их нельзя напрямую присваивать переменным базового типа. Следующий код не будет скомпилирован:
double? nvd1 = 12.3; double nvd2 = nvd1; // error
Для приведения Nullable-переменной к базовому типу можно воспользоваться явным приведением:
double nvd3 = (double) nvd1;
В этом случае следует помнить, что если значение Nullable-переменной равно null, то при выполнении данной операции будет выброшено исключение InvalidOperationException.
Второй вариант – это использование оператора ??, при этом нужно дополнительно задаться значением, которое будет присвоено переменной базового типа если в исходной лежит значение null
double nvd4 = nvd1 ?? 0.0; Console.WriteLine(nvd4); bool? nvb1 = null; bool nvb2 = nvb1 ?? false; Console.WriteLine(nvb1); Console.WriteLine(nvb2);
Второй вариант позволяет более лаконично обрабатывать ситуацию, когда вызов какого-то метода может возвращать null, а результат его работы нужно присвоить типу-значению, при этом заранее известно, какое значение нужно присвоить переменной в этой ситуации:
static int? GetValue(bool flag) { if (flag == true) return 1000; else return null; } static void Main(string[] args) { int test1 = GetValue(true) ?? 123; Console.WriteLine(test1); int test2 = GetValue(false) ?? 123; Console.WriteLine(test2); }
Целочисленные типыInteger types
Тип является базовым целочисленным типом по умолчанию.The type is the default basic integer type. Он может представлять все целые числа в диапазоне, зависящем от реализации.It can represent all of the whole numbers over an implementation-specific range.
Представление целого числа со знаком — это одно из значений, которое может содержать положительные и отрицательные значения.A signed integer representation is one that can hold both positive and negative values. Он используется по умолчанию или при наличии ключевого слова модификатор.It’s used by default, or when the modifier keyword is present. Ключевое слово модификатор задает Неподписанное представление, которое может содержать только неотрицательные значения.The modifier keyword specifies an unsigned representation that can only hold non-negative values.
Модификатор размера задает ширину в битах используемого представления целых чисел.A size modifier specifies the width in bits of the integer representation used. Язык поддерживает модификаторы, и .The language supports , , and modifiers. Тип должен быть не менее 16 бит в ширину.A type must be at least 16 bits wide. Тип должен быть не менее 32 бит в ширину.A type must be at least 32 bits wide. Тип должен быть не менее 64 бит в ширину.A type must be at least 64 bits wide. Стандартный задает отношение размера между целыми типами:The standard specifies a size relationship between the integral types:
Реализация должна поддерживать как минимальные требования к размеру, так и отношение размера для каждого типа.An implementation must maintain both the minimum size requirements and the size relationship for each type. Однако фактические размеры могут и зависеть от реализации.However, the actual sizes can and do vary between implementations. См. раздел для деталей реализации, связанных с Майкрософт.See for Microsoft-specific implementation details.
Ключевое слово можно опустить, если заданы модификаторы, или.The keyword may be omitted when , , or size modifiers are specified. Модификаторы и тип, если они есть, могут использоваться в любом порядке.The modifiers and type, if present, may appear in any order. Например, и следует ссылаться на один и тот же тип.For example, and refer to the same type.
Синонимы целочисленного типаInteger type synonyms
Компилятор считает синонимами следующие группы типов:The following groups of types are considered synonyms by the compiler:
-
, , , , , ,
-
, ,
-
, , , ,
-
, ,
-
, , , , , ,
-
, ,
-
, , , , , ,
-
, ,
Целочисленные типы, определяемые корпорацией Майкрософт , включают в себя конкретные типы,, и .Microsoft-specific integer types include the specific-width , , , and types. Эти типы могут использовать модификаторы и.These types may use the and modifiers. Тип данных аналогичен типу , — типу , — типу , а — типу .The data type is synonymous with type , is synonymous with type , is synonymous with type , and is synonymous with type .
Подсчет ссылок
Классы QSharedPointer и QWeakPointer реализуют подсчет ссылок.
5.1. Жесткие ссылки
Обычный указатель типа T* можно «обернуть» в объект QSharedPointer<T>, который
послужит жесткой ссылкой. Указатель будет удален в тот момент, когда последняя ссылка выйдет
за область действия, и для нее будет вызван деструктор QsharedPointer<T>. Такая ссылка
конструируется из обычного указателя:
QSharedPointer<Foo> sp0(new Foo);
Если указатель на объект передан конструктору QSharedPointer<T>, то объект нельзя
самостоятельно уничтожать либо создавать из него еще один QSharedPointer<T>. Новые
жесткие ссылки создаются через копирование и присваивание:
Foo* foo = new Foo; QSharedPointer<Foo> sp0(foo); QSharedPointer<Foo> sp1(sp0); // правильно QSharedPointer<Foo> sp2; sp2 = sp0; // правильно QSharedPointer<Foo> sp3(foo); // ошибка!
В конструкторе можно указать произвольную функцию (функтор) для удаления:
QSharedPointer::QSharedPointer (T *ptr, Deleter deleter);
Как и для других умных указателей, здесь перегружены операторы разыменования (*), доступа к
членам (->), а также сравнения (!= и ==). QSharedPointer<T> работает как обычный
указатель T*.
QSharedPointer<Foo> sp0(new Foo); QSharedPointer<Foo> sp1(sp0); (*sp0).bar = 23; sp0->baz(); if (sp0 == sp1) { // ... } if (sp0.isNull()) // выполняется, если указатель нулевой { // ... } if (sp0 || !sp1) // используется приведение к bool { // и оператор ! // ... }
Сам указатель можно получить при помощи метода
T* QSharedPointer::data() const;
5.2. Слабые ссылки
Для слабых ссылок QWeakPointer<T> не задано разыменование. Они применяются только для
того чтобы проверить, не был ли указатель удален. Аналогично, имеется метод isNull(),
приведение к bool и оператор !. Слабые ссылки можно копировать, присваивать и
сравнивать.
Допускается преобразование жесткой ссылки в слабую и наоборот:
QWeakPointer<T> QSharedPointer::toWeakRef() const; QSharedPointer<T> QWeakPointer::toStrongRef() const;
При этом, слабые ссылки создаются только из жестких, как в случае
QWeakPointer<Foo> wp(sp0);
5.3. Приведение
Для приведения типов предусмотрены вспомогательные функции. Если указатель на T0 нужно
привести к указателю на T1 при помощи static_cast, const_cast, dynamic_cast, то используйте
соответственно:
QSharedPointer<T1> qSharedPointerCast (const QSharedPointer<T0>& other); QSharedPointer<T1> qSharedPointerCast (const QWeakPointer<T0>& other); QSharedPointer<T1> qSharedPointerConstCast (const QSharedPointer<T0>& other); QSharedPointer<T1> qSharedPointerConstCast (const QWeakPointer<T0>& other); QSharedPointer<T1> qSharedPointerDynamicCast (const QSharedPointer<T0>& other); QSharedPointer<T1> qSharedPointerDynamicCast (const QWeakPointer<T0>& other);
Эти функции принимают жесткую или слабую ссылку и возвращают жесткую. Преобразование из
слабой ссылки в слабую при помощи static_cast осуществляет
QWeakPointer<T1> qWeakPointerCast (const QWeakPointer<T0>& other);
Если преобразование dynamic_cast не удается, то возвращается ссылка, соответствующая
нулевому указателю.
Лидеры по количеству трипл-даблов в истории НБА
Предлагаем вашему вниманию топ-10 баскетболистов, которые совершили больше всего трипл-даблов в истории НБА.
Место | Игрок | Количество трипл-даблов | Годы игровой карьеры | Средние показатели за карьеру |
1 | Оскар Робертсон (Oscar Robertson) | 181 | 1960-1974 | 25,7 очка; 9,5 передач; 7,5 подбора. |
2 | Расселл Уэстбрук (Russell Westbrook) | 146 | 2008-н.в* | 23,2 очка; 8,3 передач; 7,1 подбора. |
3 | Мэджик Джонсон (Magic Johnson) | 138 | 1979-1996 | 19,5 очка; 11,2 передач; 7,2 подбора. |
4 | Джейсон Кидд (Jason Kidd) | 107 | 1994-2013 | 12,6 очка; 8,7 передач; 6,3 подбора. |
5 | Леброн Джеймс (LeBron James) | 92 | 2003-н.в | 27,1 очка; 7,4 передач; 7,4 подбора. |
6 | Уилт Чемберлен (Wilt Chamberlain) | 78 | 1959-1974 | 30,1 очка; 4,4 передач; 22,9 подбора. |
7 | Ларри Бёрд (Larry Bird) | 59 | 1979-1992 | 24,3 очка; 6,3 передач; 10,0 подбора. |
8 | Джеймс Харден (James Harden) | 44 | 2009-н.в | 25,1 очка; 6,3 передач; 5,3 подбора. |
9 | Фэт Левер (Fat Lever) | 43 | 1982-1994 | 13,9 очка; 6,2 передач; 6,0 подбора. |
10 | Никола Йокич (Nikola Jokić) | 38 | 2015-н.в | 16,9 очка; 5,4 передач; 9,7 подбора. |
*н.в – настоящее время
Таблицы
наиболее точной суммыабсолютного
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
~ | 4.86 21 |
0 0 |
0 0 |
↑ | 4.97 14 |
0 0 |
0 0 |
↓ | 4.50 19 |
0 0 |
0 0 |
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
±~ | 158.96 7936 |
0 0 |
0 0 |
±↑ | 86.35 2560 |
0 0 |
0 0 |
±↓ | 175.70 11776 |
0 0 |
0 0 |
6
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
~ | 143.00 562 |
0 0 |
0 0 |
↑ | 126.60 473 |
0 0 |
0 0 |
↓ | 161.91 482 |
0 0 |
0 0 |
±~ | 2015.41 38889 |
0 0 |
0 0 |
±↑ | 1520.84 33965 |
0 0 |
0 0 |
±↓ | 1672.76 36513 |
0 0 |
0 0 |
6
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
~ | 4277.17 4662 |
0 0 |
0 0 |
↑ | 29.17 111 |
0 0 |
0 0 |
↓ | 7508.68 7915 |
0 0 |
0 0 |
±~ | 475.68 8221 |
1.09 21 |
0 0 |
±↑ | 65.39 861 |
0.01 1 |
0 0 |
±↓ | 270.34 1736 |
0 0 |
0 0 |
о
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
~ | 4.84 19 |
0.01 1 |
0 0 |
↑ | 2.81 11 |
0.01 1 |
0 0 |
↓ | 6.53 26 |
0 0 |
0 0 |
±~ | 33.83 1650 |
1.26 23 |
0 0 |
±↑ | 12.76 422 |
0.31 6 |
0 0 |
±↓ | 18.54 548 |
0 0 |
0 0 |
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
~ | 17.77 483 |
1.46 61 |
0 0 |
↑ | 10.92 243 |
0.34 19 |
0 0 |
↓ | 19.71 734 |
0 0 |
0 0 |
Порядок | Всё подряд | Отдельно + и – |
---|---|---|
±~ | 78.65 2336 |
2121.61 50048 |
±↑ | 76.27 2496 |
2465.55 66432 |
±↓ | 52.74 480 |
2863.61 99200 |
6
Порядок | Naive | Kahan | Rump–Ogita–Oishi |
---|---|---|---|
~ | 210 | 522 | |
↑ | 410 | ||
↓ | 42 |
для себя
- Если нужно испортить сумму, получаемую наивным алгоритмом, то можно складывать отдельно положительные и отдельно отрицательные числа. Иногда, но не всегда, сортировка чисел по убыванию модуля также «ломает» наивный алгоритм, лучше сортировать по возрастанию, но и это в ряде случаев даёт более плохой результат, чем в случае хаотичного порядка.
- Если нужно получить ожидаемо хороший результат, следует взять алгоритм Rump–Ogita–Oishi, я не нашёл случайных тестов, при которых он выдавал бы не наиболее точную сумму. Недостаток алгоритма в том, что работать он будет медленнее наивного сложения. Ускорить такой алгоритм, вероятно, можно, пользуясь битовым представлением числа с плавающей запятой и кое-какими трюками, но у нас такой задачи на этот обзор не было.
- Алгоритм Кэхэна значительно лучше наивного суммирования и гораздо проще алгоритма Rump–Ogita–Oishi, поэтому наиболее целесообразен на практике, где точность наивного метода вам не подходит. Просто убедитесь заранее, что ваши числа не обладают какими-то экстраординарными свойствами, которые «завалят» данный алгоритм.
- Наивное суммирование в общем-то не такое страшное, как могло показаться. Ну, подумаешь, потеряли мы 5 десятичных цифр (если N не более миллиона). Много? Если их у вас 16, то вроде бы не страшно, а если 7 (для float), то вроде бы… хотя, друзья, неужели кто-то будет складывать миллион чисел в типе float? Вы серьёзно? Это допустимо только если вам нужна одна правильная цифра, либо если массив обладает какой-то особой спецификой, и то я бы не рискнул.
- Это творческий процесс, я создал свою субъективную схему тестирования и не считаю это научно-достоверным знанием, а потому не выношу на суд общественности. Коды алгоритмов я дал выше, если вам очень нужно, то не составит труда написать своё сравнение алгоритмов и получить свои данные.
- Мой код не автоматизирован, чтобы его запускать для получения разных тестов, нужно ковыряться в программе и менять какие-то параметры, это просто неприлично — давать такой код. А написание полноценной системы тестирования в задачи публикации не входило.
Что такое трипл-дабл в баскетболе
Лишь по-настоящему универсальные игроки способны в трёх показателях достичь двузначной цифры. Но таковые есть, поэтому в статистике учитывается трипл-дабл, что означает тройной дубль. Например, 11 очков, 12 передач и 14 подборов. Самым сложным для достижения показателем является перехват. Известны лишь 19 случаев за всю историю НБА с 1973-го, когда игроки делали либо 10, либо 11 перехватов за матч. Превысить цифру 11 не удалось никому. Сложно достигнуть двузначного результата в блок-шотах. За 36 последних лет 130 раз показатели игроков в этом элементе игры имели двузначый результат.
Чаще других встречаются следующие комбинации: очки плюс передачи плюс подборы. Лучшим центровым игрокам удаётся хорошо забивать и отлично играть в защите. В среднем дважды за сезон встречаются трипл-даблы в сочетании: очки плюс подборы плюс блок-шоты. Остальные варианты встречаются довольно редко. Никому не удавалось достичь тройного дубля в следующих сочетаниях: очки плюс блок-шоты плюс перехваты; подборы плюс блок-шоты плюс перехваты, а также перехваты плюс блок-шоты плюс передачи. Дабл-дабл в баскетболе – явление более распространённое.
Краткая история трипл-дабла
Впервые трипл-даблы стали фиксироваться в статистике, начиная с сезона 1979-80. В тот год их было 32. До сезона 1990-91 было зафиксировано 543 тройных дубля, в среднем по 45.25 в год. Львиная доля из них (137 или же 25.23%) была сделана Мэджиком Джонсоном. После того, как он завершил игровую карьеру в 1991 году, количество трипл-даблов снизилось. Так, начиная с сезона 1991-92 и до 2014-15, было зафиксировано 841 тройных дубля (35.04 в среднем). Лидером был Джейсон Кидд, на счету которого 107 трипл-даблов. Но уже со следующего года начался самый настоящий всплеск, и его главным «виновником» стал Рассел Уэстбрук. В сезоне 2015-16 количество тройных дублей выросло с 46 до 75, но это была лишь разминка. В сезонах 2017-2019 игроками было сделано 352 трипл-дабла (117.33 в среднем), а на долю Рассела Уэстбрука пришлись 101 из них (28.69% от общего количества).
С выполнением трипл-даблов связано множество забавных моментов. Некоторые игроки так сильно хотели добиться этого статистического показателя, что пытались отобрать десятый подбор у товарищей по команде или же всеми силами отдать недостающую результативную передачу. Некоторые специально промахивались под чужим кольцом, чтобы подобрать мяч и заработать подбор. Из-за этого НБА пришлось внести изменения в правила, в результате которых подборы после намеренных промахов не шли в статистику. Центровой Эндрэй Блатч, выступавший в сезоне 2009-2010 за команду Вашингтон Уизардс, до сих пор известен большинству болельщиков как «Человек, который просто хотел сделать трипл-дабл».
Характеристики типов с плавающей запятойCharacteristics of the floating-point types
C# поддерживает следующие предварительно определенные типы с плавающей запятой:C# supports the following predefined floating-point types:
Ключевое слово или тип C#C# type/keyword | Приблизительный диапазон значенийApproximate range | ТочностьPrecision | РазмерSize | Тип .NET.NET type |
---|---|---|---|---|
От ±1,5 x 10−45 до ±3,4 x 1038±1.5 x 10−45 to ±3.4 x 1038 | 6–9 цифр~6-9 digits | 4 байта4 bytes | System.Single | |
от ±5,0 × 10−324 до ±1,7 × 10308±5.0 × 10−324 to ±1.7 × 10308 | 15–17 цифр~15-17 digits | 8 байт8 bytes | System.Double | |
от ±1,0 x 10-28 до ±7,9228 x 1028±1.0 x 10-28 to ±7.9228 x 1028 | 28-29 знаков28-29 digits | 16 байт16 bytes | System.Decimal |
В приведенной выше таблице каждый тип ключевого слова C# из крайнего левого столбца является псевдонимом для соответствующего типа .NET.In the preceding table, each C# type keyword from the leftmost column is an alias for the corresponding .NET type. Они взаимозаменяемые.They are interchangeable. Например, следующие объявления объявляют переменные одного типа:For example, the following declarations declare variables of the same type:
По умолчанию все типы с плавающей запятой имеют значение .The default value of each floating-point type is zero, . Все типы с плавающей запятой имеют константы и с минимальным и максимальными итоговыми значениями этого типа.Each of the floating-point types has the and constants that provide the minimum and maximum finite value of that type. Типы и также предоставляют константы, обозначающие бесконечные и нечисловые значения.The and types also provide constants that represent not-a-number and infinity values. Например, тип предоставляет следующие константы: Double.NaN, Double.NegativeInfinity и Double.PositiveInfinity.For example, the type provides the following constants: Double.NaN, Double.NegativeInfinity, and Double.PositiveInfinity.
Так как тип характеризуется более высокой точностью и меньшим диапазоном, чем и , он подходит для финансовых расчетов.Because the type has more precision and a smaller range than both and , it’s appropriate for financial and monetary calculations.
В одном и том же выражении можно сочетать и целочисленные типы, и типы и .You can mix integral types and the and types in an expression. В этом случае целочисленные типы неявно преобразуются в один из типов с плавающей запятой. При необходимости тип неявно преобразуется в .In this case, integral types are implicitly converted to one of the floating-point types and, if necessary, the type is implicitly converted to . Выражение вычисляется следующим образом.The expression is evaluated as follows:
- Если в выражении есть тип , оно оценивается как или в реляционных сравнениях или сравнениях на равенство.If there is type in the expression, the expression evaluates to , or to in relational and equality comparisons.
- Если в выражении нет типа , оно оценивается как или в реляционных сравнениях или сравнениях на равенство.If there is no type in the expression, the expression evaluates to , or to in relational and equality comparisons.
Можно также смешивать целочисленные типы и тип в выражении.You can also mix integral types and the type in an expression. В этом случае целочисленные типы неявно преобразуются в тип , а выражение вычисляется как или в реляционных сравнениях и сравнениях на равенство.In this case, integral types are implicitly converted to the type and the expression evaluates to , or to in relational and equality comparisons.
Тип нельзя смешивать с типами и в выражении.You cannot mix the type with the and types in an expression. В этом случае, если требуется выполнить арифметические операции или операции сравнения или равенства, необходимо явно преобразовать операнды из типа или в тип , как показано в следующем примере:In this case, if you want to perform arithmetic, comparison, or equality operations, you must explicitly convert the operands either from or to the type, as the following example shows:
Можно использовать строки стандартных числовых форматов или строки пользовательских числовых форматов для форматирования значения с плавающей запятой.You can use either standard numeric format strings or custom numeric format strings to format a floating-point value.
typedef в Qt
В Qt имеются директивы typedef, облегчающие кроссплатформенную разработку и написание имен
типов (таблица 1).
Таблица 1. typedef в Qt
Для переносимости кода |
|
---|---|
qint8 | 8-битное знаковое целое |
quint8 | 8-битное беззнаковое целое |
qint16 | 16-битное знаковое целое |
quint16 | 16-битное беззнаковое целое |
qint32 | 32-битное знаковое целое |
quint32 | 32-битное беззнаковое целое |
qint64 | 64-битное знаковое целое |
quint64 | 64-битное беззнаковое целое |
quintptr | Беззнаковый указатель (32 или 64 бита) |
qptrdiff | Знаковый указатель (32 или 64 бита) |
qreal | Везде double; float только для архитектуры ARM |
Для краткой записи типов | |
uchar | unsigned char |
uint | unsigned int |
ulong | unsigned long |
ushort | unsigned short |
qlonglong | long long int или __int64 |
qulonglong | unsigned long long int или unsigned __int64 |
В большинстве систем qint8, qint16, qint8 соответствуют signed char, signed short и signed
int.
Тип qint64 обычно соответствует long long int. В компиляторах, не использующих расширения
C99 (например, msvc), этот тип может обозначаться как __int64 (также используются __int8,
__int16, __int32).
Для повышения переносимости кода 64-битные литералы можно записывать через макросы
Q_INT64_C и
Q_UINT64_C: qint64 m = Q_INT64_C(9223372036854775807); quint64 n = Q_UINT64_C(18446744073709551615);
Это то же самое, что 9223372036854775807LL и 18446744073709551615ULL.
Для указателей гарантируется
sizeof(void*) == sizeof(quintptr) && sizeof(void*) == sizeof(qptrdiff)
Объявление и инициализация переменных
В общем случае при объявлении переменной в C#, вначале указывается тип данных переменной, затем ее имя:
int nVal; string strVal;
Задание значения переменной можно произвести в момент инициализации:
int radius = 10; string name = "John";
либо после инициализаций:
string name; name = "John";
Необходимо иметь ввиду, что переменную нельзя использовать до тех пор пока она не будет проинициализирована, Например, выполнение следующей программы завершится с ошибкой:
int notInitedVal; Console.Write(notInitedVal);
В примерах мы не будем приводить код импорта и объявления класса. В конце главы будет приведен листинг программы со всеми примерами из данного урока.
Ключевое слово new
Ключевое слово new, как правило, используется при инициализации переменных, которые имеют ссылочный тип данных. О том, что это такое мы расскажем чуть ниже. Пусть у нас есть класс Rectangle
class Rectangle { public double Width = 0; public double Height = 0; }
Данный класс нам нужен только для демонстрации, при разработке собственных классов не стоит создать поля с ключевым словом public. О создании классов и основах объектно-ориентированного программирования будет рассказано в одном из ближайших уроков.
Создадим переменную класса Rectangle
Rectangle rect = new Rectangle(); Console.WriteLine($"Rectangle Width={rect.Width}, Height={rect.Height}");
Переменные типа int, double и т.п. также можно проинициализировать с помощью ключевого слова new, в этом случае будет присвоено значение по умолчанию:
int newInitedValue = new int(); Console.WriteLine("Default int value: " + newInitedValue);
Ключевое слово var. Неявная типизация
При объявлении переменной вместо явного задания типа можно поставить ключевое слово var. В этом случае будет использована система вывода типов для определения типа переменной по ее значению.
int v1 = 12345; var v2 = 12345; Console.WriteLine($"Type of v1: {v1.GetType()}\nType of v2: {v2.GetType()}");
При работе с var необходимо помнить следующее:
- использовать var можно только для объявления локальных переменных;
- var нельзя использоваться для объявления типа возвращаемого значения, типов полей и параметров;
- при объявлении переменной с использованием var она обязательно должна быть проинициализирована, при этом использовать для этого null запрещено;
- объявлять переменную допускающую null-значение с использованием лексемы ? через var нельзя.
Дабл-дабл в современном баскетболе
Современный баскетбол – это игра, в которой любой игрок на площадке должен быть универсальным. Прошли те времена, когда центровые играли только под кольцом и не умели бросать, а защитники практически не ходили в проходы и ограничивались дальними и средними бросками. Тоже самое касается и защиты: если команда хочет претендовать на высокие места, ее игроки должны уметь размениваться в защите и подстраховывать партнеров. То есть, «большой» должен хотя бы обозначить защиту, оставшись в размене против «малыша», и наоборот.
В связи с этим, сейчас в баскетболе очень ценятся универсальные игроки, которые отмечаются во всех статистических показателях. Баскетбол изменился настолько, что стерлись грани между классическими пятью позициями. Сейчас игроки делятся на защитников, форвардов и центровых. Это значит, что каждый баскетболист должен выполнять множество задач на площадке: защитники должны не только разыгрывать мяч и отдавать передачи, но еще и помогать в борьбе за отскок, а «большие» должны уметь пасовать и бросать с дистанции.
Подобная вариативность игроков приводит к тому, что они часто делают дабл-даблы. Это важный критерий полезности баскетболиста, который говорит о его плодотворной работе на площадке. И все же, несмотря на такие изменения в игре, самыми частыми комбинациями дабл-даблов остаются очки + подборы и очки + передачи. Существует также и двойной дабл-дабл, то есть, игрок набирает 20 и более пунктов в двух разных показателях, например, 20 очков и 20 подборов.
Защищенные указатели
Когда объект, на который ссылается указатель, разрушается, указатель становится «повисшим»,
т.е. содержащим адрес, по которому уже нет объекта. Это часто служит источником ошибок.
В Qt имеется защищенный указатель QPointer<T>, который автоматически принимает
значение 0 при разрушении связанного с ним объекта. Объект должен наследовать от
QObject.
В остальном QPointer<T> работает как T*. Он автоматически приводится к T*,
перегружаются операторы * и -> для разыменования, а также присваивание =.
Конструкторы QPointer<T>:
QPointer(); // нулевой QPointer (T *p); QPointer (const QPointer<T> &p); // копия
Методы:
T* data() const; // указатель bool isNull() const; // true, если 0
Операторы (+, -, ++ и —), используемые для арифметики указателей, не перегружаются.
Пример:
#include <QPointer> QPointer<Foo> x = new Foo; // ... if (x) { x->bar(); // не выполняется, если x был удален }
Разумеется, защищенные указатели предполагают дополнительные накладные расходы по сравнению
с обычными. Оповещение об уничтожении объекта реализовано через подключение сигнала к слоту.
Но обычно этим можно пренебречь.
Типы Single/Double/Currency
Данные
типа Single и Double содержат числа с плавающей
точкой из разных диапазонов значений.
Single – с 6 верными десятичными разрядами
после запятой, Double – с 14 верными
десятичными разрядами после запятой.
Данные типа Currency также служат для
представления чисел с плавающей точкой,
но число разрядов после запятой ограничено
четырьмя. Этого достаточно при
выполнении денежных расчетов:
Dim
s
As
Single,
a
As
Single
s
=1.7 ‘Результат: 1.7
a
= — 62.697
В
VB в качестве разделителя целой и дробной
частей используется точка.
В
этих инструкциях присваивания справа
от знака равенства находятся константы
с дробной частью. Возможно применение
другого способа записи таких констант.
Этот способ состоит в записи константы
с порядком.
Константы
типа Singleс порядком
выглядят так:
Так |
А |
1.5Е-8 |
1.5*10-8или 0.000000015 |
1E-6 |
0.000001 |
1.256578E5 |
125657.8 |
При
записи констант типа Doubleвместо буквыEприменяется
букваD, что сигнализируетVB, что константа имеет
тип с плавающей точкой, но не обычной,
а двойной точности.
Так |
А |
1.5D-8 |
1.5*10-8или 0.000000015 |
1D-6 |
0.000001 |
1.256578E5 |
125657.8 |
К
числовым переменным можно применять
арифметические операции сложения (+),
вычитания (-), умножения (*), деления (/),
возведения в степень (^) и некоторые
другие, с которыми мы ознакомимся позже.
Тип String
Значением
переменной типа String может быть символ
или строка символов.
Для
того чтобы VB отличал константу типа
строки символов от имени переменной,
константа заключается в парные кавычки:
Dim
Переменная As
String
Переменная
= «Привет Мир» ‘Результат: Привет
Мир
Строки
можно объединять. В качестве оператора
объединения строк в VB можно использовать
как знак суммирования (+), так и знак
«коммерческое и» (&). Однако для
лучшей читаемости кода следует применять
только &, так как знак плюса используется
обычно при суммировании числовых
значений.
Dim
a As String, b As String, c As String
a
= “Петр”
b
= “великий”
c
= a+b
‘Значение: Петр великий
c
= a&b
‘Значение: Петр великий
Тип
Date
Значением
переменной типа Date может быть, дата,
время или дата и время.
Данные
типа Date специально предназначены для
обработки информации о дате и времени.
Чтобы для VB было понятно, что под указанным
значением подразумевается дата и/или
время, нужно поместить его между двумя
знаками #. При вводе следует пользоваться
американским форматом (мм/дд/гг). Если
же при вводе данных этого типа использовать
кавычки («), что допустимо, то следует
применять установленный в системе
формат даты и времени ( как правило –
дд/мм/гг):
Dim
d As Date
d
= #10/16/95# ‘Результат:
16.10.95
d
= #1:25:00 PM# ‘Результат: 13:25:00
d
=
«6.10.95» ‘Результат: 6.10.95
d
= «13:25» ‘Результат: 13:25:00
Тип
Boolean
Переменная
типаBoolean может принимать всего два
значения. Такая переменная может иметь
значениеTrue(истина) или значениеFalse(ложь).
В
VB значению True соответствует 1, а False — 0.
Если переменной этого типа присваивается
значение 0, то переменная содержит False.
Все другие значения подразумевают True:
DimnVarAsBoolean
nVar= 5 ‘Результат:True
Тип
Variant
Универсальный
тип данных Variant — это хамелеон. Он
устанавливает тип данных в зависимости
от содержимого. Если в такой переменной
содержится число, то переменная типа
Variant принимает соответствующий тип
данных.
Если
ее содержимое — число 5, то она принимает
тип Integer;
если
1.2— Double; если текст, то String. Переменная
типа Variant изменяет свой тип во время
выполнения программы. Вот простой
пример:
Dim
V
As
Variant
V
= «25» ‘V содержит «25» (String)
V
= V +5 ‘V содержит 30 (Integer)
V
= V & » штук» ‘V содержит «30 штук»
(String)
Переменные
типа Variant имеют большое практическое
значение, однако, при их применении
возникают проблемы. Во-первых, при чтении
кода не видно, какой внутренний тип
имеет переменная в данный момент. Это
может крайне затруднить обнаружение
логических ошибок программирования.
Во-вторых, данные этого типа занимают
больше памяти, чем аналогичные данные,
объявленные с указанием явного типа.
Ошибки округленияRound-off errors
Из-за общих ограничений, касающихся представления вещественных чисел в форме с плавающей запятой и арифметических операций с плавающей запятой, при вычислениях с использованием типов с плавающей запятой могут возникать ошибки округления.Because of general limitations of the floating-point representation of real numbers and floating-point arithmetic, round-off errors might occur in calculations with floating-point types. То есть полученный результат выражения может отличаться от ожидаемого математического результата.That is, the produced result of an expression might differ from the expected mathematical result. В следующем примере показано несколько таких случаев:The following example demonstrates several such cases:
См. заметки в справочной документации по , и .For more information, see remarks at the , , or reference pages.