Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

РЕШЕНИЯ задач на PHP для начинающих

#41 Евгений

Евгений
  • Пользователь
  • 481 сообщений
  • Репутация: 0
0

Отправлено 08 Декабрь 2011 - 12:15

Dirokol, копируйте, пожалуйста, условие задачи. Т.к. обычно лень лезть в соседнюю тему и искать условие
  • 0

#42 Dirokol

Dirokol
  • Пользователь
  • 2 сообщений
  • Репутация: 0

Отправлено 12 Декабрь 2011 - 16:18

Задача №9
Написать функцию, которая будет выводить данные в календарном формате на текущий месяц. Возможно использование стандартных функций определения дней недели.
если я правильно понял задание, то выводится календарик, который можно облагородить
подцветить дни недели, выделить текущий.. и т.д.

date_default_timezone_set('UTC');
$today = array(
"year" => date(Y),//year
"month" => date(n),//month
"days" => date(t),//days in month
"N" => date(N),//day of week
);

$startday = date(N, mktime(0, 0, 0, $today['month'], 1, $today['year']));

echo "<table border=1><tr>";

for ($day = 1; $day < $startday; $day++)
{
echo "<td>"."--"."</td>";
}

for ($day=1; $day<=$today['days']; $day++)
{
echo "<td>".$day."</td>";
if (date(N, mktime(0, 0, 0, $today['month'], $day, $today['year']))%7==0)
{
echo "<tr></tr>";
}
}

$endday = date(N, mktime(0, 0, 0, $today['month'], $today['days'], $today['year']));
for ($day = $endday; $day < 7; $day++)
{
echo "<td>"."--"."</td>";
}
echo "</table>";

  • 0

#43 warchant

warchant
  • Пользователь
  • 1 сообщений
  • Репутация: 0

Отправлено 09 Январь 2012 - 21:43

Написать программу, выводящую на экран свой собственный код. Использовать функции чтения файла нельзя.
Очень заинтересовала данная задача, может кто-то сможет ее решить? Я не нашел другого варианта, как считать содержимое файла *.php с задачей и вывести на экран... но по условию нельзя читать из файла?
  • 0

#44 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 10 Январь 2012 - 00:43

Написать программу, выводящую на экран свой собственный код. Использовать функции чтения файла нельзя.
Очень заинтересовала данная задача, может кто-то сможет ее решить? Я не нашел другого варианта, как считать содержимое файла *.php с задачей и вывести на экран... но по условию нельзя читать из файла?

warchant,
на самом деле, у этой задачи есть простое и короткое решение, вот оно:

Размер вышенаписанной программы 0 байт и она точно решает поставленную задачу. ;)

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

А вот нормальный, а неголоволомочный пример, когда программа выводит _произвольный_ свой код полностью:
<?php
/*программа, которая выводит любой свой код*/
show_source(__FILE__);
/*правильная программа — это та, которая полезная*/
?>
, в нарушение условий задачи он с использованием функций чтения файла, но зато универсальный.
  • 0

#45 umv

umv
  • Пользователь
  • 1 сообщений
  • Репутация: 0

Отправлено 16 Январь 2012 - 11:34

<?php
$arr = array('a', 'bcd', 'efgh', 'ij');

$max = $arr[0];

for($i=0;$i<count($arr);$i++){
echo(strlen($arr[i]));

if (strlen($max)<strlen($arr[i])){
$max = $arr[i];}}
echo($max);
?>

Почему strlen($arr[i]) возвращает 0?
  • 0

#46 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Январь 2012 - 15:51

...
Почему strlen($arr[i]) возвращает 0?

Потому что пропущен символ доллара... правильно так: strlen($arr[$i]).
Ну и не мешало бы почитабельнее код оформлять.
  • 0


#47 neitrosha

neitrosha
  • Пользователь
  • 7 сообщений
  • Репутация: 0

Отправлено 03 Апрель 2012 - 08:28

Задача №13 ("Перевертыш", работа со строками)

Цитата
Вводиться слово, выводиться его перевертыш. Например: "перевертыш" => "шытревереп".


И я дополню тогда своим решением) Про strrev слышал, но решил просто подумать немножко и написать обычным кодом:


if(!isset($_POST['go']))
// если нажата кнопочка
		exit('no!');
  
	elseif(empty($_POST['word']))
//если не пустое слово
		exit('pusto');
	else
	{
		$word = $_POST['word'];
		$count = strlen($word);
		$i = 0;
		$count--;
// потому что нумерация массива идет с нуля
		while($count >= $i)
		{
			echo $word[$count];
			$count--;
		}
	}

Сообщение отредактировал neitrosha: 03 Апрель 2012 - 08:28

  • 0

#48 neitrosha

neitrosha
  • Пользователь
  • 7 сообщений
  • Репутация: 0

Отправлено 03 Апрель 2012 - 19:24

Задача №12 ("Палиндром", работа со строками)

Цитата
Палиндромом называют последовательность символов, которая читается как слева направо, так и справа налево. Найти во введённой строке подстроку-палиндром максимальной длины.


