За последние 24 часа нас посетили 17903 программиста и 1720 роботов. Сейчас ищут 1017 программистов ...

Помогите с задачкой :)

Тема в разделе "PHP для новичков", создана пользователем Mrackk3, 2 май 2015.

  1. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    Помогите, пожалуйста, чайнику huh.gif
    Реализую в php скриптах вот такую задачку: "Сколько дециметров ширина монитора с диагональю 28 дюймов, при соотношении сторон 12:9? Точность - 3 знака после запятой."

    Все цифры в задаче -переменные.

    На одной странице должна быть и форма ввода и показан результат расчета скрипта..........
    Я решил эту задачку вот скрипт:
    Код (PHP):
    1. <?php
    2.  
    3.  
    4. echo 'Задача
    5. ';
    6. echo 'Сколько дециметров ширина монитора с диагональю   a дюймов, если длинна относиться к ширине как b:c? Точность - 3 знака после запятой.
    7. ';
    8. echo '
    9. ';
    10. function clearData($data, $type='i'){
    11.    switch($type){
    12.   case 'i': return $data*1; break;
    13.   case 's': return trim(strip_tags($data)); break;
    14.    }
    15.    }
    16.  
    17. if($_SERVER['REQUEST_METHOD'] == 'POST'){  
    18. $a = clearData ($_POST['a']);             #Получаем первое слагаемое
    19. $b = clearData ($_POST['b']);             #Получаем второе слагаемое
    20. $c = clearData ($_POST['c']);
    21.  
    22. $e = 0.254;
    23. $f = 0.5;                                  
    24. $result = round ($a*$c*0.254/sqrt((pow($b,2)+pow($c,2))),3); #Действия с числами  и результат записываем в переменную
    25.     
    26. echo 'Результат: '. $result;  #Выводим результат на экран
    27.   
    28.  
    29. }
    30.  
    31. ?>
    32. <form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
    33. Диагональ монитора в дюймах - a:
    34.  
    35. <input type="text" name="a">
    36.  
    37. Длина частей - b:
    38.  
    39. <input type="text" name="b">
    40.  
    41. Ширина частей - c:
    42.  
    43. <input type="text" name="c">
    44.  
    45. <input type="submit" value="Считать!">
    46.  
    47. </form>
    Вопрос в следующем : нужно на станице, которая получилась в результате выполнения прошлого задания нарисовать прямоугольник в масштабе 1 сантиметр = 1 пиксель.
    Прямоугольник перерисовывается при поступлении новых переменных (диагональ, соотношение сторон).

    Ничего не получается, подскажите с чего хотя бы начать huh.gif??

    Рабочий скрипт есть в сети - http://zadachy.zz.mu
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Рисовать нужно именно на php или html5 Canvas тоже подходит?
     
  3. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    Да подходит!!!

    Добавлено спустя 4 минуты 23 секунды:
    Нашел вот такой код:

    Код (Text):
    1.  
    2. <?php
    3.  
    4.  
    5. // Создание изображения 200 x 200
    6. $canvas = imagecreatetruecolor(200, 200);
    7.  
    8. // Создание цветов
    9. $pink = imagecolorallocate($canvas, 255, 105, 180);
    10. $white = imagecolorallocate($canvas, 255, 255, 255);
    11. $green = imagecolorallocate($canvas, 132, 135, 28);
    12.  
    13. // Рисование разноцветных прямоугольников
    14. imagerectangle($canvas, 50, 50, 150, 150, $pink);
    15. imagerectangle($canvas, 45, 60, 120, 100, $white);
    16. imagerectangle($canvas, 100, 120, 75, 160, $green);
    17.  
    18. // Вывод и освобождение памяти
    19. header('Content-Type: image/jpeg');
    20. echo 'uuu';
    21. imagejpeg($canvas);
    22. imagedestroy($canvas);
    23.  
    24. ?>
    но не соображу как заставить при изменении данных в форме перерисовываться прямоугольник....
     
  4. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    это пхп, чтобы перерисовать треугольник, вам надо отправить на сервер новые данные через форму. Либо крутить аякс, чтоб без обновления страницы.
    А вообще на самом деле попробуйте html5 canvas
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А если всё же нужно php, то можно передать скрипту рисования прямоугольника длину и ширину в параметрах, а адрес скрипта указать в теге <img>. Скрипт, который вы нашли, вполне себе ничего.
    Код (Text):
    1.  echo 'uuu';
    я только не понял, зачем там. Если вы свою задачу смогли решить, то сможете и переделать его, чтоб он рисовал прямоугольник именно нужной ширины, взятой из параметров (подсказка: $_GET)
     
  6. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    это случайно, я что написал:) спасибо огромное что натолкнули!!!
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Лови, покуда нефиг было делать, накидал тебе рисовалку простенькую.

    Добавлено спустя 4 минуты 14 секунд:
    Да, все числа это, в твоем случае, сантиметры. Если дециметры нужны, поковыряйс, где вывод текста идет, и сам на 10 раздели, ок? Ну..чтобы не все коту масленица.
     
  8. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да, я там канвас скопипастил с другого своего проекта, и там в стилях пробито, что курсор над ним не отображается, обрати внимание на такие мелочи. А лучше просто свой канвас вбрось. Функции один фиг, от него только айдишник нужен.
     
  10. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    ok!!!

    Добавлено спустя 26 минут 9 секунд:
    а можно заставить функцию draw_rectangle взвемодействовать с вишеописаним php кодом?
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Дык при генерации кода страницы, который включает эту функцию, подставляй в вызов нужные тебе циферки. Страницу же сервер генерирует. Так генерируй что душе угодно. echo, все дела.
     
  12. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    Всем спасибо огромное за помощь !!!
    Вот результат - http://zadachy.zz.mu

    Добавлено спустя 2 минуты 18 секунд:
    Коды:
    Файл 1
    Код (Text):
    1. <!DOCTYPE HTML>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>Задача</title>
    6. </head>
    7.  
    8. <body>
    9. <h2>Задача</h2>
    10. <h3>Сколько дециметров ширина монитора с диагональю  a дюймов, если ширина относится к высоте как b:c? Точность - 3 знака после запятой.</h3>
    11. <?php
    12.  
    13. echo '<br />';
    14. function clearData($data, $type='i'){
    15.     switch($type){
    16.         case 'i': return $data*1; break;
    17.         case 's': return trim(strip_tags($data)); break;
    18.     }
    19.    }
    20.  
    21. if($_SERVER['REQUEST_METHOD'] == 'POST'){  
    22. $a = clearData ($_POST['a']);             #Получаем первое слагаемое
    23. $b = clearData ($_POST['b']);             #Получаем второе слагаемое
    24. $c = clearData ($_POST['c']);
    25. $resultWidth = round ($a*$c*0.254/sqrt((pow($b,2)+pow($c,2))),3); #Действия с числами  и результат записываем в переменную
    26. $resultWidthCM = round ($resultWidth*10);
    27. $resultHeight = round ($a*$b*0.254/sqrt((pow($b,2)+pow($c,2))),3);    
    28. $resultHeighCM = round ($resultHeight*10);
    29. echo $f = "<img src='rect.php?w=$resultHeighCM&h=$resultWidthCM'>";
    30. echo '<br />';
    31. echo '<br />';
    32. echo 'Результат ширины в дециметрах:<br /> '. $resultHeight;
    33. echo '<br />';
    34. echo 'Результат высоты в дециметрах: <br />'. $resultWidth;   #Выводим результат на экран
    35. echo '<br />';
    36. echo 'Результат ширины в сантиметрах:<br /> '. $resultHeighCM;
    37. echo '<br />';
    38. echo 'Результат высоты в сантиметрах: <br />'. $resultWidthCM;
    39. echo '<br />';
    40. }
    41.  
    42. ?>
    43. <h3>ВВЕДИТЕ ДАННЫЕ В ФОРМУ:</h3><br />
    44. <form action="<?=$_SERVER['PHP_SELF']?>" method="POST">
    45.  
    46. Диагональ монитора в дюймах - a:<br />
    47. <input type="text" name="a"><br />
    48. Ширина  - b: <br />
    49. <input type="text" name="b"><br />
    50. Высота  - c:<br />
    51. <input type="text" name="c"><br />
    52. <br />
    53. <input type="submit" value="Считать!">
    54. </form>
    55. </body>
    56. </html>
    Файл 2
    Код (Text):
    1. <?php
    2.  
    3.  $resultWidthCM = $_GET["w"];
    4.  $resultHeighCM = $_GET["h"];
    5.  
    6.  $canvas = imagecreatetruecolor($resultWidthCM, $resultHeighCM);
    7.  
    8. // Вывод и освобождение памяти
    9.  header('Content-Type: image/jpeg');
    10.  
    11.  imagejpeg($canvas);
    12.  imagedestroy($canvas);
    13.  
    14.  
    15.  
    16. ?>
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Условие:
    Сколько дециметров ширина монитора с диагональю a дюймов, если ширина относится к высоте как b:c? Точность - 3 знака после запятой.

    То есть известна только длина диагонали. Ввел только диагональ. Жмакнул "считать", выпала ошибка и ничего не произошло. Не работает.
    Зачем поля для ввода ширины и высоты? Их рассчитывать надо. Это у меня в рисовалке диагональ высчитывается автоматом из ширины и высоты по теореме пифагора. А тебе сначала надо обратное действие запилить же.

    Добавлено спустя 1 минуту 16 секунд:
    При вбивании данных от балды, рисуется просто черный квадрат. Я же тебе дал красивый рисовальник, почему его бы не заюзать ?:)
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Fell-x27, у него известно ещё отношение длины диагонали к ширине, так что это отношение. Туда надо вводить что-то типа 2:3. Иначе у вас получится одно уравнение с двумя неизвестными. Он поля неверно обозвал
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Отожблин. Так и падает юзабилити.
    И да, один фиг, ошибка при неверном вводе - косяк. Должна быть мягкая обработка.

    Тогда все работает, но моя рисовалка, имхо лучше результат выдает :)
     
  16. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    Ваша рисовалка очень классная, спасибо, гдет-о ее обязательно применю, но так как я только учусь то сообразил только с php реализацией рисования квадрата, не вышло у меня заставить вашу рисовалку рисовать то что на выходе моего скрипта....
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Даю подсказки:
    Страницы - это тупо текст. В плане вывода на страницу нет никакой разницы между JS и HTML с точки зрения PHP. Это просто буковки.

    Выполни в PHP:
    Код (Text):
    1. echo '<script>alert("Код на JS!");</script>';
    Вуаля, работает!

    Теперь так:
    Код (Text):
    1. $a = "Переменная из пыха";
    2. echo '<script>alert("'.$a.'");</script>';
    А теперь давай прикинем, является ли проблемой выкинуть на страницу JS-функцию, и ее вызов, с заранее проставленными еще на стадии генерации значениями.

    P.S. И да, вообще всю эту задачу можно сделать на JS. Как таковой, сервер тут не нужен для вычислений. Клиент справится без проблем.
     
  18. Mrackk3

    Mrackk3 Новичок

    С нами с:
    2 май 2015
    Сообщения:
    15
    Симпатии:
    0
    спасибо!!!