Типы данных с плавающей точкой
Вводная лекция.
Для начала выясним, что же такое объектно-ориентированное программирование и в чем его существенное отличие?
Объектно-ориентированное программирование– это система идей программирования, в которой основными концепциями являются понятия объектов и классов.
Представьте себе, что вы проектируете автомобиль. Вы знаете, что автомобиль должен содержать двигатель, подвеску, две передних фары, 4 колеса, и т.д. Ещё вы знаете, что ваш автомобиль должен иметь возможность набирать и сбавлять скорость, совершать поворот и двигаться задним ходом. И, что самое главное, вы точно знаете, как взаимодействует двигатель и колёса, согласно каким законам движется распредвал и коленвал, а также как устроены дифференциалы. Вы уверены в своих знаниях и начинаете проектирование.
Вы описываете все запчасти, из которых состоит ваш автомобиль, а также то, каким образом эти запчасти взаимодействуют между собой. Кроме того, вы описываете, что должен сделать пользователь, чтобы машина затормозила, или включился дальний свет фар. Результатом вашей работы будет некоторый эскиз. Вы только что разработали то, что в ООП называется класс.
Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью.
Рассмотрим создание класса пользователем и применение класса, созданного пользователем, в программе.
Объявление класса:
class <имя класса>
{
public:
<объявление переменных, констант, функций>
private:
<объявление переменных, констант, функций>
protected:
<объявление переменных, констант, функций>
};
Объявление класса начинается с ключевого слова class. Переменные, константы, функции, включенные в класс, называются членами класса. Члены класса объявляются в одном из трех разделов класса: public, private, protected. Включение члена класса в тот или иной раздел влияет на доступность этого члена для объектов других классов.
Раздел public обеспечивает доступность помещенных в него свойств и методов для любых объектов. Это внешняя часть класса, или интерфейс его взаимодействия с другими классами.
Раздел private обеспечивает сокрытие помещенных в него свойств и методов от других объектов, делая их недоступными объектам других классов. Таким образом, класс защищает свои данные (свое состояние) от внешнего воздействия. Посторонний объект может воздействовать на объект данного класса только через интерфейс этого класса.
Раздел protected позволяет, используя механизм наследования, передавать включенные в него члены класса по наследству.
Вы отлично потрудились и машины, разработанные по вашим чертежам, сходят с конвейера. Вот они, стоят ровными рядами на заводском дворе. Каждая из них точно повторяет ваши чертежи. Все системы взаимодействуют именно так, как вы спроектировали. Но каждая машина уникальна. Они все имеют номер кузова и двигателя, но все эти номера разные, автомобили различаются цветом, а некоторые даже имеют литьё вместо штампованных дисков. Эти автомобили, по сути, являются объектами вашего класса.
Объект – это сущность, способная сохранять свое состояние (информацию) и обеспечивающая набор операций (т.е. поведение) для проверки и изменения этого состояния.
Говоря простым языком, объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. В данном примере, если класс – это некоторый абстрактный автомобиль из «мира идей», то объект – это конкретный автомобиль, стоящий у вас под окнами.
Объект состоит из следующих трех частей:
- имя объекта;
- состояние (переменные состояния);
- методы (операции).
Типы переменных.
Тип | байт | Диапазон принимаемых значений |
целочисленный (логический) тип данных | ||
bool | 0 / 255 | |
целочисленный (символьный) тип данных | ||
char | 0 / 255 | |
целочисленные типы данных | ||
int | -2 147 483 648 / 2 147 483 647 | |
типы данных с плавающей точкой | ||
float | -2 147 483 648.0 / 2 147 483 647.0 | |
double | -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0 |
Тип данных bool
Первый в таблице — это тип данных bool. У логического выражения может быть один из двух результатов true или false. true - если логическое выражение истинно (т.е. равно 1), false - если логическое выражение ложно (равно 0).
Тип данных char
Тип данных char - это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char. Для представления символов в C++ типу данных char отводится один байт, в одном байте — 8 бит, тогда возведем двойку в степень 8 и получим значение 256 — количество символов, которое можно закодировать. Таким образом, используя тип данных char можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII.
ASCII ( от англ. American Standard Code for Information Interchange) — американский стандартный код для обмена информацией.
Целочисленные типы данных
Целочисленные типы данных используются для представления чисел.
Приставки целочисленных типов данных:
short-приставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;
long- приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти.
Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел — это тип данных int. Благодаря приставкам short, long,появляется некоторое разнообразие типов данных int, различающихся размером занимаемой памяти и (или) диапазоном принимаемых значений.
Типы данных с плавающей точкой
В С++ существуют два типа данных с плавающей точкой: float и double. Типы данных с плавающей точкой предназначены для хранения чисел с плавающей точкой. Типы данных float и double могут хранить как положительные, так и отрицательные числа с плавающей точкой. У типа данных float размер занимаемой памяти в два раза меньше, чем у типа данных double, а значит и диапазон принимаемых значений тоже меньше. Если тип данных float объявить с приставкой long, то диапазон принимаемых значений станет равен диапазону принимаемых значений типа данных double. В основном, типы данных с плавающей точкой нужны для решения задач с высокой точностью вычислений, например, операции с деньгами.
Класс string
Это тип данных, значениями которого является произвольная последовательность (строка) символов алфавита. Каждая переменная такого типа (строковая переменная) может быть представлена фиксированным количеством байтов либо иметь произвольную длину.
Для использования данного класса в ваших приложениях, нужно подключить заголовочный файл string:
#include <string>
Приведение типов.
Иногда мы используем в одной программе переменные разных типов и нам просто необходимо, чтобы мы могли с ними взаимодействовать в одной строчке. Например, взять целочисленное значение из Edit-а. Например, такой код будет неправильным и компиляцию он не пройдет:
int x;
x = Edit1->Text;
Компилятор нам выдаст сообщение «Cannot convert 'UnicodeString' to 'int'». То есть мы не можем поместить строковой элемент в целочисленное число. Но, если мы используем конвертацию типа, то компиляция пройдет успешно. Общий вид операции приведения типа
<первый тип>To<второй тип>
Покажу на примере нашей программы:
int x;
x = StrToInt(Edit1->Text);
Теперь компилятор знает, что мы хотим взять из строки целочисленное значение, и спокойно запишет нам в икс какое-либо число, которое будет находиться в Edit-e. Конвертировать друг в друга можно практически любой тип данных, если это имеет смысл.
Спецификаторы.
Стандартная библиотека C/C++ включает ряд функций для чтения и записи на консоли (клавиатура и монитор). Эти функции читают и пишут данные как простой поток символов.
Функция printf() является функцией стандартного вывода. С помощью этой функции можно вывести на экран монитора строку символов, число, значение переменной...
Например, если вы напишите:
printf(“Привет, мир!”);
То результатом работы программы будет:
Привет, мир!
Функция printf() это функция форматированного вывода. Это означает, что в параметрах функции необходимо указать формат данных, которые будут выводиться. Формат данных указывается спецификаторами формата. Спецификатор формата начинается с символа % за которым следует код формата.
Спецификаторы формата:
%с | символ |
%d | целое десятичное число |
%f | десятичное число с плавающей запятой xx.xxxx |
%o | восьмеричное число |
%s | строка символов |
%u | беззнаковое десятичное число |
%x | шестнадцатеричное число |
%X | шестнадцатеричное число |
%% | символ % |
%p | указатель |
%n | указатель |
Например, если у нас есть переменная x=10.3563 типа float и мы хотим вывести её значение с точностью до 3-х цифр после запятой, то мы должны написать:
printf("Переменная x = %.3f",x);
Результат:
Переменная x = 10.356
Кроме спецификаторов формата данных в управляющей строке могут находиться управляющие символы:
\f | Новая страница, перевод страницы |
\n | Новая строка, перевод строки |
\" | Двойная кавычка |
\' | Апостроф |
\0 | Нулевой символ, нулевой байт |
\N | Восьмеричная константа |
\xN | Шестнадцатеричная константа |
\? | Знак вопроса |
Чаще всего вы будете использовать символ \n. С помощью этого управляющего символа вы сможете переходить на новую строку.
Функция стандартного ввода scanf():
Функция scanf() - функция форматированного ввода. С её помощью вы можете вводить данные со стандартного устройства ввода (клавиатуры). Вводимыми данными могут быть целые числа, числа с плавающей запятой, символы, строки и указатели.
Спецификаторы формата:
%c | чтение символа |
%d | чтение десятичного целого |
%i | чтение десятичного целого |
%e | чтение числа типа float (плавающая запятая) |
%o | чтение восьмеричного числа |
%s | чтение строки |
%x | чтение шестнадцатеричного числа |
%p | чтение указателя |
Пример программы:
/* Пример 1 */
#include <stdio.h>
void main(void)
{
int age;
printf("\nСколько вам лет?:");
scanf("%d",&age);
printf("Вам %d лет.", age);
}
Наследование:
Наследование- отношение, которое определяет одну сущность в терминах другой. В случае наследования класса новый класс определяется в терминах одного или нескольких родительских классов. Новый класс наследует интерфейс и реализацию от своих родителей. Новый класс называется подклассом или производным классом (в C++).
Наследование класса объединяет наследование интерфейса
и наследование реализации. В случае наследования интерфейса новый интерфейс определяется в терминах одного или нескольких существующих. При наследовании реализации новая реализация определяется в терминах одной или нескольких существующих.
ПРОСТОЕ НАСЛЕДОВАНИЕ
Наследование представляет собой способность производного класса наследовать характеристики существующего базового класса. Например, предположим, что у вас есть базовый класс employee:
class employee
{
public:
employee(char *, char *, float);
void show_employee(void);
private:
char name[64];
char position[64];
float salary;
};
Далее предположим, что вашей программе требуется класс manager, который добавляет следующие элементы данных в класс employee:
float annual_bonus;
char company_car[64];
int stock_options;
В данном случае ваша программа может выбрать два варианта: во-первых, программа может создать новый класс manager, который дублирует многие элементы класса employee, или программа может породить класс типа manager из базового класса employee. Порождая класс manager из существующего класса employee, вы снижаете объем требуемого программирования и исключаете дублирование кода внутри вашей программы.
Для определения этого класса вы должны указать ключевое слово class, имя manager, следующее за ним двоеточие и имя employee, как показано ниже:
Производный класс //-----> class manager : public employee { <-------// Базовый класс
// Здесь определяются элементы
};
Ключевое слово public, которое предваряет имя класса employee, указывает, что общие (public) элементы класса employee также являются общими и в классе manager. Например, следующие операторы порождают класс manager.
class manager : public employee
{
public:
manager(char *, char *, char *, float, float, int);
void show_manager(void);
private:
float annual_bonus;
char company_car[64];
int stock_options;
};
Что следует знать:
· Наследование представляет собой способность производить новый класс из существующего базового класса.
· Производный класс — это новый класс, а базовый класс — существующий класс.
· Когда вы порождаете один класс из другого (базового класса), производный класс наследует элементы базового класса.
· Для порождения класса из базового начинайте определение производного класса ключевым словом class, за которым следует имя класса, двоеточие и имя базового класса, например class dalmatian: dog.
Мно́жественное насле́дование — свойство, поддерживаемое частью объектно-ориентированных языков программирования, когда класс может иметь более одного суперкласса (непосредственного класса-родителя). Эта концепция является расширением «простого (или одиночного) наследования» (англ. single inheritance), при котором класс может наследоваться только от одного суперкласса.
Предположим, к примеру, у вас есть класс computer_screen:
class computer_screen
{
public:
computer_screen(char *, long, int, int);
void show_screen(void);
private:
char type[32] ;
long colors;
int x_resolution;
int y_resolution;
};
Предположим, что у вас есть также класс mother_board:
class mother_board
{
public:
mother_board(int, int, int);
void show_mother_board(void);
private:
int processor;
int speed;
int RAM;
};
Используя эти два класса, можно породить класс computer, что показано ниже:
class computer : public computer_screen, public mother_board
{
public:
computer(char *, int, float, char *, long, int, int, int, int, int);
void show_computer(void);
private:
char name[64];
int hard_disk;
float floppy;
};
Как видите, этот класс указывает свои базовые классы сразу после двоеточия, следующего за именем класса computer.
class computer : public computer_screen, public mother_board //——————> Базовые классы
Алгоритм ветвления в C++
Встречаются ситуации, когда программе нужно выбрать, какую операцию ей выполнить, в зависимости от определенного условия.
К примеру, мы вводим с клавиатуры целое число. Если это число больше десяти, то программа должна выполнить одно действие, иначе — другое. Реализуем этот алгоритм на C++ с помощью конструкции ветвления, используя оператор if.
Внешний вид программы:
У нас имеются следующие компоненты: Label1 для вывода результата, Edit1 для считывания числа, которое введет пользователь и Button1 для выполнения операции сравнения.
Для сравнения используется операторы if и else. Общий вид:
if (выражение1) {
оператор1; }
else {
оператор2;}
Как это будет выглядеть в нашем случае:
int x = 10; //объявляем переменную, с которой будем сравнивать
int y = StrToInt(Edit1->Text);
//во вторую переменную такого же типа извлекаем число из Edit1, повторяем перевод типов и переводим строчку в число StrToInt()
if (y>=x) {
Label1->Caption="Это число больше, либо равно 10";}
else {
Label1->Caption="Это число меньше десяти";}
И в конце выводим результат пользователю в Label 1:
Эту же самую программу можно выполнить при помощи конструкции switch-case.Синтаксис это конструкции:
switch ( <переменная> ) {
case значение1:
Выполнить если <переменная> == значение1
break;
case значение2:
Выполнить если <переменная> == значение2
break;
...
default:
выполнить, если ни один вариант не подошел
break;
}
Как это будет выглядеть в случае нашей программы:
int x = 10;
int y = StrToInt(Edit1->Text);
switch (y) {
case 1:
Label1->Caption="Число равно 1";
break;
case 2:
Label1->Caption="Число равно 2";
break;
. . . . . . . . . . . .
case 10:
Label1->Caption="Число равно 10";
break;
default:
Label1->Caption="Число больше 10"; }
Обязательно не забываем после каждого caseприписыватьbreak,иначе программа начнет выводить все те значения, которые идут после верного совпадения. Т.е. если мы после всех case забыли breakи ввели число пять, то программа выведет следующий результат:
Число равно 5
Число равно 6
Число равно 7
Число равно 8
Число равно 9
Число равно 10
Число больше 10
Так что будем внимательны, используя эту конструкцию.
Цикл for в C++
Цикл — многократное прохождение по одному и тому же коду программы. Циклы необходимы программисту для многократного выполнения одного и того же кода, пока истинно какое-то условие. Если условие всегда истинно, то такой цикл называется бесконечным, у такого цикла нет точки выхода.
В языке программирования С++ существуют такие циклы:
- цикл for
- цикл while
- цикл do while
Но по большому счету циклом for можно заменить оставшиеся два.
Тело цикла будет выполняться до тех пор, пока условие будет истинно(т. е. true).
// форма записи оператора цикла for: for (/*выражение1*/; /*выражение2*/; /*выражение3*/ ) { /*один оператор или блок операторов*/; } Где выражение1 – это начальное условие, выражение2 – условие выхода из цикла, Выражение3 – что мы делаем, пока не выйдем из цикла. |
Напишем программу, которая выведет нам в Memo1 числа от одного до десяти. Можно просто каждой отдельной строчкой прописать Memo1->Lines->Add(“тут будет число от 1 до 10”), но это будет целых 10 строчек кода, а если нам нужно вывести числа от 1 до 100, то нам придется слишком много раз копипастить, что не есть удобно. И вот тут нам на помощь и проходят циклы.
for (int i = 1; i = 100; i++) {
Memo1->Lines->Add(i);
}
Вот так с помощью всего двух строчек кода мы сможем вывести числа от 1 до 100.
Int i = 1 – это у нас начальное условие.
i = 100 – это условие выхода из цикла, т.е. как только i будет равно 100, то мы выйдем из цикла.
i++ - с каждым выполнением цикла, мы будем увеличивать i на единицу.