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

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


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

#1 Banderas

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

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

Есть тема Задачи на PHP для начинающих. Решил создать тему, в которой будут РЕШЕНИЯ задач на PHP для начинающих. Конечно же в теме могут быть обсуждения, поправки, дискуссии и так далее. Поэтому для того, что бы визуально лучше воспринимать задачу, предлагаю оформлять решения задач следующим образом.

1) копируем название задачи с темы "Задачи на PHP для начинающих". Цвет #0000FF, размер шрифта 3.
[size="3"][color="#0000FF"]Задача №4(работа с файлами)[/color][/size]
2) копируем условие задачи как цитата
3) вставляем код решения задачи. Желательно с комментариями. Можно алгоритм и т.д. по желанию.. Обязательно!!! использовать подсветку кода

Может как-то скрыть код? Что бы смотреть решение именно той задачи, которая интересует.
И ещё, чуть не забыл. Если вы решили задачу, и ваш код (алгоритм решения) задачи не идентичен коду, который уже существует в данной теме, решение задачи можно ещё раз постить. Все знают, что программирование позволяет решать задачи несколькими способами, именно за это я люблю кодить))

Пожалуй я начну. Я делал не по книгам, но это почти аналог.

Задача №4(работа с файлами)

Имеется файл с содержимым (книга|автор|издательство|состояние) например:
PHP 5 объектно-ориентированное программирование|Шишов Алексей|БХВ|1
MySQL: неподъемная книга разработчика|Шишов Алексей|БХВ|0
Справочник всего Г в России|Пупкин Вася|Пупкин и к0|1
Книга для домохозяек|Хозяйка Лидия|Домхоз|1
Телевидение в каждой коморке|Телестанция СССР|КВС+|0


Нужно написать 3 функции.
1) Функция, считывающая из файла построчно данные и разбила их на многомерный массив вида:
array(
array(title => [книга], author => [автор], print => [издательство], status => [состояние]),
array(title => [книга], author => [автор], print => [издательство], status => [состояние]),
array(title => [книга], author => [автор], print => [издательство], status => [состояние]),
);

Выходные данные: массив книг.
2) Функция, обрабатывающая массив книг и возвращающая книги с запрошенным состоянием. Поле состояния отвечает за публикацию, опубликована книга или нет.
3) Функция, выводящая список книг в удобочитаемой форме.


Решение задачи..
у нас есть файл orders.txt с содержимым
01:44:46 31st	3 покрышек	2 масла	12 свечей	 всего: $441.6	
01:45:30 31st	12 покрышек	4 масла	34 свечей	 всего: $1651.2	
19:45:58 1st	3 покрышек	5 масла	23 свечей	 всего: $530.4	
19:48:39 1st	5 покрышек	34 масла 	1 свечей	 всего: $1012.8	
20:01:10 1st	32 покрышек	1 масла	12 свечей	 всего: $3909.6	
20:01:10 1st	32 покрышек	1 масла	12 свечей	 всего: $3909.6	
20:04:36 1st	2 покрышек	23 масла 	45 свечей	 всего: $732
разделитель я выбрал не самый лучший, но переделывать не хотелось, такой я ленивый))

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

echo "<pre>";
print_r($order); // выводим наш массив
echo "</pre>";


3) Выводим данные в удобочитаемом виде
<html>
<head>
<title>Обзор заказов</title>
</head>
<body>
<h2>Автозапчасти от Боди;)</h2>
<h3>Заказы клиентов</h3>
<?php
$header = array('Дата', 'Покрышки', 'Масла', 'Свечи', 'Сумма');

echo <<<HTML
<table border='0' cellspacing='10'>
<tr bgcolor='e7e7e7'>
HTML;

foreach($header as $key => $value) echo "<td>$value</td>";
echo "</tr>";

$D_ROOT = $_SERVER['DOCUMENT_ROOT'];
$orders = file("$D_ROOT/../www/orders/orders.txt"); // file() заносит данные из указанного файла в массив
н
for ($i=0;$i<count($orders);$i++) {
$line = explode("\t", $orders[$i]); // разбиваем строку на подстроки, которые отделены знакому табуляции \t
for ($k=1;$k<4;$k++) $line[$k] = intval($line[$k]);
echo "<tr>";
for ($j=0;$j<count($line);$j++) echo "<td>$line[$j]</td>";
echo "</tr>";
}
echo "</table>";

?>
</body>
</html>


2) не делал, в этом ничего сложного нет, простое условие. В своей задачи у меня небыло такой цели, поэтому не делал. Хотя если будет время, то на днях допишу.

 

 

  • 0

