Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Ответы на вопросы из уроков по php
Форумы портала PHP.SU » PHP » Уроки php » Ответы на вопросы из уроков по php

Страниц (5): [1] 2 3 4 5 »
 

1. valenok - 16 Января, 2009 - 19:31:46 - перейти к сообщению
Урок № 1. Переменные


Вопросы и задания на усвоение материала:

1. $a = '22'; Какого типа является сейчас переменная $a ?
2. $b = $a = 7; чему равно $b ? не забудьте что читается в лева на право.
3. $a = '46'; $b = '32'; Что больше, а или б ?
4. Какой тип переменной лучше всего подойдёт для хранения результата деления 2 на 4?
5. $a = 5; $b=2.5; Какого типа данных будет результат деления А на Б ?
6. Попробуйте присвоить переменной значение +214748364900000000000000.
7. Выясните сколько это 2B в шестнадцатеричной системе ? ( Присвойте переменной значение и выведите )
7. Можно ли переменной присвоить переменную ? Если да - покажите как. Если нет, объясните почему нет.
9. $a='Вася'; $b = 'Петя'; Поменяйте местами значения переменных .

10. Создайте одномерный числовой массив с одним элементом.
Добавьте туда еще один элемент.
Добавьте туда третий элемент представляющий из себя ассоциативный массив с одним элементом.
Добавьте в этот ассоц. массив еще один элемент.
Замените первый элемент в родительском массиве на второй элемент из ассоц. массива.

11. Создайте переменную типа Resource



Ответы и решения

1. $a = '22'; Переменная является строкой, о чём свидетельствуют кавычки.

2. $b = $a = 7; - $b = 7; Несмотря на то, что читается с лева на право, интерпретатор присваивает переменной b то выражение которое находится с права от знака равно, и именно поэтому оно сначала проверят выражение справа. А потом подставляет $b = $a , где $a в свою очередь уже равен семи.

3. $a = '46'; $b = '32'; переменные а и б являются строками и сравнить их не получится.
С таким же успехом вы могли бы сравнивать $a='автобус'; и $b='троллейбус';

Замечание: Сравнить "автобус" и "троллейбус" можно, к строкам применимо сравнение. Только сравнится оно с учетом типа данных, то есть, в случае со строками, в порядке следования символов в таблице ASCII.

4. результатом деления 2 на 4 будет половина - дробь. А значит тип будет float

5. результатом деления 5 на 2,5 будет float. Несмотря на то, что результат деления будет целым числом - в делении участвует дробь по этому результатом деления будет нечто вроде 2/1 (дробь две первых).

6. При присвоении -214748364900000000000000 переменной, переменная принимает тип float так как его точность и диапазон больше и на экране вы увидите 2.147483649E+23

7. <?php $a = 0x2B; echo $a; ?> вывело 43. Заметьте что формат числа в шестнадцатеричной системе 0x__

8. Можно. Как в вопросе 2 или <?php $a = 1; $b = $a; echo $b; ?> выведет 1

9. <?php $a='Вася'; $b = 'Петя'; $c = $a; $a = $b; $b = $c; ?> Теперь $a='Петя'; $b = 'Вася';
Альтернативное решение предложенное Eugen'ом - не используя третьей переменной:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $a=$a ^ $b;
  4. $b=$a ^ $b;
  5. $a=$a ^ $b;
  6. ?>
  7.  

Предлагается читателям самим понять, почему код сработает и даст тот же результат.

10.
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Создайте одномерный числовой пустой массив с одним элементом.
  3. $a = Array('element'); // $a[0] = element
  4.  
  5. // Добавьте туда еще один элемент.
  6. $a[] = 'elem2'; // $a[1] = elem2
  7.  
  8. // Добавьте туда третий элемент представляющий из себя ассоциативный массив с одним элементом.
  9. $a[] = Array( 'key' => 'val' ); //  $a[2] = array(...)
  10.  
  11. // Добавьте в этот ассоц. массив еще один элемент.
  12. $a[2]['integer'] = 45; // $a[2] = Array( 'key' => 'val' , 'intege' => 45 );
  13.  
  14. // Замените первый элемент в родительском массиве на второй элемент из ассоц. массива.
  15. $a[0] = $a[2]['integer'];


