
- •220300 - Системы автоматизированного проектирования
- •Состав языка и принцип работы компилятора языка высокого уровня
- •Идентификаторы
- •Альтернативный ввод-вывод в стиле с
- •Константы
- •Манипуляторы
- •Преобразования типов
- •Арифметические операции
- •Функции стандартной библиотеки
- •Операции отношения и логические операции
- •Базовые конструкции структурного программирования
- •Цикл с параметром (for)
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Рекомендации по программированию циклов
- •Ветвления
- •Условный оператор if
- •Вложенные конструкции
- •Проблемы соответствия if и else во вложенных ветвлениях
- •Условная операция
- •Оператор switch
- •Операторы передачи управления
- •Контрольная работа
- •Массивы
- •Сортировка массива методом выбора
- •Сортировка массива методом пузырька
- •Многомерные массивы
- •Операции со строками
- •Функции
- •Void starline(); // объявление функции (прототип)
- •Передача аргументов в функцию по значению
- •Void charline(char sim, int n); // объявление функции (прототип)
- •Возвращение функцией значения
- •Передача аргументов по ссылке
- •Возвращение значения по ссылке
- •Перегруженные функции
- •Переменные и функции
- •Передача массивов в функции
- •Указатели
- •Указатели и массивы
- •Указатели и функции
- •Указатели и строки
- •Динамический массив и динамическое выделение памяти
- •Ввод/вывод
- •Форматированный ввод/вывод
- •Конструкторы и методы
- •Двоичный ввод/вывод. Бинарные файлы
- •Двунаправленный ввод/вывод
- •Функции стандартной библиотеки для работы с файлами или ввод/вывод в стиле с
Преобразования типов
Язык С++ достаточно свободно обращается с выражениями, включающими в себя различные типы данных. В С++ различают неявное преобразование типов и явное. Неявное преобразование типов в выражениях со смешанными типами данных осуществляется автоматически компилятором согласно иерархии типов данных, по которой у каждого типа данных имеется свой приоритет по отношению к другим типам. Приведём иерархию типов данных, перечислив основные типы по старшинству, от низшего к высшему: char short int long int float double long double. Таким образом, если в арифметическом выражении присутствуют операнды различного типа, то в этом случае операнд с более "низким" типом будет преобразован компилятором к более "высокому" типу. Рассмотрим пример:
#include <iostream>
#include <conio>
using namespace std;
int main() {
int i = 7;
float f = 1.5;
double d = i * f;
cout <<"Результат равен " << d << endl; // d=10.5
getch(); return 0;
}
При компиляции данной программы, тип int переменной i автоматически преобразовывается в вещественный тип, а затем результат умножения преобразовывается к типу double. Однако, необходимо помнить, что в ряде случаев (особенно при целочисленных вычислениях) могут возникать ошибки из-за того, что компилятор не осуществляет преобразования типов.
#include <iostream>
#include <conio>
using namespace std;
int main() {
int a = 5, b = 2;
a=a/b*10;
cout <<"Результат равен " << a << endl; // a=20 - ошибка. Должно быть 25
getch(); return 0;
}
Из-за того, что в данной программе происходит деление величин целого типа, возникает ситуация, когда получающаяся в результате деления дробная часть отбрасывается, из-за того, что эти величины определены как целые. В итоге мы получаем неправильный ответ 20, вместо 25. Для решения этой проблемы можно определить переменные a и b как float, а можно осуществить явное преобразование типов следующим образом.
int main() {
int a = 5, b = 2;
a = static_cast<float>(a) / b * 10.0; //преобразовываем переменную а к вещественному типу
cout <<"Результат равен " << a << endl; // a=25
getch();
return 0;
}
Здесь, с помощью оператора явного приведения типов static_cast<новый тип> (переменная) мы устранили ошибку. Наряду с таким способом приведения типов, существуют другие способы в стиле С: a = float(a) / b * 10.0; или a = (float)a / b * 10.0;. Недостаток последних двух форматов заключается в том, что их трудно найти в большом коде программы как визуально, так и с помощью команды поиска.
Арифметические операции
В языке С++ используются четыре основные арифметические операции: +, -, *, /. Их использование ничем не отличается от математики. Кроме этого, существует ещё одна арифметическая операция, которая применяется только к целым числам типа char, short int, int, long int. Эта операция называется операцией остатка от деления и обозначается знаком %. Результатом этой операции является остаток, получаемый при делении левого операнда на правый.
int main() {
cout <<6%8 <<endl //6 (нет такого числа, которое при умножении на 8 дало бы 6 => остаток 6)
<<7%8 <<endl //7
<<8%8 <<endl //0 (8*1=8, 8=8+0 => остаток 0)
<<11%4 <<endl //3 (4*2=8, 11=8+3 => остаток 3)
<<12%10 <<endl; //2 (10*1=10; 12 = 10+2 => остаток 2)
return 0;
}
В языке С++ часто используются так называемые арифметические операции с присваиванием (+=, -=, *=, /= и т.п.). Эти операции комбинируют арифметическую операцию и операцию присваивания, тем самым исключая необходимость использования имени переменной дважды.
Также часто применяются операции увеличения и уменьшения на 1. Эти операции, называемые также инкрементом (++) и декрементом (--), имеют две формы записи – префиксную, когда операция записывается перед операндом (++а) и постфиксную (а++). В префиксной форме сначала изменяется операнд, а затем его значение становится результирующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется. Рассмотрим пример:
int main() {
int a = 27;
a += 10; // то же самое, что a = a + 10;
cout << a << ", ";
a -= 7; // то же самое, что a = a - 7;
cout << a << ", ";
a *=2; // то же самое, что a = a * 2;
cout << a << ", ";
a /= 3; // то же самое, что a = a / 3;
cout << a << ", ";
a %= 3; // то же самое, что a = a % 3;
cout << a << endl;
a++; cout << a << ", "; // то же самое, что a = a + 1;
a = 5 * (++a); cout << a << ", ";
a = 5 * (a++); cout << a << endl;
return 0;
}
Результат работы программы: 1 строка: 37, 30, 60, 20, 2 ; 2 строка: 3, 20, 101.