#2 matroskin8

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

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

Решил поддержать тему ;)
Ну, и решил первую задачу :)
Итак, Задача №1(математическая)

Рассчитать скорость движения машины и вывести её в удобочитаемом виде. Осуществить возможность вывода в км/ч, м/c.
Исходные данные: Пройденный путь - S; Время движения - t.
Представить решение задачи с помощью одной функции.

Решение задачи:
1) сама функция будет такой:
function speed($s, $t, $val){
$speed[1] = $s / $t . " км/ч";
$speed[2] = $speed[1] / 3.6 . " м/с";
return $speed[$val];
}

Функция имеет 3 аргумента - пройденный путь, время движения и 3-ий аргумент отвечает за пользовательский вариант вывода расчета (км/ч или м/c). В массив $speed попадает 2 варианта расчета, а возвращает ф-ция 1 вариант в зависимости от того, что выбрал пользователь.
2) осуществляем минимальную проверку полученных данных:
if(!empty($_POST['submit'])){
if($_POST['S'] <= 0 || $_POST['t'] <= 0){
$_SESSION['error'] = '<strong><em>Число должно быть больше нуля</em></strong>';
header("Location: index.php");
exit();
}else{
$_SESSION['res'] = "<strong><em>" .speed($_POST['S'], $_POST['t'], $_POST['val']). "</em></strong>";
header("Location: index.php");
exit();
}
}

Если попало что-то кроме числа с плюсом (1, 2, 50.5 и т.д.) или ноль, то нам это не подходит и в сессионную переменную error мы заносим соответствующее сообщение. Если число нас устраивает, то в $_SESSION['res'] заносим результат работы ф-ции.
3) выводим результат и уничтожаем сессию:
<?php
echo $_SESSION['error'];
echo $_SESSION['res'];
session_unset();
session_destroy();
?>

4) ну и код самой формы:
<form method="post" action="">
<table>
<tr>
<td>Пройденный путь (км):</td> <td><input type="text" name="S" /></td>
</tr>
<tr>
<td>Время движения (ч):</td> <td><input type="text" name="t" /></td>
</tr>
<tr>
<td><input type="radio" name="val" value="1" checked="checked" /> км/ч</td> <td><input type="radio" name="val" value="2" /> м/с</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" value="Рассчитать" /></td>
</tr>
</table>
</form>

Вот полный код скрипта:
<?php
session_start();

function speed($s, $t, $val){
$speed[1] = $s / $t . " км/ч";
$speed[2] = $speed[1] / 3.6 . " м/с";
return $speed[$val];
}

if(!empty($_POST['submit'])){
if($_POST['S'] <= 0 || $_POST['t'] <= 0){
$_SESSION['error'] = '<strong><em>Число должно быть больше нуля</em></strong>';
header("Location: index.php");
exit();
}else{
$_SESSION['res'] = "<strong><em>" .speed($_POST['S'], $_POST['t'], $_POST['val']). "</em></strong>";
header("Location: index.php");
exit();
}
}
?>

<h3><ins>Рассчет скорости</ins></h3>

<?php
echo $_SESSION['error'];
echo $_SESSION['res'];
session_unset();
session_destroy();
?>
<form method="post" action="">
<table>
<tr>
<td>Пройденный путь (км):</td> <td><input type="text" name="S" /></td>
</tr>
<tr>
<td>Время движения (ч):</td> <td><input type="text" name="t" /></td>
</tr>
<tr>
<td><input type="radio" name="val" value="1" checked="checked" /> км/ч</td> <td><input type="radio" name="val" value="2" /> м/с</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" value="Рассчитать" /></td>
</tr>
</table>
</form>

  • 0


#3 admin

admin
  • Пользователь PRO
  • 5 272 сообщений
  • Репутация: 54

Отправлено 14 Январь 2011 - 17:25

matroskin8 и Banderas, я не уверен, что нужны решения. Обычно толку от них мало, так как люди быстро сдаются и подглядывают в решения, когда лучше дольше подумать и решить самостоятельно.
  • 0

Сколько лет прошло, а ссылки всё ещё лучше покупать тут



#4 matroskin8

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

Отправлено 14 Январь 2011 - 17:41

matroskin8 и Banderas, я не уверен, что нужны решения. Обычно толку от них мало, так как люди быстро сдаются и подглядывают в решения, когда лучше дольше подумать и решить самостоятельно.

