Priklady/03/Kalkulacka.php


  1  <?php Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT") ?>
  2  <html>
  3  <head>
  4    <meta http-equiv="Content-Language" content="sk">
  5    <meta http-equiv="Content-Type" content="text/html" charset="windows-1250">
  6    <title>Kalkulačka</title>
  7  </head>
  8  <body>
  9  <h2>Kalkulačka</h2>
 10  <?php
 11  
 12  function Parameter ($Nazov, $AkNieJe_Vrat="" )
 13  { // IB **********
 14    // Z globálnych polí $_REQUEST, $HTTP_POST_VARS resp. $HTTP_GET_VARS získa
 15    // hodnotu položky definovanej argumentom $Nazom. Ak danému názvu
 16    /* v globálnych poliach nie je priradená hodnota, funkcia vráti
 17       obsah premennej $AkNieJe_Vrat. */
 18    global $_REQUEST, $HTTP_POST_VARS, $HTTP_GET_VARS;
 19  
 20    $Param=$AkNieJe_Vrat;
 21    if (isset($_REQUEST[$Nazov]))  $Param =  $_REQUEST[$Nazov];
 22    else if (isset($HTTP_POST_VARS[$Nazov]))  $Param =  $HTTP_POST_VARS[$Nazov];
 23    else if (isset($HTTP_GET_VARS[$Nazov])) $Param =  $HTTP_GET_VARS[$Nazov];
 24    if (strlen($Param)>0) $Param=stripslashes(urldecode($Param));
 25    return $Param;
 26  }
 27  
 28  function DajCislo ($sText, $Ako="FLOAT")
 29  { // IB **********
 30    // Zo zadaného textového reťazca v argumente $sText funkcia
 31    // vytvorí číslo. Argument $Ako obsahuje upresnenie pre to,
 32    // ako urobiť výsledok - podľa hodnoty prvého znaku:
 33    //   INT   .. typ int,
 34    //   TEXT  .. textový reťazec - string,
 35    //   FLOAT .. číslo typu float - môže obsahovať desatinnú bodku.
 36  
 37    // Zo zadaného textu odstránim medzery:
 38    $sText=str_replace(" ", "", $sText);
 39    // Desatinnú čiarku nahradím desatinnou bodkou.
 40    $sText=str_replace(",", ".", $sText);
 41    // Zoberiem prvé písmeno argumentu $Ako a nastavím ho
 42    // na veľké písmeno.
 43    $Ako=strtoupper(substr($Ako,0,1));
 44    // Do premennej $Cislo dám text v požadovanom type.
 45    switch ($Ako) {
 46      case "I" : $Cislo=(int)$sText;  break;
 47      case "T" : $Cislo=$sText;       break;
 48      default  : $Cislo=(float)$sText;   break;
 49    }
 50    return $Cislo;
 51  }
 52  
 53  function JeCislo ($Cislo)
 54  { // IB ********
 55    // Funkcia skontroľuje či zadaný argument môže byť číslom.
 56    // Vráti FALSE, ak je zistená neprípustná hodnota.
 57    // Odstránim medzery zo začiatku a konca čísla:
 58    $Cislo=trim($Cislo);
 59    // Zistim dlzku textového reťazca:
 60    $Dlzka=strlen($Cislo);
 61    // Dĺžka textu čísla musí byť väčšia ako nula.
 62    if ($Dlzka==0) return FALSE;
 63    // V reťazci čísla môžu byť iba číselné znaky, desatinná čiarka resp.
 64  //  if (strspn ($Cislo, "0123456789 ,.e")!=$Dlzka) return FALSE;
 65    if ( PocetVyskytov($Cislo, "0123456789 ,.e-+")!=$Dlzka) return FALSE;
 66    // V texte nesmu byt dve alebo viac desatinnych ciarok, bodiek
 67    if ( PocetVyskytov($Cislo, ".,")>1) return FALSE;
 68    // Tu je možné doplniť ďalšie kontroly...
 69    // Ak som sa dostal až sem, hodnotu argumentu považujem za číslo,
 70    // preto vrátim TRUE.
 71    return TRUE;
 72  }
 73  
 74  function PocetVyskytov($sKde, $sCo)
 75  { // IB **************
 76    // Funkcia zistí v reťazci $sKde počet výskytov znakov z reťazca $sCo.
 77    $lKde=strlen($sKde);
 78    $lCo =strlen($sCo);
 79    $n=0;
 80    for ($i=0; $i<$lCo; $i++) {
 81      for ($j=0; $j<$lKde; $j++) if ($sCo[$i]==$sKde[$j]) $n++;
 82    }
 83    return $n;
 84  }
 85  
 86  $Cislo1  =Parameter("Cislo1");
 87  $Cislo2  =Parameter("Cislo2");
 88  $Operacia=Parameter("Operacia", "?");
 89  // POZOR: Znak + sa meni na medzeru !!!
 90  if ($Operacia==" ") $Operacia="+";
 91  // Zadane parametre transformujem na číslá:
 92  $x=DajCislo($Cislo1);
 93  $y=DajCislo($Cislo2);
 94  // Pripravim oznam
 95  $Oznam=""; // ak bude vsetko OK zostane prazdny
 96  if ($Operacia!="?") {
 97    if (!JeCislo($Cislo1))
 98      $Oznam.="<br />Prvé číslo má podozrivú hodotu : ".$Cislo1." >> ".$x;
 99    if (!JeCislo($Cislo2))
100      $Oznam.="<br />Druhé číslo má podozrivú hodotu : ".$Cislo2." >> ".$y;
101  }
102  // Vlastny vypocet
103  $Vysledok="";
104  switch ($Operacia) {
105    case "+": $Vysledok = $x+$y; break;
106    case "-": $Vysledok = $x-$y; break;
107    case "*": $Vysledok = $x*$y; break;
108    case "/":
109      if ($y!=0) $Vysledok = $x/$y;
110      else $Oznam.="<br/>Nedá sa deliť nulou !";
111      break;
112    default: $Operacia="+"; break;
113  }
114  // Pociatocna inicializacia pola pre oznacenie selekcie.
115  $Sel = array ( "+" => "", "-" => "", "*" => "", "/" => "");
116  // Slovo selected bude len v jednej polozke danej operaciou
117  $Sel[$Operacia]="selected";
118  ?>
119  <form name="Zadane" action="Kalkulacka.php" method="post">
120    Zadajte dve čísla, vyberte operáciu a stlačte = <br/><br/>
121    <input type="text" name="Cislo1" value="<?php echo $Cislo1 ?>" />
122    <select name="Operacia">
123      <option <?php echo $Sel["+"] ?>>+</option>
124      <option <?php echo $Sel["-"] ?>>-</option>
125      <option <?php echo $Sel["*"] ?>>*</option>
126      <option <?php echo $Sel["/"] ?>>/</option>
127    </select>
128    <input type="text" name="Cislo2" value="<?php echo $Cislo2 ?>" />
129    <input type="submit" value="   =   ">
130    <?php echo $Vysledok, $Oznam ?>
131  </form>
132  </body>
133  </html>