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>