Ю4.4

Задача: Вычислить среднее значение [latex]x[/latex] и дисперсию [latex]d_{x}[/latex] для заданного массива [latex]X(k)[/latex] наблюдений:

[latex]x_{avg}=\frac{1}{k}\sum_{i=1}^{k}{x_{i}}[/latex];   [latex]d_{x}=\frac{1}{k-1}\sum_{i=1}^{k}{\left(x_{i}-x_{avg^{}} \right)^{2}}[/latex]

Тесты:

 k x среднее дисперсия
 3  4, 5, 8 5,66666666666667  4,333333
 5  2, 3, 6, 13, 22 9,2  69,7
 6  0, 5, 23, 7, 11, 1 7,83333333333333  71,366667
2  error: incomplete input x
 0  error: wrong value k
 —  error: incomplete input k
1 5 5  error: wrong value k

Код программы:

Код на языке Java:

Ссылка: https://ideone.com/648LHr

План программы:

  1. Назначение рабочих переменных
  2. Проверка ввода числа итераций
  3. Вычисление среднего значения
  4. Вычисление дисперсии
  5. Вывод результата

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

Ссылка на ideone.com: http://ideone.com/t9ALrA

Related Images:

Ю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-мя замерами.

 

Related Images:

Ю4.32

Суммы по косой. Просуммировать элементы матрицы [latex]A(n,n)[/latex] по каждой из линий , параллельных главной диагонали. Напечатать полученные суммы.

Матрица Суммы
1 2 3
4 5 6
7 8 9
7 12 15 8 3
-1 2 -3 4
10 5 11 6
-7 8 -9 2
12 5 13 6
12 -2 31 1 15 3 4
0 0
0 0
0 0 0

Код программы:

Сначала вводим размер квадратной матрицы —  [latex]n[/latex]. Создаем одномерный массив [latex]b[/latex] в который будет результат. В нем будет [latex]2n-1[/latex] элементов, которые мы заполняем нулями.После чего в цикле будем накапливать суммы [latex]b[i-j+n-1]+=a[i][j].[/latex].

При  [latex]i=j[/latex], мы записываем сумму диагоналей в  [latex]b[n-1][/latex], который находиться в середине нашего массива  [latex]b[/latex], как нам и нужно.
Если  [latex]i>j[/latex], мы записываем суммы в элементы после середины нашего массива [latex]b[/latex].
Если  [latex]i<j[/latex], мы записываем суммы в элементы до середины нашего массива [latex]b[/latex].
Константу, которая нам нужна, будем искать по формуле [latex] max(j) — min(i)[/latex], которая равна [latex]n-1[/latex].

Код программы можно посмотреть тут

Related Images:

Ю4.17

В массиве [latex]A(n)[/latex] найти и напечатать номера (индексы) локальных максимумов, то есть таких [latex]a_{i}[/latex], что [latex]a_{i-1}<a_{i}>a_{i+1}[/latex].

Значение Результат
8   5 3 8 6 7 2 9 5 2 4 6

 

Для решения данной задачи зададим массив. После этого создадим цикл, в котором будем каждую итерацию проверять, удовлетворяет ли новое значение нашему условию и если да, то выводить на печать его номер.

Related Images:

Ю4.6

 Задача: Угол между векторами

Найти угол между векторами    [latex]A(n)[/latex] и  [latex]B(n)[/latex]   используя формулу:

[latex]cos\varphi =\cfrac { \left( A,B \right) }{ \left| A \right| \cdot \left| B \right| } =\cfrac { \sum _{ i=1 }^{ n }{ { a }_{ i }{ b }_{ i } } }{ \sqrt { \sum _{ i=1 }^{ n }{ { a }_{ i }^{ 2 } } } \sqrt { \sum _{ i=1 }^{ n }{ { b }_{ i }^{ 2 } } } }[/latex]
  N  A(n)  B(n)  Rad & Deg
  2   3 4   4 3  0.283794         16.2596
  2   7 1   5 5  0.643501         36.8686
3 3 4 0 4 4 2 0.367208         21.0388
10 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 0               0
2 0 2 3 0 1.5708       89.9969
2 -3 5 4 -1 2.35619      134.995

