|
|
|
| Ответ 001 на задачу N 16.
С условиями задачи можно ознакомится по ссылке.
<?php
$fileN = "data.dat";
$h = $w = 300;
//Цвета секторов (всего 15).
$r[] = 72; $g[] = 209; $b[] = 204;
$r[] = 199; $g[] = 21; $b[] = 133;
$r[] = 25; $g[] = 25; $b[] = 112;
$r[] = 245; $g[] = 255; $b[] = 250;
$r[] = 255; $g[] = 228; $b[] = 225;
$r[] = 255; $g[] = 228; $b[] = 118;
$r[] = 255; $g[] = 222; $b[] = 173;
$r[] = 0; $g[] = 0; $b[] = 128;
$r[] = 253; $g[] = 245; $b[] = 230;
$r[] = 255; $g[] = 165; $b[] = 0;
$r[] = 218; $g[] = 112; $b[] = 114;
$r[] = 205; $g[] = 133; $b[] = 63;
$r[] = 255; $g[] = 0; $b[] = 0;
$r[] = 0; $g[] = 255; $b[] = 0;
if (is_file($fileN))
{
$fd = fopen($fileN, "r");
$sum = 0;
while (!feof($fd))
{
$a = trim(fgets($fd));
//Отбрасываю пустые строки
if (!empty($a))
{
//В $exp[1] - название, в $exp[0] - кол-во.
$exp = explode(" ", $a);
$sector[$exp[1]] = $exp[0];
$sum += $exp[0];
}
}
fclose($fd);
//или рисуем диаграмму
if (isset($_GET['img']))
{
$img = imagecreatetruecolor($w+1,$h+1);
if (!$img) exit;
$white = imagecolorallocate($img, 255, 255, 255);
imagefill($img, 1, 1, $white);
$background = imagecolorallocate($img, 240, 240, 240);
$cx = $cy = $h/2;
imagefilledellipse($img ,$cx, $cy, $w ,$h, $background);
}
//или выводим таблицу
else
{
$table = "<html><head><title>диаграмма</title></head>
<body>
<img src=".$_SERVER['PHP_SELF']."?img=diagram>
<table border=1 cellpadding='3' cellspacing='0'>
<tr align='center'>
<td> цвет </td>
<td> кол-во </td>
<td> % </td>
<td> пояснение </td>
</tr>";
}
$start = 0; //Начальный угол
$ostatok = 0; //Здесь размер непрорисованных секторов.
$i = 0; //Сётчик
// В $key - название, в $val - кол-во.
foreach ($sector as $key =>$val)
{
$ugol = $val / $sum * 360;
//Сектор < 2% (2% от 360 = 7.2).
if ($ugol > 7.2)
{
//или рисуем диаграмму
if (isset($_GET['img']))
{
$color = imagecolorallocate($img, $r[$i], $g[$i], $b[$i]);
$angle_sector = $start + $ugol + $ostatok;
imagefilledarc($img ,$cx, $cy, $w, $h, $start, $angle_sector, $color, "IMG_ARC_PIE");
$start += $ugol;
}
//или выводим таблицу
else
{
$table .= "
<tr align='center'>
<td bgcolor='".sprintf("#%02x%02x%02x", $r[$i], $g[$i], $b[$i])."'></td>
<td> $val </td>
<td> ".sprintf("%.2f",($val/$sum*100))." % </td>
<td> $key </td>
</tr>";
}
$i++;
}
else
{
//Не прорисованный сектор
$ostatok += $ugol;
$table .= "
<tr align='center'>
<td> нет </td>
<td> $val </td>
<td> ".sprintf("%.2f",($val/$sum*100))." % </td>
<td> $key </td>
</tr>";
}
//Если секторов >= 15.
if ($i >= 15) break;
}
//или рисуем диаграмму
if (isset($_GET['img']))
{
header ("Content-type: image/jpeg");
imagejpeg($img);
}
//или выводим таблицу
else
{
$table .="
</table>
</body>
</html>";
echo $table;
}
}
else {echo "файл data.dat не найден";exit;}
?>
|
Пустые строки в data.dat игнорируются.
Одинаковые названия вида
...
8 сливы
...
12 сливы
не допускаются.
Сектор < 2% объединяется со следующим.
http://www.softtime.ru/info/task.php?id_article=88 | |
|
|
|
|
|
|
|
для: SoftTime
(13.04.2006 в 19:56)
| | Просто волшебно... Я в восхищении! скрипт работает как надо, так как вы единственный осилили эту задачу вам достаются все баллы и почести :))) | |
|
|
|