За последние 24 часа нас посетили 17667 программистов и 1709 роботов. Сейчас ищут 1717 программистов ...

Построение графика на РНР

Тема в разделе "PHP для новичков", создана пользователем dm_rut, 10 дек 2016.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @dm_rut оператор GOSUB есть только в разновидностях Basic.
     
  2. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Именно.
    Используй class и будет тебе счастье.
     
  3. dm_rut

    dm_rut Активный пользователь

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Можно пример?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    В PHP тоже есть глобальные переменные, но их нужно было бы тоже перечислить внутри sum, в дерективе global, но это плохой тон, лучше передать аргументы. Если десять - ничего страшного. Так функция не привязывается к именам $a1 и т.п.,
    Код (PHP):
    1. // и один раз вы можете её вызвать так:
    2. sum($A1, $A2, $B1, $B2);
    3. // а другой так:
    4. sum($hren1, $hren2, 45, $hren4);
    array и list я использовал, поскольку это удобно, когда возвращаемых значений несколько, можно было и без них, опять же с глобальными переменными, но это всё плохой тон. Лучше делать без global, с параметрами и возвращаемыми значениями. А вы просто упорно не хотите даже прочитать, что такое list, что такое array, что такое return и т.п., а сетуете, что язык слишком сложный и непонятный. Если бы прочитали (физику не должно быть сложно прочитать книгу по синтаксису), не возникало бы вопросов, которые вы задаёте
    --- Добавлено ---
    Ага, челу, которому сложно вызвать функцию, с ООП будет гораздо проще...
    --- Добавлено ---
    @dm_rut руководство по синтаксису php предоставили сами разработчики: https://secure.php.net/manual/ru/langref.php
     
  5. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Что-то вроде:
    PHP:
    1. class Chart {
    2.     public $A1, $A2, $A3, $B1, $B2, $B3;
    3.  
    4.     /** Построение графика CL */
    5.     public function Build() {
    6.         // Исходные данные
    7.         $pi = 3.14159;
    8.         $f = 16.3168;
    9.         for ($x=0; $x <= 650; $x++) {
    10.           $f = $f * pow(2, 1 / 64);
    11.           $w = (2 * $pi * $f);
    12.  
    13.            $this->A1 = $Rl21;
    14.            $this->B1 = $w * $L21;
    15.            $this->A2 = $Rd2;
    16.            $this->B2 = 0;
    17.            $this->Sum();
    18.  
    19.            $V1 = $this->A3;
    20.            $Z1 = $this->B3;
    21.  
    22.            $this->A1 = $Rc21;
    23.            $this->B1 = -1 / $w / $C21;
    24.            $this->A2 = $V1;
    25.            $this->B2 = $Z1;
    26.            $this->Sub();
    27.  
    28.           $y = $w / $C21 - $Rd2;
    29.           imageSetPixel($img, 20 + $x, 600 - $y, $black);
    30.         }
    31.     }
    32.     /** Сложение */
    33.     protected function Sum() {
    34.         $this->A3 = $this->A1 + $this->A2;
    35.         $this->B3 = $this->B1 + $this->B2;
    36.     }
    37.     /** Вычитание */
    38.     protected function Sub() {
    39.         $this->A3 = $this->A1 - $this->A2;
    40.         $this->B3 = $this->B1 - $this->B2;
    41.    }
    42. }
     
    dm_rut и mahmuzar нравится это.
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Нету никаких ребусов для того, кто знает язык. Вы просто язык не знаете, поэтому для вас всё ребус. Я вообще не знаю теории того дела, которое вы там пытаетесь запрограммировать, но если бы знал, вынес бы все эти формулы в осмысленные функции, типа (на примере той формулы, которую я из физики помню)
    Код (PHP):
    1. function resistance($U, $I) {
    2.     return $U / $I;
    3. }
    Смысл: каждый раз, видя вызов resistance(...) я бы знал, что здесь у меня считается на кой-то чёрт электрическое сопротивление.

    Если там нужно считать комплексные числа, то ещё проще, нашёл бы библиотеку, которая работает с комплексными числами, такие есть. Но потому что я знаю язык, мне это легко.
     
  7. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    1) Нет там никакого ООП, - просто структура с переменными и функциями.
    ООП != структура CLASS ;)
    2) Человек просто не понял разницу в области видимости переменных между бейсиком и ПХП.
    Класс позволит ему эмулировать подпрограмму в бейсике через метод. (т.е. избавится от передачи переменных через параметры)
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Глобальные переменные тоже, не дополняя теорию. Но это всё плохие советы. Если классы, то должны быть нормальные классы, а не от нечего делать запихаем алгоритм, который, как я подозреваю, на несколько сотен строк, в класс.
     
  9. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Выше я привёл пример (макет) нормального класса. ;)
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    С точки зрения PHP, но не с точки зрения ООП. Какую он абстракцию отображает по вашему? Каково состояние и поведение объекта этого класса?
     
  11. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Я же выше написал "ООП != структура CLASS".
    Каким боком здесь ООП?
    Думаю, не стоит путать тёплое с мягким.
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну вообще, классы нужны для реализации возможности строить системы с архитектурой ООП, хотя использовать их можно как угодно. Но я против такого. Вот если бы вы решали задачу с графиком, вы бы так использовали классы? Вообще, я просто не хотел грузить человека дополнительными терминами, а так бы я дал ТС ссылочки на готовые классы, работающие с теми же комплексными числами, если они здесь нужны. Ну и вообще, всё под задачу.

    Лично я бы посмотрел, что считает конкретно, в физическом смысле, каждая из этих формул, раз уж мы решаем физическую задачу, дал бы соответствующие имена функциям, может быть бы даже создал классы, если в них там есть хоть какой-то смысл, после чего бы получил стройный и красивый самодокументированный цикл.
     
  13. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Угу. Каждый язык имеет свои особенности и ограничения. И когда в них упираешься, приходится выкручиваться. :(
    Для ТС наиболее простой способ перевести код с бейсика на ПХП именно через структуру class.
    --- Добавлено ---
    Угу. Использование классов вообще заметно облегчает кодирование. Особенно, если у тебя десятки тысяч строк кода.
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Chushkin, Только нормальное использование классов
    Код (PHP):
    1. interface FunctionCalc2d
    2. {
    3.     public function calc($x);
    4. }
    5.  
    6. class ChartBuilder {
    7.     private $img;
    8.  
    9.     public function __construct() { /* ... */ }
    10.  
    11.     public function draw($x_start, $x_end, $x_step, FunctionCalc2d $calc) {
    12.         // ....
    13.     }
    14. }
    15.  
    16. class ElectricFilterCalculator implements FunctionCalc2d {
    17.     // ...
    18. }
     
  15. dm_rut

    dm_rut Активный пользователь

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Общая картина такая: на фиксированном листе с осями координат (ссылку давал) рисуются графики. Какие будут рассчитываться и отображаться выбирает пользователь, в перспективе схем будет пара десятков. Каждой соответствует свой цикл. Чем сложнее (а есть схемы с десятком элементов) - тем длиннее цикл. Формул же, к которым надо ссылаться всего 6, в самом простом случае все формулы используются, в сложных случаях они используются по несколько раз.
    Если не так, то как ещё это всё организовать?
    Да, я не разбираюсь в РНР. Хотя уже в состоянии (криво и неправильно) вывести соответствующий действительности график на экран. Хочется сделать это правильно и покороче. Не перегружая код всякими повторениями.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @dm_rut, если схему выбирает пользователь, то это прямо просится на ООП задача, но тут в двух словах не описать, вы не прочитаете всё это. А так: ну прочтите, что такое функции, что такое аргументы и т.п.

    Мой код после бейсика вас смутил по простой причине: в бейсике все переменные были глобальные, т.е. доступные по всей программе, а в php переменные бывают глобальные (доступные по всей программе) и локальные (доступные только внутри функции), плюсу функций бывают аргументы. Теоретически можно использовать глобальные переменные, но это не гут, лучше передавать данные в функцию через аргументы, как это сделал я (хотя вас и смутили "повторы" списка). А вообще, почитайте руководство по языку, тогда вы будете понимать, что делаете, а не тыкаться. Вот ещё раз ссылка: https://secure.php.net/manual/ru/langref.php. Я не буду начинать изучение немецкого языка с написания на нём технических текстов, даже если это будет целью изучения языка, я начну с изучения того, как сказать "У меня есть собачка, она красивая"
     
  17. dm_rut

    dm_rut Активный пользователь

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Про локальные переменные я догадался. Но меня вполне устроят глобальные, потому что тогда всегда в любом месте кода можно будет идентифицировать переменную. В Бейсике это было в порядке вещей и сейчас тоже подойдёт. Зато не надо будет их по много раз объявлять.

    На сайт, на который Вы даёте ссылки, я хожу регулярно. Дело в том, что понимание действительности у всех разное: кто-то изучает чистую теорию и потом генерит решения, а кто-то предпочитает разбирать гарантированно рабочие примеры и на их базе изучать теорию. Конечный результат одинаковый - путь разный.
     
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну так там написано, и как в php работать с глобальными переменными. Идёт директива global. Чтобы разбирать готовые примеры, надо знать php
     
  19. dm_rut

    dm_rut Активный пользователь

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Знать РНР есть смысл, если это поможет писать нормальный код. Хотя бы на уровне того, что я писал в глубокой молодости.
    Хороший код (как и хороший программист) отличается от плохого краткостью изложения, т.е. отсутствием балласта и бессмысленных повторений. Но представленные примеры не оставляют надежды.
    Часто это вообще похоже на бред. Сначала надо просто объявить переменные, а потом повторить ещё раз для тех, кто не понял. Через пару строк опять повторить, и ещё раз после прохождения по ссылке. Поскольку в рамках одного цикла таких обращений много, то невозможно избавиться от ощущения изощрённого издевательства.
    Та же история с повторением $this почти в каждой строке (пост 30). Трудно поверить, что это нормальное программирование.
    Нет, я конечно верю, что в РНР так принято. Поэтому один цикл доделаю так.
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @dm_rut так принято везде, кроме бейсика
     
  21. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Смешно.

    Ну так если PHP напрягает, пиши на другом языке - их много.
    C++, например, тебе подойдёт - там можно без $this. :)
     
  22. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    без $ )
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Где вы в php объявления переменных нашли? Таковых нету. В моём примере было объявление функции, а потом вызов. Одинаковые имена - это случайность, я просто не сильно понимаю, что и зачем там происходит, поэтому оставил ваши имена для сложения. Профит я вам показал - вы потом можете в вызове функции подставлять любые переменные, чего с глобальными переменными сделать не получится. Функция получилась независимая от того, что вы передаёте. Например, можно сделать так:
    Код (Text):
    1.  
    2. list($a3, $b3) = sum($a1, $b1, $a2, $b2);
    3. list($c, $d) = sum($a1, $a3, $a2, $b3);
    А с вызовом gosub в бейсике вам бы пришлось помучаться с такой задачей, там у вас выбора нету просто.
     
  24. dm_rut

    dm_rut Активный пользователь

    С нами с:
    10 дек 2016
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Да не нужно независимых функций. Туда всегда будет отправляться только один и тот же набор ($A1, $A2, $B1, $B2), а возвращаться всегда только $А3 и $В3. Для всех функций одно и то же.

    С gosub мучений нет в принципе, эта команда просто отправляет дальнейший расчёт туда, куда указано, а потом возвращает обратно. Там можно вообще ничего не писать, т.е. абсолютно, и продолжить как ни в чём не бывало.
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @dm_rut дай алгоритм на бейсике?