Код программы на С++

Код программы на Java

Чтобы выполнить задачу, требуется всего лишь следовать вычислениям формулы. Для того, что бы узнать значение не косинуса а самого угла, применяем математическую функцию [latex]acos[/latex].

Ссылка C++

Ссылка на Java

Related Images:

Ю4.35

Задача

Совместная работа. Известно время [latex]t_{1},t_{2}, \cdots,t_{n}[/latex], за которое некоторую работу может выполнить каждый из [latex]n[/latex] рабочих бригады, работая в одиночку. Сколько времени понадобится бригаде на выполнение этой работы, если они будут работать совместно (и при этом никто из них не «сачкует»)?

Количество рабочих n. Время t каждого рабочего, требуемое для выполнения некоторой работы.  Время совместной работы.
3 2 4 5 1.1
5 2 4 5 1 2 0.4
6 6 6 6 6 6 6 1.0
7 8 6 5 6 6 7 2 0.7

В данной задаче нам нужно найти время, за которое [latex]n[/latex] рабочих выполнят какую-то совместную работу. В задаче не указан  общий объём выполняемой работы, по-этому зададим его как 1. Время совместной работы находят по формуле: [latex]t_{call}=\frac{V}{\frac{V}{t_{1}}+\frac{V}{t_{2}}+\cdots+\frac{V}{t_{n}}}[/latex], где [latex]V[/latex] –  общий объём выполняемой работы, т.е – 1. Т.к в задаче не указана единица измерения времени, будем считать все в часах.

В программе используются два цикла. Первый– для ввода времени каждого рабочего, а второй– для вычисления общей производительности рабочих. Call–callaboration (время совместной работы), sum – общая производительность рабочих.

Ниже представлена сама программа (C++):

Код на Java:

Так же вы можете воспользоваться ссылкой (C++)/ссылкой (Java), для ознакомления с программой.

Related Images:

Ю4.7

Задача. В матрице [latex] z(n,n)[/latex] каждый элемент разделить на диагональный, стоящий в том же столбце.

Тест

при [latex] n=3[/latex] (элементы главной диагонали выделены )

5 4 9
3 1 7
8 6 2

1 4 4.5
0.6 1 3.5
1.6 6 1

Проверим совсем простой вариант, для наглядности:

при [latex] n=2[/latex]

4 5
2 10

1 0.5
0.5 1

Код на языке С++ :

 

Ссылка на программу: http://ideone.com/ecqIxL

Решение:

Вводим квадратную матрицу  [latex] z(n,n)[/latex].Потом описываем элемент, который будет делиться диагональным:

Следующим шагом будет описание диагонального элемента во вложенном цикле, который определяет элемент в столбце  и непосредственно деление диагонального элемента на элемента, стоящий в том же столбце.

 

Выводим значение полученной матрицы.

Код на языке Java:

 

Ссылка на программу: http://ideone.com/dT5GVl

Related Images:

Ю4.33

Задача

Для заданной матрицы  [latex] A(m,n) [/latex]  найти её норму:  [latex] \left \| A \right \| = \max_{i=1,m} \sum_{k=1}^{n} \left | a_{ik} \right |[/latex].

Тесты

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

Ввод Построчные суммы Вывод
[latex] \begin{pmatrix} 1 & -3 & 2 & 4 & 0 \\ -3 & -7.5 & 2.3 & -3.1 & 2.8 \\ 3.4 & -4.5 & 0 & 0 & 2 \\ 3.2 & 4.7 & 2.8 & -3.1 & -4.3 \end{pmatrix} [/latex] [latex] \begin{matrix} 10 \\ 18.7 \\ 14.4 \\ 18.1 \end{matrix}[/latex] 18.7

Решение

Нам понадобятся два цикла: во внешнем будем искать максимум, пробегая по всем строкам матрицы; во внутреннем будем для фиксированной строки вычислять сумму абсолютных величин её элементов. Если эта сумма превосходит текущую максимальную, обновляем последнюю. Поскольку все наши суммы будут неотрицательными числами, изначально присвоим переменной max значение [latex] 0 [/latex].

