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

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


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

#11 Banderas

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

Отправлено 16 Январь 2011 - 18:29

Задача №11 ("строка из букв строки", работа со строками)

Даны 2 слова, определить можно ли из 1ого слова составить 2ое, при условии что каждую букву из строки 1 можно использовать только один раз.


Формы:
<html>
<head>
<title>Слово из букв второго слова</title>
<head>
<body>
<form action='zad11_h.php' method='post'>
<textarea name='text'>
</textarea>
<br /><input type='text' name='verb' />
<br /><input type='submit' name='ok' />
</form>
</body>
</html>


Обработчик:
<?php
!isset($_POST['ok']) ? exit : '';

$text = $_POST['text'];
$verb = $_POST['verb'];
echo "$verb => $text <br />";

empty($text) && empty($verb) ? exit : '';

for ($i=0;$i<strlen($verb);$i++) {
$smb = strpos($text, $verb[$i]); // ищем в "почве" нужный нам символ
$smb ? $check .= $verb[$i] : print("$verb[$i] !-> $text"); // создаем из символов слово (для проверки)
$text[$smb] = ''; // удаляем символ, который нашли из нашей "почвы"
}

strcasecmp($verb, $check) != 0 ? print('слово "'.$verb.'" не подходит') : print('слово "'.$verb.'" подходит');
// если образовавшееся слово совпадает с изначальным, значит из букв исходного слова можно создать нужное нам слово
?>


Только небольшая проблема, почему-то не воспринимает букву "т". С остальным вроде работает. В чем баг?
  • 0


#12 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Январь 2011 - 19:42

matroskin8, косячек у тебя в первой задаче - перевод из км/ч в м/c. А так, думаю можно и без сессий и перезагрузок страниц обходиться. Тут не критично, в нормальных задачах плохой тон.
Вообще кто-то спрашивал решения, помнится. Но плохое это дело учиться по готовому, особенно если это тривиальные задачи.

Banderas, в первом твоем посте:
код
$fp = fopen("$D_ROOT/../www/orders/orders.txt", 'rb'); // открываем файл с параметрами read
while (!feof($fp)) { // пока не достигли конца файла
$order[] = fgets($fp); // считываем построчно файл orders.txt и заполняем массив $orders[]
}
fclose($fp);

можно заменить одной строкой
$order = file($filename);

И не понятно, зачем ты указывал полный путь до файла относительно сервера?!
По выводу в удобочитаемом виде - для кого он читаем? Если для программиста - то код неудобный. Зачем использовать for с непонятными по названию переменными $k и $j, если есть foreach. Так же не понимаю, почему нельзя использовать для счетчика два раза переменную $k, циклы ведь у тебя не вложенные ;) Хотя так будет нагляднее.

По поводу задачи 6

Есть форма с одним полем и кнопкой отправки. Поле, в которое вводится ссылка заполняется пользователем и отсылается на обработку.
Файл-обработчик получает ссылку, проверяет нет ли ещё такой в базе(файле) и заносит её в конец файла.

Опять же непонятка с полным путем - зачем? Так же не понятно, зачем после нахождения уже такого элемента и выставления флага продолжаем искать далее. Нужно выйти из цикла. Так же запись лучше производить в одном месте, после проверки наличия. Кстати - указатели это не флаги ;)

По поводу задачи 13

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

Интересное решение при минимизации используемой памяти - перестановка символов, перебирая с краев.

По поводу задачи 11
Твой скрипт неимеет определенной кодировки, её лучше определить и конечно же нельзя таким образом удалять символы из строки, они превращаются в нечитаемый символ.
Вот возможное решение ;)
<?php
if(isset($_POST['ok']))
{
$text = $_POST['text'];
$verb = $_POST['verb'];
$check = "";
echo "слово <b>{$verb}}</b> получаем из слова <b>{$text}</b> <br />";

empty($text) && empty($verb) ? exit : '';

for ($i = 0; $i < strlen($verb); $i++) {
$smb = strpos($text, $verb[$i]); // ищем в "почве" нужный нам символ
if( $smb !== FALSE ) $check .= $verb[$i]; // составляем проверочное слово
else break; //выходим из цикла
$text = substr($text, 0, $smb).substr($text, $smb+1); // удаляем символ, который нашли из нашей "почвы"
}

strcasecmp($verb, $check) != 0 ? print("слово \"{$verb}\" нельзя получить") : print("слово \"{$verb}\" можно получить");
// если образовавшееся слово совпадает с изначальным, значит из букв исходного слова можно создать нужное нам слово
}
?>
<html>
<head>
<title>Слово из букв второго слова</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows1251">
<head>
<body>
<form action='' method='post'>
<textarea name='text'></textarea>
<br /><input type='text' name='verb' />
<br /><input type='submit' name='ok' />
</form>
</body>
</html>

  • 0

#13 matroskin8

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

Отправлено 18 Январь 2011 - 21:18

matroskin8, косячек у тебя в первой задаче - перевод из км/ч в м/c. А так, думаю можно и без сессий и перезагрузок страниц обходиться. Тут не критично, в нормальных задачах плохой тон.

А конкретнее можно? ;)
Скрипт тестировал перед тем, как выкладывать - считает корректно как в км/ч, так и в м/с. Расчет прост: полученный результат в первом элементе массива делим на 3,6 (3600 с\ч / 1000 м\с) и получаем результат в м/с. Например:
путь - 36 км, 
время - 1 час
скорость в км/ч - 36/1=36км/ч
скорость в м/с - 36 000 м / 3600 с = 10 м/с
ну или: 36/3.6 = получаем тот же результат - 10
Только что специально проверил скрипт с сайта - выдает правильный результат. Если косяк не в переводе, то подскажи в чем - исправим ;)
Можно и без сессий и перезагрузок, но так, по-моему, скрипт более полноценен - никуда не перебрасывает и нет проблемы F5, т.е., просто дописал к решению немного удобств. Если нужно голое решение задачи, то:
function speed($s, $t, $val){
$speed[1] = $s / $t . " км/ч";
$speed[2] = $speed[1] / 3.6 . " м/с";
return $speed[$val];
}

  • 0


#14 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 19 Январь 2011 - 12:51

matroskin8, я думал ошибка в переводе... Извини, сам ступил xD Всё норм.
  • 0

#15 matroskin8

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

Отправлено 19 Январь 2011 - 13:01

Ничего страшного - никто не застрахован от ошибок, сам частенько туплю ;)
  • 0


#16 Zvegro

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

Отправлено 21 Январь 2011 - 22:56

Я попробовал решить задачу про принадлежность к кругу и к 2 координатной четверти. Проверте пожалуйся.
http://narod.ru/disk...1/krug.php.html
  • 0

#17 FaTeRy

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

Отправлено 22 Январь 2011 - 01:01

Zvegro, Вам же написали как решение надо выкладывать.
  • 0

#18 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 22 Январь 2011 - 11:36

Я попробовал решить задачу про принадлежность к кругу и к 2 координатной четверти. Проверте пожалуйся.
http://narod.ru/disk...1/krug.php.html

Нужно оформить правильно пост!

Задача решена верно, но не рационально...
Весь этот код
					 //Проверяем на принодлежность ко II четверти.
if(($x < 0) && ($y > 0)) $osi = TRUE;
else $osi = FALSE;

//Проверяем на принадлежность к окружности в 2 этапа. Сначала по оси X.
if($x > -10) $xdop = TRUE; //X допустимое.
else $xdop = FALSE;


if($xdop != TRUE) //Если по оси X не проходит, то прнадлежность к кругу не прошла.
{
$krug = FALSE;
}
else //Если по X прошла, высчитывем допустимое по оси Y.
{
$yk = 100 - $x*$x;
$ydop = sqrt($yk); //Допустимое значение Y

if($y <= $ydop) $krug = TRUE; //Если Y допустимое подходит, то пранадлежность к кругу - истина.
else $krug = FALSE;
}

можно заменить всего одной строчкой
((sqr($x)+sqr($y) < 100) && ($x<0) && ($y>0)) ? print ("координаты $x и $y подходят к условию") : '';

радиус круга равен x2+y2=R2. Если х2+у2>R2 тогда точки/точка вне радиуса ношей окружности.
  • 0


#19 Zvegro

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

Отправлено 22 Январь 2011 - 13:10

Извиняюсь за оформление. Я более универсализировал. ;)
Чего то я сразу в условие не догадался прописать про окружность.
  • 0

#20 Zvegro

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

Отправлено 22 Январь 2011 - 13:34

А вот еще я реал задачу про английские монеты. Суть задачи в следующем. Нужно представить определенное количество пенсов в виде гиней, фунтов и шиллингов.
Гинея = 252 пенса.
Фунт = 240 пенсов.
Шиллинг = 12 пенсов.
Ввод: количество пенсов.
Вывод: в виде 5 цифр
Гиней | Шиллингов | Фунтов | Пенсов | Всего

Вот мое решение.
$money  = (int)$money2;

if($money >= 252) $gen = (int)($money/252); //Гиней
else $gen = 0;

$gen_ost = $money - (252*$gen); //Остаток от гиней

if($gen_ost >= 240) $funt = (int)($gen_ost/240); //Фунтов
else $funt = 0;

$funt_ost = $gen_ost - (240*$funt); //Остаток

if($funt_ost >= 12) $shil = (int)($funt_ost/12); //Шиллингов
else $shil = 0;

$shil_ost = $funt_ost - (12*$shil); //Остаток

$pen = $shil_ost; //Пенсов

$oll = $gen + $funt + $shil + $pen; // Всего монет

  • 0

robot

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


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