Ну это как посмотреть ;) По себе знаю, что если мне интересно решить какую-то задачу (именно для себя, чтобы чему-то научиться), то в решения я полезу только тогда, когда промучаюсь довольно долго и дойти до решения самостоятельно у меня просто не получится... вот тогда для меня решение будет совсем не лишним.
  • 0


#5 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 14 Январь 2011 - 17:52

Решения интересны в тех случаях, когда обсуждаются они
  • 0

#6 matroskin8

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

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

Решения интересны в тех случаях, когда обсуждаются они

Согласен ;) поэтому Banderas и писал:

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

Кроме того, вполне возможно, что кто-то решает задачи темы и, решив какую-либо задачу, захочет сравнить свое решение с решением из этой темы... вполне возможно, что он увидит решение задачи другим способом и почерпнет для себя, соответственно, что-то новое... а может быть и так, что его решение окажется более элегантным, и он представит свое решение, чтобы уже другие могли чему-то поучиться у него.
  • 0


#7 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

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

ну да, единственное у нас тут вяленько и не получиться как хочется ;)
  • 0

#8 Banderas

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

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

admin, я в школе по решениям из ГДЗ изучал тему, если что-то не понимал)). На примерах так-же модно научиться.
matroskin8, спасибо за поддержку ;)
surfer, ничего... я буду решать нерационально, а деды будут меня выправлять :)

Задача №6(работа с файлами и формой)

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

Формы:
<html>
<head>
<title>Страничка с формой</title>
</head>
<body>
<form action='zad6_h.php' method='post'>
<input type='text' name='text' size='50' />
<br><input type='submit' name='ok' />
<input type='reset' value='Сбросить' />
</form>
</body>
</html>

Обработчик:
<?php
!isset($_POST['ok']) ? exit : ''; // если не нажали кнопку "отправить", то не обрабатываем запрос

$url = $_POST['text'];
if (empty($url)) exit; // если не ввели ссылку - выходим из обработчика

$D_ROOT = $_SERVER['DOCUMENT_ROOT'];
$url .= "\r\n"; // добавляем символы переноса строки
$file = "$D_ROOT/../www/files/zad6.txt";

$fp = fopen($file, 'a+b'); // открываем zad6.txt для записи/создания/чтения в бинарном режиме
((filesize($file) == 0) ? fwrite($fp, $url) : ''); // если файл пуст - просто записываем ссылку

$fl = file($file); // создаем массив из всех строк, что в файле zad6.php

foreach ($fl as $isurl) {
strcasecmp($url, $isurl) == 0 ? $flag=true : ''; // если такая ссылка уже есть в файле, ставим указатель
}
!$flag ? fwrite($fp, $url) : ''; // если ссылки нет (выходя из логики выше), записываем ссылку в конце файла
fclose($fp);

readfile($file); // считываем файл для удобства
?>

Обработчик написан не рационально, но работает. У кого какие варианты ещё будут?
  • 0


#9 Banderas

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

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

Задача №5(работа с файлами)

Написать счетчик открытия для одной страницы. Количество открытий страницы хранится в txt-файле в виде числа.
[число открытия страницы]
После каждого 10 открытия страницы, выводить приветственное сообщение на экран.


Для удобства записывал просто цифру в таком виде 15, а не в таком [15]. Но скобки не проблема, легко убираются функцией intval()
<?php
$D_ROOT = $_SERVER['DOCUMENT_ROOT'];

@ $count = file_get_contents("$D_ROOT/../www/files/zad5.txt"); // содержимаое файла, @ - не показывает ошибку
$count ? $count++ : $count=1; // если файл открылся - увеличим значение на 1. Если нет - счетчик равен 1

file_put_contents("$D_ROOT/../www/files/zad5.txt", $count); // перезаписать содержимое файла

($count % 10 == 0) and ($count != 0) ? print ('Ура! Вы котрыли эту страницу уже ' // выводим сообщение
.$count.' раз, не надоело тут шастаться?') : '';
?>

  • 0


#10 Banderas

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

Отправлено 15 Январь 2011 - 14:26

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

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


Решение задачи:
<?php
isset($_POST['ok']) ? '' : exit; // если нажали кнопочку ...

$re = $_POST['re'];

if (!empty($re)) // если ввели строку (заполнили форму)
{
for ($i=strlen($re);$i>=0;$i--) { // перебираем символы строки справа на лево
$good[] = $re[$i]; // и заноси их в массив
}
foreach ($good as $value) echo $value; // шытревереп шан мидовыВ
}
?>

  • 0


robot

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


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