Хотя тема называется «Массивы», фактически массив нам здесь не нужен. От нас не требуют производить какие-либо действия над элементами матрицы, поэтому для экономии памяти и времени мы будем «обрабатывать её» , не сохраняя в отдельный массив.

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

Код на С++

Ideone (C++)

Код на Java

Ideone (Java)

Related Images:

Ю4.1

Задача. Разделение по знаку. В массиве С(n) подсчитать количество отрицательных и сумму положительных элементов.

Тесты:

n Входной массив Кол-во отрицательных элементов Сумма положительных элементов Комментарий
5 1.01 3 7.11 -1 -0.99 2 11.12 Пройден
14 1 2 -4.2 3.5 6.2 8 11 -144 288 9.2 -22 12 -13.5 14 4 354.9 Пройден

Код программы:

 

В ходе решении данной задачи я использую цикл for, в котором сначала считываются, а затем обрабатываются данные. Переменная-счётчик [latex]k[/latex]  нужна для того, чтобы узнать кол-во отрицательных элементов. А если встречаются неотрицательные элементы, то подсчитывается их сумма в переменной [latex]S[/latex]. Для проверки выполнения программы можно воспользоваться ссылкой.

Решение на Java:

Ссылка на решение.

Related Images:

Ю4.18

Задача: В массиве [latex]Z(2n)[/latex] каждый элемент с чётным индексом поменять местами с предыдущим, то есть получить последовательность чисел [latex]z_{2}[/latex], [latex]z_{1}[/latex], [latex]z_{4}[/latex], [latex]z_{3}[/latex], \ldots ,[latex]z_{2n}[/latex], [latex]z_{2n-1}[/latex].

Тесты: 

[latex]n[/latex] Входной массив Обработанный массив
5 1 2 3 4 5 6 7 8 9 10 2 1 4 3 6 5 8 7 10 9
7 2 4 6 8 10 12 14 16 18 20 22 24 26 28 4 2 8 6 12 10 16 14 20 18 24 22 28 26

Код на С++: 

Код на Java:

 

 

Решение:  Для того, чтобы поменять местами чётный и нечётный по порядковому номеру элементы массива, надо определить чётность порядкового номера. Для этого надо проверить остаток от деления на 2, т.е если [latex]imod2=0[/latex], то меняем предыдущий элемент с текущим.

Для проверки правильности работы программы, воспользуйтесь ссылкой.

Related Images:

Ю4.23

Латинский квадрат. Латинским квадратом порядка n называется квадратная таблица размером n, каждая строка и каждый столбец которой содержит все числа от 1 до n. Для заданного n в матрице L(n;n) построить латинский квадрат порядка n.

Тесты:

Ввод Вывод Комментарий
5 1 2 3 4 5

2 3 4 5 1

3 4 5 1 2

4 5 1 2 3

5 1 2 3 4

Пройден
4 1 2 3 4

2 3 4 1

3 4 1 2

4 1 2 3

Пройден

Код на С++

Код на Java

 

Решение:

В предложенном варианте заполнения первый элемент строки — это ее номер увеличенный на единицу. Последующий элемент есть увеличенный на единицу предыдущий (если он не равен n), или 1 (в противном случае).

С работой программы на С++ можно ознакомиться здесь, а на Java здесь.

Related Images:

Ю4.31

Задача

Циклический сдвиг. Осуществить циклический сдвиг элементов массива [latex]T\left(n\right)[/latex] на  [latex]m[/latex] позиций влево, то есть получить массив: [latex]t_{m+1},\ldots t_{n}, t_{1},\ldots t_{m}[/latex].
ри этом необязательно [latex]m<n[/latex].

Тесты:

изначальный массив сдвиг (m) результат комментарий
1 2 3 4 5 6 7 2 3 4 5 6 7 1 2 пройден
1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 пройден
1 2 3 4 5 6 7 10 4 5 6 7 1 2 3 пройден

 

 

Ссылка на код.

Код на Java:

 

 

Related Images:

Ю4.26

