Печатать книгуПечатать книгу

§ 2. Организация вычислений

Сайт: Профильное обучение
Курс: Информатика. 10 класс (Повышенный уровень)
Книга: § 2. Организация вычислений
Напечатано:: Гость
Дата: Вторник, 7 Май 2024, 19:50

2.1. Использование математических функций

 

При вычислениях часто используются различные математические функции (пример 2.1). Эти функции реализованы как встроенные вспомогательные алгоритмы и хранятся в библиотеке cmath. Для подключения этой библиотеки используют команду #include <cmath>.

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

Запись на С++ Описание
abs(x) Находит модуль числа x
sqrt(x) Находит корень квадратный из числа x. Результат — число вещественного типа
cbrt(x) Находит корень кубический из числа x. Результат — число вещественного типа
ceil(x) Находит ближайшее целое число, которое не меньше, чем значение x
floor(x) Находит ближайшее целое число, которое не больше, чем значение x
sin(x) Вычисляет синус числа x. Число x задается в радианах
cos(x) Вычисляет косинус числа x. Число x задается в радианах

 

(Другие функции можно посмотреть в Приложение к главе 1.)

Аргументом функции может быть число, переменная, выражение или другая функция:

ceil(10*sin(x)), sqrt(abs(-16)).

В примере 2.1 используются математические функции для вычисления модуля, квадратного корня и синуса.

Пример 2.1. Заданы значения переменных x и y. Вычислить значение выражения:

b space equals space fraction numerator square root of x space plus space 4 over denominator open vertical bar y close vertical bar minus space 2 end fraction sin x

Этапы выполнения задания

I. Исходные данные: переменные x, y.

II. Результат: переменная b.

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. Вычисление по формуле.
3. Вывод результата.

IV. Описание переменных: x, y, b — double.

V. Программа:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  double x, y;

  cout << "vvedi x, y" << endl;

  cin >> x >> y;

  double b = (sqrt(x) + 4) / 
      
(abs(y) - 2) * sin(x);

  cout << "b=" << b << endl;

  return 0;

}

VI. Тестирование программы. Запустить программу и ввести значения x = 13, y = 7.7.

Результат:

VI. Правильность вычислений можно проверить на калькуляторе.

2.2. Решение задач

Пример 2.2. Напишите программу для решения геометрической задачи. Задан квадрат с длиной стороны a. Найти его площадь и длину диагонали.

Этапы выполнения задания

I. Исходные данные: переменная a (длина стороны).

II.     Результат: переменные  S (площадь) и d (длина диагонали).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. Вычисление значений площади производится по формуле S = a2 длины диагонали — по формуле d = begin mathsize 18px style space straight a square root of 2 end style.
3. Вывод результата.

IV. Описание переменных: a, s, d — double.

Пример 2.3. Напишите программу для решения физической задачи.

Стоящий на берегу мальчик бросает в озеро камешек. Точка бросания находится на высоте h над поверхностью воды. Начальная скорость камешка v0 направлена горизонтально. Камешек падает в воду на расстоянии l от берега. Определите модуль начальной скорости камешка и модуль скорости, с которой он вошел в воду.

Этапы выполнения задания

I. Исходные данные: переменные h и l (высота над поверхностью воды и расстояние от берега).

II. Результат: переменные v0 и v (начальная скорость и скорость, с которой камешек вошел в воду).

III. Алгоритм решения задачи.

1. Ввод исходных данных.

2. Камешек участвует одновременно в двух движениях: равномерном со скоростью v0 по горизонтали и равноускоренном без начальной скорости по вертикали. В конце полета проекции скорости и координаты камешка будут: vx = v0; t; vy = gt; begin mathsize 16px style y space equals space h space equals space fraction numerator g t squared over denominator 2 end fraction end style. Тогда begin mathsize 16px style t space equals space square root of fraction numerator 2 h over denominator g end fraction end root end style.

3. Начальная скорость вычисляется по формуле begin mathsize 16px style v subscript 0 equals l over t end style. Значение скорости, с которой камешек вошел в воду, можно вычислить по формуле v space equals space square root of v subscript x superscript 2 space plus space v subscript y superscript 2 end root.

4. Вывод результата.

IV. Описание переменных: h, l, g, t, vy, v0, v — double.

