Определение переменных при первом использовании — КиберПедия 

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Определение переменных при первом использовании

2020-05-08 198
Определение переменных при первом использовании 0.00 из 5.00 0 оценок
Заказать работу

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

Каскадирование операции <<

Операция << повторяется несколько раз, или каскадируется. Операцию извлечения >> можно каскадировать совместно с cin аналогичным путем, давая возможность пользователю вводить несколько значений подряд. Однако такой подход употребляется достаточно редко, поскольку в этом случае перед вводом значений на экран пользователю не будут выводиться соответствующие приглашения.

Вещественные типы

В С++ имеются три вещественных типа: float, double и long double. Рассмотрим первый из них.

 

Тип float

Тип float способен хранить числа, содержащиеся в интервале от 3.4*10"38 до 3.4*1038, с точностью до семи знаков после запятой. Размер типа float равен 4 байтам (32 битам).

//circarea.cpp

//работа с переменными вещественного типа

#include <iostream>  // для cout и т. д.

using namespace std;

int main() {

float rad; // переменная вещественного типа

const float PI =3.14159F; // вещественная константа

cout << "Введите радиус окружности: "; // запрос

cin >> rad; // получение радиуса

float area = PI *rad *rad; // вычисление площади круга

cout << "Площадь круга равна " << area << endl; // вывод результата на зкран

return 0;

}

Вещественные константы

Число 3.14159F в программе CIRCAREA является примером вещественной константы. Наличие десятичной точки говорит о том, что тип этой константы вещественный, а не целый, а суффикс F после значения константы указывает конкретный ее тип — float.

Префикс const

const float PI - 3.14159F: //тип вещественная константа

Ключевое слово const предшествует описанию типа переменной и означает, что во время выполнения программы запрещено изменять значение этой переменной. Любая попытка изменить значение переменной, описанной с таким префиксом, приведет к выдаче компилятором сообщения об ошибке.

Директива #define

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

#define PI 3.14159

то идентификатор PI при компиляции будет заменен текстом 3.14159 везде, где он встречается.

Манипулятор setw

Изменяет ширину поля вывода.

//widthl.cpp

//демонстрирует необходимость применения манипулятора setw

#include <iostream>

using namespace std;

int main()

{

long popl = 4789426, pop2 = 274124, рорЗ = 9761;

cout << "Город " << "Нас." << endl <<"Москва "

<< popl << endl << "Киров " << pop2

<<endl << "Угрюмовка " << рорЗ << endl;

return 0;

}

Вывод на экран:

Город Нас.

Москва 4789426

Киров 274124

Угрюмовка 9761

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

//width2.cpp

//применение манипулятора setw

#include <iostream>

#include <iomanip>   // для использования setw

using namespace std;

int main() {

long popl =8425785, pop2 = 47, рор 3=9761;

cout << setw(9) << " Город " << setw(12) << " Население " << endl

<< setw(9) << " Москва " << setw(12) << popl << endl << setw(9) << " Киров " << setw(12)

<< pop2 << endl << setw(9) << " Угрюмовка " << setw(12) << рор 3 << endl;

return 0;

}

Манипулятор setw печатает число или строку, следующую за ним в потоке, в поле фиксированной длины n, где n — аргумент манипулятора setw(n). Значение переменной, помещаемой в поле, выравнивается справа.

Результат работы программы WIDTH2:

Город      Население

Москва    8425785

Киров      47

Угрюмовка 9761

 

Каскадирование операции <<

В программах WIDTH1 и WIDTH2 имеется только один оператор cout с каскадированием операции вставки, то есть записью в одном операторе того, что можно реализовать с помощью четырех последовательных операторов, начинающихся с cout.

 

Множественное определение

Переменные popl, рор2 и рорЗ инициализированы одновременно с их определением, в одной строке.

Файл заголовка IOMANIP

Объявления манипуляторов (за исключением endl) происходит не в файле I0STREAM, а в другом заголовочном файле — IOMANIP.

Беззнаковые типы данных

Если исключить из представления целых чисел знак, то полученный тип данных будет представлять неотрицательные целые числа с удвоенной верхней границей диапазона представления. Беззнаковые типы данных перечислены в табл. 1.

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

unsigned char ucharv;

 

Таблица 1.

 Беззнаковые целые типы