Работает у меня только для английских слов пока что. Можно писать со знаками препинания, но обязательно с пробелами, пока что не придумал, как сделать так, чтобы по моему коду всё нормально работало даже если нет пробелов после знаков препинания.

function chet($word, $count)
	{
		global $my_key;
		global $i;
		for($i, $count; $i < $count; $i++, $count--)
		{
// ну тут интуитивно понятно, что сравниваем, пока не дошли до середины, ведь мы сравниваем буквы по оба края
		  
			if($word[$i] !== $word[$count])
			{
				$my_key = false;
//как только наткнулись, что буквы не одинаковы, присваиваем логич переменной значение false и выходим из фун
				break;
			}
		}
		return $my_key;
	}
	function nechet($word, $count)
	{
		global $my_key;
		global $i;
		$key = ceil($count / 2);
	  
		/*  
		округлили в бОльшую сторону счетчик, деленный на 2,  
		чтобы дойти до середины строки  
		*/
		for($i, $count; $i < $key; $i++, $count--)
		{
// сравниваем по обе стороны от буквы, которая идеально посередине (torot - по обе стороны от буквы 'r')
		  
			if($word[$i] !== $word[$count])
			{
				$my_key = false;
				break;
			}
		}
		return $my_key;
	}
	function words_in_array($word, $count, &$str_len)
	// функция для занесения слов-палиндромов и их длины в массив, плюс, передаю значение по ссылке, чтобы изменялся индекс в массиве
  
	{
		global $array_of_strlen;
		$count++;
// всё-таки длина у нас с единицы начинается, а не с нуля
		$array_of_strlen[$str_len]['word'] = $word;
		$array_of_strlen[$str_len]['len'] = $count;
		$str_len++;
//увеличиваем индекс
	}
	function cmp($a, $<img src='http://www.masterwebs.ru/public/style_emoticons/<#EMO_DIR#>/cool.png' class='bbc_emoticon' alt='^_^' />
	// будет использоваться для usort
  
	{
		return strcmp($a['word'], $b['word']);
	}
  
	if(!isset($_POST['go']))
	{
		exit('no!');
	}
	elseif(empty($_POST['word']))
	{
		exit('pusto');
	}
	else
	{
		$word_f = $_POST['word'];
// присваиваем полную строку


$mas=array (','=>'', '.'=>'', '!'=>'', '@'=>'', '#'=>'', '%'=>'', '$'=>''
, '^'=>'', '&'=>'', '?'=>'', '_'=>'', '-'=>'', '+'=>''
, '''=>'', '"'=>''); // массив для замену знаков препинания пустотой

$word_f = strtr($word_f,$mas); // заменяем все знаки препинания пустотой для следующей функции
 
if ($word_f===false) exit ('В чем-то ошибка');
		$word_f = explode(" ", $word_f);
// разделяем её по знакам пробела
		$ch = 0;
// для нумерации уже в разделенном массиве
		$mas = count($word_f);
// узнаем длину массива
		static $str_len = 0;
		$array_of_strlen = array(
					  $str_len => array(
								  "word" => "",
								  "len" => ""
								 )
					 );
		for($ch; $ch < $mas; $ch++)
		// ну и от первого элемента (в нашем случае каждый элемент - слово) до последнего выполняем проверку
	  
		{
			$word = $word_f[$ch];
// $word присваиваем слово
			$count = strlen($word);
// узнаем его длину
			$key = $count % 2;
		  
			/*  
			узнаем остаток от деления, чтобы понять, какой цикл нужен - для четного  
			количества символов или для нечетного (toot и tohot, к примеру)  
			*/
			$my_key = true;
// для определения - палиндром слово или нет, используется в функциях
			$i = 0;
// для индексации массивов, которые в функциях
			$count--;
//пресловутая нумерация массивов, поэтому -1
		  
			if($key == 0)
			{
			  
				/*  
				если остаток от деления на 2 равен нулю, то выполняем функцию для четного кол-ва  
				символов  
				*/
				$my_key = chet($word, $count);
			  
				if($my_key == true)
				{
					echo 'Слово '. $word .' - палиндром<br>';
					words_in_array($word, $count, $str_len);
// запихиваем слово и его длину в массив
				}
				else
				{
					echo 'Слово '. $word .' - не палиндром<br>';
				}
			}
			else
			{
//выполняем функцию для нечетного кол-ва символов в строке  
				$my_key = nechet($word, $count);
			  
				if($my_key == true)
				{
					echo 'Слово '. $word .' - палиндром<br>';
					words_in_array($word, $count, $str_len);
// по аналогии
				}
				else
				{
					echo 'Слово '. $word .' - не палиндром<br>';
				}
			}
		}
		usort($array_of_strlen, "cmp");
// сортировка ассоциативного массива
		echo '<pre>';
		var_export($array_of_strlen);
		echo '</pre><br>';
// смотрим отсортированный массив
		$count = count($array_of_strlen);
		$count--;
// здесь я тупо вытаскиваю последний элемент из осортированного массива
		echo 'Самое длинное слово-палиндром в данной строке - '. $array_of_strlen[$count]['word'] .', его длина - '. $array_of_strlen[$count]['len'];
	}

Просьба высказать мысли и критику. Если хоть кто-нибудь прочитает это)
  • 0

#49 neitrosha

neitrosha
  • Пользователь
  • 7 сообщений
  • Репутация: 0

Отправлено 04 Апрель 2012 - 10:52

Задача №16 (Случайная строка)

Цитата
Написать функцию генерирующюю случайную строку определенной длины.


if(!isset($_POST['go'])) exit('no');
  
	elseif(empty($_POST['lenght']) || ctype_digit($_POST['lenght']) === false)
	exit('Либо пустая строка, либо ввели не число');
	else
	{
		$word = 'qwertyuiopasdfghjklzxcvbnm';
	  
		$we_want = $_POST['lenght']; // узнаем длину строки, кот. хотим
		$count = strlen($word); // длина строки, из символов которой будем создавать строку
		$count--; // так как нумерация массивов с нуля
		$it_is_a_string = ""; // строка, которая будет в итоге
			  for($i=0; $i < $we_want; $i++)
			  {
                      $key = rand(0, $count);
				  $it_is_a_string .= $word[$key];
			  }
		echo '<br> Строка длины ' . $we_want . ' - ' . $it_is_a_string;
	}

Сообщение отредактировал neitrosha: 04 Апрель 2012 - 10:54

  • 0

#50 Kosstin

Kosstin
  • Пользователь
  • 3 сообщений
  • Репутация: 0

Отправлено 10 Май 2012 - 04:55

Давно я тут не был задау 7 так никто и не выкладывает
Давно хотел что нить сотворить и вот держите
Переводить числа можно не только там из 2-ой в 10-ую или 16-ую а начиная от 2-ой заканчивая 32-ой и в любом сочетании хоть из 13-ой в 27-ую =)
Задача №7(математическая и формы)

Осуществить задачу перевода числа из одной системы счисления в другую. Есть пользовательская форма с тремя полями(число, из какой СС, в какую СС), Пользователь заполняет все поля и отправляет данные на сервер.
Пользователю должно вывестись сообщение вида:


Старая система счисления - [СС]
Число - [Число в старой СС]

Новая система счисления - [СС]
Число - [Число в новой СС]

<form method='POST'>  <!--Ну это форма тут все понятно методом пост отправляет данные на обработку на этуже страницу-->
Число <input name='ch'  value=''></input>
Из какой системы <input name='izs'  value=''></input>
В какую систему <input name='vks' value=''></input>
<input type='submit' value='Перевести'></input>
</form>
<?
function SSTOSS($ch,$izs,$vks){ //** Сама основная функция по переводу чисел (параметры ("число" "из какой системы" "в какую систему")) содержит в себе еще две функции
  function dtl($ch,$ss){ //** Функция перевода числа из десятичной системы счисления в любую другую (ф данном случае глядя на массив $sa видно что я ограничил 32-ой системой
   $sa=array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
   $sch=$ch;  //** Реализация вынуждает создать копию переменной числа в конце это будет остаток
   while ($sch>=$ss){ //** Пока остаток больше или равен системе счисления продожаем раскладывать ps почитайте как это вобще делать если есть вопросы
	$otv=$otv.$sa[$sch%$ss]; //** Если система счисления может содержать иные заки по этому нужный знак выбирается из массива $sa
	$sch=floor($sch/$ss); //** особенность расчета
   }
   $dtlch=strrev($otv.$sa[$sch]); //** Тут мы последний остаток присоеденяем к числу т.к. и переворачиваем число задом наперед
   return $dtlch; //** Собсно возвращаем ответ функции в виде переменной
  }
  function ltd($ch,$ss){ //** функция перевода из любой системы счисления в десятичную так же массивом ограничена до 32-ой
   $sa=array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
   $chislo=preg_split('//',$ch , -1, PREG_SPLIT_NO_EMPTY); //**Калдуем строку в массив так удобней работать будет(мне показалось) в данной функции идет расчет по символьно
   $i=0;
   while ($i<>count($chislo)-1){
	$otv=($otv+array_search($chislo[$i], $sa))*$ss; //** Ведем расчет и прибавляя к ответу цыферку применяем нужный символ
	$i++;
   }
   $ltdch=$otv+array_search($chislo[$i], $sa); //** Последняя циферка нужным символом к ответу
   return $ltdch;
  }
  $a=ltd($ch,$izs); //** А вот тут можно было конечно написать всякие ИФ там из 10ой в 10ую а если иные то сначало одно в 10ую а потом в которую надо
  $b=dtl($a,$vks); //** Сделал проще пусть иногда в холостую сработает зато верняк(тут это не страшно
  echo "Ваше число ( ".$ch." ) в ".$izs."-ой системе счисления преобразовано в число ( ".$b." ) в ".$vks."-ую систему счисления.";
}
$ch=$_POST['ch'];
$izs=$_POST['izs'];
$vks=$_POST['vks'];
if ($ch==''){    $ch=10;    $izs=2;    $vks=10;} //** не большая проверочка чтоб при запуске странички хоть дали ввести значения
echo SSTOSS($ch,$izs,$vks); //** ну вот и все СистемяСчисленияВСистемуСчисления =)
//** c Kosstin
?>

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru