[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибка в скрипте с вложенными циклами
russiandzen
Добрый день. В качестве факультатива начал изучать PHP. Для практики решаю задачи.

Вот условие:

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

Проблема в следующем: если ставлю перебор номеров билетов в цикле от 0 до 700000, то все работает. Если увеличиваю до 1000000, чтобы перебрать все варианты, то браузер выдает ошибку HTTP500. Если не трудно, подскажите в чем причина?

Листинг скрипта:

<?php
for ($g=0; $g<1000000; $g++){
$x=0;
$y=0;
$ticket=$g;
settype($ticket, string);

for ($i=1; $i<4; $i++){
$x=$x+$ticket{strlen($ticket) - $i};
}
for ($j=4; $j<7; $j++){
$y=$y+$ticket{strlen($ticket) - $j};
}
if ($x==$y){
$kol=$kol+1;
$proc=$kol/10000;
}
}
echo $kol . "<br>";
echo $proc;
?>




























AllesKlar
Куча ошибок.
Самое первое, что тебе нужно сделать, это в самом начале скрипта прописать:
error_reporting(-1);
ini_set('display_errors', 1);

Тогда браузер не будет вываливаться с ошибкой 500, а будет выводить сами ошибки.

По ошибкам:
settype($ticket, string);
что за константа такиая string? Тип нужно указывать, как строковый парамерт. Т.е. 'string'
$x=$x+$ticket{strlen($ticket) - $i};

Начиная со второй итерации цикла, $i > 1 , тогда как strlen($ticket) == 0, тогда $ticket{strlen($ticket) - $i} - это $ticket{-1}, $ticket{-2}, $ticket{-3}
Естественно, у строки нет индекса -1, -2 и -3


_____________
[продано копирайтерам]
russiandzen
Спасибо за ответ.

Цитата
error_reporting(-1);
ini_set('display_errors', 1);


Этого не знал еще, забираю, пригодится.

settype($ticket, string);

такое написание функции приводит в своем учебнике Зольников (стр. 55). PHP мануал, пишет, что правильное написание:

settype($ticket, "string");

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

Цитата
Начиная со второй итерации цикла, $i > 1 , тогда как strlen($ticket) == 0, тогда $ticket{strlen($ticket) - $i} - это $ticket{-1}, $ticket{-2}, $ticket{-3}
Естественно, у строки нет индекса -1, -2 и -3


Если нет символа с соответствующим индексом, будет присвоен ноль, что мне и надо.

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

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

но нифига. Ради интереса увеличил кол-во итераций в 10 раз, ошибка снова появилась. Так что теперь два вопроса:
1. Где можно узнать, какое время браузер ожидает ответа сервера, прежде чем отваливается в ошибку и тупо перестает ждать.

2. Что делать в тех случаях, когда необходимо дождаться выполнения какого-нибудь тяжелого алгоритма? Периодически отправлять браузеру сообщения типа "ожидайте ответа"?



AllesKlar
russiandzen
Нужно начать не с середины, а с начала.
понятие об коннстанте, понятие об переменной, понятие об типах данных, понятие размерности типов данных.

То что написал в своем учебнике Зольников на стр. 55 - это всего лишь то, что написал в своем учебнике Зольников на стр. 55 и ни буквой больше.

А вот то, что написано в официальной документации php , это закон и никаких других вольных интерпретаций быть не может.
http://php.net/settype
Цитата
bool settype ( mixed &$var , string $type )

параметр $type - типа string.
Переменные типа string в php должны быть обрамлены либо в одинарные, либо в двойные кавычки.
Далее список допустимых значений для переменной $type
Цитата
    Допустимыми значениями параметра type являются:

        "boolean" (или, начиная с PHP версии 4.2.0, "bool")
        "integer" (или, начиная с PHP версии 4.2.0, "int")
        "float" (возможно только c PHP 4.2.0, для предыдущих версий используйте устаревший вариант "double")
        "string"
        "array"
        "object"
        "null" (начиная с PHP версии 4.2.0)


Цитата
Если нет символа с соответствующим индексом, будет присвоен ноль, что мне и надо.

А вот php говорит, что это недопустимый индекс.
И не присваивается значение не потому, что там нет значения, а потому что не присваивается из-за ошибки.
И это тебе точно не нужно.

В общем, сначала типы данных, потом константы, потом переменные, потом массивы, а потом только задачи.

Из книжки вырви страницы с задачами, остальное сожги.
php.net - вот твой источник + форумы с живыми людьми.

Цитата
1. Где можно узнать, какое время браузер ожидает ответа сервера, прежде чем отваливается в ошибку и тупо перестает ждать.

Браузер ждет ответа до тех пор, пока ответ не придет (если сервер пингуется).
а вот время выполнения скрипта зависти от настроек сервера, как правило это 60 сек., по истечении которых скрипт будет убит.

_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.