Fondamenti di programmazione
Corso php a cura del prof. Pietro De Paolis
Leggiamo la intera tabella dello stipendio
Nella precedente lezione avevamo visto come ricavare lo stipendio annuo lordo di un docente di scuola secondaria superiore Ora vogliamo completare il discorso considerando tutti i dipendenti della scuola, come nella seguente tabella presa dal contratto:
anni di servizio | Collaboratore scolastico | Collaboratore scolastico dei servizi | Assistenti amministrativi | Coordinatore amm.e tecnico | Dir. servizi gen. ed amm. e amm. | Docente sc. materna ed elem. | Docente diplomato istituti sec. II° | Docente scuola media | Docente laureato istituti sec. II° |
da 0 a 2 |
13659.90 |
14010.01 |
15302.38 |
17495.96 |
20230.62 |
17582.23 |
17582.23 |
19082.50 |
19082.50 |
da 3 a 8 |
13925.18 |
14268.28 |
15646.28 |
17968.93 |
20819.59 |
18057.22 |
18057.22 |
19609.37 |
20163.59 |
da 9 a 14 |
14896.91 |
15223.27 |
16874.38 |
19425.88 |
22664.73 |
19520.02 |
19520.02 |
21331.19 |
21893.39 |
da 15 a 20 |
15784.44 |
16120.67 |
18037.47 |
21127.37 |
24774.81 |
21228.70 |
21228.70 |
23313.53 |
24027.25 |
da 21 a 27 |
16668.09 |
17031.95 |
19207.56 |
22778.93 |
27053.50 |
22887.02 |
23701.35 |
25238.19 |
26745.11 |
da 28 a 34 |
17334.59 |
17677.28 |
20040.76 |
24408.24 |
29394.78 |
24523.25 |
25323.78 |
27126.29 |
28525.83 |
da 35 a |
17801.67 |
18159.30 |
20679.35 |
25621.63 |
31672.27 |
25741.51 |
26556.37 |
28525.83 |
29945.29 |
Ci servono, per questo, due menu a tendina uno per la scelta del tipo di dipendente e l'altro per la scelta degli anni di servizio. Quello per la scelta degli anni di servizio lo abbiamo già fatto. Il listato in html era il seguente:
<html> <body background="sfondo2.jpg"> Programma per il calcolo dello stipendio mensile lordo di un docente laureato di scuola superiore.<br> <form action="stipendio4.php" name="modulo1"> <select size="1" name="anniservizio" > <option value="0">SCEGLI ANNI DI SERVIZIO</option> <option value="1">DA 0 A 2</option> <option value="2" >DA 3 A 8</option> <option value="3">DA 9 A 14</option> <option value="4">DA 15 A 20</option> <option value="5">DA 21 A 27</option> <option value="6">DA 28 A 34</option> <option value="7">DA 35 IN POI</option> </select> <input type="Submit" value="CALCOLA LO STIPENDIO MENSILE"> </form> <body> </html>
|
Listato di stipendio3.php |
e lo avevamo salvato come stipendio3.php. Il secondo menu a tendina può essere il seguente:
<select size="1" name="personale" >
<option value="0">SCEGLI PERSONALE</option>
<option value="1">COLLABORATORE SCOLASTICO</option> <option value="2" >COLLABORATORE SCOL. DEI SERVIZI</option> <option value="3">ASSISTENTI AMMINISTRATIVI</option> <option value="4" >COORDINATORE AMM. E TECNICO</option><option value="5">DIRETTORE SERV. GEN. E AMMIN.</option>
<option value="6" >DOCENTE SCUOLA MATERNA- ELEMENTARE</option> <option value="7">DOCENTE DIPLOMATO SECONDARIA 2°</option> <option value="8" >DOCENTE SCUOLA MEDIA</option> <option value="9" >DOCENTE LAUREATO - SECONDARIA 2°</option> </select>A questo secondo menu a tendina diamo il nome di personale,
<select size="1" name="personale" >
in tal modo la variabile che contiene la scelta dell'utente sarà personale in html e successivamente sarà $personale in php.
Mettiamo i valori nelle 10 opzioni:
<option value="0">SCEGLI PERSONALE</option>
dove il valore 0 sarà quando l'utente omette la scelta; mentre gli altri valori vanno da 1 a 9 come le nove colonne della tabella. In tal modo il numero contenuto in $personale sarà proprio il numero di colonna della tabella. Uniamo, allora, a stipendio3.php il secondo menu a tendina ed otteniamo:
<html> <body background="sfondo2.jpg"> Programma per il calcolo dello stipendio lordo.<br> <form action="stipendio7.php" name="modulo1">
<select size="1" name="personale" > <option value="0">SCEGLI PERSONALE</option> <option value="1">COLLABORATORE SCOLASTICO</option> <option value="2" >COLLABORATORE SCOL. DEI SERVIZI</option> <option value="3">ASSISTENTI AMMINISTRATIVI</option> <option value="4" >COORDINATORE AMM. E TECNICO</option><option value="5">DIRETTORE SERV. GEN. E AMMIN.</option> <option value="6" >DOCENTE SCUOLA MATERNA- ELEMENTARE</option> <option value="7">DOCENTE DIPLOMATO SECONDARIA 2°</option> <option value="8" >DOCENTE SCUOLA MEDIA</option> <option value="9" >DOCENTE LAUREATO - SECONDARIA 2°</option> </select>
<select size="1" name="anniservizio" > <option value="0">SCEGLI ANNI DI SERVIZIO</option> <option value="1">DA 0 A 2</option> <option value="2" >DA 3 A 8</option> <option value="3">DA 9 A 14</option> <option value="4">DA 15 A 20</option> <option value="5">DA 21 A 27</option> <option value="6">DA 28 A 34</option> <option value="7">DA 35 IN POI</option> </select> <br><br> <input type="Submit" value="CALCOLA LO STIPENDIO MENSILE"> </form> <body> </html>
|
Listato di stipendio6.php |
che salviamo come stipendio6.php.
Notiamo che quando l'utente schiaccia il tasto
viene richiamato con:
<form action="stipendio7.php" name="modulo1">
il modulo stipendio7.php che ancora non abbiamo scritto.
Lettura del file degli stipendi
Ora dobbiamo dapprima prepare un file testo che contiene tutti gli stipendi e sostituirlo con quello precedente, che era stipendi.txt, in modo che contenga gli stipendi di tutto il personale. In pratica occorre modificare la tabella e copiarla in un file testo. Un modo può essere questo:
Collaboratore scolastico
Collaboratore scolastico dei servizi Assistenti amministrativi Coordinatore amm.e tecnico Dir. servizi gen. ed amm. e amm. Docente sc. materna ed elem. Docente diplomato istituti sec. II° Docente scuola media Docente laureato istituti sec. II° da 0 a 2 13659.90 14010.01 15302.38 17495.96 20230.62 17582.23 17582.23 19082.50 19082.50 da 3 a 8 13925.18 14268.28 15646.28 17968.93 20819.59 18057.22 18057.22 19609.37 20163.59 da 9 a 14 14896.91 15223.27 16874.38 19425.88 22664.73 19520.02 19520.02 21331.19 21893.39 da 15 a 20 15784.44 16120.67 18037.47 21127.37 24774.81 21228.70 21228.70 23313.53 24027.25 da 21 a 27 16668.09 17031.95 19207.56 22778.93 27053.50 22887.02 23701.35 25238.19 26745.11 da 28 a 34 17334.59 17677.28 20040.76 24408.24 29394.78 24523.25 25323.78 27126.29 28525.83 da 35 a 17801.67 18159.30 20679.35 25621.63 31672.27 25741.51 26556.37 28525.83 29945.29 FINE
|
File di testo degli stipendi: stipendi05.txt |
Copiamo il file e salviamolo come stipendi05.txt .
Notiamo alcuni particolari del file stipendi05.txt che è stato organizzato in modo da essere letto e poi memorizzato in una matrice che chiameremo $matrice[$t]. La tabella iniziale ha 10 colonne e 8 righe. La prima riga riporta il tipo di ciascun personale della scuola e la prima colonna riporta gli anni di servizio, che sono validi per tutte le colonne. Se leggo il file dall'inizio e lo memorizzo in $matrice[$t] ottengo per esempio che l'elemento $matrice[01] contiene "collaboratore scolastico"; l'elemento $matrice[11] contiene lo stipendio di 13659,90 relativo sempre al collaboratore scostico con anni di servizio da 0 a 2; l'elemento $matrice[21] contiene lo stipendio di 13925,18 relativo sempre al collaboratore scostico con anni di servizio da 3 a 8; e così via; in pratica il primo numero dell'emento della matrice mi indica la riga ed il secondo numero mi indica la colonna, se contiamo righe e colonne partendo da zero.
Andiamo ora a preparare il listato di stipendio7.php che dovrà leggere il file e memorizzarlo nella matrice. Partiamo da stipendio5.php che era:
<html> <body background="sfondo2.jpg"> <?php print ("Programma per calcolare lo stipendio annuo lordo.<br><br>"); $anniservizio = $_GET['anniservizio'];
// leggo il file stipendi.txt $nomefile = "stipendi.txt"; $fp = fopen($nomefile, "r"); for ($t=1; $t<8; $t++) { $matrice1[$t] = fgets ($fp, 4096); $matrice2[$t] = fgets ($fp, 4096); }; fclose($fp);
// stampo i risultati print ("Lo stipendio annuo lordo è € $matrice2[$anniservizio] <br>"); if ($anniservizio == 0) print ("Non hai indicato gli anni di servizio. Torna indietro! <br>"); ?> <body> </html>
|
Listato di stipendio5.php |
e modifichiamolo opportunamente in questo modo:
<html> <body background="sfondo2.jpg"> <?php print ("Programma per calcolare lo stipendio annuo lordo.<br><br>"); $personale = $_GET['personale']; $anniservizio = $_GET['anniservizio'];
// leggo il file stipendi05.txt $nomefile = "stipendi05.txt"; $fp = fopen($nomefile, "r"); for ($t=1; $t<81; $t++) $matrice[$t] = fgets ($fp, 4096); fclose($fp); $tre = $anniservizio.$personale; $uno = $anniservizio."0"; // stampo i risultati if ($personale == 0) print ("Non hai indicato il tipo di personale. Torna indietro! <br>"); if ($anniservizio == 0) print ("Non hai indicato gli anni di servizio. Torna indietro! <br>"); print ("Personale: $matrice[$personale] <br>"); print ("Anni di servizio: $matrice[$uno] <br>"); print ("Lo stipendio annuo lordo è € $matrice[$tre] <br>"); ?> <body> </html>
|
Listato di stipendio7.php |
e salviamolo come stipendio7.php.
Notiamo alcuni particolari.
Unione di variabili
Se ho due variabili le posso unire tra di loro usando il punto tra le due variabili.
Esempio
$tre = $anniservizio.$personale;
Il contenuto di $anniservizio viene unito al contenuto di $personale e memorizzzato in $tre. Nel nostro caso lo usiamo per formare l'indice della matrice. Se infatti in $anniservizio vi è 1 e in $personale vi è 1, ottengo come unione 11. Stiamo attenti che l'unione è diversa dalla somma. Infatti se avessi sommato 1+1 avrei ottenuto 2.
Se eseguiamo stipendio6.php otteniamo:
che ci permette di calcolare lo stipendio annuo lordo di tutto il personale della scuola.
Gestione degli errori
In fase di scrittura del nostro programma dobbiamo cercare di prevedere tutte le situazioni che si possono verificare in fase di esecuzione. Se guardiamo la nostra prima pagina del programma stipendio6.php:
notiamo che l'utente potrebbe omettere di effettuare una o entrambe delle due selezioni previste. In tal caso noi abbiamo previsto con la istruzione:
<option value="0">SCEGLI PERSONALE</option>
che il valore di $personale sia "0" e con la istruzione:
<option value="0">SCEGLI ANNI DI SERVIZIO</option>
che il valore di $anniservizio sia "0".
Contemporaneamnte in stipendio7.php. abbiamo previsto con le istrzuioni:
if ($personale == 0) print ("Non hai indicato il tipo di personale. Torna indietro! <br>");
if ($anniservizio == 0) print ("Non hai indicato gli anni di servizio. Torna indietro! <br>");
una prima gestione degli errori. Tuttavia notiamo che il programma fa delle operazioni inutili in caso di errore, infatti continua a leggere il file stipendi05.txt e fa le stampe, perdendo del tempo inutilmente. Occorrerebbe, invece, bloccare la esecuzione del programma. La questione del tempo è importante; un buon programmatore deve ridurre al minimo il numero di istruzioni che servono ad eseguire il programma e deve scegliere sempre il modo più veloce, evitando di far perdere del tempo prezioso al computer. Vediamo, quindi, come modificare il listato di stipendio7.php nel seguente:
<html> <body background="sfondo2.jpg"> <?php print ("Programma per calcolare lo stipendio annuo lordo.<br><br>"); $personale = $_GET['personale']; $anniservizio = $_GET['anniservizio']; // gestione degli errori if ($personale == 0) { print ("Non hai indicato il tipo di personale. Torna indietro! <br>"); exit; }; if ($anniservizio == 0) { print ("Non hai indicato gli anni di servizio. Torna indietro! <br>"); exit; };
// leggo il file stipendi05.txt $nomefile = "stipendi05.txt"; $fp = fopen($nomefile, "r"); for ($t=1; $t<81; $t++) $matrice[$t] = fgets ($fp, 4096); fclose($fp); $tre = $anniservizio.$personale; $uno = $anniservizio."0"; // stampo i risultati print ("Personale: $matrice[$personale] <br>"); print ("Anni di servizio: $matrice[$uno] <br>"); print ("Lo stipendio annuo lordo è € $matrice[$tre] <br>"); ?> <body> </html>
|
Listato di stipendio7.php |
notiamo le due if che fanno il controllo degli errori:
if ($personale == 0) {
print ("Non hai indicato il tipo di personale. Torna indietro! <br>");
exit;
};
if ($anniservizio == 0) {
print ("Non hai indicato gli anni di servizio. Torna indietro! <br>");
exit;
};
in esse compare una nuova istruzione php e cioè exit.
Exit ci consente di bloccare il programma nel punto in cui si trova senza eseguire le istruzioni successive. Salviamo il nuovo listato di stipendio7.php ed eseguiamo nuovamente stipendio6.php per vederne gli effetti.
Corso di programmazione in PHP
prof. Pietro De Paolis
Indice di tutte le pagine del sito