11. Создать переменную типа Resource просто так не получится. Переменная этого типа представляет из себя указатель на другой внешний ресурс и нам пока неизвестно с каким ресурсом и какой памятью работать. Тип данных Ресурс существует, но о нём полностью заботится php .
2. EuGen - 16 Января, 2009 - 22:34:29 - перейти к сообщению
Урок № 2 - Немного управления.

Здесь я привожу ответы на вопросы. Надеюсь, сначала вы попробовали ответить на них самостоятельно.
0. Никогда не обязательно. else - часть, которая выполняется в случае ложности условия в if, либо если пройдены все ветки elseif и все условия там тоже были ложны. Но часть else никогда не является обязательной для определения.
1. case 2. Мы попадем в часть else, так как 5%5 равно 0, и, значит, ложно. Далее, 5>0, то есть выполнится код, стоящий после ":".
2.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. for($iData=1; $iData%1024; $iData*=2)
  4. {
  5. echo($iData%1024);
  6. }
  7. ?>
  8.  

3. Код не выполнится до конца никогда, так как условие в while будет всегда истинно. Связано это с тем, что внутри тела цикла никак не меняется переменная, которая проверяется в условии цикла. И, значит, цикл будет повторяться бесконечное число раз, так как изначально его условие истинно.
4. break(3)
5. Необходимость в break есть тогда, когда нужно, чтобы выполнялся код только для одного case - для того, который соответствует значению выражения switch. Напомню, что если нет break, то выполнится не только этот case, но и все нижестоящие.
6.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //в предположении, что $rgData - исходный массив.
  4. $rgResult=array();
  5. foreach($rgData as $key=>$value)
  6. {
  7.    $rgResult[$value]=$key;
  8. }
  9. ?>
  10.  
3. Champion - 17 Января, 2009 - 10:58:55 - перейти к сообщению
УРОК № 3. Знакомство с функциями.
1. В каком варианте (вариантах) функция объявлена синтаксически не верно? Почему?
-a- function my_func() {} - верно, всё без подвоха
-b- function _qwerty($a) {} - тоже верно
-c- function 4func($a = 4) {} - начинается с цифры, а это неправильно
-d- function func($a = 4) {} - верно
-e- function func.my($a) {} - имя функции содержит точку - неправильно
-f- function func-my($a = 4) {} - имя функции содержит минус (или тире - не важно) - неправильно
-g- function int($a = 4) {} - int - зарезервированное слово, тем не менее, такое объявление функции синтаксически верно и она будет работать
-h- function return($a = 4) {} - return также зарезервированное слово, но это оператор. Поэтому так объявлять функцию нельзя.

2. В каком варианте функция function func($a, $b = 4, &$c, $d = 5, $e = 6) вызвана неправильно? Почему? (все переменные имеют значение, функция возвращает значение)
-a- call func(1, 3, $d) - неправильно
-b- $d = func(1, 3, 5) - неправильно, потому, что третий параметр должен передаваться по ссылке, т.е. это должна быть переменная, а не константа.
-c- $d = func(1, 3, $f, 6) - верно
-d- echo func($s) - неправильно. Не все остальные параметры имеют значение по умолчанию.
-e- func(1, func(1, 3, $d), $d) - правильно.
-f- func(1, $d, func(1, 3, $d)) - неправильно по той же причине, что и в пункте b. По ссылке передаваться должна переменная
4. Dastar - 23 Января, 2009 - 00:47:40 - перейти к сообщению
Урок 0. "Уххты! А что это?" - ответы

