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

Discussione in 'PHP' iniziata da tonya_atrox, 7 Ottobre 2016.

  1. tonya_atrox

    tonya_atrox Nuovo Utente

    Registrato:
    18 Settembre 2016
    Messaggi:
    15
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Femmina
    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;
     
  2. Max 1

    Max 1 Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    29 Febbraio 2012
    Messaggi:
    3.865
    Mi Piace Ricevuti:
    286
    Punteggio:
    83
    Sesso:
    Maschio
    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
     
    A tonya_atrox piace questo elemento.
  3. tonya_atrox

    tonya_atrox Nuovo Utente

    Registrato:
    18 Settembre 2016
    Messaggi:
    15
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Femmina
    grazie e Scusa , me ne ero dimenticata.
     
  4. borgo italia

    borgo italia Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    4 Febbraio 2008
    Messaggi:
    16.028
    Mi Piace Ricevuti:
    146
    Punteggio:
    63
    Sesso:
    Maschio
    Località:
    PR
    Home Page:
    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?
     
    A tonya_atrox piace questo elemento.
  5. Rikk73

    Rikk73 Utente Attivo

    Registrato:
    7 Aprile 2015
    Messaggi:
    133
    Mi Piace Ricevuti:
    6
    Punteggio:
    18
    Sesso:
    Maschio
    Occupazione:
    .NET Software Developer
    Località:
    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...
     
    A tonya_atrox piace questo elemento.
  6. AdeKnite

    AdeKnite Utente Attivo

    Registrato:
    3 Agosto 2016
    Messaggi:
    161
    Mi Piace Ricevuti:
    35
    Punteggio:
    28
    Sesso:
    Maschio
    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
     
    A tonya_atrox piace questo elemento.
  7. tonya_atrox

    tonya_atrox Nuovo Utente

    Registrato:
    18 Settembre 2016
    Messaggi:
    15
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Femmina
    :) 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
     
  8. borgo italia

    borgo italia Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    4 Febbraio 2008
    Messaggi:
    16.028
    Mi Piace Ricevuti:
    146
    Punteggio:
    63
    Sesso:
    Maschio
    Località:
    PR
    Home Page:
    ciao
    poi comunica a @AdeKnite il voto che ti da il proff
     
    A AdeKnite piace questo elemento.
  9. VAik

    VAik Utente Attivo

    Registrato:
    16 Aprile 2016
    Messaggi:
    117
    Mi Piace Ricevuti:
    3
    Punteggio:
    18
    mi iscrivo
     
  10. marino51

    marino51 Utente Attivo

    Registrato:
    28 Febbraio 2013
    Messaggi:
    2.549
    Mi Piace Ricevuti:
    126
    Punteggio:
    63
    Occupazione:
    free lance
    Località:
    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
     
Sto caricando...

Condividi questa Pagina