[PHP] Calcolo anzianità soggetti [era: Help me :( Esercizio per me impossibile]

tonya_atrox

Nuovo Utente
18 Set 2016
15
0
1
39
Sto uscendo pazza :(:confused::eek:o_O Alcuni esercizi sono riuscita a completarli ma con questo mi sono completamente bloccata . Non so da dove iniziare .
Chiedo se qualcuno del forum puo' aiutarmi.
Grazie e scusate per il disturbo.

Esercizio:
Si definisca una gerarchia di classi per rappresentare soggetti fiscali. Ogni soggetto fiscale ha un nome, e di ogni soggetto fiscale deve essere possibile calcolare l'anzianità in un dato anno, tenendo però presente che l’anzianità si calcola in modo diverso a seconda della categoria (impiegato, pensionato o straniero) a cui appartiene il soggetto fiscale. In particolare:

  • se il soggetto è un impiegato, allora l’anzianità a un certo anno si calcola sottraendo l'anno di assunzione a quell'anno;

  • se il soggetto è un pensionato, allora l’anzianità a un certo anno si calcola sottraendo l'anno di pensionamento a quell'anno;

  • se il soggetto è uno straniero, allora l’anzianità a un certo anno si calcola sottraendo l'anno di ingresso nel paese a quell'anno.

  • Scrivere un metodo che, dato un elenco di soggetti fiscali e un anno, sia in grado di calcolare il soggetto con l'anzianità più alta a quel dato anno

    Creare una classe astratta per gestire le diverse chiamate a metodi in uno script inserito nel file index.php;
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.232
321
83
Ciao tonya_atrox.
Occhio questa discussione per regolamento dovrebbe essere chiusa! Ho cambiato io il titolo perché i titoli devo essere descrittivi del problema e non frasi a caso tipo help me aiuto, leggi qui ecc. ecc..

Vedi di leggere il regolamento del forum

Grazie
 
  • Like
Reactions: tonya_atrox

tonya_atrox

Nuovo Utente
18 Set 2016
15
0
1
39
Ciao tonya_atrox.
Occhio questa discussione per regolamento dovrebbe essere chiusa! Ho cambiato io il titolo perché i titoli devo essere descrittivi del problema e non frasi a caso tipo help me aiuto, leggi qui ecc. ecc..

Vedi di leggere il regolamento del forum

Grazie
grazie e Scusa , me ne ero dimenticata.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
146
63
PR
www.borgo-italia.it
ciao
non ti posso dare una mano con le classi perchè mi sono sempre rifutato di impararle, però posso darti un paio di dritte
1) fatti il diagramma di flusso per chiaruirti il problema
2) traduci il diagramma in php stile procedurale e poi trasformalo in classi

una domanda: cosa intendi per "elenco" ? un elenco fatto da database?
 
  • Like
Reactions: tonya_atrox

Rikk73

Utente Attivo
7 Apr 2015
133
6
18
Arezzo
molto importante è come strutturi il db
ad ogni record potresti imputare tre campi data tipo Assunzione (per anzianità di servizio) pensionamento (per quella di pensione) ed ingresso (se straniero)

in questo modo puoi calcolare la differenza tra le date come vuoi, anche tutte e tre per un solo record, ad esempio se fosse uno straniero lavoratore che poi va in pensione...
 
  • Like
Reactions: tonya_atrox

AdeKnite

Utente Attivo
3 Ago 2016
161
35
28
26
Ciao, grazie al tuo problema ho colto l'occasione per imparare la OOP.
Questo è quanto ho ottenuto (non ho effettuato operazioni di validazione, per cui se inserisci una stringa dove invece è richiesto un intero, il sistema crolla).
PHP:
<?php

// CLASSE ASTRATTA
abstract class SoggettiFiscali {

  public $nome;
  //setto le diverse date a N/D
  public $anno_assunzione = "N/D";
  public $anno_pensionamento = "N/D";
  public $anno_entrata = "N/D";
// tutte le sottoclassi dovranno implementare questo metodo
  abstract function anzianita($anno_corrente);

}

// IMPIEGATO
class Impiegato extends SoggettiFiscali {

  public function __construct($nome,$anno) {
    $this->nome = $nome;
    // modifico la data che gli compete
    $this->anno_assunzione = $anno;
  }

