Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование на языке С++. Ч.1. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
Приложение 3 Приоритет иассоциативность операций С++
Описание оператора Оператор Альтернатива
Приоритет группы 12, слева направо ассоциативность
42 Побитовое ИЛИ
Приоритет группы 13, слева направо ассоциативность
43 Логическое И
Приоритет группы 14, слева направо ассоциативность
44 Логическое ИЛИ
Приоритет группы 15, справа налево ассоциативность
45 Условная логика 46 Назначение 47 Присваивание умножения 48 Присваивание деления 49 Назначение модуля 50 Присваивание сложения 51 Присваивание вычитания 52 Присваивание сдвига влево 53 Присваивание сдвига вправо 54 Назначение побитового И 55 Назначение побитового включающего
ИЛИ
56 Назначение побитового исключающе-
го ИЛИ
57 Выражение Throw
Приоритет группы 16, слева направо ассоциативность
58 Запятая
211
Окончание табл. П3.1
| bitor
&& and
|| or
? :
=
*=
/=
%=
+=
-=
<<=
>>=
&= and_eq
|= or_eq
^= xor_eq
throw
,
 



В математической библиотеке С++ есть функция вычис-
ления степени, и даже не одна [46]. Они определены так.
double pow( double x, double y );
oat powf( oat x, oat y );
long double powl( long double x, long double y );
dene pow(X, Y) // Requires C11 or higher
double pow( double x, int y ); // C++ only
oat pow( oat x, oat y ); // C++ only oat pow( oat x, int y ); // C++ only
long double pow( long double x, long double y ); // C++ only long double pow( long double x, int y ); // C++ only
Из определения понятно, что у девяти перечисленных функций результат и тип принимаемых значений разные. Для их использования необходимо подключить
<cmath>
с именем ми. Приведем фрагменты теста для разных сред разработки.
#include <iostream> #include <cmath>
.
Заметим, что обратиться к функции вычисления степени
pow()
можно и с двумя целочисленными значения-
Сначала онлайн-компилятор ОnlineGBD:
<math.h>
либо
using namespace std;
int main() {
int x=3; int iPow = pow(x,2); cout << "pow(int int) =" << iPow << endl;
Приложение 4 Использование функции вычисления степени
213
return 0; }
Будет выведено
Приведем еще примеры использования функции
int pow(int,int) = 9.
pow()
Они разрабатывались в среде Visual Studio 2020. В следующем
2
фрагменте кода вычисляются степени i
для i, изменяющегося
от 1 до 5.
int i, n= 5; double x1=2.0, xn; for (i = 1; i <= n; i++) { x1=1.0*i; xn = pow(x1,2.0); cout << i << " х^2 = " << xn << endl;
}
Результат выполнения приведен на рис. П4.1. Заметим,
x1
что тип переменной
определен как
double
.
.
Рис. П4.1. Квадраты первых пяти натуральных чисел
И в последнем примере обратимся к функциям
powf
и
powl
oat Pow = powf(2.2, 3.0); cout << " oat powf(oat,oat) = " << Pow << endl; long double Pi = 3.14159, lThree = 3.0l; oat llPow = powl(Pi, lThree); cout << " long powl(long,long) = " << llPow << endl;
Получим следующее
oat powf(oat,oat) = 10.648 long powl(long,long) = 31.0062
Теперь покажем, как вычислить сумму степеней числа, не используя функции. Напишем программу для вычисле-
1
ния такой суммы: 2
+ 22 + 23 + 24 + 25 + 26.
.
214
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
cout << "\n2+2*2+2*2*2+ . . ." << endl;
int i, x = 2; int sxn,xn = 1; int n = 6; sxn = 0; for (int l = 1; l <= n; l++) { xn = 1; { for (i = 1; i <= l; i++) xn = xn * x; sxn = sxn + xn;
cout << "l " << l; cout << " xn sxn " << xn << " " << sxn << endl; } } cout << "summa " << sxn << "\n";
Очевидно, что это не эффективно (рис. П4.2).
Рис. П4.2. Вычисление суммы степеней 2
Можно использовать один цикл для решения этой за­дачи.
int i, x = 2; int sxn,xn; int n = 6; sxn = 0; xn = 1; for (int l = 1; l <= n; l++)
{
xn = xn * x; sxn = sxn + xn;
cout << "l " << l; cout << " xn sxn " << xn << " " << sxn << endl; }
Приложение 4 Использование функции вычисления степени
215
cout << "summa " << sxn << "\n";
Результат будет таким же.
Теперь приведем программу, в которой реализовано срав­нение времени решения задачи вычисления суммы степеней числа 2 тремя алгоритмами:
• с двумя циклами (без использования функции);
• с одним циклом (без использования функции);
pow
• с использованием функции
.
Для получения оценки времени выполнения каждый ал­горитм выполняется множество раз. Иначе трудно их срав­нить. Важно понимать, что программа реализуется в режиме мультипрограммирования (многозадачности). И для одинако­вого количества слагаемых.
int i, x = 2; int sxn,xn; int n = 60; cout << " n = " << n << endl; // НЕ ЭФФЕКТИВНО – ДВА ЦИКЛА clock_t Start1 = clock(); for(long int l=1; l<1000000; l++)
{ // cout << "\n2+2*2+2*2*+ . . ." << endl;
sxn = 0; for (int l = 1; l <= n; l++) { xn = 1; { for (i = 1; i <= l; i++) xn = xn * x; sxn = sxn + xn;
// cout << "l " << l; // cout << " xn sxn " << xn << " " << sxn << endl; } } // cout << "summa " << sxn << "\n"; }
clock_t End1 = clock();
double Seconds1 = (double)(End1 – Start1) / CLOCKS_PER_SEC; cout << " Seconds1 = " << Seconds1 << endl;
216
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
// НЕ ЭФФЕКТИВНО – ФУНКЦИЯ pow clock_t Start2 = clock(); for(long int l=1; l<1000000; l++)
{
sxn = 0; for (int l = 1; l <= n; l++)
{
sxn=sxn+pow(x,l);
} // cout << "summa " << sxn << "\n"; }
clock_t End2 = clock();
double Seconds2 = (double)(End2 – Start2) / CLOCKS_PER_SEC; cout << " Seconds2 = " << Seconds2 << endl;
// ЭФФЕКТИВНО – ОДИН ЦИКЛ clock_t Start3 = clock(); for(long int l=1; l<1000000; l++)
{
sxn = 0; xn = 1; for (int l = 1; l <= n; l++)
{
xn = xn * x; sxn = sxn + xn;
// cout << "l " << l; // cout << " xn sxn " << xn << " " << sxn << endl; } // cout << "summa " << sxn << "\n"; }
clock_t End3 = clock();
double Seconds3 = (double)(End3 – Start3) / CLOCKS_PER_SEC; cout << " Seconds3 = " << Seconds3 << endl;
cout << " n = " << n << endl;
Приложение 4 Использование функции вычисления степени
Сравним результаты двух запусков программы для 6 сла­гаемых (рис. П4.3 и П4.4).
Рис. П4.3. Сравнение трех алгоритмов вычисления степеней 2
для шести слагаемых (запуск 1)
Рис. П4.4. Сравнение трех алгоритмов вычисления степеней 2
для шести слагаемых (запуск 2)
217
Для небольшого количества слагаемых разность времени выполнения алгоритмов не такая большая.
Для 60 слагаемых результат уже сильно отличается (рис. П4.5, П4.6).
Рис. П4.5. Сравнение трех алгоритмов вычисления степеней 2
для шестидесяти слагаемых (запуск 2)
218
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Рис. П4.6. Сравнение трех алгоритмов вычисления степеней 2
для шестидесяти слагаемых (запуск 2)
Учебное издание
Андреева Ольга Владимировна Широков Андрей Игоревич
АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С++
Учебник
Технический редактор Т.В. Суханова Корректор В.В. Демидова Верстальщик А.М. Маркин
Подписано в печать 25.04.23 Уч.-изд. л. 13,69
1
Формат 60 × 90
Университет науки и технологий МИСИС, 119049, Москва, Ленинский пр-кт, д. 4, стр. 1
Издательский Дом НИТУ МИСИС, 119049, Москва, Ленинский пр-кт, д. 2А Тел. 8 (495) 638-44-06
Отпечатано в типографии Издательского Дома НИТУ МИСИС, 119049, Москва, Ленинский пр-кт, д. 4А Тел. 8 (495) 638-44-16, 8 (495) 638-44-43
/
16
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]