Licence Informatique 2ème année Programmation Objet 1
Contrôle continu – 21/02/2019 - 1h30
Numéro étudiant : Nom :
Prénom : Diplôme :
Les notes de cours, TD et TP sont autorisées.
Exercice 1 : À quel affichage conduit l'exécution du programme suivant? (3 points) class A{
int i=0;
A(int i){
this.i=i;
}
int m(A a){
return a.i;
} }
class B extends A{
int i=1;
B(){
super(3);
this.i=4;
}
int m(A a){
return super.m(this);
}
public static void main(String[] truc){
A a = new B();
System.out.println(a.i);
System.out.println(((B) a).i);
System.out.println(a.m(a));
System.out.println(((B) a).m(a));
A b = new A(5);
System.out.println(b.m(a));
} }
Exercice 2 (7 points) : on veut représenter des poux dans un programme. Chaque pou a un nom et une quantité de sang qu'il a sucé. Quand un pou est créé, cette quantité de sang est à zéro. Chaque pou doit pouvoir sucer du sang, et à chaque succion il avale 0,01ml de sang.
a- Proposez du code objet pour représenter les poux. (1,5 points)
Parmi les poux, il y a des papas poux. Les papas poux sont des poux qui ont des enfants poux. On doit pouvoir ajouter des enfants à un papa pou au fur et à mesure qu'ils naissent.
b- Proposez du code objet pour représenter les papas poux. (2 points)
Les papous sont représentés dans le programme par la classe suivante (on suppose que la classe Tribu existe).
class Papou{
Tribu tr;
Papou(Tribu tr){ this.tr = tr; } }
c- Proposez du code objet pour représenter les papas poux papous. Un papa pou papou est créé en précisant son nom et sa tribu (3,5 points).
Exercice 3 (10 points) : on veut développer un logiciel pour simuler les flux financiers publics, de façon très simplifiée bien sur. Tous les objets qui interviennent dans la simulation doivent implémenter l'interface Runnable (non modifiable car elle fait partie du langage Java), qui ne contient qu'une méthode run. Cette méthode décrit ce que fait chaque objet à chaque pas de simulation, qui correspond à une durée d'un mois.
interface java.lang.Runnable{
public void run();
}
La simulation comporte des citoyens actifs (non retraités), des entreprises et l'état. Chacun de ces élements a un compte bancaire qu'il doit être possible de créditer et de débiter.
Chaque citoyen actif a un numéro de sécu et un compte bancaire initialisé a zéro. Chaque citoyen actif a en outre un revenu mensuel initialisé aléatoirement. Parmi les citoyens, il y a des fonctionnaires qui ont des revenus entre le SMIC (1200 euros par mois) et 15000 euros par mois. Il y a des salariés du secteur privé qui ont des revenus entre le SMIC et 3 millions d'euros par mois (certains footballeurs, PDG, ...). Et il y a des chomeurs, qui ont un revenu entre 550 (RSA minimum) et 6200 euros (plafond d'indemnisation chomage).
Quand un citoyen meurt (c'est-à-dire quand l'objet qui représente le citoyen cesse d'exister), l'état récupère un impôt sur les successions égal à 20% du montant du compte bancaire du citoyen.
Chaque mois, les citoyens ayant un revenu mensuel supérieur à 850 euros payent à l'état un impôt sur le revenu égal à 14% de leurs revenus. En plus, tous les citoyens payent à chaque pas de simulation 150 euros de taxes diverses (TVA, TIPP, ...).
On peut supposer pour les questions a et b qu'il existe un objet de type Etat qui posséde un compte bancaire et représente l'état, et que cet objet est stocké dans la variable de classe Etat.ETAT.
a- Proposez des classes pour représenter les citoyens. (5 points)
Les entreprises ont toutes un numéro SIREN et un bénéfice annuel, compris entre -10 milliards et +30 milliards, et initialisé aléatoirement. Chaque mois, chaque entreprise avec un bénéfice positif verse à l'état un impôt sur les sociétés égal à 28% de son bénéfice mensuel (égal au bénéfice annuel divisé par 12).
b- Proposez des classes pour représenter les entreprises (2 points)
L'état a un compte bancaire initialisé à -2300 milliards d'euros (montant de la dette publique). L'état gère 5 millions 650000 fonctionnaires, qui sont initialisés avec un numéro de sécu bidon. Il doit être possible d'ajouter et de supprimer des fonctionnaires. Chaque mois, l'état verse à chaque fonctionnaire un salaire égal à son revenu.
c- Proposez des classes pour représenter l'état (3 points)
CO RR
EC TIO N
Exercice 1 3,4,3,3,3
Exercice 2
import java.util.ArrayList;
class Pou{
String nom;
float sang;
Pou(String n){
this.nom = n;
this.sang = 0;
}
void suce(){
this.sang = this.sang+0.01f;
} }
class PapaPou extends Pou{
ArrayList<Pou> enfants;
PapaPou(String n){
super(n);
this.enfants = new ArrayList<Pou>();
}
void addEnfant(Pou e){
this.enfants.add(e);
} }
class Tribu{}
class Papou{
Tribu tr;
Papou(Tribu tr){
this.tr = tr;
} }
class PapaPouPapou extends PapaPou{
Papou pa;
PapaPouPapou(String n, Tribu tr){
super(n);
this.pa = new Papou(tr);
} }
Exercice 3 class Bankable{
float compte;
Bankable(float init){this.compte = init;}
void debite(float montant){this.compte = this.compte-montant;}
void credite(float montant){this.compte = this.compte+montant;}
}
abstract class Citoyen extends Bankable implements Runnable{
String numSecu;
float revenu;
Citoyen(String secu){
super(0.0f);
this.numSecu = secu;
CO RR
EC TIO N
this.revenu = 0.0f;
}
public void run(){
float sous = 150.0f;
if(this.revenu>850) sous = sous + Etat.IMPOT_SUR_REVENU*this.revenu;
this.debite(sous);
Etat.ETAT.credite(sous);
}
protected void finalize(){
Etat.ETAT.credite(Etat.IMPOT_SUR_SUCCESSION*this.compte);
} }
class Fonctionnaire extends Citoyen{
Fonctionnaire(String secu){
super(secu);
this.revenu = (float) (1200+Math.random()*13000);
} }
class SalariePrive extends Citoyen{
SalariePrive(String secu){
super(secu);
this.revenu = (float) (1200+Math.random()*2998800);
} }
class Chomeur extends Citoyen{
Chomeur(String secu){
super(secu);
this.revenu = (float) (550+Math.random()*5650);
} }
class Entreprise extends Bankable implements Runnable{
String siren;
float benefices;
Entreprise(String siren){
super(0.0f);
this.siren = siren;
this.benefices = (float) (-10E9+Math.random()*30E9);
}
public void run(){
if(this.bebfices>0){
float sous = Etat.IMPOT_SUR_BENEFICE*this.benefices/12,0f;
this.debite(sous);
Etat.ETAT.credite(sous);
} } }
import java.util.LinkedList;
class Etat extends Bankable implements Runnable{
static final float IMPOT_SUR_REVENU=0.14f;
static final float IMPOT_SUR_SUCCESSION=0.2f;
static final float IMPOT_SUR_BENEFICE=0.28f;
static final Etat ETAT=new Etat();
LinkedList <Fonctionnaire> tf;
Etat(){
super(-2299E9f);
tf = new LinkedList<Fonctionnaire>();
for(int i=0;i<5650000;i++) tf.add(new Fonctionnaire("0000"));
}
CO RR
EC TIO N
public void addFonctionnaire(Fonctionnaire f){this.tf.add(f);}
public void removeFonctionnaire(Fonctionnaire f){this.tf.remove(f);}
public void run(){
for(Fonctionnaire f:this.tf){
f.credite(f.revenu);
this.compte = this.compte - f.revenu;
} } }