A413a

Задача: Таблица футбольного чемпионата задана квадратной матрицей порядка n, в которой все элементы, принадлежащие главной диагонали, равны нулю, а каждый элемент, не принадлежащий главной диагонали, равен  2,  1  или  0 (числу очков, набранных в игре:  2— выигрыш,  1— ничья,   0— проигрыш).

a) Найти число команд, имеющих побед больше, чем поражений.

Тесты:

Матрица Число команд Комментарий
3

0 2 2

0 0 1

0 1 0

1 Работает
4

0 2 1 1

0 0 2 2

1 0 0 0

1 0 2 0

2 Работает
2

0 1

1 0

0 Работает

Объяснение переменных:

int n — число команд (размерность квадратной матрицы)

double k = 0 — вспомогательная переменная для метода, описанного ниже (особенности)

int m[n][n] — квадратная матрица, в которую вносится турнирная таблица.

int d = 0- переменная для счёта удоволетроворяющих условию команд

Код: проверить на ideone.

Алгоритм:

  1. Ввод n ( cin >> n ).
  2. Заполнение массива m ( cin >> m[i][j] ).
  3. Подсчет суммы очков команды ( k += m[i][j] ).
  4. Если k делённое на количество игр больше 1 (  k/(n-1) [latex]\in \Re [/latex]  ), d++.
  5. Обнуляем k. Возвращаемся к п.3, пока не будет выполнен цикл
  6. По завершению цикла выводим d.

 Особенности:

Метод использованный для выявления команд, удовлетворяющих условию задачи, заключается в замеченной мной впоследствии изучения задачи закономерности:

Если сумма очков команды делится на количество игр и даёт 1, то это значит, что либо победы = поражениям (не подходит по условию) либо это сплошные ничьи (снова победы = проигрышам). Причем, если ответ больше 1, то и побед больше, чем поражений. Если ответ меньше 1, то побед меньше, чем поражений.

Ю5.11

Задача: Задача Иосифа. По кругу располагается  [latex]n[/latex]  человек. Ведущий считает по кругу и выводит («казнит»)  [latex]m[/latex]-го человека*. Круг смыкается, счет возобновляется со следующего после «казнённого»; так продолжается, пока «в живых» не остаётся только 1 человек. Найти номер этого человека, [а так-же для заданного  [latex]n[/latex]  найти такое  [latex]m>1[/latex] , при котором в живых остаётся первый]**.

* — m не может превышать n по условию.

** — вторая часть задачи.

Тесты:   

Ввод Вывод Комментарий
2 1 2 [2] Работает
3 3 2 [не существует] Работает
271 42 121 [69] Работает
271 69 1 [69] Работает

Объяснение переменных:

bool existing - булева переменная для фиксирования существования второй части задачи. vector <int> a — вектор, по задаче представляет собой нумерацию людей.

unsigned int n, m — переменные, где n и m соответсвуют условию задачи.

int JeosifFunc(a, n, m) — функция, которая выполняет основной алгоритм задачи.

 

 Код: Проверить на ideone.

Алгоритм выполнения описан в комментариях в коде.

 

Особенности:

  1. В коде очень легко запутаться, т.к. нумерация «слотов» вектора начинается с нуля, следовательно везде по коду мы должны это учитывать. Это здорово мешает в понимании кода.
  2. Алгоритм выполнения первой задачи заключен в функцию. Без этого хода нельзя было бы выполнить вторую часть задания методом, представленным выше.
    if( JeosifFunc(a, n, k) == 1 )

Ю12.31

Задача: строка содержит арифметическое выражение, состоящее из целых чисел и знаков операции: [latex]+,-,*,/[/latex]  (без скобок). Проверить корректность выражения (в смысле последовательности чисел и знаков операции)

Тесты: 

Выражение Ответ Комментарий
-1+2-3/4*5 Верно Работает
-1 Верно Работает
-1/-4 Верно Работает
5—4 Верно Работает
1 Верно Работает
54-*3//6 Ошибка Работает. Неправильная последовательность
5/0+42 Ошибка Работает. Деление на ноль
5/ Ошибка Работает. После символа должно следовать число

Объяснение переменных:

string a  — строка для ввода.

bool rightness  — булева переменная для фиксирования ошибочного выражения.

