Monday, January 25, 2016

Limbajul PHP. Mini-proiect "statistic". Functii, constante, include/require etc

Enuntul urmator, adaptat din tema unui curs de PHP procedural, cere, practic, relationarea a doua fisiere php care contin functii pentru generarea si validarea unor valori numerice.

"Creati un mini-proiect PHP cu fisiere, plasat intr-un director accesibil prin URL-ul http://localhost/.../ . In acel director se vor afla urmatoarele fisiere/directoare:

1) directorul include, care contine fisierul utils.php, in care se definesc: 
a) o constanta NR_DATE, cu o valoare numerica la alegere; 
b) o functie validareData() ce valideaza o data calendaristica. Functia primeste 3 argumente: zi, luna si an (toate numerice) si verifica daca ziua se incadreaza in numarul maxim de zile ale lunii specificate; 
2) fisierul statistici_date.php, in care: 
a) se include utils.php, pentru a avea disponibile constanta si functia de validare. Se va folosi o cale relativa (require "include/utils.php"), pentru a nu face site-ul dependent de sistemul local de fisiere; 
b) se realizeaza o bucla in care se genereaza NR_DATE date calendaristice (se genereaza ziua, luna si anul folosind functia rand() ). Fiecare data generata se va afisa pe ecran: cele valide cu verde, cele invalide cu rosu. Pentru validare se va folosi functia validareData() scrisa anterior. Anul se va genera intre 1900* si 2100; 
c)la sfarsit se va afisa statistica: X date valide, Y date invalide."

In solutia propusa, validarea porneste de la criteriul lunii generate aleator. Domeniul acoperitor de generare a valorilor pentru zile este (1, 31). Daca luna este prima, a treia, a cincea, a saptea, a opta, a zecea sau a douasprezecea, corectitudinea datei este asigurata de insasi domeniul fixat pentru zile.

Daca luna este februarie (a doua) si daca valoarea este superioara lui 28 (in cod, $d > 28) atunci, daca anul ($y) este bisect (test prin functia isLeap()) si daca ziua $d == 29 inseamna ca data este valida. In cazul contrar ultimei clauze if (<==> $ > 29), data e invalida.

Daca luna este a 2-a si ziua este mai mica sau egala cu 28, data generata este valida, indiferent de an, ordinar sau bisect.

Daca luna este a patra, a sasea, a noua si a unsprazecea, orice zi $d <=30 implica o data valida, indiferent de an.

Instructiunea switch si gruparea case-urilor pentru lunile cu 30 de zile simplifica functionalitatea codului.

Pentru afisare, s-a folosit o lista neordonata intr-un element de pagina pozitionat stanga si un tabel pozitionat in dreapta listei.

Domeniul pentru anii generati cu functia rand a fost fixat la (1920, 2100). Nu ca ar avea importanta prea mare, dar in 1919, in primavara, s-a introdus in Romania reforma calendarului gregorian, astfel incat de la 14 aprilie (1 aprilie pe stil vechi) anul respectiv, datele calendaristice pot fi in mod consistent corelate cu zilele saptamanii ;-)

In continuare, codul si prinscreen-ul, cu mentiunea ca, spre exemplu, daca fisierul date_statistice.php este rezident intr-un alias numit practice1, atunci utils.php se afla in …/practice1/include.


1) Fisierul .../include/utils.php:
------------------------------------------------------------------------------------------------------
<?php
define("NR_DATE", 100);

function validareData($d, $m, $y = NULL)
{
            switch($m)
            {
                        case 2:if($d > 28) 
                        {
                                    if(isLeap($y))
                                    {
                                                if($d == 29) return true;
                                                else return false;
                                    }
                        } else return true;
                        case 4: 
                        case 6:
                        case 9:
                        case 11: if($d > 30) return false;
                        else return true; 
            }
           
}

function isLeap($y)
{
            if($y%4) return false;
            else if($y%100) return true;
            else if($y%400) return false;
            else return true;
}

?>
------------------------------------------------------------------------------------------------------

2) Fisierul date_statistice.php:
------------------------------------------------------------------------------------------------------
<!DOCTYPE HTML>
<head>
            <title>Stats</title>
            <style>
            #rside {
                        width:20%;
                        float:left;
            }
            #lside{
                        float:left;
            }
            table, td, tr {
            border: 2px solid red;
            text-align:center;
            }
            table{
                        width:100%;
            }
            </style>
            </head>
            <body style = "background-color:Antiquewhite;color:DarkOrchid">
            <div id="rside">
            <ul>
<?php
require "include/utils.php";
$id = 0;
$vd = 0;
$arr =array();
for($i = 0; $i < NR_DATE; $i++)
{
            global $id, $vd, $arr;
            $d = rand(1, 31);
            $m = rand(1, 12);
            $y = rand(1920, 2100);
            if(validareData($d, $m, $y) === false) 
            {
                        echo "<li><h3 style = \"color:red\">$d.$m.$y: data invalida!</h3></li>";
                        $id++;
                        $arr[] = $i;
            }
            else 
            {
                        echo "<li><h3 style = \"color:green\">$d.$m.$y: data valida.</h3></li>";
                        $vd++;
            }
}
?>
</ul>
</div>
<div id="lside">
<br/>
<table>
                        <tr>
                                    <td><h4>Date valide</h4></td><td><h4>Date invalide</h4></td>
                        </tr>
<?php
    echo "<tr>
                                    <td><h4>$vd</h4></td><td><h4>$id</h4></td>
                          </tr>
</table>";
echo "<br><h4>S-au generat date invalide la extragerea/extragerile: ";
foreach($arr as $v) echo ($v + 1)."; ";
echo "</h4>";

?>
</div>
</body>

</html>






No comments:

Post a Comment