labvez - 2007 április - 5 megfelelő bejegyzés

Mutass mindent

Jelöld be, hogy főbb mely kategóriákat akarod olvasni, vagy ha csak egyet: kattints a nevére.


mindet
jan
feb
már
ápr
máj
jún
júl
aug
sze
okt
nov
dec
2010
-
-
-
-
-
-
-
-
-
-
-
2008
-
-
-
-
-
-
-
-
-
-
-
Haszprus

Basic programming skills 1 - hét napjai közti különbség

©   Haszprus   |   fejlesztés howto labvez php

Adottak a hét napjai (H, K, Sze, Cs, P, Szo, V), valamint egy adattábla, benne minden rekordhoz két nap. Számítsuk ki, hogy a két nap között hány-hány nap van. (Pl. hétfőtől péntekig, majd péntektől hétfőig eltelő napok száma.)

A nem javasolt megoldás: veszünk egy külső switch case szerkezetet, amelynél az eseteket az első napok szerint alakítjuk. Hét eset. Majd ezek mindegyikében egy újabb switch case, aszerint, hogy a második nap mi. 72 = 49 eset.

switch ($elsonap) {
 case 'H': 
   switch ($masodiknap)
     case 'K':   echo '1 ill 6 nap van koztuk'; break;
     case 'Sze': echo '2 ill 5 nap van koztuk'; break;
     ...
 case 'K':
   switch ($masodiknap)
     case 'H':   echo '6 ill 1 nap van koztuk'; break;
     case 'Sze': echo '1 ill 6 nap van koztuk'; break;
     ...
 ...
}

Ez tényleg nem túl jó, egyrészt a 49 elágazás miatt, másrészt mert ha mondjuk angolul is ki akarjuk írni az eredményeket akkor már 2*49 elágazásunk lesz. Egy fokkal jobb megoldás, ha a napokhoz számokat társítunk, majd ezeket kivonogatjuk egymásból mod 7:

switch ($nap) {
 case 'H': $n = 1;
 case 'K': $n = 2;
 ...
}

Csakhogy ezt a társítást lehet switch case nélkül is, és ezúttal egy végleges, immáron meglehetősen rövid és komplett megoldás:

function eltelt_napok($napchar1, $napchar2) {
 $napok = array('H' => 1, 'K' => 2, 'Sze' => 3, ...);
 $nap1 = $napok[$napchar1];
 $nap2 = $napok[$napchar2];
 $diff1 = mod(max($nap1, $nap2) - min($nap1, $nap2), 7);
 $diff2 = mod(min($nap1, $nap2) - max($nap1, $nap2), 7);
 return array($diff1, $diff2);
}

A mod fv természetesen megvalósítandó vmi tetszőleges módon. Lehet hogy a php-ben van is rá vmi, én hirtelen nem találtam, úgyhogy:

function mod($n, $q) {
   $n %= $q;
   if ($n < 0)
      $n += $q;
   return $n;
}

Update 17:13: sőt a mod fv is elhagyható, ld. tbela kommentje.

Haszprus

Szglab5 php hf is back

©   Haszprus   |   bme labvez

Ismét beüzemeltem a 2006-os php házimat, for fun Mert idegesített, hogy a régi házim nem elérhető jogosultsági problémák miatt, nomeg mert kitörölték alóla a tábláimat, és a hallgatói fiókomat. Egyébként visszanézve néhány dolgot változtatnék a kódon, de alapvetően elégedett vagyok vele.

Update 22:57: illetve ha már lúd akkor legyen kövér, itt van xsql-ből is

Haszprus

Kilencedik labor (PHP)

©   Haszprus   |   labvez

Nézzük hát a legutóbbi labort, az egyik csoportom php-laborját, amely nekik a tárgy utolsó órája. Félév elején 12-en indultak, egy rögtön eltávozott mert tavalyról hozta az adatlabor-jegyét, tehát 11-en folytatták a félévet. Egy embert út közben kénytelen voltam megvágni.

10-en szerezhettek tehát nálam valamilyen jegyet (már amennyiben az utolsó házit mindenki leadja, akinek kell). A labor szabályzata úgy szól, hogy az 5 mérésből a 4 legjobb eredménye számít. Volt 4 ember, aki egy alkalmat se bukott, kiváncsian vártam hogy vajon hányan jelennek meg az utolsó laboron átlagjavítási célzattal, vagy pusztán érdeklődésből.

Nos, 4-ből 1 tett így. Kicsit sajnálom a dolgot, mert ez volt az általam tartott legmagasabb színvonalú labor, hiszen php-ből sokmindent hozzá tudtam tenni az alapanyaghoz, életközeli szemléletes példákat, magyarázatokat, hackelhetőségi rizikófaktorokat stb. Hogy nem fog mindenki megjelenni php-n, az nyilvánvaló volt már év elején is, úgyhogy én nagyon sajnálom hogy idén a php került a legvégére, örültem volna ha többeknek mondhatok el hasznos és/vagy érdekes dolgokat ezzel kapcsolatban.

Haszprus

Hatodik labor (XSQL)

©   Haszprus   |   labvez

Az XSQL még mindig nehéz téma, nemcsak azoknak, akik nem mennek át a beugrón, de sajnos úgy látom órán, hogy azoknak is, akik átmennek. 6 elégtelen beugróból 3 embert mentő-szóbeliztettem (ahhoz is el kell érni egy bizonyos pontszámot), egyikőjük sikerrel járt, a másik kettő sajnos nem tudott válaszolni a kérdéseimre. Időt azt adtam eleget, be sem fejeztük az órát 45-ig. Ugyanakkor ez azt is jelenti, hogy túl sok időt adtam mindegyiküknek, feszesebbre kell venni a tempót, hiszen az időt azokra kell fordítanom, akik a beugrón megfeleltek és esetleg segítséget várnak tőlem valamelyik feladatukhoz.

Egyébként attól függetlenül hogy egy beugrón önmagában nem múlik semmi (hiszen 5 alkalomból 4-et kell teljesíteni), nem jó érzés elégteleneket osztani, de ha egyszer valaki a minimális ponthatár felét (sem) éri el, vagy szóban sem tudja magát kimenteni (ne adj isten azt mondja szóbeli közben, hogy nem igazán akar foglalkozni a házival), akkor nem tudok mit tenni: nincs eredmény, ami alapján átengedhetném.

Ugyanakkor kifejezetten rossz kedvem van a bukási ráta miatt, illetve elsősorban azon két ember miatt, akik számára itt véget ért a tárgy.