При написании программ обращайте внимание на форматирование текста программы (пример 2.4).

1. В первой позиции на экране пишут только команды #include <iostream>, #include <cmath>, using namespace std;, int main() и ставят фигурные скобки, а остальные команды пишут со сдвигом на 2—4 позиции вправо.

2. Если в программе несколько частей, то их можно отделить друг от друга пустой строкой.

Для автоматического форматирования кода можно воспользоваться командой Format use AStyle из контекстного меню рабочей области (пример 2.5).

Пример 2.2.

V. Программа:

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

  double a;

  cout << "vvedi a"<<endl;

  cin >> a;

  double s = a * a;

  double d = a * sqrt(2);

  cout << "s=" << s;

  cout << "  d=" << d << endl;

  return 0;

}

VI. Тестирование программы. Введите значение  a = 2. Результат:

Проверить правильность вычислений можно на калькуляторе.

Пример 2.3.  

V. Программа:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  double h, l;

  cout << "vvedi h, l"<< endl;

  cin >> h >> l;

  double g = 10;

  double t = sqrt(2 * h / g);

  double vy = g * t;

  double v0 = l / t;

  double v = sqrt(v0*v0 + vy*vy);

  cout << "v0=" << v0;

  cout << "  v=" << v << endl;

  return 0;

}

 

VI. Тестирование программы:

Запустите программу и введите значения h = 1.8 и l = 4.8.

Результат должен быть следующим:

Проверить правильность вычислений можно на калькуляторе.

В программе можно использовать комментарии — текст, который не анализируется при запуске программы на выполнение. Текст после символов // считается комментарием и выделяется серым цветом. В комментариях удобно записывать условие задачи и пояснения к командам.

Пример 2.4. Программа с комментариями и отформатированным кодом:

Если для комментариев использовать символы ///, то они выделяются более ярко. Сделать выделенный блок комментарием можно с помощью Crtl+Shift+C, снять комментарий — Crtl+Shift+X,

Пример 2.5. Контекстное меню рабочей области:

2.3. Целочисленный тип данных

Часто при решении задач нужно работать с целыми числами. Для этого в C++ используется тип данных int.

С помощью переменных типа можно задавать целые числа из диапазона от –2147483648 до 2147483647. Для этого типа данных определены следующие операции:

Математические операции

Запись в С++

+ (сложение) +
– (вычитание)
∙ (умножение) *
целочисленное деление /
нахождение остатка %

В С++ для деления как целых, так и вещественных чисел используется один и тот же знак «/». Будет результат целым или вещественным, зависит от операндов (переменных или чисел, стоящих слева и справа от знака). Если хотя бы один операнд вещественный, то результат будет вещественным. Если оба операнда целые, то и результат будет целым.

Операция «%» соответствует операции mod в языке программирования Pascal и используется только для целых чисел.

Пример 2.6. Даны два целых числа и b. Написать программу, которая находит целую часть и остаток от деления a на b.

Этапы выполнения задания

I. Исходные данные: переменные a и b.

II. Результат: переменные c (целочисленное частное) и d (остаток).

III. Алгоритм решения задачи.

1. Ввод исходных данных. 
2. Целочисленное частное находим как результат операции: a/b, остаток — a%b.
3. Вывод результата.

IV. Описание переменных: a, b, c, d  int.

Значение, которое выдает в качестве результата операция %, может отличаться от математического определения остатка (в математике под остатком понимают неотрицательное число). Если остаток не равен нулю, то знак числа, которое является результатом операции %, определяется знаками операндов (пример 2.7). Если проанализировать данные из таблицы, то можно понять, что begin mathsize 16px style a space percent sign space b space equals space a space minus space open square brackets a over b close square brackets space cross times space b end style [1].

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

double = 16 / 7;

Вначале будет выполнено деление 16 на 7 (целочисленное), в результате получим 2. После чего целое значение 2 будет преобразовано к вещественному значению 2.0. Чтобы получить вещественный результат, необходимо, чтобы хотя бы одно число было вещественным. Команду можно записать, например, так:

double x = 16. / 7;

Если в операторе присваивания используются не константы, а переменные, то необходимо преобразовать выражение так, чтобы действия выполнялись с нужным типом. Например, оператор присваивания

double x = a / b;

в котором a и b целочисленные переменные, можно записать так:

