Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
Топ:
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Интересное:
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Дисциплины:
2020-05-08 | 198 |
5.00
из
|
Заказать работу |
|
|
Определение переменной 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!