Информатика. Учебно-методическое пособие
.pdfПроверим полученный результат. Символ 0 имеет код 48, в результате операции деления мы должны получить 9.6, а все выражение должно быть равно 59.81. Результаты не совпали. Дело в том, что результат деления двух целых операндов (ch и a) также будет целым, т. е. остаток 0.6 отбрасывается, отсюда и конечный результат. Чтобы эту проблему решить, надо использовать явное преобразование типов.
Явное преобразование типов может быть осуществлено посредством операции приведения типов, которая имеет формат:
static_cast <тип_к которому_привести> (выражение).
Ключевое слово static_cast означает, что приведение выполняется статически, т. е. при компиляции программы. Результат этой операции – преобразование результирующего значения выражения в тип, указанный в угловых скобках. Выражение может быть любым – от единственной переменной до сложнейшего составного оператора.
Решение проблемы для приведенного примера: t = ch/ static_cast <float>(a)+z;
Операции ввода и вывода
В языке С++ разработан способ ввода/вывода с использованием так называемых потоков ввода и вывода cin и cout. Для того чтобы использовать эти стандартные потоки, необходимо включить заголовочный файл <iostream>. Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует ее.
#include <iostream> using namespace std;
cin>>x; //Ввод значения в переменную х из стандартного потока cin cin>>x>>y; // Ввод двух переменных
cout << "x = " << x << "\ny = " << y << endl; // Функция endl осу-
ществляет перевод строки.
Если при вводе или выводе произошла ошибка, в переменной состояния потока устанавливается соответствующий флаг. Проверить его значение можно с помощью функции fail.
cin >> x;
if (cin.fail())
cout << "Произошла ошибка при вводе\n";
11
Форматирование
Для управления форматом вводимого/выводимого значения используются так называемые манипуляторы. Это функции, которые изменяют способ управления выводом данных. Для использования манипуляторов необходимо включить заголовочный файл <iomanip>.
Изменения, сделанные всеми манипуляторами, кроме setw, остаются в силе до отмены. Действие манипулятора setw распространяется только на одно вводимое/выводимое значение.
Вывод информации может производиться с помощью манипуляторов, указанных в табл. 1
Манипулятор
fixed
internal
left
scientific
setfill(c)
setprecision()
setw(n)
showpoint
showpos
Таблица 1
Описание
Для вещественных чисел используется фиксированный формат
Знак выравнивается по левому краю, а само число – по правому краю
Выравнивание по левому краю Для вещественных чисел используется научный формат
Задает символ для заполнения. По умолчанию используется пробел
Задает количество цифр справа от десятичной точки
Устанавливает минимальное количество символов, используемых для вывода значения. Если значение представляется меньшим количеством символов, остальные позиции заполняются символом, установленным с помощью манипулятора setfill. Выравнивание задается манипуляторами left, right и internal. Чтобы установить поведение по умолчанию (столько символов, сколько необходимо), нужно использовать манипулятор setw с параметром 0
Вывод и целой, и дробной части вещественного числа, даже если дробная часть равна 0
Вывод знака перед положительным числом
12
Пример 2
#include <iostream> #include <iomanip> using namespace std; void main ()
{ setlocale(LC_ALL,"rus_rus.1251"); int m, n, x;
double y;
cout<<"Введите значениедвухцелых переменных"<<endl; cin >> m >> n;
cout << "m = " << setw(5) << m << "\nn = " << setw(7) << n << endl; cout<<"Введитеотрицательное целоечисло "<<endl;
cin >> x;
cout << setfill('0')<< setw(10) << internal << x << endl; cout<<"Введите вещественноечисло3.1415926 "<<endl; cin >> y;
cout << setfill(' ') << fixed << setw(7) << setprecision(2) << y << endl;}
Результат
КОМПЛЕКСНЫЕ ЧИСЛА
Комплексные числа широко используются в современной радиотехнике для расчета различных схем и устройств по переменному току.
Комплексным числом называется выражение вида a + ib, где
a и b – любые действительные числа, i2 1 – специальное число, ко-
торое называется мнимой единицей.
Комплексные числа часто обозначают одной буквой, например, z = a + ib. Число a называется действительной частью комплексного числа z (Re z), а число b – мнимой частью этого числа z (Im z).
13
Комплексные числа вида a + 0i называют действительными. Числа вида 0 + ib называются чисто мнимыми. Геометрическими интерпретаци-
ями комплексного числа являются
вектор A(a, b) или точка A(a, b) на
комплексной плоскости. Комплексной называется плоскость, когда по оси ординат откладывается мнимая часть комплексного числа, а по оси абсцисс – действительная.
Модулем комплексного числа называется длина вектора, соответствующего этому числу:
z a2 b2 .
Аргументом комплексного числа z = a + ib (z ≠ 0) называется величина угла между положительным направлением действительной оси и вектором, обозначается обычно φ = arg(z) = arctg(b/a). Существует три формы записи комплексного числа:
алгебраическая z =a+bi;
тригонометрическая z z (cos sin ) ;показательная z z ei .
В С++ для работы с комплексными числами предусмотрен класс сomplex. Для его использования нужно включить заголовочный файл: #include <complex>. В стандартную библиотеку C++ включены три специализированные версии класса complex для типов float, double
и long double.
Инициализация комплексной переменной
//Чисто мнимое число: 0 + 7i comp1ex< double > purei( 0, 7 );
//Мнимая часть равна 0: 3 + 0i comp1ex< float > rea1_num( 3 );
//И вещественная, и мнимая часть равны 0: 0 + 0i comp1ex< long double > zero;
14
//Инициализация одного комплексного числа другим comp1ex< double > purei2( purei );
//Инициализация комплексного числа арифметическим типом complex< double > w;
double h=3.14159; w = h;
Приведение типов
При операциях с комплексными числами, так же как и с вещественными, происходит преобразование типов – их приведение. Приведение может быть без потери информации – безопасное приведение и рискованное (опасное), когда такая потеря может происходить. Здесь много подводных камней. Поэтому надо запомнить, что безопасным является приведение complex<float> в complex <double>, оно может быть задано неявно. Остальные приведения надо задавать явно. Кроме того, лучше не использовать комплексные числа целого типа, так, в явном и неявном виде они не преобразуются в complex с типом float
или double. сomplex<float> cf;
complex<double> cd;
complex<double> cdL(cf); // OK: явное приведение complex<float> cd2 = cd; // OK: безопасное приведение complex<int> ci;
complex<double> cd4 = ci; // ОШИБКА: небезопасное приведение complex<double> cd5(ci); // ОШИБКА: нет явного приведения
Вывод и ввод комплексных чисел
В С++ поддерживается и ввод/вывод комплексных чисел. Оператор вывода печатает действительную и мнимую часть через запятую в круглых скобках. Например, результат выполнения оператора вывода
complex< double > z( 3.14159, -2.171 ); cout << z << endl;
выглядит так:
( 3.14159, –2.171 )
Оператор ввода понимает любой из следующих форматов.
//Допустимые форматы для ввода комплексного числа
//3.14159 ==> comp1ex( 3.14159 );
15
//( 3.14159 ) ==> comp1ex( 3.14159 );
//( 3.14, –1.0 ) ==> comp1ex( 3.14, –1.0 );
//может быть считано как
cin >> a >> b >> с;
// где a, b, с – комплексные числа
Значит, если вы введете вещественное число (в круглых скобках или без них) на место комплексных переменных a или b, то это интерпретируется как комплексная переменная с нулевой мнимой частью. Для ввода же переменной с = 3.14 – 1.0i необходимо в круглых скобках через запятую ввести отдельно действительную и мнимую часть.
Операторы класса complex
Комплексные числа можно складывать, вычитать, умножать,
делить, сравнивать,
#inc1ude <complex> comp1ex< double > a; comp1ex< double > b;
complex< double > с = a * b + a / b;
Комплексные и арифметические типы разрешается смешивать в одном выражении:
comp1ex< double > a;
complex< double > d = a + 3.14159;
STOP! В правой части приведенного оператора происходит суммировние комплексной переменной и вещественной константы. Тип этих объектов должен быть одинаковым, в данном случае – это double, так как константа с десятичной точкой в Visual C++ имеет по умолчанию тип double. Если же типы этих объектов не совпадут, то компилятор выдаст ошибку:
comp1ex< float > a;
complex< double > d = a + 3.14159;//ОШИБКА Устраним эту ошибку
comp1ex< float > a;
complex< double > d = a + 3.14159f; //OK
Буква f в конце числа сообщает компилятору, что тип числа – float.
16
Класс комплексных чисел поддерживает четыре составных оператора присваивания: +=, -=, *= и /=. Таким образом, если
complex <float>a,d;
то можно записать a+=b;
Функции для работы с комплексными числами
Класс complex имеет две функции, возвращающие соответственно вещественную и мнимую части. Мы можем обращаться к ним, используя синтаксис доступа к членам класса:
complex<double> z; double re = z.real(); double im = z.imag();
или эквивалентный синтаксис вызова функции: double re = real(z);
double im = imag(z);
Кроме того, для работы с комплексными числами имеются следу-
ющие функции: abs(), arg(), conj(), polar(), sqrt(), sin(), cos(), tan(), exp(), log(), log10() и pow(). Функция polar() по модулю и аргументу комплексного числа находит его действительную и мнимую часть, функция conj(z) возвращает комплексно сопряженное число числа z.
Подытоживая сказанное, приведем код программы для работы с комплексными числами.
Пример 3
#include <iostream> #include <complex> using namespace std; void main ()
{
setlocale(LC_ALL,"rus_rus.1251");
//Определение объектов типа complex
complex< double > purei( 0, 7 ); // Чисто мнимое число: 0 + 7i
complex< float > real_num( 3 );// Мнимая часть равна 0: 3 + 0i
17
complex< long double > zero;// И вещественная, и мнимая часть равны 0: 0 + 0i
//инициализация одного комплексного числа другим complex< double > purei2( purei );
//Инициализация комплексного числа арифметическим типом complex< double > w;
double h=3.14159; w=h;
//Вывод комплексных чисел
cout<<"\npurei="<<purei<<endl; cout<<"real_num="<<real_num<<endl; cout<<"zero="<<zero<<endl; cout<<"purei2="<<purei2<<endl; cout<<"w="<<w<<endl;
// Ввод комплексного числа complex< float > a,b;
cout<<"\nВведите комплексное число a"<<endl;// ( 3.14,–1.0 ) ==> comp1ex( 3.14, 1.0 );
cin>>a;
cout<<"a="<<a;
cout<<"\nВведите комплексное число b"<<endl; //3.14159 ==> comp1ex( 3.14159, 0.0 );
cin>>b;
cout<<"b="<<b<<endl;
// Арифметические операции с комплексными числами complex< double > c= a * b + a / b; cout<<"\nc="<<c<<endl;
complex< double > d=c+3.14159; cout<<"d="<<d<<endl;
a += 1; cout<<"a="<<a<<endl;
// Нахождение вещественной, мнимой части, модуля и аргумента комплексного числа
cout<<"\n Вещественная часть c = "<<real(c)<<endl; cout<<"Мнимая часть c = "<<c.imag()<<endl; cout<<"Модуль c = "<<abs(c)<<endl;
18
cout<<"Аргумент c = "<<arg(c)<<endl;
// Другие функции класса complex complex< double > z(3.1415926,0.5); cout<<"\nsin(z)="<< sin(z);
complex< double > v;
v = polar(abs(c),arg(c));5 cout<<"\nv="<<v<<endl;
}
Результат
Введите комплексное число a (3.14, –1.0)
а = (3.14,1)
Введите комплексное число b 3.14159
b = (3.14159,0) w = (3.14159,0
c = (10.8641, –3.4599) d = (14.0057, –3.4599)
Действительная часть c = 10.8641 Мнимая часть c = –3.4599
Модуль c = 11.4017 Аргумент c = –0.308316
sin(c) = (6.04292e – 008, –0.521095) v = (10.8641, –3.4599)
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. Написать, ввести и отладить программу вычисления переменных a или b в соответствии с вариантом. Предусмотреть вывод исходных данных и результатов на экран монитора.
19
Z3 |
Z4 |
|
а |
Z1 |
б |
|
Z2
Смешанное соединение сопротивлений
2. Используя формулу для смешанного соединения сопротивлений, найти выражение для сопротивления z между узлами а и б схемы на рисунке. Создать программу расчета вещественной и мнимой части этого сопротивления, а также его модуля и аргумента. Исходные данные для расчета взять из табл. 2.
Таблица 2
Вари- |
Z1 |
|
Z2 |
|
Z3 |
|
Z4 |
||||
|
|
|
|
|
|
|
|
|
|
|
|
ант |
real |
|
imag |
real |
|
imag |
real |
imag |
real |
|
imag |
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
1 |
3 |
|
0 |
3.14159 |
|
4.08 |
5 |
9 |
0 |
|
2.1 |
2 |
6.28 |
|
1.414 |
0 |
|
6 |
4.1 |
12 |
2.7 |
|
0 |
3 |
0 |
|
0 |
3 |
|
4 |
3.14159 |
2.0009 |
2.1 |
|
4.14 |
7 |
8.45 |
|
4 |
8.87465 |
|
–2.2 |
0 |
5 |
2.71 |
|
–5 |
5 |
–4 |
|
–5 |
8.2 |
|
0 |
4.1 |
3.8 |
–7.12 |
|
0 |
6 |
–9.13 |
|
0 .5 |
6 |
|
7 |
0 |
0 |
8 |
|
2 |
7 |
0 |
|
–7.2 |
4.14 |
|
3 |
12 |
8 |
6.7 |
|
8.13 |
8 |
6.128 |
|
8 |
0 |
|
6.87 |
6.456 |
–0.9 |
6 |
|
9 |
9 |
–8.37 |
|
0 |
4 |
|
5 |
7.19 |
5 |
0 |
|
–0.07 |
10 |
1.41454 |
|
3.2 |
7.2 |
|
–0.787 |
6 |
0 |
6.12 |
|
6 |
11 |
2 |
|
3 |
6.23456 |
|
0 |
8.123 |
–7.5 |
–4 |
|
13.6 |
12 |
4.12 |
|
–0.654 |
5 |
|
3 |
7.12345 |
0 |
7.13 |
|
4.414 |
13 |
0 |
|
2 |
–4.24 |
|
0 |
8 |
8.12345 |
–6.2 |
|
5.1 |
14 |
–2 |
|
–4 |
4.41487 |
|
–5.1 |
4.765 |
3 |
0 |
|
4.34 |
15 |
0 |
|
0 |
5.567 |
|
–7.4 |
2.12345 |
–3.1 |
2 |
|
3 |
3. Оформить отчет по работе, обратив особое внимание на выводы. Подготовиться к защите, ориентируясь на контрольные вопросы. Защитить работу.
20
