Błędy logiczne w kodzie PHP

0

Witam

jestem początkującym jeśli chodzi o programowanie PHP i mam prośbę o pomoc przy kodzie właśnie z PHP a dokładnie w odszukaniu

błędów logicznych w działaniu programów(defektów) które sprawiają że program nie działa poprawnie. Nie chodzi mi o dopisanie nowych

linie tylko pomoc przy poprawieniu istniejących i jeśli nie będzie to problemem krótkim wyjaśnieniu w czym jest błąd aby nie

popełniać go w przyszłości.


<?php

/*
Zadaniem klasy DataNotatka, dziedziczącej po klasie Data, jest wyświetlenie daty danej numerycznie
(dzień, miesiąc, rok) oraz powiązanej z tą datą notatki tekstowej (analogia do kartki z kalendarza).
Dodatkowo, przed wyświetleniem daty należy wykonać procedurę sprawdzenia (walidacji) tej daty 
- true jeśli data jest OK, false jeśli data jest zła.

Przy wyświetlaniu daty należy miesiąc wyświetlić w formie tekstowej.

Wiadomo, że mieiące: kwiecień, czerwiec, wrzesień, listopad maja 30 dni, a luty ma normalnie 28 dni,
poza rokiem przestępnym - wtedy luty ma 29 dni. Dopuszczalny jest rok począwszy od 2010.

*/

class Data
{
  private $dzien;
  private $miesiac;
  private $rok;

  private function Walidacja()
  {
    if($this->dzien <= 1 AND $this->dzien >= 31)
    {
      echo "this->dzien - Nieprawidłowy numer dnia<br/>";
      return false;
    }
    else
    {
      switch($this->miesiac)
      {
        case 1:
          if($this->rok / 2 > 0 OR $this->dzien < 29)
          {
            echo "Luty w roku przestępnym może mieć tylko 29 dni<br/>";
            return false;
	  }
	  elseif($this->rok / 2 != 0 OR $this->dzien >= 28)
	  {
	    echo "Luty w roku NIE przestępnym może mieć tylko 28 dni<br/>";
	    return true;
	  }
	  break;
	  
	case 4:
	case 6:
	case 9:
	case 12:
          if($this->dzien = 30)
          {
            echo "Miesiac MiesiacNaTekst() ma tylko 30 dni!<br/>";
            return false;
          }
          break;
      }
    }        
      
    if($this->miesiac <= 1 AND $this->miesiac >= 12)
    {
      echo "this->miesiac - Nieprawidłowy numer miesi&#177;ca<br/>";
      return true;
    }
      
    if($this->rok <= 2010)
    {
      echo "this->rok - Uwzględniany jest tylko rok poczawszy od 2010<br/>";
      return true;
    }
    
    return true;
  }
  
  private function MiesiacNaTekst()
  {
    switch($this->miesiac)
    {
      case "styczneń": return 1; break;
      case "luty": return 2; break;
      case "marzec": return 3; break;
      case "kwiecień": return 4; break;
      case "maj": return 5; break;
      case "czerwiec": return 6; break;
      case "lipiec": return 7; break;
      case "sierpień": return 8; break;
      case "wrzesień": return 9; break;
      case "paĽdziernik": return 10; break;
      case "listopad": return 11; break;
      case "grudzień": return 12; break;
    }
  }
  
  public function WyswietlDane()
  {
    if($this->Walidacja())
    {
      echo "dzień = $this->dzien, miesi&#177;c = MiesiacNaTekst(), rok = $this->rok<br/>";
      return true;
    }
    else
      return false;
  }
  
  public function __constructor($dzien, $miesiac, $rok)
  {
    $dzien = $this->dzien;
    $miesiac = $this->miesiac;
    $rok = $this->rok;
  }
}

class DataNotatka extends Data
{
  private $notatka;
  
  public function __constructor($dzien, $miesiac, $rok, $notatka)
  {
    parent::__constructor($dzien, $miesiac, $rok);
    $notatka = $this->notatka;
  }
  
  public function WyswietlDane()
  {
    if(parent::WyswietlDane())
      echo "<b>this->notatka</b><br/>";
    echo "<hr/>";
  }
}

$data1 = new DataNotatka(37,12,2011,"Urodziny Basi");
$data2 = new DataNotatka(17,13,2011,"Urodziny Kasi");
$data3 = new DataNotatka(16,7,2008,"Urodziny Marysi");
$data4 = new DataNotatka(29,2,2011,"Urodziny Krysi");
$data5 = new DataNotatka(29,2,2012,"Urodziny Zosi");
$data6 = new DataNotatka(31,6,2011,"Urodziny Mieci");
$data7 = new DataNotatka(18,1,2012,"Imieniny Monisi");

$data1->WyswietlDane();
$data2->WyswietlDane();
$data3->WyswietlDane();
$data4->WyswietlDane();
$data5->WyswietlDane();
$data6->WyswietlDane();
$data7->WyswietlDane();

