Autor Zpráva
Snipo
Profil
Ahojte, snažím sa trochu zdokonaliť a tak sa mi dostala do ruky taká knižka kde sú rôzne zadania. Tu je pár funkcií, čo som vytvoril a chcel by som vás poprosiť kto má trocha času aby sa na to pozrel, či sa to nedá spraviť lepšie, efektívnejšie.

<?php

//Program načíta prirodzené číslo n a vypíše výsledok

class kalkulacka
{
    private $cislo;

    public function __construct( $cislo )
    {
        $this->cislo = $cislo;
    }

    //Vracia súčet prvých n prirodzených čísel
    public function sucetPrvych()
    {
        $vysledok = 0;

        for( $i=0; $i <= $this->cislo; $i++ )
        {
            $vysledok += $i;
        }

        echo( '(1.) ' . $vysledok );
    }

    //Vracia faktoriál čísla n
    public function faktorial()
    {
        $vysledok = 1;

        for( $i=1; $i <= $this->cislo; $i++ )
        {
            $vysledok *= $i;
        }

        echo('(2.) ' . $vysledok);
    }

    //Vracia celú časť odmocniny z čísla n
    public function celaOdmocnina()
    {
        $vysledky = array();

        for( $i=0; $i*$i <= $this->cislo; $i++ )
        {
            $vysledky[] = $i;
        }

        $posledny = count( $vysledky ) - 1;

        $vysledok = $vysledky[$posledny];

        echo('(3.) ' . $vysledok);
    }

    //Vracia ciferný súčet čísla n
    public function cifernySucet()
    {
        $vysledok = 0;
        $dlzkacisla = strlen( $this->cislo );

       for( $i=0; $i <= $dlzkacisla - 1; $i++ )
       {
           $vysledok += substr( $this->cislo, $i, 1  );
       }

       echo('(4.) ' . $vysledok);
    }

    //Vracia počet jednotiek čísla n
    public function pocetJednotiek()
    {
        $dlzkacisla = strlen( $this->cislo );
        $vysledok = substr( $this->cislo, $dlzkacisla - 1, 1 );

        echo('(5.) ' . $vysledok);
    }

    //Vracia číslo napísané odzadu
    public function cisloOdzadu()
    {
        $dlzkacisla = strlen( $this->cislo );
        $cifry = array();
        $vysledok = '';

        for( $i=0; $i <= $dlzkacisla - 1; $i++ )
        {
            $cifry[] = substr( $this->cislo, $i, 1 );
        }

        $dlzkapola = count($cifry);

        for ( $i = $dlzkapola - 1; $i >= 0; $i-- )
        {
            $vysledok .= $cifry[$i];
        }

        echo('(6.) ' . $vysledok);
    }

}
mimochodec
Profil
- v cisloOdzadu mi připadá zbytečný ten mezikrok a použití pole.
- v celaOdmocnina na to jdeš dost neekonomicky.
- faktoriál umí php i samo - http://php.net/manual/en/function.gmp-fact.php (jak moc je ta knihovna běžná, netuším)
lionel messi
Profil
Snipo:
Len pár triviálnych postrehov (nie som profík a s OOP mám minimum skúseností):
1. Úplne zbytočné zátvorky okolo jazykovej konštrukcie echo.
2. Miesto echo by som rozmýšľal nad použitím return — tieto metódy sú použiteľné iba v prípade, že výsledok chceš rovno vypísať. Čo ak budeš v budúcnosti s ním chcieť spraviť niečo iné?
//Vracia súčet prvých n prirodzených čísel
    public function sucetPrvych()
    {
        $vysledok = 0;
 
        for ($i=0; $i <= $this->cislo; $i++)
        {
            $vysledok += $i;
        }
 
        return '(1.) ' . $vysledok;
    }
a následné vypísanie:
$kalkulacka = new kalkulacka (2);
echo $kalkulacka->sucetPrvych();
Snipo
Profil
mimochodec:
v cisloOdzadu mi připadá zbytečný ten mezikrok a použití pole.

Jasné, už mi to došlo, ono ja si rád všetko ukladám takto do premenných, aby to moja hlavička stíhala. Ale to je otázka cviku asi.

v celaOdmocnina na to jdeš dost neekonomicky

Tu ma nič iné nenapadá.

lionel messi:
Úplne zbytočné zátvorky okolo jazykovej konštrukcie echo

Zvykol som si to takto používať, v materiáloch odkiaľ sa učím to tak robia. Robí to niečo inak oproti klasickému echu?

Miesto echo by som rozmýšľal nad použitím return — tieto metódy sú použiteľné iba v prípade, že výsledok chceš rovno vypísať. Čo ak budeš v budúcnosti s ním chcieť spraviť niečo iné

Toho som si vedomý. Ale to je iba pre cvičenie, viem, že to už nevyužijem. To by som tam potom nedával ani to číslovanie úloh.
lionel messi
Profil
Snipo:
Zvykol som si to takto používať, v materiáloch odkiaľ sa učím to tak robia
Nie je to práve šťastné, hoci napr. na itnetwork.cz je to pomerne časté.

Robí to niečo inak oproti klasickému echu?
Viď: Závorky u jazykových konstrukcií od Jakuba Vránu.
Alphard
Profil
Tady moc nejde mluvit o OOP, přístup mít třídu kalkulačka s jednou vlastností cislo a hromadou pochybných metod, které si berou hodnoty pro výpočet kdo ví kde je úplně vedle. Buď vám jde o algoritmy, pak to pište jako normální funkce přebírající parametr, nebo vám jde o zapouzdření čísla jako datového typu a pak vytvářejte nějakou třídu Number, která bude například v případě binárních operátorů přebírat jinou instanci třídy Number.

class Number
{
  private $value;
  
  public function add(Number $v) 
  {
    return new Number($this->value +  $v->value);
  }
}

Pokud jde o algoritmy, chtělo by to nepsat je tak prvoplánově a trochu je promyslet. Třeba hned první metoda sucetPrvych() je krásný případ součtu aritmetické posloupnosti, není důvod jít na to hrubou silou.

v celaOdmocnina na to jdeš dost neekonomicky
Tu ma nič iné nenapadá.
Složitější numerické metody jsou nyní nad vaše síly, takže doplním jen odkaz en.wikipedia.org/wiki/Methods_of_computing_square_roots.

Co byste ale mohl řešit hned je pracovat s číslem víc jako s číslem, třeba u pocetJednotiek() se nabízí jednoduché return $this->cislo % 10;

A když už s číslem pracujete jako se stringem (já bych předtím explicitně konvertoval na string, byť to PHP dělá implicitně), je dobré všimnou si např. funkce strrev() a nepsat na to 20řádkové funkce.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: