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

Сервис обмена электронных валют

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

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

#51 Kosstin

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

Отправлено 12 Май 2012 - 06:36

Давно я тут не был задау 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
?>

Сам же усовершенствовал
<form method='POST'>
Число <input name='ch'  value=''></input>
Из какой системы <input name='izs'  value=''></input>
В какую систему <input name='vks' value=''></input>
<input type='submit' value='Перевести'></input>
</form>
<?
$ch=$_POST['ch'];
$izs=$_POST['izs'];
$vks=$_POST['vks'];
if ($ch==''){
$ch=10;
$izs=2;
$vks=10;
}
function stos ($ch,$izs,$vks) {
   $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){
	$otv1=($otv1+array_search($chislo[$i], $sa))*$izs;
	$i++;
   }
   $sch=$otv1+array_search($chislo[$i], $sa);
   while ($sch>=$vks){
	$otv=$otv.$sa[$sch%$vks];
	$sch=floor($sch/$vks);
   }
  echo "Ваше число ( ".$ch." ) в ".$izs."-ой системе счисления преобразовано в число ( ".strrev($otv.$sa[$sch])." ) в ".$vks."-ую систему счисления.";
  }
  stos ($ch,$izs,$vks);
?>
ах да и даннмы массивом максимальной будет тридцатишестиричная система счисления XD
  • 0

#52 Kosstin

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

Отправлено 12 Май 2012 - 11:32

Что то зацепило меня этой задачей
С утра встал и в голову пришли мысли
Снова усовершенствовал код
Показываю уже только саму функцию
function stos ($ch,$izs,$vks) {
$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){
  $otv1=($otv1+array_search($chislo[$i], $sa))*$izs;
  $i++;}
  $sch=$otv1+array_search($chislo[$i], $sa);
while ($sch>=$vks){
  $otv=$otv.$sa[$sch%$vks];
  $sch=floor($sch/$vks);}
echo "( ".$ch." ) в ".$izs."-ой в число ( ".strrev($otv.$sa[$sch])." ) в ".$vks."-ую<br>";
}
тут я использовал для работы с числом массив сделав его с помощью preg split
почему то использование массива для вытаскивания значения по ключу я предположил наиболее удобным
но потом решил все так и проверить что лучше и переделал его на работу со строкой и циклом for
получилось элегантнее
function stos ($ch,$izs,$vks) {
$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="$ch";
for($i=0;$i<strlen($chislo)-1;$i++)
$otv1=($otv1+array_search($chislo{$i}, $sa))*$izs;
$sch=$otv1+array_search($chislo{$i}, $sa);
while ($sch>=$vks){
  $otv=$otv.$sa[$sch%$vks];
  $sch=floor($sch/$vks);}
echo "( ".$ch." ) в ".$izs."-ой в число ( ".strrev($otv.$sa[$sch])." ) в ".$vks."-ую <br>";
}
но разницы я большой не заметил
как я проверял:
я сделал цикл фор на выполнение миллиона итераций функции при ограничении выполнения скрипта 30 секунд
и провел не большой тест =)) сколько итераций успеет выполнить сервер пока не пройдет 30 сек
s1 скрипт со строкой и циклом фор s2 с массивом и циклом вайл
script1 выполнено итераций (тысяч) время с
s11 600 34
s12 470 34
s13 570 33
s14 540 43
s15 590 34
среднее 554 35
script2
s21 600 44
s22 460 32
s23 530 34
s24 570 34
s25 440 38
среднее 520 36
проверку производил переводом по порядку числа 10ой системы счисления в 16ую
выходит что скрипт со строкой и циклом фор выполнил в среднем на одну секунду быстрее и на 6.5% больше итераций чем цикл вайл с масивом =)
ну и несет меня чер возьми

а так же =))
далее провел тест со 100т итераций но уже просто засекая время выполнения
в данном случае переводил число 1 в 16 систему =)
и опять s1 победил в среднем s1 выполнялся 1.8 секунды а s2 2.1 секунды

кто еще подскажет как улучшить этот код?

Сообщение отредактировал Kosstin: 12 Май 2012 - 11:47

  • 0

#53 Ashmodei

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

Отправлено 18 Июль 2012 - 17:37

Всем привет!
Странно, что не обсуждалось решение задачи №8, про рекурсию... Видимо, у меня одного с ней проблемы :D

Вообщем, вот:

Задача №8(работа с каталогами)

Написать функцию, которая будет удалять каталог и всё содержимое в нём, т.е. подкаталоги и файлы.
Осуществить рекурсивный вызов этой функции в подкаталогах.