  public function anzianita($anno_corrente) {
    return $anno_corrente-$this->anno_assunzione;
  }
}

// PENSIONATO
class Pensionato extends SoggettiFiscali {

  public function __construct($nome,$anno) {
    $this->nome = $nome;
    // modifico la data che gli compete
    $this->anno_pensionamento = $anno;
  }

  public function anzianita($anno_corrente) {
    return $anno_corrente-$this->anno_pensionamento;
  }
}

// STRANIERO
class Straniero extends SoggettiFiscali {

  public function __construct($nome,$anno) {
    $this->nome = $nome;
    // modifico la data che gli compete
    $this->anno_entrata = $anno;
  }

  public function anzianita($anno_corrente) {
    return $anno_corrente-$this->anno_entrata;
  }
}

// creo una classe per il confronto dei soggetti
class ConfrontaSoggetti {
  public $lista_soggetti;
  // l'istanza della classe prenderà in input un array di soggetti
  public function __construct($lista_soggetti) {
    $this->lista_soggetti = $lista_soggetti;
  }
  // controllo quale è il soggetto più anziano
  public function piuAnziano($anno_corrente) {
    $max = $this->lista_soggetti[0]->anzianita($anno_corrente);

    foreach ($this->lista_soggetti as $key => $persona) {
      $anzianita_corrente = $persona->anzianita($anno_corrente);

      if ($anzianita_corrente > $max) {
        $max = $anzianita_corrente;
        $res['nome'] = $persona->nome;
        $res['categoria'] = get_class($persona);
        $res['anno_pensionamento'] = $persona->anno_pensionamento;
        $res['anno_assunzione'] = $persona->anno_assunzione;
        $res['anno_entrata'] = $persona->anno_entrata;
        $res['anzianita'] = $max;

      }
    }
    return $res; // ritorna un array con le informazioni del più anziano
  }
}

// creo un array in cui inserisco diversi soggetti
// puoi inserire tutti i soggetti che vuoi 
$lista[0] = new Impiegato("Tizio",1990);
$lista[1] = new Impiegato("Caio",1985);
$lista[2] = new Straniero("Sempronio",1984);
$lista[3] = new Pensionato("Asdrubale",1591);

// salvo in una variabile l'anno in cui fare il confronto
$anno_confronto = 2016;

$cfr = new ConfrontaSoggetti($lista);

// salvo le informazioni all'interno di variabili
// per costruire un output
$nome  = $cfr->piuAnziano($anno_confronto)['nome'];
$categoria  = $cfr->piuAnziano($anno_confronto)['categoria'];
$anno_assunzione  = $cfr->piuAnziano($anno_confronto)['anno_assunzione'];
$anno_pensionamento  = $cfr->piuAnziano($anno_confronto)['anno_pensionamento'];
$anno_entrata  = $cfr->piuAnziano($anno_confronto)['anno_entrata'];
$anzianita  = $cfr->piuAnziano($anno_confronto)['anzianita'];

// stampo l'output a video
echo "
<strong>Nome:</strong> ".$nome."<br>
<strong>Categoria:</strong> ".$categoria."<br>
<strong>Anno Assunzione:</strong> ".$anno_assunzione."<br>
<strong>Anno Pensionamento:</strong> ".$anno_pensionamento."<br>
<strong>Anno Entrata:</strong> ".$anno_entrata."<br>
<strong>Anzianità:</strong> ".$anzianita." anni.<br>";

?>
Ti allego l'output.

Cattura.PNG
 
  • Like
Reactions: tonya_atrox

tonya_atrox

Nuovo Utente
18 Set 2016
15
0
1
39
Ciao, grazie al tuo problema ho colto l'occasione per imparare la OOP.
Questo è quanto ho ottenuto (non ho effettuato operazioni di validazione, per cui se inserisci una stringa dove invece è richiesto un intero, il sistema crolla).
PHP:
<?php

// CLASSE ASTRATTA
abstract class SoggettiFiscali {

  public $nome;
  //setto le diverse date a N/D
  public $anno_assunzione = "N/D";
  public $anno_pensionamento = "N/D";
  public $anno_entrata = "N/D";
// tutte le sottoclassi dovranno implementare questo metodo
  abstract function anzianita($anno_corrente);

}

