Код (Text): A1=Rc21: B1=w*L21 A2=Rd2: B2=0 GOSUB "Сложение" V1=A3: Z1=B3 A1=Rc21: B1=-1/w/C21 A2=V: B2=Z1 GOSUB "Вычитание" Ud21=A3: E21=B3 E21=E21*180/pi "Мощность на Rd21" P21=Ud21*Ud21/Rd21 END "Сложение" A3=A1+A2: B3=B1+B2 RETURN "Вычитание" A3=A1-A2: B3=B1-B2 RETURN Вот тот самый кусок кода.
PHP: $сложение = '$A3=$A1+$A2; $B3=$B1+$B2;'; $вычитание = '$A3=$A1-$A2; $B3=$B1-$B2;'; $A1=$Rc21; $B1=$w*$L21; $A2=$Rd2; $B2=0; eval($сложение); $V1=$A3; $Z1=$B3; $A1=$Rc21; $B1=-1/$w/$C21; $A2=$V; $B2=$Z1; eval($вычитание); $Ud21=$A3; $E21=$B3; $E21=$E21*180/pi(); echo "Мощность на Rd21: "; $P21=$Ud21*$Ud21/$Rd21; echo $P21;
@dm_rut, а теперь зацените, как бы я этот код переписал: Код (PHP): function sum($a1, $a2, $b1, $b2) { return [$a1 + $a2, $b1 + $b2]; } function diff($a1, $a2, $b1, $b2) { return [$a1 - $a2, $b1 - $b2]; } list($V1, $Z1) = sum($Rc21, $Rd2, $w * $L21, 0); list($Ud21, $E21) = diff($Rc21, $V, -1 / $w / $C21, $V, $Z1); $E21=$E21*180 / M_PI; $P21= $Ud21* $Ud21/ $Rd21; Вот так вот передавать целые выражения в функцию вы в бейсике не имеете возможности. А тут, с аргументами, мне не нужно каждый раз перегонять переменные из пустого в порожнее.
[vs] Будет работать Ваш вариант если алгоритм будет внутри цикла, а функции вне его? Что-то у меня так вообще ничего не выводится. В бейсике ничего никуда не передаётся. Отправляется сам алгоритм, со всеми переменными и данными имеющимися на тот момент, делает указанные в функции вычисления и возвращается обратно. Там вообще не надо думать ни о чём. Отправил - получил.
Спасибо, всё работает. Можно ли функции разместить ниже алгоритма? Или надо обязательно наверху? Сейчас наберу весь алгоритм. Надеюсь график построится.
Но у меня строчек меньше в итоге. Ну сравнивать php с бейсиком некорректно, php всё-таки наследует синтаксис языка C с включениями из Perl и некоторых других языков. А С куда более мощный и разнообразный язык, чем бейсик. И [vs] специально для вас вставил eval, это по сути не функции у него, обычные строковые переменные, поэтому в этом случае обязательно наверху. стандартная функция eval выполняет содержимое строковой переменной как код. Поэтому, вообще говоря, лучше её не использовать. И на части хостингов eval может быть отключена администраторами как небезопасная.
Если в коде из поста 52 строчки 4 и 5, 6 и 7 и т.д. записывать в одну, то будет строчек тоже мало. А я так и записываю обычно. Конечно все языки разные. Но в основных моментах похожи. И даже аналог gosub-а нашёлся. В общем какая-то кривулина похожая на настоящую нарисовалась (ссылку выше давал), алгоритм работает и ссылки на функции соответственно тоже. Правда масштаб надо уточнить, но это мелочи. Попробую сегодня второй график пристроить. [vs] Спасибо!
Нормальный аналог gosub дал вам я. [vs] посмотрел видимо на вашу реакцию на нормальные функции php, и решил: ну пусть костылём пользуется. Ещё раз, это у него не функции, это обычные строковые переменные. --- Добавлено --- В своей программе [vs] так, конечно, писать не будет, я на 100% уверен, он очень профессиональный человек.
Это был способ максимально воспроизвести алгоритм из бейсика. На php так не пишут конечно =) Преимущества функций более очевидны, когда код занимает несколько экранов. Кстати, php не интерпретируется, а компилируется при выполнении в оптимальный бинарный код, поэтому оверхеда при многократном вызове функций не возникает, а вот с eval() возникает, т.к. код, извлеченный из переменной, требует отдельной компиляции.
Жаль, что [vs] вообще никак не будет писать в своей программе. Во всяком случае не написал ещё до сих пор. А я написал, не без помощи, конечно. Поэтому все, когда возникнет потребность воспользоваться графическим отображением своих идей, обратятся к "неправильному" коду. А к "правильному" не обратятся, потому что не смогут найти. Соответственно применительно этой отдельно взятой задаче можно утверждать, что так, как предложено в посте 52 пишут, а так как в посте 53 - не пишут. Хотя конечно оба кода работают, я проверял. Дело в том, что алгоритм сложный, а случаях хитрых схем - пипец какой сложный, так ещё и единственно возможный. Поэтому там комментариев больше чем самого кода, приходится подписывать каждый блок из четырёх действий (записанный в две, либо четыре строчки), а так же каждую ссылку на формулу, указывая что конкретно с чем складывается, вычитается или ещё что-либо делает. Без комментариев элементарно запутаться, а через пару месяцев вообще будет проще всё заново построить, воспользовавшись в качестве шпаргалки кодом в бейсике. А как комментировать "правильный" код - я не представляю. Например строчка 12 что делает? Хотя с математической точки зрения всё правильно.
diff переводится "разница", можно было ещё назвать subtraction - вычитание, может даже было бы более правильно. И код самодокументированный. По поводу имён переменных - я так предположил, что эти же буквы используются в физике для работы с этими величинами, поэтому читающий и знакомый с предметом немного человек поймёт, что там за формулы использованы. К тому же, всегда можно посмотреть, а что делает какая функция. В современных средах разработки это два клика мыши. Что делает оператор list(..) поймёт любой знакомый с php человек, и догадается, что функция справа возвращает массив. --- Добавлено --- Хотя, если бы я реально решал эту задачу, я бы выносил не действия типа сложения/вычитания в отдельные функции (хотя может быть и их тоже), а именно куски, которые считают что-то конкретно физическое, т.е. функции у меня бы назывались типа "посчитать сопротивление контура", "посчитать разницу потенциалов" (от балды взял, что помнится из курса физики, что конкретно здесь происходит с точки зрения физики, я не знаю, но идея, надеюсь, ясна). Есть правило программирования: если код требует комментария, он должен быть вынесен в отдельную функцию.
Да, Вы правы. Именно эти обозначения и именно такой алгоритм используются в книгах, поэтому опасно что-либо менять. Всё равно хитросплетения кода забываются, а соответствие его учебнику позволяет легко всё распутать, взяв тот самый учебник. Например я всего за 5 минут составил рабочий алгоритм для схемы LC по аналогии со схемой CL, которую мы совместными усилиями тут собрали. Это потому что всё свежо в памяти. Если бы делал его через пол-года, то потратил бы 10-15 минут, добавляется время на поход к полке и поиск нужной книжки. А если бы код был бы "правильный", то не знаю справился ли. Теперь надо сделать выбор какая кривая будет выводиться на экран. Ссылка На странице такие строчки с чекбоксами: HTML: <input type="checkbox" name="p" value="p1">считать Р<Br> <input type="checkbox" name="e" value="e1">считать Е ...... <input type="checkbox" name="p" value="p2">считать Р<Br> <input type="checkbox" name="e" value="e2">считать Е Среднюю схему пока пропускаем. Это сам код: PHP: Построение графика LC for (; $x <= 670; $x++) { $f = $f * pow(2, 1 / 64); $w = (2 * pi() * $f); .... тут алгоритм $y = $Yp * $P1 * $SYp; $ye = 182 - $E1 * $SYe; imageSetPixel($img, 20 + $x, 600 - $y, $black); imageSetPixel($img, 20 + $x, 600 - $ye, $black); } Построение графика LC for (; $x <= 670; $x++) { $f = $f * pow(2, 1 / 64); $w = (2 * pi() * $f); .... тут алгоритм $y = $Yp * $P2 * $SYp; $ye = 182 - $E2 * $SYe; imageSetPixel($img, 20 + $x, 600 - $y, $black); imageSetPixel($img, 20 + $x, 600 - $ye, $black); } Как сделать правильно вывод imageSetPixel в зависимости от поставленной галочки? Надо наверно первый $y назвать $yp, чтобы было всё красиво, сделаю потом обязательно.
Вот этим отличается навороченный РНР от старого и примитивного бейсика. В бейсике не было возможности ставить галочки, но можно было присваивать действию либо единицу, либо ничего или любое другое значение. Перед строкой вызывающей печать прописать "IF например р1 ≠ 1 THEN GOTO мимо этой строки" или весь алгоритм пропускать. И ВСЁ! Жуткий примитив, пользуются только динозавры, но это работает. А в крутом РНР замучаться можно всё везде присваивать и назначать. И не работает потому что что-то где-то не сходится, то ли скобки не там, то ли кавычки не те, а чтобы узнать как правильно - надо идти изучать теорию.
Ну вы просто для старого доброго бейсика изучили теорию PHP на самом деле очень простой язык для ограниченного круга задач, на нас (кто пишет только на php) другие программисты свысока, особенно какие-нибудь крутые сиплюсплюсеры (типа моего знакомого, который разрабатывает ПО для подводных лодок) Как работают чек-боксы - это надо знать особенности браузеров. Для неотмеченного чек-бокса браузер просто не передаёт параметра в запросе, так что тут PHP не причём, так работает браузер, и в любом языке нужно проверять именно, пришло ли соответствующее поле в запросе. В php это делается через операцию проверки существования: Код (Text): if (isset($_REQUEST["p"])) { // Делать то, что надо, если отмечена галочка p } Об этом написано в любой книге по веб-программированию
Тру стори: у подъезда на новой хате по вечерам тусуется группа молодых людей в адидасе. По началу меня это напрягало, пока проходя мимо в очередной раз, не услышал "зашифровано в эм дэ пять".
Не изучал я теорию бесика - делать мне больше нечего. Достаточно было просто посмотреть как писать конкретную команду. В PHP так работать будет? PHP: //Построение графика LC for (; $x <= 670; $x++) { $f = $f * pow(2, 1 / 64); $w = (2 * pi() * $f); .... алгоритм расчёта $P2 и $E2 if (isset($_REQUEST["p2"])) { imageSetPixel($img, 20 + $x, 600 - $Yp * $P2 * $SYp;, $black); } if (isset($_REQUEST["e2"])) { imageSetPixel($img, 20 + $x, 300 - $E2 * $SYe;, $black); } } Сократил пару лишних переменных и строчек заодно.
Должно, попробуйте. Только я бы лучше здесь сделал radio, поскольку чекбоксы можно выбрать одновременно. Ну тут я точно вашей задачи не знаю
Чекбоксы можно выбирать в произвольном порядке. Что нужно в чекбоксах добавить и что изменить в коде? На странице прописано так: HTML: <form action="" onsubmit="return sub(this);"> <table> ... Ввод всех переменных ... чекбоксы соответствующие, например: <input type="checkbox" name="p" value="p2">считать Р </table> </form>
Совет выше не работает. Если бы была оперативная обратная связь, то возможно его можно было бы оживить, но ... В код ближе к началу вставил это: PHP: if (isset($_GET["p"])) $p = $_GET["p"]; else $p = 'p1'; В первый алгоритм это: PHP: if ($p == 'p1') { imageSetPixel($img, 20 + $x, 600 - $Yp * $P1 * $SYp, $black); } А во второй это: PHP: if ($p == 'p2') { imageSetPixel($img, 20 + $x, 600 - $Yp * $P2 * $SYp, $black); } На чекбоксы всё равно не реагирует, но хотя бы реагирует на изменение в верхнем блоке. Если там в конце стоит р1, то кривая Р1 отображается, если р2, то не отображается ни Р1 ни Р2. Про совет читать теорию я не забываю. Многие примеры с рекомендованного тут сайта вообще показывают ошибку при копировании их в дримвивер, остальные не дают желаемого результата. Как постигать теорию без примеров - не знаю. Мне что, читать только текст, на примеры не смотреть, а набирать самостоятельно? Пробовал: так тоже ничего не работает.
дримвивер - это не php, плевать что он говорит. Надо смотреть, какая версия php на сервере. Ну и плюс отладку никто не отменял. var_dump, var_export, die. http://phpfaq.ru/debug#debug. По двум кускам кода не могу сказать, что у вас не так. Теоретически я вам правильно рассказал, как работают чекбоксы
Это я читал. Что с того, что есть ошибки. Это я и так знаю. Про то, что их надо исправлять тоже знаю. И пытаюсь их исправить сегодня целый день. Ещё вчера начал. Вопрос в том: что надо прописать вокруг команды imageSetPixel чтобы её функционирование зависело от соответствующего чекбокса. Если кусков кода недостаточно - могу весь выложить, но это ничего не даст, там ничего относящегося к вопросу нет. Подозреваю что чего-то не хватает, узнать бы чего. Код с чекбоксами можно посмотреть в посте 69. Там обычная таблица, данные вводятся и работают, чекбоксы видимо нет. Далее есть ещё это: HTML: <img id="myimg" border="0" style="width:718px; height:620px;" src="script.php" alt="" /> <script type="text/javascript"> function sub (f) { // получим значения полей ввода из формы var U = f.U.value; var L11 = f.L11.value; var Rl11 = f.Rl11.value; var C11 = f.C11.value; var Rd1 = f.Rd1.value; ..... и т.д. // здесь нужно проверять x1-2 и y1-2 на правильность, т.е. что бы были цифрами и не были пустыми if ( U == "" || L11 == "" || Rl11 == "" || C11 == "" || Rd1 == "" || R21 == "" || C21 == "" || L21 == "" || Rl21 == ""|| Rd2 == "" ) { alert ("Заполните все поля ввода !"); return false; } //формируем GET запрос var get = "?U="+U+"&L11="+L11+"&Rl11="+Rl11+"&C11="+C11+"&Rd1="+Rd1+"&R21="+R21+"&C21="+C21+"&L21="+L21+"&Rl21="+Rl21+"&Rd2="+Rd2; document.getElementById("myimg").src = "script.php"+get; return false; } </script> Это всё. Сам script выкладывал уже неоднократно (например пост 67). Таких блоков несколько, отличаются цифрами после букв в переменных, в результате получаются Р1 и Е1, Р2 и Е2 и т.д. которые и определяют где по высоте будет печататься точки кривых. Надо всего лишь дать пользователю возможность выбирать те, которые ему нужно. Что не так?
Ну так, видите, вы же не сказали (а я на сайт не лез смотреть, ибо тоже, как вы понимаете, не бездельничаю целыми днями, отвечая здесь на вопросы), что вы строку get-запроса формируете через javascript, да ещё и вручную. jQuery вы не пользуетесь? Предлагаю включить, поскольку там есть удобная очень функция для формирования такой строки с учётом всех особенностей. С использованием jQuery строку 18 можно будет написать как Код (Javascript): var get = "?" + $(f).serialize() Просто ваша строка, сформированная вашим кодом, элементарно не содержит данных о чекбоксах никаких. Почитать про jQuery: http://jquery.com/
Подключил. Строку 18 заменил. Ничего не изменилось. jQuery видимо работает поскольку форма кривой графика сохранилась. Чекбоксы не функционируют как и раньше. Что ещё надо сделать? Это показательный пример. Если предположить, что я сам бы нашёл в какой-нибудь книжке про jQuery и подключил, то после отсутствия результата - снёс бы и вернулся к предыдущему состоянию. Именно так я последние два месяца изучаю теорию РНР. Перелопачено куча информации, практически ничего не работает.
Ну так надо посмотреть. Дайте ссылку, где не работает, я за вас вживую посмотрю чего передаётся. Мои мозги - всё-таки не интерпретатор JavaScript.