Jump to content

Pomoć oko par zadataka PHP


Recommended Posts

Zadatke bi trebalo riješiti bez korištenja bilo kakvih gotovih PHP funkcija. Treba mi za školu, i stalno sam na nekon tragu rješenja ali nikako dobiti točno :angry:

 

1. Napiši funkciju koja kao parametar prima string, te kao rezultat vraća true ako je zadani string

palindrom. U suprotnom vraća false. (palindrom: anavolimilovana)

 

2. Napiši funkciju koja kao parameter prima neki niz, a kao rezultat vraća element koji se najviše

puta ponavlja unutar tog niza.

 

3. Napiši funkciju koja kao parameter prima neki niz cijelih brojeva, a kao rezultat vraća

najmanji broj unutar tog niza.

 

:mellow:

Link to post
Share on other sites

Evo pošto sam raspoložen za pisanije, nemojte zameriti ako negde i pogrešim logički pošto sam umoran (drugačije je kad bih kucao kod, ovako pišem napamet iz glave)...

Ne radim PHP, bar ne svaki dan, mnogo bolje poznajem JS, ali ni u tom slučaju ti ne bih ovde pisao kod, već samo ideje, a ti se potrudi pa nađi sintaksu na net-u (imaš na w3schools za JS i na zvaničnom sajtu php-a za php, mada za ovo što ti treba isto je dovoljan w3schools i za php), jer se tako najbolje uči sintaksa, umesto da ti neko napiše gotova rešenja.

Ne bi verovao da i napredni programeri često potežu dokumentaciju kad im je potrebno nešto što vrlo retko koriste.

 

 

1. zadatak

Bilo bi najlakše koristiti "strrev()", ali pošto kao ne može ugrađena funkcija...

 

Pošto palindromi najčešće ne uzimaju u obzir razmake, moraš to da imaš u vidu (to je glavna logička začkoljica, ostalo je prosto), ali pretpostavljam da ne smeš koristiti ni ugrađenu funkciju za uklanjanje razmaka između reči u stringu.

 

Definišeš funkciju (pogledaj na php.net kako se definiše funkcija sa jednim parametrom) sa odgovarajućim parametrom, npr. "function fPalindrom(parametar){}" - kod php-a, isto kao kod JS-a, nije potrebno navoditi tip podatka (loosely typed language).

 

Sada bi bilo nezgodno koristiti duplu petlju u kojoj ćeš nekom novom nizu dodeliti elemente polaznog niza (stringa) obrnutim redosledom - možeš koristiti strlen, ali ako baš i to ne smeš, moraš prvo napraviti petlju koja inkrementira vrednost nove promenljive za dužinu strniga sve dok karakter parametar ne bude jednak praznom stringu, tj. ''), jer ćeš imati problem sa razmacima između reči, koji se kod palindroma ignorišu.

 

Kako ne možeš koristiti ugrađenu php funkciju da prvo "očistiš" string od razmaka, postoji bolji način.

 

Ako je broj znakova u stringu paran (uključujući razmake), porediš prvi i poslednji znak, pa drugi i pretposlednji, ali svaki put proveriš da li je jedan od njih razmak, ako jeste za tu promenljivu preskočiš jedan indeks i ponoviš poređenje. Ako je broj znakova neparan, onda ideš do celobrojnog dela polovine dužine stringa unapred od početka i unazad od kraja.

 

Algoritam je prost, mada ima i drugih načina, ali ne bih da pišem celu stranu teksta ako ne razumeš osnovne stvari iz programiranja (ne pisanja koda, već programiranja).

 

 

 

2. zadatak

Ideja je da napraviš novi niz sa istim brojem elemenata kao prvi, koji svi imaju vrednost 1.

Zatim u prvom nizu porediš svaki element sa svakim, ali ako 1. uporediš sa ostalima, onda 2. porediš sa 3. i onima iza, jer je sa 1. već upoređen.

Svaki put kad naiđeš na novi element koji je jednak prvom, u drugom nizu na 1. mestu inkrementiraš broj (kada 2. element porediš sa 3. i ostalima iza, u slučaju jednakosti inkrementiraš 2. element u drugom nizu).