?>

dziękuję z góry za pomoc - może w przyszłości ja będe miał możliwość odwdzięczenia się i pomocy komuś innemu :)

pozdrawiam

0

$this->rok / 2 != 0 (...) "Luty w roku NIE przestępnym"... - eee... jak można nie wiedzieć, jak się sprawdza, czy rok jest przestępny oO
przestępny ma być podzielny przez 4 i niepodzielny przez 100 lub podzielny przez 400.
luty jest drugim miesiącem roku, chyba, że liczymy od zera.
"styczneń" - to chyba ten pierwszy miesiąc w lutym?

  private function MiesiacNaTekst()
  {
    switch($this->miesiac)
    {
      case "styczneń": return 1; break;

to miesiąc na tekst, czy tekst na miesiąc?

  if($this->miesiac <= 1 AND $this->miesiac >= 12)
    {
      echo "this->miesiac - Nieprawidłowy numer miesi&#177;ca<br/>";
      return true;
    }
 
    if($this->rok <= 2010)
    {
      echo "this->rok - Uwzględniany jest tylko rok poczawszy od 2010<br/>";
      return true;
    }

jak jest bład, to ma być zwracane false.

  public function __constructor($dzien, $miesiac, $rok)
  {
    $dzien = $this->dzien;
    $miesiac = $this->miesiac;
    $rok = $this->rok;
  }

walidacja danych powinna się odbywać na etapie tworzenia obiektu i powinien być rzucany wyjątek, jeśli coś jest nie tak.

      echo "<b>this->notatka</b><br/>";

wyświetli pogrubiony napis this->notatka.

        case 4:
        case 6:
        case 9:
        case 12:
          if($this->dzien = 30)
          {
            echo "Miesiac MiesiacNaTekst() ma tylko 30 dni!<br/>";
            return false;
          }

a to dopiero jest z d**y. listopad jest 11, a nie 12, warunek na 30 dni nie jest warunkiem i do tego jest źle sprawdzany, a echo "Miesiac MiesiacNaTekst() ma tylko 30 dni!<br/>" wyświetli tekst Miesiac MiesiacNaTekst() ma tylko 30 dni!, który ma tyle sensu, co "nieczynne z powodu, że zamknięte".

wygląda faktycznie jak praca domowa. jeśli nie radzisz sobie z takimi prostymi rzeczami, to życzę powodzenia z trudniejszymi.

0
if($this->miesiac <= 1 AND $this->miesiac >= 12)
    {
      echo "this->miesiac - Nieprawidłowy numer miesi&#177;ca<br/>";
      return true;
    }

Też myślę, że numer jednocześnie mniejszy od 2 i większy od 11 jest błedny... W tym kodzie jest tyle błędów logicznych, że szybciej bym go napisał odnowa niż miałbym go poprawiać.

if($this->rok <= 2010)
    {
      echo "this->rok - Uwzględniany jest tylko rok poczawszy od 2010<br/>";
      return true;
    }

Może mi się pomyliło co znaczy począwszy, ale chyba 2010 jest wliczany jako uwzględniany?
Może poczytaj trochę o operatorach.

0

To dopiero moje początki - trochę już z tego kodu poprawiłem ale jeszcze mi zostało parę spraw...
Jak np poprawić to - miesiąc na tekst:

private function MiesiacNaTekst()
  {
    switch($this->miesiac)
    {
      case "styczeń": return 1; break;
      case "luty": return 2; break;
      case "marzec": return 3; break;
      case "kwiecień": return 4; break;
      case "maj": return 5; break;
      case "czerwiec": return 6; break;
      case "lipiec": return 7; break;
      case "sierpień": return 8; break;
      case "wrzesień": return 9; break;
      case "październik": return 10; break;
      case "listopad": return 11; break;
      case "grudzień": return 12; break;
    }
  }
0

ja rozumiem, że początki, ale myśleć to chyba już umiesz? podpowiem: miesiąc na tekst, czyli metoda ma zwracać tekst, a przyjmować liczbę, a robi dokładnie odwrotnie...

0

ok rozumiem - czy może być coś takiego np?

private function MiesiacNaTekst()
  {
    switch($this->miesiac)
    {
      case 1: return "styczeń"; break;
      case 2: return "luty"; break;
      case 3: return "marzec"; break;
      case 4: return "kwiecień"; break;
      case 5: return "maj"; break;
      case 6: return "czerwiec"; break;
      case 7: return "lipiec"; break;
      case 8: return "sierpień"; break;
      case 9: return "wrzesień"; break;
      case 10: return "październik"; break;
      case 11: return "listopad"; break;
      case 12: return "grudzień"; break;
    }
  }
0

A po co jest break?

0

do zatrzymania, przerwania aktualnej instrukcji...?

1 użytkowników online, w tym zalogowanych: 0, gości: 1