Исходные данные: path - путь удаляемого каталога


Мучаю ее уже второй день, но безрезультатно. Объясните, что тут не так?

<?php
$path1 = 'C:/www/test';
full_del($path1);
function full_del($path)
{  
	$dir = opendir($path);
	chdir($path);
	while ($obj = readdir($dir))
	{
		if (is_file($obj))
			unlink($obj);
		if (is_dir($obj) && $obj!='.' && $obj!='..')
		{
		  echo $obj, '<br>';
			full_del($path.'/'.(string)$obj);
		  @rmdir($obj);
		}	  
			
	}
  
}  
?>

  • 0

#54 Eugene An

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

Отправлено 24 Июль 2012 - 13:05

поскольку я тут немного новичек возможно у меня левый php(хотя это маловероятно) - собственно вопрос по решению первой задачи - а конкретно про этот кусок кода

<?php
echo $_SESSION
['error'];
echo $_SESSION['res'];
session_unset();
session_destroy();
?>

проверял лично ради интереса - php ругается на неопределенные индексы - вот сижу и думаю как исправить и стоит ли править.

  • 0

#55 copypaster

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

Отправлено 11 Август 2012 - 12:27

Задача №2(математическая)

Цитата

Разработать функцию вычисления факториала заданного числа (n!)
Исходные данные, передаваемые в функцию: n - число, факториал которого вычисляется.
На выходе получить результат в виде факториала числа.


Добрый всем день! Логика задачи простая, только мне этого мало. Подскажите, как проверить целое ли число ввел пользователь, ведь этого требует определение факториала. Функция is_int у меня не прошла, так как вводимое в браузер значение воспринимается как string.
  • 0

#56 Morty

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

Отправлено 16 Август 2012 - 03:07

