Monday, November 30, 2015

Limbajul PHP. Functii si tablouri. Aplicatie: eliminarea elementelor dintr-un string pe baza paritatii si afisarea optimizata a rezultatului

Problema urmatoare este enuntata pe site-ul www.programmr.com si face apel la notiunile de functie, string, tablou, instructiuni de decizie si ciclare.

Enuntul:

"Write a function evens that accepts an integer parameter 'n' and that returns the integer formed by removing the odd digits from 'n'.

If a negative number with even digits other than 0 is passed to the method, the result should also be negative.


Leading zeros in the result should be ignored and if there are no even digits other than 0 in the number, the method should return 0."

Rezolvarea propusa in codul urmator face abstractie de functiile accesibile in manipularea sirurilor se caractere. De pilda, lungimea stringului in care sunt stocate cifrele si eventualul semn al numarului introdus de la tastatura se determina intr-o bucla while si nu cu strlen().

O chestiune netriviala apare in cerinta " leading zeros in the result should be ignored..."

Rezolvarea tine cont de bunul simt. 

Pentru a fi indreptatiti sa punem valoarea zero intr-un element al array-ului in care pastram cifrele rezultatului, trebuie ca anterior acest array sa fi fost initializat. Iar codul permite initializarea DOAR daca anterior a fost detectata o cifra para (%2 == 0) nenula.

Chestiunea este adresata de doua ori, corespunzatoare situatiilor "nr cu semn" si "nr fara semn", in blocul functiei  f_evens cu linia alternativa:
else if($z !== "") $z[] = 0;
$z[] fiind tabloul in care sunt stocati digitii rezultatului.

Codul si printscreen-urile de validare in consola intepretorului php, respectiv pe programmr.com, in continuare.


<?php
   // Submitted by Valentin
  
   echo "Enter a number:";
$x = trim(fgets(STDIN));
$i = 0;
$x1 = $x;
while($x1)
{
            $x1 = (int)($x1/10);
            $i++;
}
//echo $i."\n";

function f_evens($w)
{
            global $i;
            $count = 0;
            $sign = 0;
            $z = "";
            if($w[0] === "-")
            {
                        $sign = 1;
                        for($j = 1; $j <= $i; $j++)
                        {
                                    if(!($w[$j]%2))
                                    {
                                                if($w[$j] != 0)
                                                {
                                                            $count++;
                                                            $z[] = $w[$j];
                                                }
                                                else if($z !== "") $z[] = 0;
                                    }
                        }
            }
            else
                        for($j = 0; $j < $i; $j++)
                        {
                                    if(!($w[$j]%2))
                                    {
                                                if($w[$j] != 0)
                                                {
                                                            $count++;
                                                            $z[] = $w[$j];
                                                }
                                                else if($z !== "") $z[] = 0;
                                    }
                        }
            if($count)
            {
                        if($sign) echo "-";
                        foreach($z as $k) echo $k;
            }
            else echo "0";
}
$y = "$x";
f_evens($y);


?>





No comments:

Post a Comment