Название Нижняя граница диапазона Верхняя граница диапазона Размер в байтах
unsigned char 0 255 1
unsigned short 0 65 535 2
unsigned int 0 4 294 967 295 4
unsigned long 0 4 294 967 295 4

 

Выход за рамки допустимых для данного типа значений, как правило, приводит к труднообнаруживаемым ошибкам. Подобные ошибки с беззнаковыми типами происходят гораздо реже. Следующая программа хранит одно и то же значение, равное 1 500 000 000, в переменных signedVar типа int и unsignVar типа unsigned int.

// signtest.cpp

// работа со знаковым / беззнаковыми переменными

#include <iostream>

using namespace std;

int main()

{

int signedVar=1500000000; // знаковая переменная

unsigned int unsignedVar =1500000000; // беззнаковая переменная

signedVar = (signedVar*2) / 3; //выход за границы диапазона

unsignedVar = (unsignedVar*2) / 3; // вычисления внутри диапазона

cout << "Знаковая переменная равна " << signedVar << endl;

// вывод правильного результата

cout << "Беззнаковая переменная равна " << unsignedVar << endl;

// вывод некорректного результата

return 0;

}

 

Программа умножает обе переменные на 2, а затем делит на 3. Несмотря на то, что правильный результат должен получиться меньше исходного значения, промежуточные вычисление приводят к результату, большему, чем исходное число. Такая ситуация стандартна, но зачастую она приводит к ошибкам. Так, например, в программе SIGNTEST мы должны ожидать того, что в обеих переменных в итоге будет содержаться одно и то же значение, составляющее 2/3 от исходного и равное 1 000000000. Но результат умножения, равный 300000000, вышел за допустимый верхний предел для переменной signedVar, равный 2 147 483 647. Поэтому результат работы программы будет выглядеть следующим образом:

Знаковая переменная равна 431655765, беззнаковая переменная равна 1000000000.

 

2. Преобразования типов

Язык С++, как и его предшественник С, свободнее, чем многие другие языки программирования, обращается с выражениями, включающими в себя различные типы данных. В качестве примера рассмотрим программу MIXED:

// mixed.cpp

// использование смешанных выражений

#include <iostream>

using namespace std;

int main()

{

int count=7;

float avgWeight = 155.5F;

double totalWeight = count *avgWeight;

cout << " Вес равен " << totalWeight << endl;

return 0;

}

Здесь переменная типа int умножается на переменную типа float, а результат присваивается переменной типа double. Компиляция программы происходит без ошибок, поскольку компиляторы допускают возможность перемножения (и выполнения других арифметических операций) с операндами разных типов.

Явные преобразования типов

Пример оператора, осуществляющего преобразование типа int к типу char:

aCharVar= static_cast<char>(anIntVar);

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

В программе SIGNTEST неверный результат получился из-за слишком большого промежуточного значения переменной. Для решения проблемы можно использовать тип unsigned int вместо int, поскольку в этом случае диапазон представления оказался достаточным для хранения вычисленного значения. А если и этого недостаточно? Тогда для решения проблемы можно использовать операцию приведения типов. Рассмотрим следующий пример.

// cast.срр

// работа со знаковыми и беззнаковыми переменными

#include <iostream>

using namespace std;

int main()

{

int intVar = 1500000000; // 1 500 000 000

intVar = (intVar * 10) / 10; // слишком большой результат cout «" Значение intVar равно " «intVar «endl:

// неверный результат

intVar = 1500000000; // приведение к типу double

intVar = (static_cast<double>(intVar) * 10) / 10;

cout << " Значение intVar равно " << intVar << endl;

// верный результат

return 0;

}

 

Когда мы умножаем переменную intVar на 10, получаемый результат, равный 15000000000, нельзя хранить даже с помощью типа unsigned int, поскольку это приведет к получению неверного результата, подобного уже рассмотренному.

Конечно, можно изменить тип данных на double, но, если,например, не хватает памяти, существует другой способ — привести переменную intVar перед умножением к типу double. Оператор

static_cast<double>(i nt Var)

создает временную переменную типа double, содержащую значение, равное значению intVar. Затем эта временная переменная умножается на 10, и поскольку результат также имеет тип double, переполнения не происходит. Затем временная переменная делится на 10, и результат присваивается обычной целой переменной intVar. Результат работы программы выглядит следующим образом:

Значение intVar равно 211509811

Значение intVar равно 15000000000

Первый из результатов, полученный без приведения типов, неверен; второй результат - верен.

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


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

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

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.048 с.