double x = 1. */ b;

Тогда результат операции умножения будет вещественным и деление будет выполняться для вещественных чисел.


[1] Скобки open square brackets blank close square brackets  обозначают округление числа до целого в меньшую сторону.

 

Тип int является базовым целочисленным типом. Другие целочисленные типы можно получать, приписывая к int модификаторы. Различают два типа модификаторов, которые могут менять знаковость или размер.

Знаковость:

signed — тип будет иметь знаковое представление (используется по умолчанию, если модификатор не указан);

unsigned — тип будет иметь беззнаковое представление.

Размер:

short — тип будет занимать в памяти не меньше 16 бит;

long — тип будет иметь размер не меньше 32 бит;

long long — тип будет иметь размер не меньше 64 бит.

Примеры использования модификаторов:

Тип

Диапазон значений

Размер (бит)

short int 32768..32767 16
unsigned short int 0..65535 16
int 2147483648.. 2147483647 32
unsigned int 0..4294967295 32
long long int  263 .. 263  1 64
unsigned long long int 0 .. 264  1 64

Если при описании используют модификаторы, то слово int может быть опущено. Следующие описания эквивалентны:

short int short
unsigned int unsigned
long long int long long
unsigned long long int unsigned long long

Пример 2.6.  

V. Программа:

#include <iostream>

using namespace std;

int main()

{

  int a, b;

  cout << "Vvedi 2 chisla" << endl;

  cin >> a >> b;

  int c = a / b;

  int d = a % b;

  cout << "a / b = " << c << endl;

  cout << "a % b = " << d << endl;

  return 0;

}

IV. Тестирование программы:

Запустите программу и введите значения a = 11 и b = 4.

Результат должен быть следующим:

Пример 2.7.  Результат операций div и mod для разных чисел:

a

b

a / b

a % b

17 3 5 2
–17 3 –5 –2
17 –3 –5 2
–17 –3 5 –2

В языке С++ допускается явное преобразование типов. Для этого используется команда

 static_cast<dataType>(value

Здесь — dataType имя типа, к которому нужно преобразовать величину value.

В коде программы эта команда используется следующим образом:

  double static_cast<double>(a)/b 

Также компилятором С++ поддерживается так называемый Cи-стиль приведения типов данных, когда новый тип указывается в скобках перед именем переменной:

    double x = (double)/ b;    

Компилятор C++ также позволяет использовать этот оператор и следующим образом:

    double = double(a) / b;  

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

2.4. Решение задач

Решение задач

Пример 2.8. Васин таймер показывает время только в секундах. Написать для Васи программу, которая переведет время в минуты и секунды.

Этапы выполнения задания

I. Исходные данные: переменная с (время в секундах).

II. Результат: переменные m (полное количество минут) и s (остаток секунд).

III. Алгоритм решения задачи.

1. Ввод исходных данных. 
2. Для нахождения полного числа минут нужно найти целую часть от деления исходного числа секунд на 60. 
3. Оставшиеся секунды можно найти как остаток от деления исходного числа секунд на 60. 
4. Вывод результата.

IV. Описание переменных: c, m, s — int.

Пример 2.9. Задано трехзначное число. Напишите программу, которая находит среднюю цифру.

Этапы выполнения задания

I. Исходные данные: переменная а.

II.  Результат: переменная b (преобразованное число).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Среднюю цифру числа можно найти, если сначала разделить число на 10, а затем найти остаток от деления полученного числа на 10. 
3. 
Вывод результата.

IV. Описание переменных: a, b — int.

Пример 2.10. В исторической книге, которую читала Таня, длина отреза ткани измерялась в локтях. Написать программу, которая переведет локти в метры и сантиметры.

Этапы выполнения задания

I. Исходные данные: переменная l (локти).

II. Результат: переменные m (метры) и s (сантиметры).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. 
Сначала переведем локти в сантиметры. Для этого количество локтей нужно умножить на 45 и сохранить значение в переменной x.
3. 
Для определения числа метров найдем целую часть от деления x на 100.
4. Оставшиеся сантиметры можно найти как остаток от деления x на 100.
5. 
Вывод результата.

IV. Описание переменных: l, x, m, s int.

Пример 2.11. Написать программу, которая определит полное количество часов и минут, прошедших от начала суток до того момента (в первой половине суток), когда часовая стрелка повернулась на f градусов (0  f < 360, f — целое число).

Этапы выполнения задания

I. Исходные данные: переменная f (количество градусов).

II. Результат: переменные с (часы) и m (минуты).

III. Алгоритм решения задачи.

1. Ввод исходных данных. 
2. Часовая стрелка обходит циферблат за 12 часов, следовательно, за один час она поворачивается на 360 / 12 = 30°. Поворот часовой стрелки осуществляется каждую минуту. Угол поворота 30 / 60 = 1 / 2°. 
3. Количество часов можно найти, если нацело разделить f на 30.
4. Остаток от деления f на 30 соответствует минутам. Для того чтобы их найти, нужно остаток умножить на 2. 
5. Вывод результата.

Описание переменных: f, c, m int.

Пример 2.12. Дано целое число а. Написать программу, которая получит а3 и а10 за четыре операции умножения (другие операции использовать нельзя).

Этапы выполнения задания

I. Исходные данные: переменная a.

II. Результат: переменные a3 (a3) и a10 (a10).

III. Алгоритм решения задачи.

1. Ввод исходных данных.
2. Для сокращения количества умножений введем дополнительные переменные, которые будут хранить промежуточные значения.

а) a2 = a ∙ a (1-е умножение);

б) a3 = a2 ∙ a (2-е умножение);

в) a5 = a2 ∙ a3 (3-е умножение);

г) a10 = a5 ∙ a5 (4-е умножение).

3. Вывод результата.

IV. Описание переменных: a, a2, a3, a5, a10 long long.

Пример 2.8.

 V. Программа:

#include <iostream>

using namespace std;

int main()

{

  int c;

  cout << "Kol-vo sek" << endl;

  cin >> c;

  int m = c / 60;

  int s = c % 60;

  cout << m << ":" << s << endl;

  return 0;

}

VI. Тестирование программы.

Запустите программу и введите значениe  c = 137.

Результат должен быть следующим:

Пример 2.9.

 V. Программа:

#include <iostream>

using namespace std;

int main()

{

  int a;

  cout << "Chislo a = ";

  cin >> a;

  int b = a / 10 % 10;

  cout << "b=" << b << endl;

  return 0;

}

VI. Тестирование программы.

Запустите программу и введите значение a = 452.

VII. Результат: переменная b (средняя цифра числа).

Некоторые старорусские единицы длины:

1 локоть = 45 см, 1 аршин = 16 вершков, 1 вершок = 4 ногтя, 1 ноготь ≈ 11 мм.

Пример 2.10.

V. Программа:

#include <iostream>

using namespace std;

int main()

{

  setlocale(0"");

  int l;

  cout << "Введи l = ";

  cin >> l;

  int x = l * 45;

  int m = x / 100;

  int s = x % 100;

  cout << l << " локтей = ";

  cout << m << " м ";

  cout << s << см" << endl;

  return 0;

}

VI. Тестирование программы:

Запустите программу и введите значение l = 7.

Результат должен быть следующим:

Пример 2.11.

V. Программа:

#include <iostream>

 

using namespace std;

 

int main()

{

  int f;

  cout << "ugol f = ";

  cin >> f;

  int c = f / 30;

  int m = f % 30 *2;

  cout << c << ":" << m << endl;

  return 0;

}

VI. Тестирование программы.

Запустите программу и введите значение f = 85.

Результат должен быть следующим:

Пример 2.12.

V. Программа:

#include <iostream>

using namespace std;

int main()

{

  long long a;

  cout << "a = ";

  cin >> a;

  long long a2 = a * a;

  long long a3 = a2 * a;

  long long a5 = a3 * a2;

  long long a10 = a5 * a5;

  cout << "a^3 = " << a3 << endl;

  cout << "a^10 = " << a10 << endl;

  return 0;

}

VI. Тестирование программы.

Запустите программу и введите значения l = 3.

Результат должен быть следующим:

Вопросы к параграфу

1. Что понимают под тестированием программы?

2. Для чего можно использовать комментарии?

3. Какой тип данных можно использовать в C++ для работы с целочисленными данными?

4. Какое максимальное значение можно задать переменной типа int?

5. Какие операции определены для целочисленных данных?