TALVEZ-NOSSO-PERSONAGEM-NA-HISTRIA1Задача: На шахматной доске находятся король и несколько ферзей другого цвета. Проверить, находится ли король под угрозой и если да, кто ему угрожает. Положение фигур задано массивом A(8,8): 0 — клетка пуста, 1 — король, 2 — ферзь. Ферзь бьет по горизонтали, вертикали и диагоналям.

0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 2
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 2 2 0 0 0 2 2

Король под угрозой от ферзя на клетке (2,8) (по вертикали)

Король под угрозой от ферзя на клетке (8,2) (по горизонтали)

Король под угрозой от ферзя на клетке (8,8) (по диагонали)

Решение:

Ссылка на ideone C++: http://ideone.com/h4ECiW

Ссылка на ideone Java: http://ideone.com/sIJwPA

 

Сначала в цикле вводим массив и ищем где находится король (единичка). Найдя короля, начинаем искать ферзей в восьми направлениях от него (вниз, вверх, вправо, влево и также по диагоналям). Найдя ферзя по одному из направлений выводим его координаты и переходим на следующее направление т.к. все остальные не причинят угрозы королю, потому что между ними и королем стоит фигура (первый найденный ферзь).

Related Images:

Ю4.10

Задача: Найти среднее арифметическое элементов каждой строки матрицы [latex]Q\left(l,m \right)[/latex] и вычесть его из элементов этой строки.

[latex]l[/latex] [latex]m[/latex] [latex]Q\left(l,m \right)[/latex] [latex]\acute{Q}\left(l,m \right)[/latex]
2 3
4 6 2
5 9 10
0 2 -2
-3 1 2
4 3
-5 -2 -3
6 5 0
-8 9 -64
468 -3 1
-1.66667 1.33333 0.333333
2.33333 1.33333 -3.66667
13 30 -43
312.667 -158.333 -154.333
1 1 8 0

C++:

Java:

У переменных [latex]l[/latex], [latex]m[/latex] (количество строк и столбцов соответственно) — тип int, т.к. это целые числа.
Массив для данной матрицы [latex]q\left[l \right]\left[m \right][/latex] и массивы элементов суммы [latex]sum\left[l \right][/latex] и среднего арифметического [latex]sr\left[l \right][/latex] каждой строки  имеют тип double, так как могут содержать вещественные числа.

В первом цикле инициализируем элементы массива [latex]sum\left[l \right][/latex] нулями, чтобы там не лежал мусор.

Во втором цикле, который перебирает все элементы матрицы, вводятся эти элементы, считается их сумма и среднее арифметическое для каждой строки.

В третьем цикле вычитаем из каждого элемента среднее арифметическое строки, в которой он находится, и выводим новое значение элемента на экран.

Задача на Ideone:
C++
Java

Related Images:

Ю4.22

Задача

Плюсы и минусы. В массиве [latex] Z(m) [/latex] найти число чередований знака, то есть число переходов с минуса на плюс или с плюса на минус. Например в последовательности 0, -2, 0, -10, 2, -1, 0, 0, 3, 2, -3  четыре чередования (как известно нуль не имеет знака).

Код С++

 

Код С++ на Ideone: http://ideone.com/qEJL9Z

Код Java

Код Java на Ideone: Ю 4.22

Комментарии

Задаем массив и делаем проверку: находим первый член массива не равный нулю, запоминаем его знак, находим следующий, проверяем если знаки совпадают ищем следующий член массива, в противном случае к сумме прибавляем единицу и запоминаем новый знак .

Тесты

Размер массива (m) Массив (Z[m]) Результаты Комментарии
11 0 -2 0 -10 2 -1 0 0 3 2 -3 4 Пройден
1 1 0 Пройден
5 1 -2 3 -4 5 4 Пройден

Related Images:

Ю4.29

Текущий минимум. Каждый из элементов [latex] t_{i}[/latex] массива [latex]T(m)[/latex] заменить минимальным среди первых [latex]i[/latex] элементов этого массива.

[latex]m[/latex] [latex]t_{1}, t_{2},\ldots,t_{i}[/latex]  Результат:
6 9
7
8
5
14
1
9
7
7
5
5
1
5 3
-2
5
-3
8
3
-2
-2
-3
-3
4 12
0
4
-7
12
0
0
-7