Только начинаю учить пхп, вот с помощью Ваших задач закрепляю. Дошел до седьмой пришлось помудохаться, потому и решил выложить. (Тем болей, что в виде моего нубства в решении Kostin`а я и вовсе запутался). Все что в голову пришло: перебор или через десятичную сс, выбрал второе ибо перебором как-то уж по идиотски получается.) Итак
Задача №7(математическая и формы)
<?php
function trancetodec($number,$ccold)   //переводим в десятичную сс
{
if(!preg_match("/^[0-9a-fA-F]{1,}$/",$number)) //кое-какая, но всеж проверка
{
  echo "Вы ввели недопустимые символы";
  return 0;
}

$numarrey=str_split($number);   //Заполняем массив числом, разбитым по разрядам
$count=count($numarrey);
for($i=0;$i<$count;$i++)
{
  $repl= array('a'=>10,'b'=>11,'c'=>12,'d'=>13,'e'=>14,'f'=>15); //замена символов для шеснадцатиричной сс
  $numarrey[$i]=strtr($numarrey[$i],$repl); //собственно сама замена
  $ii=$i;		//понадобилось 2 счетчика...
  while($ii)
  {
  $numarrey[$count-1-$i]*=$ccold;  // ?????
  $ii--;
  }
}
$numarrey[$count]=0;
for($i=0;$i<$count;$i++)
{
  $numarrey[$count]+=$numarrey[$i]; //Profit
}
return $numarrey[$count];
}
function trancefromdec($number,$ccnew)   //переводим из десятеричной в нужную
{
$repl= array('10'=>'a','11'=>'b','12'=>'c','13'=>'d','14'=>'e','15'=>'f');//а вдруг 16ричная?
$u=$number;		//для вычисления предпологаемого количества разрядов выходного числа
for($counter=-1;(int)$u;$counter++)  //инт!
   $u=$u/$ccnew;
for($i=$counter;$i>=0;$i--){   //магия №2
  if($i){
   $numarrey[$i]=$number%$ccnew;
   $number=($number-$numarrey[$i])/$ccnew;
  }else
   $numarrey[0]=$number;
  $numarrey[$i]=strtr($numarrey[$i],$repl);//если 16тиричная
}
echo strrev(implode($numarrey));  //выходит перевертышь.. Из-за того, что я в обратном порядке елементы массива добавляю?
}[/size][/font][/color]


[color=#0000FF][font=verdana, helvetica, arial, sans-serif][size=3]if(isset($_GET['submit']))
trancefromdec(trancetodec($_GET['num'],$_GET['old']),$_GET['new']);
?> [/size][/font][/color]


[color=#0000FF][font=verdana, helvetica, arial, sans-serif][size=3]<form>
<table>
<tr><td><p>Из</p></td><td><select name="old"><option selected value="2">bin</option><option value="3">tri</option><option value="8">oct</option><option value="10">dec</option><option value="16">hex</option></select></td></tr>
<tr><td><p>В</p></td><td><select name="new"><option selected value="2">bin</option><option value="3">tri</option><option value="8">oct</option><option value="10">dec</option><option value="16">hex</option></select></td></tr>
<tr><td><p>Число</p></td><td><input type="text" name="num"></td></tr>
<tr><td colspan="2"><input type="submit" name="submit"></td></tr>
</table>
</form>



Будет с меня толк если учить продолжу или не мое это, кодить?)(Начал учить недели 2 назад, других языков не знаю)






поскольку я тут немного новичек возможно у меня левый php(хотя это маловероятно) - собственно вопрос по решению первой задачи - а конкретно про этот кусок кода

<?php
echo $_SESSION
['error'];
echo $_SESSION['res'];
session_unset();
session_destroy();
?>

проверял лично ради интереса - php ругается на неопределенные индексы - вот сижу и думаю как исправить и стоит ли править.


Возможно у тебя отключены куки в брузере(или session.use_cookies) и session.use_trans_sid в конфигах пхп.

Задача №2(математическая)

Цитата



Добрый всем день! Логика задачи простая, только мне этого мало. Подскажите, как проверить целое ли число ввел пользователь, ведь этого требует определение факториала. Функция is_int у меня не прошла, так как вводимое в браузер значение воспринимается как string.



раз не прошла то может брать со строки инт через intval .. или регулярным выражением отфильтровать
  • 0

#57 bonuas

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

Отправлено 19 Август 2012 - 17:02

Задача №2(математическая)


[font=verdana' date=' helvetica, arial, sans-serif']Разработать функцию вычисления факториала заданного числа (n!)[/font]
[font=verdana, helvetica, arial, sans-serif]Исходные данные, передаваемые в функцию: n - число, факториал которого вычисляется.[/font]

[font=verdana, helvetica, arial, sans-serif]На выходе получить результат в виде факториала числа.[/font]


<?php
function nfactorial($n){
if ($n<0){
echo "факториал для отрицательных чисел вычислить невозможно";
} if ($n==0) {
echo "1";
}
if ($n>0){
$z=1;
for ($i=1; $i<=$n; $i++){$z=$z*$i;}
echo "$z";
}
}
?>


  • 0

#58 Sosnovskij

Sosnovskij
  • Администратор
  • 3 883 сообщений
  • Репутация: 565

Отправлено 23 Сентябрь 2013 - 16:01

Сообщение от пользователя Armiferus

Всем привет! Не стал бы никого утруждать задачей, если бы не слишком долгие попытки решить ее. Думаю, многим будет интересно решить задачу по массивам. <br /> 1) Создать массив из трех значений: "два", "один", "три". 2) Создать функцию, которая принимает число в строке, а возвращает само число. Например, получена строка "два", а возвращается число 2. 3) Создать массив из 100 элементов. Значение каждого элемента должно высчитываться по правилу: (номер_итерации*х), где х - это число, возвращаемое функцией, созданной во втором пункте. Параметр для функции - это элемент массива, созданного в 1-ом, где индекс равен остатку от деления на 3 номера итерации. Выведите получившийся массив, используя цикл for. Создайте ассоциативный массив, где ключи имеют значения: "один", "два" и "три", а значения 1, 2 и 3 соответственно. 6) Создайте массив, как в 3-ем пункте, но без использования функции и с использованием массива, созданного в 5-ом пункте. 7) Выведите получившийся массив, используя цикл while


  • 1

Не стесняйтесь ставить оценки темам :) Правила форума. Мой блог http://sosnovskij.ru/.



#59 nazarkikalo

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

Отправлено 06 Октябрь 2013 - 15:29

Задача №3(Робота с масивамы)
1.Найти долю K = L / M, где L - количество нулевых элементов массива B (8), а M - количество нулевых элементов массива C (8).
Задача №2(Робота с масивамы)
Дано текст из маленьких латинских букв, за которым следует точка. Распечатать буквы, входящие в текст не менее двух раз.
  • 0

#60 cage

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

Отправлено 22 Ноябрь 2013 - 19:40

Привет!
Как решаются задачи типа:
"Дан массив A ненулевых
целых чисел размера 10. Вывести значение первого из тех его элементов
Ak, которые удовлетворяют неравенству Ak < A10. Если таких элементов
нет, то вывести 0."

Вывести наименьшее число - понятно, но так чтобы первого из элементов... Помогите!
  • 0

robot

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


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