1. Фразу "Hello World" нужно заключить в кавычки (одинарные ['] или двойные ["])


3. Перед коменнарием дожны стоять две косые черты (//)
5. valenok - 26 Января, 2009 - 20:38:49 - перейти к сообщению
Урок № 16. Работа с изображениями

Вопросы и задания на усвоение материала:

1. Наложение печати
Уверен дописать на картинке пару слов у тебя труда не составит. ПОэтому попробуем пририсовать графическую подпись. Открываем пэинт и делаем свой автограф. Получилось? Отлично.
Теперь сохраняем из гугла две фотки Памеллы Андерсон и пририсовываем к ним свою подпись.
( Подсказка: наверное полезно знать что у изображения есть такой параметр как Альфа - обозначающее прозрачность. Уверен Ctrl F по списку функций что нибудь бросит вам в глаза, хотя это вовсе не обязательно.)


2. Captcha
Сложную мы делать не будем, сделаем простую. Каждый раз выводится случайные 4 цифры.
В чём прикол? Для этого будем использоваться особый шрифт
А еще после того как наше изображение будет белого цвета с чёрным текстом , мы применим к нему фильтр негатива и на экране сделаем так чтобы оно отображалось наоборот, с чёрным фоном и белым цветом и оба изображение выводились на экран.(И всё в одном скрипте)

3. логотип php
Это заданее попроще и подлинее - нарисуйте логотип php


Решения:

1. Штамп
http://ru2.php.net/manual/ru/ima...es-watermark.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Загружаем картинку и печать
  3. $stamp = imagecreatefrompng('stamp.png');
  4. $im = imagecreatefromjpeg('photo.jpeg');
  5.  
  6. // Выбираем позции нашей печати на новом изображении. 10 пикселей от левого правого угла
  7. // что делают две других функции я уверен ты знаешь из документации
  8. $marge_right = 10;
  9. $marge_bottom = 10;
  10. $sx = imagesx($stamp);
  11. $sy = imagesy($stamp);
  12.  
  13. // Копируем печать на исходное изображение
  14. // Какие параметры и их значения ты поймёшь пролистав доку. =)
  15. imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
  16.  
  17. // Выводим новое изображение и очищаем память
  18. header('Content-type: image/png');
  19. imagepng($im);
  20. ?>
  21.  




2. captcha
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. if( !isset($_GET['generate_image']) )
  4. {
  5.  ?>
  6.   <img src='?generate_image'><br>
  7.   <img src='?generate_image&inverted'>
  8.  <?PHP
  9.  die();
  10. }
  11.  
  12.  
  13.  
  14. $captcha = rand(1000,9999); // наше случайное четырёх-значное число
  15. $img = imagecreatetruecolor(88,44);
  16.  
  17. $black = imagecolorallocate($img, 0, 0, 0);
  18. $white = imagecolorallocate($img, 255,255,255);
  19.  
  20. imagefill  ( $img  , 0  , 0  ,$white  );
  21. imagefttext  ( $img  , 16  , 0  , 5  , 15  , $black  , 'arial.ttf'  , $captcha  );
  22.  
  23. if( isset($_GET['inverted']) ) imagefilter  ( $img  , IMG_FILTER_NEGATE );
  24.  
  25. header('Content-Type: image/png');
  26. imagepng($img);
  27.  

На тот случай если у вас не работает imagefilter http://ru2.php.net/manual/ru/fun...filter.php#79551

3. логотип
Ну самый простой вариант, ну или после протрезвения

Рисовать я пока не буду, но расскажу этапы.

Создаём рисунок
закрашиваем в белый
рисуем овал
рисуем на нём текст белого цвета большого размера
в том же месте со смещением на пиксель ниже и правее рисуем тот же текст двумя размерами меньше, чёрным
Дорисовываем пару серых дуг слева вверху от овала
и парочку тёмно фиолетовых справа.
( Можно было сначала нарисовать тёмно фиолетовый овал, а на нём светлый, чтоб его закрыл
и оставил лишь немного срава, вместо рисования дуги.)
6. EuGen - 05 Мая, 2009 - 12:20:53 - перейти к сообщению
Урок № 5. Математические функции


0. Вернет true, если принять, что такие числа допустимы. Если читатель знает предмет вопроса (или не поленился заглянуть в википедию), то он знает, что трансцедентные числа - обычные вещественные числа. Но являются они корнями многочлена с иррациональными коэффициентами. Единственное что - их представление в типе float языка php сделает их уже не трансцентными вовсе. Так что - с точки зрения float функция is_nan вернет true. Если же считать, что трансцедентные числа нельзя записать представлением float, то и вообще ничего не вернет (агрумента то и не будет)
1.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class Converter
  4. {
  5.         protected $cipherSet;
  6.         protected $rgCiphers;
  7.    
  8.         protected $inputSet;
  9.         protected $outputSet;
  10.         protected $fromBase;
  11.         protected $toBase;
  12.  
  13.        
  14.         protected $iErrorCode;
  15.         protected $sErrorMessage;
  16.        
  17.         /*Submit only full cipher set*/
  18.         function __construct($strSet)
  19.         {
  20.                 $this->cipherSet=$strSet;
  21.                 $this->iErrorCode=0;
  22.                 $this->sErrorMessage="";
  23.         }
  24.         /*multiplication with non-decimal base*/
  25.         protected function baseArithmeticMult($num)
  26.         {
  27.                 $currentResultLen=count($this->rgCiphers);
  28.                 if ($currentResultLen==0)
  29.                 {
  30.                         return;
  31.                 }
  32.                 $rgMods=array();
  33.                 $currentPos=0;
  34.                 $div=0;
  35.                 do
  36.                 {
  37.                         $divided=0;
  38.                         if ($currentResultLen>$currentPos)
  39.                         {
  40.                                 $divided=$this->rgCiphers[$currentPos]*$num;
  41.                         }
  42.                         $divided+=$div;
  43.                         $rgMods[$currentPos]=$divided%$this->toBase;
  44.                         $div=(int)($divided/$this->toBase);
  45.                         $currentPos++;
  46.                 }
  47.                 while($currentResultLen>$currentPos||$div!=0);
  48.                 $this->rgCiphers=$rgMods;
  49.         }
  50.         /*addition with non-decimal base*/
  51.         protected function baseArithmeticPlus($num)
  52.         {
  53.                 $currentPos=0;
  54.                 $divided=$num;
  55.                 do
  56.                 {
  57.                         $divided+=(int)($this->rgCiphers[$currentPos]);
  58.                         $this->rgCiphers[$currentPos]=$divided%$this->toBase;
  59.                         $divided=(int)($divided/$this->toBase);
  60.                         $currentPos++;
  61.                 }
  62.                 while ($buf>0);
  63.         }
  64.         /*error's getters*/
  65.         public function getErrorCode()
  66.         {
  67.                 return $this->iErrorCode;
  68.         }
  69.        
  70.         public function getErrorMessage()
  71.         {
  72.                 return $this->sErrorMessage;
  73.         }
  74.         /*main function*/
  75.         public function baseConvert($num, $fromBase=0, $toBase=0)
  76.         {
  77.                 $num=(string)($num);
  78.                 $totalCiphers=strlen($num);
  79.                 $this->inputSet=substr($this->cipherSet, 0, $fromBase);
  80.                 $this->outputSet=substr($this->cipherSet, 0, $toBase);
  81.                 $this->toBase=$toBase;
  82.                 $this->rgCiphers=array();
  83.                 for ($currentPos=0; $currentPos<$totalCiphers; $currentPos++)
  84.                 {
  85.                         $currentCipher=$num[$currentPos];
  86.                         $cipherSign=substr_count($this->inputSet, $currentCipher);
  87.                         if($cipherSign==0)
  88.                         {
  89.                                 $this->iErrorCode=255;
  90.                                 $this->sErrorMessage="Cipher '".$currentCipher."' was not found in cipher set: ".$this->inputSet;
  91.                                 return null;
  92.                         }
  93.                         elseif($cipherSign>1)
  94.                         {
  95.                                 $this->iErrorCode=255;
  96.                                 $this->sErrorMessage="Cipher '".$currentCipher."' was found more than once in cipher set: ".$this->inputSet;
  97.                                 return null;
  98.                         }
  99.                         if ($currentPos!=0)
  100.                         {
  101.                                 $this->baseArithmeticMult($fromBase);
  102.                         }
  103.                         $this->baseArithmeticPlus(strpos($this->inputSet, $currentCipher));
  104.                 }
  105.                 $convertedNum='';
  106.                 $totalCiphers=count($this->rgCiphers);
  107.                 for ($currentPos=0; $currentPos<$totalCiphers; $currentPos++)
  108.                 {
  109.                         $convertedNum=$this->outputSet[$this->rgCiphers[$currentPos]].$convertedNum;
  110.                 }
  111.                 return $convertedNum;
  112.         }
  113. }
  114. ?>
  115.  

2. Некоторые примеры:
is_nan(sqrt(-1)) и is_finite(sqrt(-1))
is_nan(acos(2)) и is_finite(acos(2))
7. Delovoy - 12 Ноября, 2010 - 14:09:22 - перейти к сообщению
Подскажите, есть ли ответы на урок №8 ?
8. nichtraucher - 26 Ноября, 2010 - 16:44:19 - перейти к сообщению
Цитата:
1. $a = '22'; Переменная является строкой, о чём свидетельствуют кавычки.


Тогда почему код:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $a = '22';
  3. $b = '43';
  4. $c = $a + $b;
  5. echo $c;
  6. ?>

выводит число 65? Разве строки могут додаваться?
Вопрос: $a = '22'; переменная точно строка?
9. Мелкий - 26 Ноября, 2010 - 16:50:23 - перейти к сообщению
nichtraucher пишет:
выводит число 65?

+ - математический оператор. Поэтому PHP выполняет приведение типов к числу. Вот на JS вы бы получили строку 2243, т.к. там конкатенация строк плюсом работает.
10. ALEN - 03 Декабря, 2010 - 13:24:05 - перейти к сообщению
nichtraucher
в php при математических выражениях , интерпретатор сам пытается перевести строку в число - поэтому результат правильный.
11. Dmitrij - 29 Ноября, 2011 - 16:59:43 - перейти к сообщению
В задании номер 6 второго урока в цикле foreach перед $rgResult[$value]=$key; необходимо
написать unset($rgResult[$key]); Иначе в массив просто добавится еще 3 элемента.
12. vbnm - 19 Января, 2012 - 21:35:23 - перейти к сообщению
ALEN пишет:
nichtraucher
в php при математических выражениях , интерпретатор сам пытается перевести строку в число

операторы "<",">" так же приводят к такому поведению?
Однако
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?
  2. $a="vbnm";
  3. if ($a === 4)
  4.         {echo 'четыре';}
  5. elseif ($a<4)
  6.         {echo 'меньше 4';}
  7. elseif ($a>4)
  8.         {echo 'больше 4';}
  9.        
  10.        
  11. else {echo $a."это не число!";}
  12. ?>


если так, то подскажите, как правильно оформить данный код, чтобы он различал числа и строки.
13. etoYA - 20 Января, 2012 - 01:19:10 - перейти к сообщению
vbnm, неуверен, но попробуйте так:

PHP:
скопировать код в буфер обмена
  1. <?
  2. $a = 'asdd';
  3. if (is_numeric($a)) echo 'Это число';
  4. else echo 'Это строка';
  5. ?>
14. vbnm - 20 Января, 2012 - 20:14:05 - перейти к сообщению
etoYA
пасибо за подсказку, сделал два скрипта на этой основе,
Спойлер (Отобразить)


Спойлер (Отобразить)


но мне непонятно, как сделать скрипт на онове этого условия?
CODE (htmlphp):
скопировать код в буфер обмена
  1. $a === 4
Однако
ведь по факту, тут идет сравнение и по значению и по типу
15. etoYA - 11 Февраля, 2012 - 04:19:45 - перейти к сообщению
vbnm, тут не нелучится сделать такое условие.

2 варианта, либо true, либо false

 

Powered by ExBB FM 1.0 RC1