Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Циклы и массивы
Форумы портала PHP.SU » » Вопросы новичков » Циклы и массивы

Страниц (2): [1] 2 »
 

1. Stibaslo - 21 Января, 2017 - 18:55:11 - перейти к сообщению
Подскажите с решением проблемы!
Суть:
1. Есть массивы №1 и №2 значений [0.2 0.5 0.6 0.8 0.7 .......] и [0.3 0.2 0.1 0.3 0.7 .......]
2. Необходимо складывать значения элементов массива№1 (0.2 +0.5.....)
3. При достижении суммы элементов массива№1 S>= 1 необходимо перейти к сложению элементов массива №2 с такими иже условиями (достижение суммы >=1).
4. При достижении суммы элементов массива№2 S>= 1 увеличить значение m++ и вернуться к продолжению сложения оставшихся элементов массива №1

Помогите плз, голову уже сломал
2. Строитель - 21 Января, 2017 - 20:38:23 - перейти к сообщению
Stibaslo, вероятно так?
Спойлер (Отобразить)
3. Stibaslo - 21 Января, 2017 - 21:41:32 - перейти к сообщению
Спасибо! Вот только получается второй цикл всегда просчитывает суммы до единицы, прибавляет m++ пока первый цикл по суммам не закончится! Считает неправильно. ((((
4. Строитель - 21 Января, 2017 - 22:12:58 - перейти к сообщению
Stibaslo пишет:
прибавляет m++
А переменная $m должна увеличиваться только один раз за всё время выполнения скрипта?
Stibaslo пишет:
Вот только получается второй цикл всегда просчитывает суммы до единицы
На счёт второго цикла - вы изначально вроде бы так и описали алгоритм (пункт №4)
5. Stibaslo - 21 Января, 2017 - 22:23:42 - перейти к сообщению
Нет, нет
Начинает считать первый, доходит до единицы -> переходит ко второму. Во втором суммирует до единицы -> прибавляет m++ -> возвращается в первый и проводит аналогичные операции с оставшимися элементами массива пока не кончится первый или второй массив.

Заморочка такая
6. Строитель - 21 Января, 2017 - 22:27:34 - перейти к сообщению
Stibaslo, я подумаю, но не буду обещать что смогу решить.
7. Stibaslo - 21 Января, 2017 - 22:30:47 - перейти к сообщению
Спасибо большое, если смогу отблагадарю
8. Строитель - 22 Января, 2017 - 12:38:29 - перейти к сообщению
Stibaslo, проверьте этот вариант
Спойлер (Отобразить)

(Добавление)
Stibaslo, если этот вариант подходит, и если вам нужны будут комментарии в коде, то я их пропишу.
9. Stibaslo - 22 Января, 2017 - 15:21:40 - перейти к сообщению
Строитель, попробовал, результат расчета для этих данных - 3 выдает?
Немного непонятно если честно, если не трудно через // расставить пояснения.


С предыдущим вариантом нельзя добавить реализацию такого варианта:

PHP:
скопировать код в буфер обмена
  1. $m = 0;
  2. $sum_1 = 0;
  3. $sum_2 = 0;
  4.  
  5. foreach ($arr_1 as $item_1) {
  6.     if ($sum_1 >= 1) {
  7.                       foreach ($arr_2 as $item_2) {
  8.                                                    if ($sum_2 >= 1) {
  9.                                                    $m++;
  10.                                                    break;
  11.                                                                     }
  12.                                                                             // ? если элементы закончились - то выход из всего цикла, если нет то продолжение суммирования
  13.                                                    $sum_2 += $item_2;
  14.                                                    }
  15.                       }
  16.                                                                          // ? если элементы закончились - то выход из всего цикла, если нет то продолжение суммирования
  17.                                                   $sum_1 += $item_1;
  18.                            }
  19. echo $m;

(Добавление)
При повторном исполнении 2-го варианта выскакивает ошибка - Cannot redeclare foo() (previously declared in D:\......., как поправить?
10. Строитель - 22 Января, 2017 - 15:48:46 - перейти к сообщению
Stibaslo пишет:
результат расчета для этих данных - 3 выдает?
Stibaslo, да, результат равен 3. Прокомментировал предыдущий код
Спойлер (Отобразить)
Stibaslo пишет:
С предыдущим вариантом нельзя добавить реализацию такого варианта:
Думаю можно. Попробую, и позже отпишусь.
(Добавление)
Stibaslo пишет:
При повторном исполнении 2-го варианта выскакивает ошибка - Cannot redeclare foo() (previously declared in D:\......., как поправить?
Вы наверное описание функции прописали в тело цикла?
(Добавление)
Stibaslo, и ещё для ясности напишите мне, какое должно быть значение в переменной $m при таких значениях массивов:

$arr_1 = [0.2, 0.5, 0.6, 0.8, 0.7]; // 2.8
$arr_2 = [0.3, 0.2, 0.1, 0.3, 0.7]; // 1.6
11. Stibaslo - 22 Января, 2017 - 17:29:33 - перейти к сообщению
массивы - это вероятности наступления событий А и Б.
число $m - количество наступлений некоего события В, которое произойдет если произойдет А и Б.

(т.е. массив№1 - вероятности события А, при его наступлении (суммирование в массиве№1 больше единицы) - переход в массив№2 и рассчитывается вероятность наступления события Б (массив№2).

соответственно при переборе всего массива№1 или всего массива№2 - событие в этот "день" не наступит.

Сами массивы просто пример, в реальности значений гораздо больше и массивов будет шесть как минимум. Т.е. матрешка из циклов.
12. Строитель - 22 Января, 2017 - 17:33:10 - перейти к сообщению
Вероятно кто-то из более опытных программистов сможет помочь? )
13. Stibaslo - 22 Января, 2017 - 17:48:20 - перейти к сообщению
Вряд ли.
Мне бы в первом варианте если организовать проверку количества "обработанных" элементов массивов и выход при их окончании - дальше сам бы докрутил.
Не могу допереть просто как проверить, кончились элементы в массиве или нет
14. Строитель - 22 Января, 2017 - 17:53:37 - перейти к сообщению
Stibaslo пишет:
Не могу допереть просто как проверить, кончились элементы в массиве или нет
Ну, я во втором варианте (с двумя рекурсивными функциями) реализовал проверку массивов на наличие элементов. Но тот вариант вам тоже не подошёл?
15. Stibaslo - 22 Января, 2017 - 17:56:31 - перейти к сообщению
Во втором варианте сложнее (для меня) шесть массивов вложить. Буду пробовать!

 

Powered by ExBB FM 1.0 RC1