// IMPIEGATO
class Impiegato extends SoggettiFiscali {

  public function __construct($nome,$anno) {
    $this->nome = $nome;
    // modifico la data che gli compete
    $this->anno_assunzione = $anno;
  }

  public function anzianita($anno_corrente) {
    return $anno_corrente-$this->anno_assunzione;
  }
}

// PENSIONATO
class Pensionato extends SoggettiFiscali {

  public function __construct($nome,$anno) {
    $this->nome = $nome;
    // modifico la data che gli compete
    $this->anno_pensionamento = $anno;
  }

  public function anzianita($anno_corrente) {
    return $anno_corrente-$this->anno_pensionamento;
  }
}

// STRANIERO
class Straniero extends SoggettiFiscali {

  public function __construct($nome,$anno) {
    $this->nome = $nome;
    // modifico la data che gli compete
    $this->anno_entrata = $anno;
  }

  public function anzianita($anno_corrente) {
    return $anno_corrente-$this->anno_entrata;
  }
}

// creo una classe per il confronto dei soggetti
class ConfrontaSoggetti {
  public $lista_soggetti;
  // l'istanza della classe prenderà in input un array di soggetti
  public function __construct($lista_soggetti) {
    $this->lista_soggetti = $lista_soggetti;
  }
  // controllo quale è il soggetto più anziano
  public function piuAnziano($anno_corrente) {
    $max = $this->lista_soggetti[0]->anzianita($anno_corrente);

    foreach ($this->lista_soggetti as $key => $persona) {
      $anzianita_corrente = $persona->anzianita($anno_corrente);

      if ($anzianita_corrente > $max) {
        $max = $anzianita_corrente;
        $res['nome'] = $persona->nome;
        $res['categoria'] = get_class($persona);
        $res['anno_pensionamento'] = $persona->anno_pensionamento;
        $res['anno_assunzione'] = $persona->anno_assunzione;
        $res['anno_entrata'] = $persona->anno_entrata;
        $res['anzianita'] = $max;

      }
    }
    return $res; // ritorna un array con le informazioni del più anziano
  }
}

// creo un array in cui inserisco diversi soggetti
// puoi inserire tutti i soggetti che vuoi
$lista[0] = new Impiegato("Tizio",1990);
$lista[1] = new Impiegato("Caio",1985);
$lista[2] = new Straniero("Sempronio",1984);
$lista[3] = new Pensionato("Asdrubale",1591);

// salvo in una variabile l'anno in cui fare il confronto
$anno_confronto = 2016;

$cfr = new ConfrontaSoggetti($lista);

// salvo le informazioni all'interno di variabili
// per costruire un output
$nome  = $cfr->piuAnziano($anno_confronto)['nome'];
$categoria  = $cfr->piuAnziano($anno_confronto)['categoria'];
$anno_assunzione  = $cfr->piuAnziano($anno_confronto)['anno_assunzione'];
$anno_pensionamento  = $cfr->piuAnziano($anno_confronto)['anno_pensionamento'];
$anno_entrata  = $cfr->piuAnziano($anno_confronto)['anno_entrata'];
$anzianita  = $cfr->piuAnziano($anno_confronto)['anzianita'];

// stampo l'output a video
echo "
<strong>Nome:</strong> ".$nome."<br>
<strong>Categoria:</strong> ".$categoria."<br>
<strong>Anno Assunzione:</strong> ".$anno_assunzione."<br>
<strong>Anno Pensionamento:</strong> ".$anno_pensionamento."<br>
<strong>Anno Entrata:</strong> ".$anno_entrata."<br>
<strong>Anzianità:</strong> ".$anzianita." anni.<br>";

?>
Ti allego l'output.

Vedi l'allegato 3204
:) Grandioso !!! Riscrivo il codice e lo studio subito . Sei stato anche molto chiaro nei commenti, ciò rende il codice piu' comprensibile.
Sono stata miracolata ;) grazie per la disponibilita' a presto
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
ero indeciso se intervenire, ma mi permetto di segnalare una correzione,
PHP:
//        $max = $this->lista_soggetti[0]->anzianita($anno_corrente);
        $max = -1;
considerato che l'anzianità non può essere negativa e che il codice originale non funziona con certe condizioni della lista dei soggetti