PHP.SU

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

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

> Найдено сообщений: 8
sphinks Отправлено: 28 Января, 2012 - 18:15:42 • Тема: Нахождение сумм произведений элементов массива • Форум: Хранение данных, их вывод и обработка

Ответов: 3
Просмотров: 2986
Итак:
Решение рекурсией

PHP:
скопировать код в буфер обмена
  1.  
  2. //наш массив с a,b,c,d...n значениями
  3. $mas=[a,b,c,d];
  4.  
  5. //создаем вспомогательный массив
  6. for($i=0;$i<count($mas)+1;$i++){
  7.     $a[$i]=0;
  8. }
  9.  
  10. function get_mult($last_idx,$product,$num_el,$mas,$a){
  11.                 //values_games;
  12.                 $this->a[$num_el]+=$product;
  13.                 while(++$last_idx<count($mas)){
  14.                         $s=$product*$mas[$last_idx];
  15.                         $this->get_mult($last_idx,$s,$num_el+1,$mas,$this->a);
  16.                 }
  17.         }
  18. //вызов ф-ции
  19. $this->get_mult(-1,1,0,$mas,$this->a);
  20.  

на выходе имеем массив а[], в котором индекс массива соответствует соединениям (пара-тройка-четверка), а значение - сумме произведений.
Если есть фиксированные значения, отделяем фиксированные значения и не фиксированные. Фиксированные перемножаем между собой, а в ф-цию передаем массив с не фиксированными значениями. И на выходе массив а перемножаем с произведением фиксированных значений.
sphinks Отправлено: 19 Января, 2012 - 20:18:08 • Тема: Нахождение сумм произведений элементов массива • Форум: Хранение данных, их вывод и обработка

Ответов: 3
Просмотров: 2986
Спасибо всем за помощь.
Решение найдено. Если интересно, могу выложить.
А нет - тему ф топку!
sphinks Отправлено: 19 Января, 2012 - 14:56:02 • Тема: Нахождение сумм произведений элементов массива • Форум: Хранение данных, их вывод и обработка

Ответов: 3
Просмотров: 2986
Задача:
В массиве Аn=[A0,A1,A2...An] найти :
1) количество множителей пар, троек, четверок, н-множителей
2) сумму произведений пар, троек, четверок... н-множителей
Усложнение:
3) найти количество множителей пар, троек, четверок при м-количестве заданных элементов, где м<n
4) сумму произведений n-множителей с m-количеством заданных элементов.
Пример:
А5=[a,b,c,d,e] n=5.
1)5-терок = 1 = abcde
4 = 5= abcd, abce,abde,acde, bcde
3=10=abc,abd,abe,acd,ace,ade,bcd,bce,bde,cde
2=10=ab,ac,ad,ae,bc,bd,be,cd,ce,de
2)S5=abcde;
S4=abcd+abce+abde+acde+bcde
S3=abc+abd+abe+acd+ace+ade+bcd+bce+bde+cde
S2=ab+ac+ad+ae+bc+bd+be+cd+ce+de
Усложнение: заданные элементы b,d. Тогда:
1)5-терок = 1 = abcde
4 = 3= abcd,abde, bcde
3=3=abd,bcd,bde
2=1=bd
2)S5=abcde;
S4=abcd+abde+bcde
S3=abd+bcd+bde
S2=bd
Итак, приступаем к решению:
Для начала найдем количество м-элементов в н-массиве с к-заданным количеством элементов. Используем рекурсию и факториал.
PHP:
скопировать код в буфер обмена
  1.  
  2. function factorial($x){
  3.  if($x==0){
  4.   return 1;
  5.  }else{
  6.   return $x*factorial($x-1);
  7.  }
  8. }
  9.  

И создаем ф-цию нахождения м-элементов н-массива с к-заданным кол-вом элементов
PHP:
скопировать код в буфер обмена
  1.  
  2. function calculate($n,$k){
  3.  for($i=$n;$i>$k;$i--){
  4.                 $columns[$i]=factorial($n-$k)/(factorial($i-$k)*factorial($n-$i));
  5.         }
  6.         return $columns;
  7. }
  8.  

Решение не очень красивое, но поэтому и нужна помощь. Тут чувствую тоже рекурсия должна быть, может кто подскажет.
Итак, ф-ция возвращает массив, номер элемента которого соответствует количеству м-элементво, а значение элемента - количеству соединений м-элементов.
Т.е. при n=5, к=0 columns=[5=>1, 4=>5, 3=>10, 2=>10, 1=>5].
А при n=5, к=2 columns=[5=>1, 4=>3, 3=>3, 2=>1]. Единицы опускаются, т.к. условие - минимум 2 элемента.
Дальше- больше.
Нужно найти сумму произведений. И вот тут вопрос: КАК????
Чувствую, рекурсия нужна. Т.к. без рекурсии вообще труба получается. Вот ф-ция нахождения для n=5
Тут $arg2- массив с 5-ю элементами, а $arg1-что именно мы ищем(пары, тройки и т.д)
PHP:
скопировать код в буфер обмена
  1.  
  2. function getSum($arg1,$arg2){
  3.  switch($arg1){
  4.   case 5: break;
  5.   case 4: break;
  6.   case 3: break;
  7.   case 2: for($i=0;$i<count($arg2);$i++){
  8.                 for($j=$i+1;$j<count($arg2);$j++){
  9.                    $sum2+=$arg2[$i]*$arg2[$j];
  10.                }
  11.              }
  12.    return $sum2;
  13.    break;
  14.   default: return 0;
  15.  }
  16. }
  17.  

Из примера видно, что с каждым $arg1+1 будет увеличиваться вложение for(). Поэтому это не решение, а издевательство какое-то.!!!
Может кто-то уже встречался с подобным? ПОмогите разобраться.
sphinks Отправлено: 22 Августа, 2011 - 14:55:24 • Тема: PHP работа с сокетами • Форум: Работа с сетью

Ответов: 7
Просмотров: 6983
Всем участникам огромное спасибо за помощь.
Все вылечил, разобрался со всем.
На счет читабельности проблема скрывалась в другом:
Сервер передавал с перебоями. А т.к. передавался хмл, то деструктор выдавал ошибку. Поборол недуг разглядывая последний символ в ответе.
sphinks Отправлено: 18 Августа, 2011 - 20:33:45 • Тема: PHP работа с сокетами • Форум: Работа с сетью

Ответов: 7
Просмотров: 6983
Спасибо огромнейшее за помощь. Действительно, работает с бесконечным зацикливанием.
Но вот проблемка еще появилась: не могу прочитать сообщение с сервера больше чем 12КВ. Т.е. я ему говорю: socket_read($socket,131072) (128KB), а он читает первые 12 и все ((
Читал инфу по socket_read() -ничего путного не нашел (( Может кто знает как повысить лимит читабельности ? Может кто-то знает, как бороться с этим недугом?
sphinks Отправлено: 17 Августа, 2011 - 18:52:40 • Тема: PHP работа с сокетами • Форум: Работа с сетью

Ответов: 7
Просмотров: 6983
Хе, спасибо всем за помощь. Хорошо, пальцы, клавиатура и инет работают.
Итак, вот реализация клиента для подключения к серверу
PHP:
скопировать код в буфер обмена
  1. $server = 'test.server';
  2. $port = 1982;
  3. $smes = '';
  4. $reply='';
  5. //создаем сокет для подключения ТСП
  6. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  7. // создаем соединение с сервером
  8. $connection = socket_connect($socket, $server, $port);
  9. if ($connection === false)      die("Cannot connect to server {$server}:{$port}");
  10. //отправляем сообщение
  11. socket_write($socket, $smes."\r\n", strlen($smes."\r\n"));
  12. //получаем ответ
  13. $reply = socket_read($socket,4096);
  14. //дальше ответ записывается в файл, что пропущу.
  15.  
  16.  

осталось теперь найти способ прослушивать все ответы от сервера. Т.к. информация поступает не переодично. Т.е. запрос на сервер ушел, ответ пришел. Потом через 2-3 минуты еще ответ от сервера. Как эти ответы отловить? Может кто поможет?
Мне бы как-нть зациклить, чтоб ответ читало, пока есть соединение. Пытался зациклить, клинит браузер. Помогите плиз!!! Растерялся Растерялся Растерялся Что такое? Что такое? Что такое? Что такое?
sphinks Отправлено: 02 Августа, 2011 - 17:55:48 • Тема: PHP работа с сокетами • Форум: Работа с сетью

Ответов: 7
Просмотров: 6983
Помогите разрешить проблему:
в телнете задаю коннект - соединяется с сервером по заданному порту. При отсылке сообщения, получаю ответ.
А как это описать в ПХП?
sphinks Отправлено: 18 Июля, 2011 - 15:21:55 • Тема: PHP работа с сокетами • Форум: Работа с сетью

Ответов: 7
Просмотров: 6983
Задача:
1.Подсоединиться к серверу на указанный порт (соединение ssl приветствуется).
2. Послать сообщение на сервер.
3. Получить ответ.
4. Оставить соединение открытым, т.к. сервер через некоторое (неопределенное время от 1секунды до 10 минут) начинает высылать сообщения.
5. Получить все сообщения, расшифровать.
6. Отправить ответ, что сообщения получены. Всем спасибо.
7. Закрыть соединение.

Решение:
PHP:
скопировать код в буфер обмена
  1.  
  2. $addr='mysite.com';
  3. $port=1983;
  4. //открываем соединение
  5. $fp=fsockopen($addr,$port,$errno, $errstr, 10);
  6. //если не соединилось - говорим об этом, иначе продолжаем работу
  7. if(!$fp){
  8.   echo 'Cannot to connect to server: $errstr ($errno)<br><br>';
  9. }else{
  10.   echo '<br>Connected to server....Ok<br>';
  11.   $message='<StartTest testnr="1" timestamp="600000"/>';
  12.   //высылаем сообщение серверу
  13.   fputs ($fp,$message);
  14.   echo 'Message sent.....Ok<br>';
  15.   echo 'Server answer...';
  16.   // получаем ответ
  17.   while (!feof($fp)) {
  18.      echo fgets($fp,100000);
  19.      echo '<br>';
  20.   }
  21. }
  22.  

И дальше начинаются проблемы (( Чтоб не закрывать соединение я не делаю fclose($fp); Но и не получаю ничего (( Есть ли какие-либо идеи, что можно сделать, чтоб решить задачу? Может как-то можно обновлять соединение, когда с сервера отправляются данные?
Как я понял, сокет работает так: Сервер - клиент. На серверной части работает слушатель, который реагирует на запросы клиента. Но как заставить клиента среагировать на передачу данных с сервера?
В голову приходит идея сделать так:
PHP:
скопировать код в буфер обмена
  1. while ($fp){
  2.   while (!feof($fp)) {
  3.      echo fgets($fp,100000);
  4.      echo '<br>';
  5.   }
  6. }

т.е. ждем ответа, пока открыто соединение.

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB