Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема в разработке 2 алгоритмов

244
13 февраля 2008 года
UAS
2.0K / / 19.07.2006
Вот дошел до одной части в работе, и никак не могу сообразить с двумя вещами.

1) Вывод навигации
Вообщем так-то сложностей никаких нет, но есть одно НО. Выводятся не все страницы, а только определееное число, остальное опускается. Ну например как на этом форуме исталка страниц.

Код:
/** string BuildNavigation($sumOfEntries,$entriesPerPage,$startEntry,$unitsInNavbar,$tpl,$params=2);
 * Возврщает постороенную строку из ссылок
 * return: string
 */

function BuildNavigation($sumOfEntries,$entriesPerPage,$startEntry,$unitsInNavbar,$tpl,$params=2) {
    /**============================================
     * integer $sumOfEntries - количество всех записей
     * integer $entriesPerPage - записей на странице
     * integer $startEntry - с какой записи начинается станица
     * integer $unitsInNavbar - кол-во ссылок для листалки ( если равно 2, то выводится все)
     * array $tpl = array(
     *     ['first_page'] - шаблон для ссылки на первую страницу,
     *     ['last_page'] - шаблон для ссылки на последнюю страницу,
     *     ['link'] - шаблон для ссылок,
     *     ['current']  - шаблон для текущей страницы,
     *     ['delimiter'] - шаблон для разделителя ссылок
     * );
     * integer $params = параметры вывода данных
     **============================================*/


    $countUnits = ceil($sumOfEntries/$entriesPerPage); // суммарное кол-во страниц
    $currentUnit = floor(($startEntry/$entriesPerPage)/$unitsInNavbar); // текущая страница

    // здесь вся загвоздка
    #$startUnit = $currentUnit
   $endUnit = $startUnit + $unitsInNavbar;
}

надо вычислить юнит(ссылка), с которого будет начинаться листалка. Вот. И никак не могу сообразить алгоритм. Так как если делать в лоб (т.е. перебирать циклом, прибавлять кол-во юнитов справа или слева) тогда возникает много условностей. Думаю, есть какой-то алгоритм, но чето я так и не сообразил...

Просьба кто знает алгоритм - напишите немного, собъяснением)

2) входит integer число, которое является суммой значений параметров. Разбить сумму и найти исходные числа

Криво наверно описал в названии, поэтому стоит привести пример:
[QUOTE="Пример"]
ряд чисел:1,2,4,8,16,32,64,...
сумма любых чисел из ряда всегда уникальна. думаю многие знают такое)

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

для примера - права файлов в юниксах. (цифрами: 1,2,4. сумма парситься и соответствующие права выставляется)

или в php error_reporting($param); в $param можно передать:
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
[/QUOTE]
так вот не могу сообразить, каким алгоритмом пропарсить входящую сумму чисел:confused:
15
13 февраля 2008 года
shaelf
2.7K / / 04.05.2005
По поводу второго... Если я правильно понял, то тебе подойдёт метод, которым я права проверяю...
Код:
/**
     * Проверяет, имеет ли пользователь необходимые права
     *
     * @param User $u
     * @param int $role
     * @return bool
     */

    public static function isAccess(User $u, $role)
    {
        return ($u->_role !== null && ($u->_role | $role) == $u->_role);
    }


По поводу первого... Возьми исходники любого форума и посмотри :)
5.1K
13 февраля 2008 года
saturn61
108 / / 25.10.2006
2shaelf, по мойму UAS не про это ;)
По поводу второго, как я понял тебе нужно вот это...
Код:
<?php
// $p - сумма
// $k - степень двойки
// $n - временная переменаая
// $n=$n>>1  -  целочисленное деление на 2
function pars($p){ //Функция которая собственно все делает, рекурсивная
 if ($p%2==0){
  $k=0;
  $n=$p;
  while($n%2==0){
   $n=$n>>1;
   $k++;
  }
  $chis=1;
  for ($i=1; $i<=$k; $i++){
   $chis=$chis*2;
  }
  echo "$chis<br>"; //Вот сдесь необходимо записать как то это число в массив $param, но почему то у меня функция его не видит, поэтому просто вывожу на экран
// А надо что то в виде $param[]=$chis, в итоге будет массив с числами, нулевой элемент которого есть сумма его элементов
  $p=$p-$chis;
  if ($p<>0){
   pars($p);
  }
 }else{
  echo "1<br>";
  if (($p-1)%2==0){
   pars($p-1);
  }
 }
}

//////////////////////////////////////////////////////////////////////////////
////                             ФОРМА ОТПРАВКИ ЧИСЛА                  //////
//////////////////////////////////////////////////////////////////////////////
if (isset($_GET['send'])){
 $param[0]=$_GET['num'];
 pars($param[0]);
}else{
 echo "
 <form action='parsit.php' method=get>
  <input type='text' name='num'>
  <input type='submit' name='send' value='varificate'>
 </form>
 "
;
}
?>

Вот рабочий код, тупо залей в новый пхп файл и проверь :)
5.1K
15 февраля 2008 года
saturn61
108 / / 25.10.2006
аффтар, ты гдде?
ап
244
15 февраля 2008 года
UAS
2.0K / / 19.07.2006
Да тут я) Просто руки не дойдут сесть да проверить все это дело)
5.1K
15 февраля 2008 года
saturn61
108 / / 25.10.2006
Ы, ну эт дело работает, тут тока надо как то из функции данные в массив записать) пока хз как это делать(
244
15 февраля 2008 года
UAS
2.0K / / 19.07.2006
saturn61, спс) Пашет) Ну а насчет того, чтоб данные заносились в массив - это легко) Короче вот готовая функция. Правда перписал, как мне удобней

Код:
function parseIntegerSum($sum,&$Output) {
    if($sum%2 == 0) {
        //$k - степень двойки
        // $n=$n>>1  -  целочисленное деление на 2
        for($k=0,$n=$sum; $n%2==0; $k++) $n=$n>>1;
        $item = 1;
        for($i=1;$i<=$k;$i++){
            $item = $item*2;
        }
        array_push($Output,$item); // пихаем полученный ответ в массив
        $sum = $sum-$item;
        if($sum != 0) parseIntegerSum($sum,&$Output);
    } else {
        if( ($sum-1)%2 == 0 ) parseIntegerSum($sum-1,&$Output);
    }
}


// используешь так:
$array = array();
parseIntegerSum(127,&$array);

// в $array будут все эти числа
5.1K
17 февраля 2008 года
saturn61
108 / / 25.10.2006
ООоо, UAS, спс, я терь знаю как не только в функцию вводить, но и выводить)))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог