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

tonya_atrox

Nuovo Utente
18 Set 2016
15
0
1
40
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.397
338
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
40
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.042
148
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
137
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
27
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
40
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
3.036
192
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
 
Discussioni simili
Autore Titolo Forum Risposte Data
M Problema con php per calcolo costo percentuale PHP 7
A [PHP] calcolo numero di ore effettuate PHP 7
M [PHP] Visualizzare nell'alert il calcolo PHP 4
maxnegri [PHP]Funzione di calcolo prezzo di una camera in un range di date PHP 62
P [PHP] Calcolo prezzi camera in range di date diverse PHP 11
Z [PHP] Calcolo giorno PHP 5
S [PHP] Calcolo Rate PHP 2
S calcolo php PHP 2
D calcolo fra date php PHP 2
M php / mysql calcolo prezzo base preventivo per hotel PHP 34
G Invio form con PHP PHP 1
T fatture con voci fattura in php PHP 0
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
M Collegamento tra form html e script php PHP 4
M Problemi con la stampa dei valori in php PHP 1
W [Cerco collaborazioni] Sviluppatore Web (PHP) Offerte e Richieste di Lavoro e/o Collaborazione 1
D passare valori da database sql a php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
E Inviare variabile a PHP da ciclo in JS Javascript 0
A form PHP prenotazione tramite query PHP 2
A Form php prenotazione di un azienda sanitaria locale presso studio medico PHP 1
F menù select dinamico da db in php PHP 3
L Problemi form Pagina php HTML e CSS 3
L php mysql non salva solo id PHP 21
L php mysql cerca e visualizza pagina PHP 0
F Il codice php è giusto? PHP 2
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
A invio massivo dati a file php Javascript 4
Z MySql injection PHP PHP 1
V PHP form intersecate PHP 0
I [Offro][Retribuito] Programmatore Php Offerte e Richieste di Lavoro e/o Collaborazione 0
P Funzione jQuery Ajax invio file a php jQuery 1
C Dopo chiusura del tag php la stringa html va a capo PHP 1
E Transaction php PHP 11
B ciclare file xml con PHP PHP 1
L Estrazione dati php Database 6
A Aiuto per pagina php PHP 0
E Php select option e ajax PHP 23
I Aiuto php Dependent Lookup PHP 0
T arretramento versione PHP... PHP 3
D problema php mysql PHP 1
D problema php mysql PHP 1
E Barra di avanzamento codice PHP PHP 4
G creazione menu a tendina e invio a pagina php PHP 1
A inserire variabile php colore in div html PHP 2
Z Video protetto con PHP PHP 0
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
I Eecuzione di javascript in ciclo foreach php. PHP 7
S Libreria PHP per creare file dwg o dxf PHP 0
A [cerco - retribuito] Sviluppatore Php freelance per progetti vari Offerte e Richieste di Lavoro e/o Collaborazione 2

Discussioni simili