Задача: Гидрологами исследовано течение реки в некотором сечении: произведена серия замеров от одного берега до другого перпендикулярно фарватеру, полученные данные: [latex]{s}_{i}[/latex] — расстояние от левого берега, м; [latex]{h}_{i}[/latex] — глубина реки, м; [latex]{v}_{i}[/latex] — скорость течения, м/с, [latex]i=1,2…,n[/latex] . Каков расход воды в секунду? То есть сколько кубометров воды протекает через сечение в секунду?
Тесты: (сначала вводятся все данные одного массива, а не поочерёдно)
Ввод | Ответ | Комментарий |
3 [2 4 6] [4 5 5] [3 7 2] |
88 | Работает |
2 [13 42] [17 18] [3.14 2.71] |
1409.85 | Работает |
Объяснение переменных:
int n - количество замеров int area = 0 - площадь поперечного сечения (требуется для формулы расхода воды) int velocity = 0 - cумма скоростей, позже будет делится на количество замеров (тоже для формулы) double s[n], h[n], v[n]; - массивы с данными о замереКод: проверить на ideone.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> using namespace std; int main() { int n; double area = 0, velocity = 0; cin >> n; double s[n], h[n], v[n]; for(int i = 0; i <= n - 1; i++){ cin >> s[i]; } //воодим данные for(int i = 0; i <= n - 1; i++){ cin >> h[i]; } for(int i = 0; i <= n - 1; i++){ cin >> v[i]; } for (int i = 0; i < n; i++){ // используем цикл if( i == 0 ){ // всегда в первый замер будет подразумеваться треугольник => area += (s[i]+h[i])/2; // формула прямоугольного треугольника } if( i == n - 1 ){ area += ((s[i]-s[i-1])+h[i])/2; // в последний замер аналогично, только вычитаем ранее s[i] (sSum) } else{ area += ((h[i-1]*h[i])/2)*(s[i] - s[i-1]); //аппроксимируем сечение реки трапециаями } velocity += v[i]; // суммируем скорости течения } velocity /= n; // среднее арифметическое cout << area*velocity; // считаем по формуле и выводим return 0; } |
Алгоритм выполнения описан в комментариях в коде.
Используется формула расхода воды: [latex]Q=Av[/latex] , где [latex]A[/latex] — площадь поперечного сечения, а [latex]v[/latex] — среднее арифметическое скорости течения всех замеров. Метод подсчета площади сечения реки описан по ссылке.
Для понимания метода:
Первый и последний «замер» на картинке образуют треугольники (относительно берега). Между ними — прямоугольные трапеции ( [latex]S=\frac { a+b }{ 2 } h[/latex], где [latex]a[/latex], например, линия 2-го замера (по картинке), а [latex]b[/latex] линия 3-го замера соответственно, [latex]h[/latex] — расстояние от 2-го замера до 3-го (нынешнее расстояние от берега отнять прошлое). Суммируем площади фигур — это и будет площадь сечения реки.
Замечание:
Данные должны вводится последовательно относительно удаления от левого берега. Подразумевается, что гидрологи обязательно замеряли всю реку (от левого до правого берегов) минимум 2-мя замерами.
Для отправки комментария необходимо войти на сайт.