Tuesday, January 26, 2016

Limbajul PHP. Tablouri multidimensionale. O aplicatie practica de iterare si determinare a unor valori specificate printre elementele unui tablou

Enuntul urmator reprezinta o problema de practica individuala asociata modulului de PHP procedural (PHP I) predat in cadrul InfoAcademy. 

Cum am specificat si cu ocazia altor postari, publicarea solutiei nu intentioneaza, nici pe departe, compromiterea procesului didactic la academia respectiva. 

Rezolvarea propusa aici nu este unica (e greu de vorbit de rezolvari "unice" in informatica) si, cu siguranta, nici cea mai optima sau mai "curata" la nivel de cod. Ea este utila in primul rand autorului, ca reminder in perspectiva in care va avea nevoie :-)

Enuntul:

 "Fie un magazin cu diverse modele de telefoane mobile, manufacturate de feluriti producatori. Incepeti prin a defini manual un tablou cu producatori si modelele atasate:

$modele = array(
            "producator1" => array ("model1", "model2", ...),
            "producator2" => "array("model3", "model4", ...),
         ..............................................));

Se cere:

1.Pornind de la tabloul de mai sus, generati (algoritmic) un alt tablou, numit $magazin, de forma:

$magazin = array("model1"=>array(
                                                 "producator"=> "producator1",
                                                  "caracteristici"=>array("lungime"=>...
                                                                                          "latime"=>...,
                                                                                          "greutate"=>...)),
                              "model2"=>array(
                                                "producator"=>...etc


in care dimensiunile si greutatea sunt generate aleator (in limite rezonabile, desigur).

2. Scrieti un algoritm care determina si afiseaza toate caracteristicile celui mai usor telefon (producatorul, modelul, lungime, latime, greutate);
3. Scrieti un algoritm care determina si afiseaza latimea medie a telefoanelor pentru fiecare producator in parte."

Presupunem pentru simplitate ca in magazin sunt reprezentati doar trei producatori iar modelele de telefoane sunt Model1, Model2,..., etc.


$modele = array("Samsung" => array("Model1", "Model2", "Model3"),
                           "Huawei"  => array("Model4", "Model5", "Model6"),
                            "Apple"   => array("Model7", "Model8", "Model9"));

O iterare dubla cu foreach ne ofera accesul la valorile din array-urile indexate cu numele producatorilor. 

Putem defini variabila globala $magazin, pe care o modificam in interiorul celei de-a doua bucle. De remarcat ca, potrivit enuntului, valorile din array-urile indexate de cheile Samsung, Huawei si Apple devin chei (indecsi) in variabila $magazin.

$magazin = array();

foreach($modele as $k=>$v)
{
   foreach($v as $k1=>v1)
   {
     $magazin[$v1] = array("producator"=>$k,
                                         "caracteristici" => array("lungime"=>rand(l1, l2),
                                                                             "latime"=>rand(l3, l4),
                                                                             "greutate"=>rand(l5, l6)));
   }
}

unde l1, ..., l6 sunt constante numerice alese convenabil.


Pentru cerinta a doua se poate imagina urmatorul mecanism:

a) se defineste variabilela $smallest initializata convenabil cu (de exemplu) greutatea primului model de telefon din $magazin:

$smallest = $magazin["Model1"]["caracteristici"]["greutate'];

b) se determina intr-o bucla foreach cea mai mica greutate, care este asociata unui index $k (care reprezinta chiar modelul de telefon).

Atunci 

$magazin[$k]["caracteristici"]["latime"], 
$magazin[$k]["caracteristici"]["lungime"] si 
$magazin[$k]["producator"] 

reprezinta latimea, lungimea si numele producatorului celui mai mic in greutate dintre telefoanele din magazin.


Pentru cerinta a treia, se definesc global variabile in care se va stoca suma dimensiunilor (latimilor) telefoanelor unui anumit producator.

Se itereaza printre elementele tabloului $magazin si se selecteaza producatorul cu un bloc switch sau cu instructiuni if/else. Selectia duce la incrementarea corespunzatoare a valorii variabilelor definite anterior etc.

Codul si printscreen-ul:


<!DOCTYPE HTML>
<head>
            <title>CellPhones</title>
            <style>
            table, td, tr {
            border: 2px solid red;
            text-align:center;
            }
            table{
                        width:50%;
            }
            </style>
</head>
<body style = "background-color:Azure;color:DarkOrchid">
<table>

<?php

$modele = array("Samsung"=>array("Model1", "Model2", "Model3"),
                            "Huawei"=>array("Model4", "Model5", "Model6"),
                            "Apple"=>array("Model7", "Model8", "Model9"));


$magazin = array();

foreach($modele as $k=>$v)
{
    foreach($v as $v1)
    {
       $magazin[$v1] = array("producator"=>$k,
                               "caracteristici"=>array("lungime"=>rand(100, 200),
                                                                   "latime"=>rand(50, 100),
                                                                   "greutate"=>rand(40, 250)));
    }
}

echo "<br />";

echo "<tr>
                        <td>Model</td>
                        <td>Producator</td>
                        <td>Lungime</td>
                        <td>Latime</td>
                        <td>Greutate</td>
            </tr>";

foreach($magazin as $k2=>$v2)
{
            echo "<tr>
                                    <td>$k2</td>
                                    <td>".$v2["producator"]."</td>
                                    <td>".$v2["caracteristici"]["lungime"]."</td>
                                    <td>".$v2["caracteristici"]["latime"]."</td>
                                    <td>".$v2["caracteristici"]["greutate"]."</td>
                        </tr>";
           
}
echo "</table>";

$smallest = $magazin["Model1"]["caracteristici"]["greutate"];
$model = $magazin["Model1"]["producator"];
$wd = $magazin["Model1"]["caracteristici"]["latime"];
$lg = $magazin["Model1"]["caracteristici"]["lungime"];

foreach($magazin as $k=>$v)
{
            if($magazin[$k]["caracteristici"]["greutate"] <= $smallest)
            {
                        $smallest = $magazin[$k]["caracteristici"]["greutate"];
                        $model = $magazin[$k]["producator"];
                        $wd = $magazin[$k]["caracteristici"]["latime"];
                        $lg = $magazin[$k]["caracteristici"]["lungime"];
            }                      
}

echo "<br/>Telefonul cu cea mai mica greutate are $smallest grame, $lg milimetri lungime, $wd milimetri latime. Marca este $model.";

$wdm_Samsung = 0;
$nr_Samsung = 0;
$wdm_Huawei = 0;
$nr_Huawei = 0;
$wdm_Apple = 0;
$nr_Apple = 0;

foreach($magazin as $k=>$v)
{
            switch($magazin[$k]["producator"]) {
                        case "Samsung" : $wdm_Samsung += $magazin[$k]["caracteristici"]["latime"]; $nr_Samsung++; break;

                        case "Huawei"  : $wdm_Huawei += $magazin[$k]["caracteristici"]["latime"]; $nr_Huawei++; break;

                        case "Apple"   : $wdm_Apple += $magazin[$k]["caracteristici"]["latime"]; $nr_Apple++; break;
                       
            }
}
echo "<br/>Latimea medie a telefoanelor Samsung este ".number_format($wdm_Samsung/$nr_Samsung, 2).".";

echo "<br/>Latimea medie a telefoanelor Huawei este ".number_format($wdm_Huawei/$nr_Huawei, 2).".";

echo "<br/>Latimea medie a telefoanelor Apple este ".number_format($wdm_Apple/$nr_Apple, 2).".";

?>

</body>
</html>



No comments:

Post a Comment