Kad prođeš sva poređenja, proveriš u drugom nizu koji element ima najveću vrednosti (to ti je treći zadatak). Pozicija tog elementa je ista kao pozicija elementa u prvom nizu kome je jednako najviše drugih elemenata (tj. ima najviše ponavljanja), pa njega vratiš kao traženu vrednost - npr. ako su nizovi a i b, ako nađeš da je najveći broj b[4], tada je vrednost a[4] sa najviše ponavljanja.

Ako su u drugom nizu svi elementi jednaki, algoritam dat u 3. zadatku će ti vratiti vrednost prvog elementa, ali to nije korektno rešenje.

Zato je potrebno proveriti i kolika je vrednost najvećeg broja u drugom nizu, i ako je to 1, onda su u prvom nizu svi elementi jedinstveni.

 

 

 

3. zadatak

Ovo je boza u bilo kom programskom jeziku. Uzmeš da je 1. element najmanji/najveći (jer je interesantniji primer gde se traži i najmanji i najveći element), recimo Amin i Amax i oba su jednaka 1. elementu.

Zatim ih uporediš sa 2. članom niza, pa ako Amin manji - ništa, ako nije, onda je Amin = niz[1]; slično i za Amax, ako je veći od 2., ništa, a ako nije, onda je Amax=niz[1]. I tako do kraja...

 

 

 

 

Eto, nije dovoljno poznavati sintaksu nekog jezika, stalno to govorim ljudima, ali oni se stalno brinu što ne znaju ovaj ili onaj programski jezik, a kad nauče jezik, ne umeju da reše najprostiji problem koristeći taj jezik.

 

To je kao da si naučio ceo rečnik nekog stranog jezika i gramatiku, ali to nije dovoljno da možeš pistai pesme ili romane.

 

Link to post
Share on other sites

Vau, rekoh, daj da probam... Nisam ni znao da toliko zavisim od gotovih funkcija.

Ako nisi resio zadatke, neka moja resenja, al' bolje se pomuci sam (SPOILERS AHEAD):

 

1.

function palindrom($string)     {
   $compare = '';
   $i = 0;
   while(1) {
       if(!isset($string[$i])) break;
       $compare = $string[$i] . $compare;
       $i++;
   }
   if($compare == $string) {
       return true;
   }
   return false;
}

 

 

2. Mozda moze i sa manje koda:

 

function counter($array)     {
   $arrayHolder = array();

   foreach($array as $element) {
       if(!isset($arrayHolder[$element]))      {
           $arrayHolder[$element] = 1;
           continue;
       }
       $arrayHolder[$element]++;
   }

   $holdCount = 0;
   $holdLetter = '';
   foreach($arrayHolder as $letter=>$count)        {
       if($count > $holdCount)     {
           $holdCount = $count;
           $holdLetter = $letter;
       }
   }
   return $holdLetter . ': ' .$holdCount;
}

 

3. To mozes sam

Link to post
Share on other sites

Koliko videh, ovo rešenje 1. zadatka ne uzima u obzir razmake između reči, koje se kod palindroma ignorišu (ana voli milovana = anavolim ilov ana), što malo komplikuje stvar.

Čak i da se razmaci ignorišu pri kreiranju promenljive $compare, ne može se na kraju njena vrednost porediti sa početnim stringom.

 

Ali, ovo je validno ako se ovoj funkciji prosledi string bez razmaka između reči, što pre pozivanja ove funkcije može da odradi druga funkcija (jer, teorijski u opštijem slučaju to može zatrebati i negde drugde u programu, pa je pogodnije uraditi tako).

Link to post
Share on other sites
Koliko videh, ovo rešenje 1. zadatka ne uzima u obzir razmake između reči, koje se kod palindroma ignorišu (ana voli milovana = anavolim ilov ana), što malo komplikuje stvar.

Čak i da se razmaci ignorišu pri kreiranju promenljive $compare, ne može se na kraju njena vrednost porediti sa početnim stringom.

 

Ali, ovo je validno ako se ovoj funkciji prosledi string bez razmaka između reči, što pre pozivanja ove funkcije može da odradi druga funkcija (jer, teorijski u opštijem slučaju to može zatrebati i negde drugde u programu, pa je pogodnije uraditi tako).

 

Tačno, ja radio samo po njegovom primeru "anavolimilovana"...

Inace, princip je isti, samo se ignorišu razmaci. A ne poredi se sa početnim stringom, nego se kreira novi gde se takodje ignorišu razmaci, a složi se bez obrtanja.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...