Код:  Проверить на ideone.

Алгоритм выполнения описан в комментариях в коде.

 

Особенности:

  1. Удобно предположить, что изначально выражение верно. И в случае отсутствия ошибок, переменной rightness присваивать ничего не нужно будет.

Итог работы:

Код проверяет правильность выражения (последовательность чисел и знаков) с учётом унарного минуса (но не плюса)*, так-же за ошибку считается деление на ноль. Примеры применения есть в тестах.

* — легко реализовать посредством удаления a[0] == '+' из соответствующих if’ах, но не стал, так как считаю унарный плюс бессмысленным.

Ю4.36

Задача: Гидрологами исследовано течение реки в некотором сечении: произведена серия замеров от одного берега до другого перпендикулярно фарватеру, полученные данные: [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.

Алгоритм выполнения описан в комментариях в коде.

Используется формула расхода воды:  [latex]Q=Av[/latex]  , где [latex]A[/latex]  — площадь поперечного сечения, а [latex]v[/latex]  — среднее арифметическое скорости течения всех замеров. Метод подсчета площади сечения реки описан по ссылке.

Для понимания метода:

270

 

Первый и последний «замер» на картинке образуют треугольники (относительно берега). Между ними —  прямоугольные трапеции (  [latex]S=\frac { a+b }{ 2 } h[/latex], где [latex]a[/latex], например, линия 2-го замера (по картинке), а  [latex]b[/latex]  линия 3-го замера соответственно, [latex]h[/latex]  — расстояние от 2-го замера до 3-го (нынешнее расстояние от берега отнять прошлое). Суммируем площади фигур — это и будет площадь сечения реки.

Замечание:

Данные должны вводится последовательно относительно удаления от левого берега. Подразумевается, что гидрологи обязательно замеряли всю реку (от левого до правого берегов) минимум 2-мя замерами.

 

Ю3.37

Задача. Численно убедиться в справедливости равенства, для чего для заданного значения аргумента [latex]x[/latex] вычислить левую его часть и разложение, стоящее в правой части, с заданной погрешностью [latex]e[/latex]. Испытать разложение на сходимость при разных значениях аргумента, оценить скорость сходимости, для чего вывести число итераций [latex]n[/latex](слагаемых или сомножителей), необходимых для достижения заданной точности.

[latex]\frac {{e}^{x}-{e}^{-x}}{2} =x+\frac {{x}^{3}}{3!}+\frac {{x}^{5}}{5!} +…+\frac {{x}^{2n-1}}{(2n-1)!} +…[/latex]
x e результат Комментарий
5 0.01 0.002312 Работает
3.14 0.999 0.686728 Работает
4 0 Эквивалентно Работает
Всё просто. Считаем левую часть, считает правую часть циклом. В том же цикле ждём момента когда [latex]le-pr[/latex] будет меньше или равно заданной погрешности.

ideone

Вывод: Задача решена.

Ю3.15

Задача: Сравнить скорость сходимости (число слагаемых для заданной точности [latex]e[/latex]  следующих разложений числа [latex]\pi[/latex]

 

1.   [latex]\pi=4\left(1-\frac {1}{3}+\frac {1}{5}-\frac {1}{7}+\frac {1}{9} -… \right)[/latex]

 

2.   [latex]\pi=3+4\left(\frac {1}{2\cdot 3\cdot 4}-\frac {1}{4\cdot 5\cdot 6}+\frac {1}{6\cdot 7\cdot 8\cdot } -…\right)[/latex]

 

3.   [latex]\pi=\sqrt {6\left(1+\frac {1}{ {2}^{2} } +\frac {1}{ {3}^{2}}+\frac {1}{ {4}^{2}}+… \right) }[/latex]

Число слагаемых (е) Вариант 1 Вариант 2 Вариант 3 Комментарий
1 0.858407 0.025074 0.692103 Работает
2  0.474926 0.00825932  0.40298 Работает
3 0.325074  0.00825932 0.283855 Работает
10  0.099753 0.000185935 0.092231 Работает

Первым делом я исчисляю разложения с заданным количеством слагаемых. Затем я присваиваю нужные им значения (по формуле), а затем с помощью абсолютного значения числа считаю погрешность.

ideone

Вывод: Второе разложение является самым точным.