Код программы:

По условию задачи необходимо выводить текущий минимум введенных элементов массива.
Для этого опишем количество элементов, которое вводится с клавиатуры (так как это целое число, оно имеет тип «int»). Затем описав массив, считываем первый элемент массива и присваиваем переменной минимум его значение. После необходимо создать цикл для ввода остальных элементов массива. При условии, что текущий элемент меньше предыдущего, переприсваиваем минимум. Все элементы массива заменяем минимальным. Остается только вывести все текущие минимумы.
Для проверки работы программы можно воспользоваться объектом.

 

Код на Java:

 

Related Images:

Ю4.25

Задача: Заполнить матрицу заданного размера [latex]M(k,l)[/latex] числами 1,2,3,4 так, чтобы по горизонтали, вертикали и диагонали не было одинаковых рядом стоящих чисел.

[latex]k[/latex] [latex]l[/latex] Output
6 6 1 2 3 4 1 2
3 4 1 2 3 4
1 2 3 4 1 2
3 4 1 2 3 4
1 2 3 4 1 2
3 4 1 2 3 4
5 5 1 2 3 4 1
3 4 1 2 3
1 2 3 4 1
3 4 1 2 3
1 2 3 4 1
Код на Ideone.

Заполняем массив с помощью формулы (j + 2 * (i % 2)) % 4 + 1. При i четном 2 * (i % 2) будет обращаться в 0. То есть в нечетных строках будут числа 1, 2, 3, 4 подряд, а в четных строках будут меняться цифры 1 на 3, 2 на 4, 3 на 1, 4 на 2.

Код программы на Java:

Код на Ideone.

Related Images:

Ю4.13

Задача. Дан массив [latex]A(n)[/latex]. Все положительные его элементы поместить в начало массива [latex]B(n)[/latex], а отрицательные элементы- в начало массива [latex]C(n)[/latex]. Подсчитать количество тех и других.

Входные данные 3 -1 2 0 Выходные данные 1 2
Заводим счетчик для отрицательных и положительных чисел,а также переменную для количества элементов массива типа [latex]int[/latex]. Читаем количество элементов и создаем три массива типа [latex]double[/latex](вдруг нам буду вводить действительные числа). В цикле читаем элемент [latex]A[i][/latex] и условием определяем положительное число или нет, и увеличиваем соответствующий счетчик. Выводим полученные результаты.

Ссылка на программу.

Java

 

 

Related Images:

Ю4.19

Задача. Многочлен [latex]{P}_{n}(x)[/latex] задан массивом своих коэффициентов [latex]A(n+1)[/latex]. Найти массив коэффициентов производной этого многочлена.

[latex]n[/latex] [latex]{a}_{2}[/latex] [latex]{a}_{1}[/latex] [latex]{a}_{0}[/latex] [latex]{b}_{2}[/latex] [latex]{b}_{1}[/latex] [latex]{b}_{0}[/latex]
2 0 0 0 0 0 0
2 17 2 3 34 2 0
2 0 -4 1 0 -4 0

Давайте вначале распишем сам многочлен [latex]{P}_{n}(x)[/latex]:
[latex]{P}_{n}(x)={a}_{n}{x}^{n} + {a}_{n-1}{x}^{n-1} + … + {a}_{0}{x}^{0}[/latex].

А его производная соответственно равна:
[latex]{P}_{n}^{(1)}(x)=n{a}_{n}{x}^{n-1} + (n-1){a}_{n-1}{x}^{n-2} + … + 0*{a}_{0}{x}^{-1}[/latex]

Давайте посмотрим как изменился массив [latex]A(n+1)[/latex]:

[latex]{P}_{n}(x)[/latex] [latex]{a}_{n}[/latex] [latex]{a}_{n-1}[/latex] [latex]{a}_{0}[/latex]
[latex]{P}_{n}^{(1)}(x)[/latex] [latex]n*{a}_{n}[/latex] [latex](n-1)*{a}_{n-1}[/latex] [latex]0*{a}_{0}[/latex]

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

Код программы: http://ideone.com/JHXOTa.

Related Images: