Урок 2: «Укрощение переменных»


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

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

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

Непонятно? Приведу пример. Допустим, вы пишете программу для расчета гипотенузы треугольника.  У вас есть длины катетов (допустим, 20 и 10)  и вы можете приступать к расчету. Ваше уравнение будет тогда выглядеть в нотации С+ так:

cout<<” Гипотенуза треугольника равна “ <<  sqrt(20*20 + 10*10) <<endl;

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

Назовем катеты kat1 и kat2, гипотенузу gip.

Теперь наше уравнение будет выглядеть так (я пока нарочно опускаю возведение в степень):

gip=sqrt(kat1*kat 1+ kat2*kat2);

sqrt – это функция извлечения квадратного корня. Она входит в заголовочный файл <math.h>. Пока мы не изучали еще функции, просто примите к сведению, что она есть.  Эта библиотека наряду еще с другими пригодится нам в игрописании.

Как видите, это выражение обладает большей гибкостью. Мы можем запросить любую величину в переменные kat1 и kat2 и вывести результат:

double kat1,kat2,gip;

  cout<<«Введите длину катета»<<endl;

  cin>>kat1;

  cout<<«Введите длину катета»<<endl;

  cin>> kat2;

  gip=sqrt(kat1*kat 1+ kat2*kat2);

  cout<<«Гипотенуза равна»<<g;

Думаю, что такой вариант более удобен.  Надеюсь, вы поняли принцип работы.

Как я уже упоминал,  компилятору нужно знать размер выделенной под данные памяти. Да-да, это очень важно. Представьте себе ваш поход в магазин с маленькой  сумкой, а там неожиданная распродажа. Естесственно, вы можете набить только свою сумку, а лишнее достанентся другим людям. И наоборот, взяв большую сумку и надеясь на авось, вы будет таскать почти пустой этот баул, расходуя свои силы и причиняя себе лишние неудобства.

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

В С++  имеются простые и типообразующие данные, определяемые пользователем. Конечно, здесь это не совсем точно, но лучше будет вам использовать это понятие.

Простые типы данных делятся на числовые, логические, строковые и символьные (фактически, строковый тип –это тот же символьный массив).  Числовой тип делится на несколько подтипов: byte,short, int, long, float, double.

Самый простой тип – это byte. Он занимает в памяти всего один байт, что подразумевает его емкость числами от -127 до 127 если это знаковая перменная, и  от 0 до 255 для беззнаковых.

Иными словами, если вы объявите переменную a типом byte и  присвоите ему значение 600, компилятор напрочь откажется выполнять этот бред. Конечно, в выражениях может быть неявное приведение типов, но об этом потом. Скажете, зачем она нужна? В программировании часто приходится оперировать так называемыми флагами состояния. Как правило, от числа от 0 до 255. Выделять под эти флаги память больше памяти расточительно, да и глупо. Привыкайте сразу программировать правильно. Например, для переменной age тип byte идеально подойдет, так как вы навряд ли в обозримом будущем проживете больше 100 лет.

Чтобы вы не путались с определением  емкости типа, сделаем небольшую хитрость. В С++ есть функция sizeof, возвращающая как раз размер какого-либо объекта.

Мы можем запросить размер в байтах  и потом вычислить его.

byte razm= sizeof (byte);

cout<<”Максимальный размер типа “ << (pow (2,razm)) -1<<endl;

Здесь мы получаем размер типа в байтах и вводим 2 в степень этого размера с помощью функции pow. Привыкайте все автоматизировать.

Наряду с byte широко применяются типы  целочисленные типы int, long. Для достаточно больших чисел используют int, для очень больших –long.  Что такое целочисленный тип? Это значит, что переменная этого типа содержит только целое число без дроби. Это важное отличие от вещественного типа.

Давайте пока отвлечемся от типов и посмотрим как нужно объявлять переменные. Синтаксис предельно прост:

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

int a=2344, b=4556;

Иногда нужно проинициировать несколько переменных одного типа одним значением. Тогда поступают так:

int a,b,c,d;

a=b=c=d=10000;

Вот такой язык С++. Но вернемся теперь к нашим типам. Тип long нужно использовать с суффиксом l, что будет говорить компилятору о типе данных (а то этот умник может живо конвертировать переменную в тип int, что потом отразится на результатах вычисления).

long d=3456l;

Наряду с целыми типами в программировании широко применяются числа с плавающей точкой (вещественные числа). В С++ это типы float и double. Главное отличие между ними – точность. Тип double более точен, но float занимает меньше памяти. Компилятор и здесь может нашкодничать –неявно привести тип float к double. Поэтому здесь тоже правило –ставим суффикс f:

float a=3.5f;

Логический тип (булевский) может принимать всего два значения –истина (true) и ложь (false). Этот тип данных широко применяется для установки состояния. Вот пример на псевдокоде:

bool windowOpen =true; // состояние открытого окна истина.

Делаем какие либо операции, что приводит к закрытию окна.

windowOpen=false; //так как окно закрыто, логично будет поставить на состояние ложь.

if (!windowOpencout<<”Окно закрыто. Ничего нельзя поделать”;

К слову, этот тип данных появился уже в С++, в С его раньше не было.

Символьный тип char предназначен для хранения символов. Он занимает один байт и может хранить только один символ. Символ должен быть заключен в одинарные кавычки.

char a=’a’;

Ну и строковый тип появился тоже в С++.  Это тип string. Но для его использования нужно подключить библиотеку <string.h> или <cstring>. В переменных этого типа хранятся строки.

string name=”Вячеслав”;

Как видите, тип string  гораздо проще использовать, нежели массив типа char.

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

Также всегда можно создать псевдоним переменной. Синтаксис его такой

typedef  тип_переменной ваше_название_псевдонима.

Пример:

typedef long LONG

Использование:

LONG g=34l;

Полезная штука особенно при работе со структурами.

На этом пока все. Пойдите выпейте кофе и приступим уже к более нормальному изучению в уроке 3.

<<Предыдущий урок                                                      Следующий урок>>

Рубрика: Уроки по С++

Добавить комментарий

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

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: