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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Циклы и массивы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Суммирование в цикле до определенного значения
Stibaslo
Отправлено: 21 Января, 2017 - 18:55:11
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Подскажите с решением проблемы!
Суть:
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

Помогите плз, голову уже сломал
 
 Top
Строитель Модератор
Отправлено: 21 Января, 2017 - 20:38:23
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Stibaslo, вероятно так?
Спойлер (Отобразить)
 
 Top
Stibaslo
Отправлено: 21 Января, 2017 - 21:41:32
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Спасибо! Вот только получается второй цикл всегда просчитывает суммы до единицы, прибавляет m++ пока первый цикл по суммам не закончится! Считает неправильно. ((((
 
 Top
Строитель Модератор
Отправлено: 21 Января, 2017 - 22:12:58
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Stibaslo пишет:
прибавляет m++
А переменная $m должна увеличиваться только один раз за всё время выполнения скрипта?
Stibaslo пишет:
Вот только получается второй цикл всегда просчитывает суммы до единицы
На счёт второго цикла - вы изначально вроде бы так и описали алгоритм (пункт №4)
 
 Top
Stibaslo
Отправлено: 21 Января, 2017 - 22:23:42
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Нет, нет
Начинает считать первый, доходит до единицы -> переходит ко второму. Во втором суммирует до единицы -> прибавляет m++ -> возвращается в первый и проводит аналогичные операции с оставшимися элементами массива пока не кончится первый или второй массив.

Заморочка такая
 
 Top
Строитель Модератор
Отправлено: 21 Января, 2017 - 22:27:34
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Stibaslo, я подумаю, но не буду обещать что смогу решить.
 
 Top
Stibaslo
Отправлено: 21 Января, 2017 - 22:30:47
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Спасибо большое, если смогу отблагадарю
 
 Top
Строитель Модератор
Отправлено: 22 Января, 2017 - 12:38:29
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Stibaslo, проверьте этот вариант
Спойлер (Отобразить)

(Добавление)
Stibaslo, если этот вариант подходит, и если вам нужны будут комментарии в коде, то я их пропишу.
 
 Top
Stibaslo
Отправлено: 22 Января, 2017 - 15:21:40
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Строитель, попробовал, результат расчета для этих данных - 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:\......., как поправить?

(Отредактировано автором: 22 Января, 2017 - 15:35:10)

 
 Top
Строитель Модератор
Отправлено: 22 Января, 2017 - 15:48:46
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




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
 
 Top
Stibaslo
Отправлено: 22 Января, 2017 - 17:29:33
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




массивы - это вероятности наступления событий А и Б.
число $m - количество наступлений некоего события В, которое произойдет если произойдет А и Б.

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

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

Сами массивы просто пример, в реальности значений гораздо больше и массивов будет шесть как минимум. Т.е. матрешка из циклов.
 
 Top
Строитель Модератор
Отправлено: 22 Января, 2017 - 17:33:10
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Вероятно кто-то из более опытных программистов сможет помочь? )
 
 Top
Stibaslo
Отправлено: 22 Января, 2017 - 17:48:20
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Вряд ли.
Мне бы в первом варианте если организовать проверку количества "обработанных" элементов массивов и выход при их окончании - дальше сам бы докрутил.
Не могу допереть просто как проверить, кончились элементы в массиве или нет
 
 Top
Строитель Модератор
Отправлено: 22 Января, 2017 - 17:53:37
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Stibaslo пишет:
Не могу допереть просто как проверить, кончились элементы в массиве или нет
Ну, я во втором варианте (с двумя рекурсивными функциями) реализовал проверку массивов на наличие элементов. Но тот вариант вам тоже не подошёл?
 
 Top
Stibaslo
Отправлено: 22 Января, 2017 - 17:56:31
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2017  


Помог: 0 раз(а)




Во втором варианте сложнее (для меня) шесть массивов вложить. Буду пробовать!
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB