Умный дом

Определение и инициализация объектов данных

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

The values 2,3 from two consecutive elements of a numerical sequence. What is the next value?

Эти значения - третий и четвертый элементы из последо­вательности Фибоначчи: 1, 1, 2, 3, 5, 8, 13 и т. д. Последова­тельность Фибоначчи начинается с двух элементов - единиц. Каждый следующий элемент это сумма двух предшеству­ющих.

Если пользователь введет 5, мы поздравим его и спросим, хочет ли он попробовать другую числовую последователь­ность. Любое другое введенное значение - неверно, и мы спросим пользователя, хочет ли он погадать еще.

Чтобы поддержать интерес к программе, мы сохраним текущий счет, основанный на отношении правильных отве­тов к числу попыток.

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

Для определения объектов данных мы должны ввести имена и тип данных. Имена могут быть любыми комбинаци­ями букв, цифр, подчеркиваний. Буквы регистрозависимые. Каждое из имен user_name, User_name, uSeR_nAmE и user_Name относится к разным объектам.

Имя не должно начинаться с цифры. Например, l_name неправильно, name_l - правильно. Также имя не должно со­впадать с ключевыми словами языка. Например, delete - ключевое слово языка, так что мы не должны использовать его в нашей программе. (Это объясняет, почему оператор удаления символа из строкового класса - это erase (), а не deleted).

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

Мы видели определение user_name в предыдущем разде­ле. Перенесем то же определение в новую программу:

#include <string> string user_name;

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

Int usr_val;

Int - ключевое слово языка определяющее, что объект usr_val - целого типа. Оба объекта: число попыток, сделан­ных пользователем и число правильных ответов, - объекты целого типа. Разница только в том, что мы бы хотели дать им начальное значение «О». Мы можем вывести каждое на от­дельную строку:

Int num_.trіes = 0; int num_right = 0;

Или определить их в одной строке через запятую:

Int num_tries = 0, num_right = 0;

В общем, лучше придерживаться правила инициализиро­вать объект данных, даже если значение только обозначает, что объект не имеет полезного значения вовсе. Я не инициа­лизировал usr_val, потому что значение будет получено непосредственно из пользовательского ввода прежде, чем программа как-то использует объект.

Альтернативный вариант инициализации - использовать так называемый конструкционный синтаксис

Int num_.tries (0);

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

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

String sequence_name = "Fibonacci";

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

#include <complex> complex<double> pureі(0, 7);

Странная нотация скобок, следующая за complex, означа­ет, что класс комплексных чисел - класс шаблонов. Класс шаблонов позволяет нам определять класс без специфика­ции типа данных одного или всех членов класса.

Класс комплексных чисел, например, состоит из двух чле­нов объекта данных. Один представляет реальную часть чис­ла, второй - мнимую. Эти члены должны быть числами типа данных с плавающей точкой, но какого? С++ поддерживает три типа чисел с плавающей точкой: единичной точности, представляемых ключевым словом float; двойной точности, представленной ключевым словом double; и расширенной

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

Механизм класса шаблонов позволяет программисту от­кладывать определение типа данных, используя класс шабло­нов. Это дает ему возможность вставить «заглушку», которую позднее он заполнит реальным типом данных. В предыдущем примере использовался выбор данных типа класса комплек­сных чисел double.

Что ж, возможно, появляется больше вопросов, чем полу­чается ответов. Это происходит от того, что шаблоны, под дер­живаемые С++, двух инициализационных синтаксисов для встроенных типов данных. Когда встроенные типы данных и программно определенный класс типов имеют разный иници- ализационный синтаксис, невозможно написать шаблон, ко­торый поддерживает и встроенный класс, и класс типа дан­ных. Унификация синтаксиса упрощает разработку шаблонов. К сожалению, раскрытие синтаксиса приводит к появлению еще большей путаницы!

Счет пользователя должен быть значением с плавающей точкой, поскольку возникает нецелое отношение. Мы опре­делим его типом double:

Double usr_score = 0.0;

Нам также нужно сохранить место для ответов пользова­теля yes/по: Make another try? Try another sequence?

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

Char usr_more;

Cout « "Try another sequence? Y/N? "; cin » usr_more;

Ключевое слово char относится к символьному типу. Символ окаймляется апострофами, обозначая ' а', ' 7 ', '; ' и т. д. Неко­торые специальные встроенные символьные обозначения при­ведены ниже (их иногда называют эскейп последовательности):

n' newline (новая строка) "t" tab (табуляция) "" null (нуль) ""' single quote (апостроф) double

Quote (кавычки) "\" backslash (обратная косая черта)

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

Cout « "n" « "t" « user_name;

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

Cout « "nt" « user_name;

Обычно мы используем эти специальные символы в бук­венной строке. Например, для представления пути к файлу в системе Windows необходимо ставить обратные косые чер­точки:

"F:\essent ial\programs\chapter1\chl_main. срр"?

С++ поддерживает встроенный булев тип данных для представления значений true/false. В нашей программе, например, мы можем определить булев объект для контроля над необходимостью вывода на дисплей следующей число­вой последовательности:

Bool go_for_it = true;

Булев объект обозначен ключевым словом bool. Он мо­жет сохранять два буквенных значения: true или false.

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

Иногда необходимо наличие объекта для представления постоянных значений: максимального числа попыток, опре­деляемых для пользователя или значения числа «пи». Объек­ты, сохраняющие эти значения, не будут меняться по ходу программы. Как мы можем предотвратить случайное измене­ние данных объектов? Заручиться поддержкой языка, объя­вив эти объекты, как const:

Const int max_tries =3; const double pi = 3.14159;

Объекты const не могут изменяться после инициализации их значения. Любые попытки переустановить значение объек­та const приведут к ошибке при компиляции. Например:

Max_tries = 42; // error: объект const

Умный дом

Как использовать массивы и векторы

Ниже приведены первые восемь элементов из шести число­вых последовательностей: Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21 Lucas: 1# 3, 4, 7, 11, 18, 29, 47 Pell: 1, 2, …

Разветвитель видеосигнала

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

Указатели дают больше гибкости

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

Как с нами связаться:

Украина:
г.Александрия
тел. +38 05235 7 41 13 Завод
тел./факс +38 05235  77193 Бухгалтерия
+38 067 561 22 71 — гл. менеджер (продажи всего оборудования)
+38 067 2650755 - продажа всего оборудования
+38 050 457 13 30 — Рашид - продажи всего оборудования
e-mail: msd@inbox.ru
msd@msd.com.ua
Скайп: msd-alexandriya

Схема проезда к производственному офису:
Схема проезда к МСД

Представительство МСД в Киеве: 044 228 67 86
Дистрибьютор в Турции
и странам Закавказья
линий по производству ПСВ,
термоблоков и легких бетонов
ооо "Компания Интер Кор" Тбилиси
+995 32 230 87 83
Теймураз Микадзе
+90 536 322 1424 Турция
info@intercor.co
+995(570) 10 87 83

Оперативная связь

Укажите свой телефон или адрес эл. почты — наш менеджер перезвонит Вам в удобное для Вас время.