Упражнения

 

1. Ответьте на вопросы для примера 2.12.

  1. Почему в программе использован тип long long, а не тип int?
  2. Введите значение 123. Почему получили отрицательный результат?
  3. Для какого наибольшего числа программа выдает правильный ответ?
  4. Что можно изменить в программе, чтобы не получать отрицательные значения?

2. Даны x, y. Напишите программу для вычисления значения арифметического выражения.

1. begin mathsize 14px style straight b space equals space fraction numerator c o s straight pi x cubed minus s i n straight pi y squared over denominator fourth root of s i n straight pi z space plus space c o s straight pi y end root end fraction end style       2. begin mathsize 14px style b space equals space fraction numerator sin space pi x squared space plus sin space pi y squared space over denominator z cubed space minus space 1.5 space y end fraction end style       3. begin mathsize 14px style a space equals space fraction numerator square root of open vertical bar x close vertical bar space minus 1 end root space minus space square root of x over denominator 1 space plus space begin display style x squared over 2 end style space plus space begin display style y squared over 4 end style end fraction end style

3. Напишите программу для решения геометрической задачи.

1. Найти длину окружности и площадь круга заданного радиуса. Значение числа π можно вычислить из равенства: pi space equals space arccos left parenthesis negative 1 right parenthesis.  
2. Равнобедренный треугольник задан длинами основания и высоты. Найти его площадь и длину боковой стороны.
3. Вычислить площадь кольца, внутренний радиус которого равен R1, а внешний R2
4. Треугольник задан величинами своих углов и радиусом описанной окружности. Найти стороны треугольника.

4. Напишите программу для решения физической задачи.

1. Автомобиль проходит первую часть пути длиной S1 км за t1 мин, участок пути длиной S2 км за t2 мин и наконец, участок длиной S3 км за t3 мин. Найдите среднюю скорость автомобиля, выраженную в км/ч.
2. Определите ускорение, вызванное силой тяготения, на высоте h = kRЗ от поверхности Земли (значение k вводится), если на поверхности Земли его модуль g = 9,81 м / с2.

5. Напишите программу для решения химической задачи.

1. В организме человека на долю атомов кислорода приходится 65 % от массы тела. Найдите массу атомов кислорода для своей массы тела.
2⃰. Масса одного атома кислорода 26.56 ∙ 10−27 (это число в программе на языке C++ записывается так: 26.56E–27, буква E — английская). Определите, сколько атомов кислорода содержится в вашем теле.

6. Напишите программы для решения задач. Используйте операции / и %.

1. Задано двузначное число. Найдите среднее арифметическое цифр числа. 
2. Задано трехзначное число. Найдите сумму цифр числа. 
3. Дана масса в граммах. Переведите ее в килограммы и граммы. 
4. Площадь участка измеряется в арах. Найдите количество полных км2
5. С начала месяца прошло m мин. Определить, какое сейчас число и который сейчас час (в часах и минутах).

7⃰. Для старорусской системы весов известны следующие соотношения:

1 берковец = 10 пудов = 400 фунтов = 38 400 золотников

Напишите программу, которая переводит массу, заданную в золотниках, в фунты, пуды и берковцы.

8. Написать программу, которая определит f — угол (в градусах) между положением часовой стрелки в начале суток и ее положением в h ч m мин (0 ≤ < 12, 0 ≤ < 60).

9. От начала суток прошло h полных часов (0 ≤ < 12). Известно, что сейчас между часовой и минутной стрелками угол в f градусов (0 ≤ < 360, f — целое число). Сколько сейчас может быть минут?

10. Напишите программы для решения задач.

1. Дано целое число а. Не пользуясь никакими другими арифметическими действиями, кроме умножения, получить а9 за четыре операции. 
2. Дано целое число а. Не пользуясь никакими другими арифметическими действиями, кроме умножения, получить а2, а5 и а17 за шесть операций. 
3. Дано целое число а. Не пользуясь никакими другими арифметическими действиями, кроме умножения, получить а15 за пять операций.
4. Дано вещественное число х. Не пользуясь никакими другими арифметическими действиями, кроме сложения, вычитания и умножения, вычислить 2х4 – 3х3 + 4х2 – 5х + 6. Разрешается использовать не более 4 умножений и не более 4 сложений и вычитаний.