Задача: Гидрологами исследовано течение реки в некотором сечении: произведена серия замеров от одного берега до другого перпендикулярно фарватеру, полученные данные: [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-мя замерами.
— Прочитайте внимательно условие задачи.
— Добавьте в метки ключевые слова из условия задачи.
— Введите из стандартного потока число n и все три массива.
— Выполните вычисления.
— В отчёте напишите формулу по которой Вы провели вычисления.
— Готово
— Готово
— Готово, хоть и задача этого не требует
— Готово
— Готово
1. не уверен, что Вы ВНИМАТЕЛЬНО прочитали условие и то, что написал Игорь Евгеньевич.
2. да
3. нет, задача этого требует (пусть и неявно) и главное этого требуем и я и Игорь Евгеньевич, а Вы не вводите массивы со стандартного ввода
4. допустим какие-то вычисления проводятся, но те ли
5. формула расхода воды верная, уже хорошо, «делают они это периодичностью в метр» — это почему? Мне кажется Вы неправильно поняли, что такое s, s -должно быть массивом, на сколько текущее измерение удалено от левого берега. У Вас почему-то есть rashod2 и rashod — в чем разница? что-то тут не так.
В общем, повторю первый совет Игоря Евгеньевича «Прочитайте внимательно условие задачи». Честно скажу, мне помогло только повторное внимательное прочтение условия задачи понять, что же хочет от нас Юркин.
А вот те, у кого в школе была летняя экологическая или краеведческая экспедиция с группой гидрологов отлично Юркина понимают 🙂
Говорил мне учитель географии Александр Иванович Почекаев, что оно мне понадобится…
Переписал код и отчет. Надеюсь, в этот раз понял правильно
«Введите из стандартного потока число n и все три массива.»
Что за «int tAsk (teachersAsk) — для дополнительного задания (введите из стандартного потока число и все три массива)»??? Оно у Вас никак не используется и абсолютно лишнее — удалите его из программы и отчета. В качестве числа предполагалось n, которое у Вас и так есть.
Как это Вы просуммировали скорость? Почему? Мне кажется нужно было суммировать расход воды: если через часть сечения 1 протекает Q_1 кубометров воды в секунду, а через часть 2 протекает Q_2 кубометров воды в секунду, то через них суммарно протекает Q_1 + Q_2 кубометров воды в секунду. Отмечу, что суммировать площади частей сечения тоже можно — таким образом получив общую площадь сечения — но это в задаче не спрашивается. А вот суммарная скорость здесь не имеет никакого смысла.Теперь разобрался — Вы считаете среднюю скорость по всем замерам и общую площадь сечения умножаете на среднюю скорость, ОК.
Теперь насчет площади — сомневаюсь, что s[i]*h[i] верная формула. Если употребление h[i] в произведении еще как-то уместно, то s[i] — это расстояние от левого берега до очередного замера, а не ширина очередного участка. Задача непростая — теперь нужно выбрать как мы аппроксимируем сечение реки — прямоугольниками или трапециями. Вроде как классически сечение реки аппроксимизируется трапециями и на крайних участках треугольниками — см. здесь. Значит вроде как Вам нужно знать дополнительный параметр — ширину реки (вместо Вашего tAsk ) — чтобы посчитать площадь последнего треугольника.
Спасибо за замечания и материал. Сразу всё понял (если понял 🙂 ).
Откорректировал.
Почему (h[i-1]*h[i])/2 умножить? Зачем суммируем s[i], ведь s[i] — это расстояния от берега и длина участка просто s[i]-s[i-1].
Вы подразумеваете, что при ( i == n — 1 ) указаны данные правого берега? Тогда h[n-1] нулевое и в формуле наверное нужно использовать предыдущее h (если я правильно Вас понял). Тогда с тестами беда. Да и вообще с таблицей у Вас проблемы: две строчки слились в одну почему-то.
Хорошо, что нашли картинку, правда мне не все в ней понятно. Но лучше пусть будет такая картинка, чем без нее.
Пока засчитать задачу не могу.
Описался в формуле, спасибо. С расстояниями намудрил.
Исправил код, в отчете подробнее описал нахождение площади сечения.
Не до конца понял замечание «h[n-1]». Если и подобное есть в коде, то только тогда, когда h[n-1] (h[i-1]) имеет присвоенное значение, то есть начиная со второго замера.
я не там исправил * на +. В формулах площади треугольника должно быть *, а в формуле площади трапеции +. Исправлю, как разрешат.
Обсудим задачу на экзамене!
Задача (как и многие у Юркина) сформулирована не очень строго. В этой задаче, например, совсем не ясно где начинается сечение реки и где оно заканчивается, какая глубина и скорость у берегов. Естественно, что река начинается на расстоянии 0 от берега. Но какая там глубина и скорость? Если предположить, что среди измерений обязательно будут встречаться измерения у берегов, то достаточно их отсортировать по возрастанию и применить аналог формулы трапеций для соседних измерений. Получится что-то вроде этого:
Ссылка для запуска