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

tonya_atrox

Nuovo Utente
18 Set 2016
15
0
1
43
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.449
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
43
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.046
150
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
141
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
30
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
43
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.203
207
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
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1

Discussioni simili