-
Cours :
- Premiers pas en Java (pdf)
- Classes et objets (pdf)
- Penser objet et encapsulation (pdf)
- Tests et enum (pdf)
- Égalité, final, static, surcharge et documentation (pdf)
- Types paramétrés et interfaces (pdf)
- Agrégation, composition, délégation et extension (pdf)
- Paquetage, accessibilité et exceptions (pdf)
- Final et notions avancées (pdf)
- Documents :
- TP :
Corrigé examen : gestion d’élection
Citoyen : classe Citizen
Question 1 (1,5 points) : Ajouter dans la classe
Citizen
les déclarations des attributsVOTING_AGE
,citizenCount
,firstName
,lastName
,age
etcitizenId
.
public class Citizen {
private final static int VOTING_AGE = 18;
private static int citizenCount = 0;
private final String lastName;
private final String firstName;
private final int citizenId;
private int age;
}
Question 2 (1 point) : Compléter le code du constructeur de la classe
Citizen
qui permet d’instancier un citoyen avec un prénom, un nom de famille et un age. Un citoyen a pour numéro d’identifiant le nombre de citoyens qui ont été instanciés avant son instanciation. Le nombre de citoyens instanciés doit évidemment être mis à jour.
public class Citizen {
public Citizen(String firstName, String lastName, int age) {
this.lastName = lastName;
this.firstName = firstName;
this.age = age;
citizenId = citizenCount;
citizenCount++;
} }
Question 3 (4 points) : Changer le code des méthodes
incrementAge
,canVote
,getUpperCaseLastName
,getCapitalizedFirstName
,getName
,getAge
,getCitizenId
,equals
etresetCitizenCount
.
public class Citizen {
public void incrementAge(){
age++;
}
public boolean canVote(){
return age >= VOTING_AGE;
}
private String getCapitalizedFirstName(){
return firstName.substring(0,1).toUpperCase()
substring(1).toLowerCase();
+ firstName.
}
private String getUpperCaseLastName(){
return lastName.toUpperCase();
}
public String getName() {
return getCapitalizedFirstName() + " "
getUpperCaseLastName();
+
}
public int getCitizenId() {
return citizenId;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Citizen))
return false;
Citizen citizen = (Citizen) o;return citizenId == citizen.citizenId;
}
public int getAge() {
return age;
}
public static void resetCitizenCount(){
0;
citizenCount =
} }
Question 4 (1,5 points) : Compléter le code de la classe
CandidateResult
.
public class CandidateResult{
private final Citizen candidate;
private int voteCount;
public CandidateResult(Citizen candidate) {
this.candidate = candidate;
this.voteCount = 0;
}
public int getVoteCount() {
return voteCount;
}
public void addVote(){
voteCount++;
}
public Citizen getCandidate() {
return candidate;
} }
Question 5 (1,5 points) : Créer une classe
CandidateResultTest
danssrc/test/java
testant les méthodesgetVoteCount
,getCandidate
etaddVote
de la classeCandidateResult
.
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class CandidateResultTest {
private Citizen candidate;
@BeforeEach
void initializeCandidate(){
new Citizen("arnaud", "labourel", 41);
candidate =
}
@Test
void testGetVoteCount(){
new CandidateResult(candidate);
CandidateResult candidateResult = assertThat(candidateResult.getVoteCount()).isEqualTo(0);
}
@Test
void testAddVote(){
new CandidateResult(candidate);
CandidateResult candidateResult = assertThat(candidateResult.getVoteCount()).isEqualTo(0);
for(int index = 0; index < 10; index++){
addVote();
candidateResult.assertThat(candidateResult.getVoteCount()).isEqualTo(index + 1);
}
}
@Test
void testGetCandidate(){
new CandidateResult(candidate);
CandidateResult candidateResult = assertThat(candidateResult.getCandidate()).isSameAs(candidate);
}
}
Question 6 (0,5 points) : Compléter le code de la méthode
toString
de la classePercentages
.
public class Percentages {
public static String toString(double percentage){
return Math.round(percentage * 100.) + "%";
} }
Question 7 (2,5 points): Changer le code des méthodes
addVote
,getExpressedVotes
,getNullVotes
,getVoterTurnout
etElectionResult
.
public class ElectionResult {
public void addVote(String ballot){
for(CandidateResult result : candidateResults)
if(result.getCandidate().getName().equals(ballot)) {
addVote();
result.return;
}
nullVotes++;
}
public void print(){
System.out.println("Expressed votes: " + getExpressedVotes());
for(CandidateResult result : candidateResults)
System.out.println(result.getCandidate().getName() + ": "
toString(proportionOfExpressedVotes(result)));
+ Percentages.System.out.println("Null votes: " + nullVotes);
System.out.println("Voter turnout: " + Percentages.toString(voterTurnout));
}
private double proportionOfExpressedVotes(CandidateResult result) {
return result.getVoteCount() / (double) getExpressedVotes();
}
public int getExpressedVotes(){
int sumOfVotes = 0;
for(CandidateResult result : candidateResults){
getVoteCount();
sumOfVotes += result.
}return sumOfVotes;
}
public int getNullVotes() {
return nullVotes;
}
public double getVoterTurnout() {
return voterTurnout;
} }
Question 8 (1 point) : Ajouter dans la classe
PollingPlace
les attributsregisteredVoters
,participatingVoters
etballots
.
public class PollingPlace {
private final List<Citizen> registeredVoters;
private final List<Citizen> participatingVoters;
private final List<String> ballots;
}
Question 9 (1 point) : Compléter le constructeur de la classe
PollingPlace
qui permet d’instancier un bureau de vote à partir d’une listepossibleVoters
de citoyens donnée en argument. Le bureau de vote aura pour liste d’électeurs enregistrés les citoyens depossibleVoters
qui ont l’age de voter, une liste vide d’électeur ayant voté et une liste vide de bulletins.
public PollingPlace(List<Citizen> possibleVoters) {
this.registeredVoters = new ArrayList<>();
for(Citizen citizen : possibleVoters)
if(citizen.canVote())
add(citizen);
registeredVoters.this.participatingVoters = new ArrayList<>();
this.ballots = new ArrayList<>();
}
Question 10 (3 points) : Compléter la méthode
acceptVoteFrom
,castBallot
,voterTurnout
etcountTheVotes
de la classePollingPlace
.
public class PollingPlace {
public boolean castBallot(Citizen citizen, String ballot) {
if (!acceptVoteFrom(citizen))
return false;
add(citizen);
participatingVoters.add(ballot);
ballots.return true;
}
public boolean acceptVoteFrom(Citizen citizen) {
return registeredVoters.contains(citizen)
contains(citizen);
&& !participatingVoters.
}
public double voterTurnout(){
return participatingVoters.size() / (double) registeredVoters.size();
}
public ElectionResult countTheVotes(List<Citizen> candidates){
new ElectionResult(candidates, voterTurnout());
ElectionResult result = for(String ballot : ballots){
addVote(ballot);
result.
}return result;
} }
Question 11 (2 points) : Créez les classes
AbsoluteMajoritySelector
etThresholdSelector
dans le dossiersrc/main/java
.
public class AbsoluteMajoritySelector implements CandidateSelector{
@Override
public boolean acceptCandidate(CandidateResult result, int expressedVotes) {
return result.getVoteCount() > expressedVotes/2;
} }
public class ThresholdSelector implements CandidateSelector {
private final double threshold;
public ThresholdSelector(double threshold) {
this.threshold = threshold;
}
public boolean acceptCandidate(CandidateResult result, int expressedVotes) {
return result.getVoteCount() >= threshold * expressedVotes;
} }
Question 12 (0,5 point) : Complétez le code de la méthode
List<Citizen> selectedCandidates(CandidateSelector selector)
dans la classeElectionResult
qui renvoie parmi les candidats dans le résultat de l’élection, ceux qui sont acceptés par leselector
passé en argument.
public class ElectionResult {
List<Citizen> selectedCandidates(CandidateSelector selector){
List<Citizen> selectedCandidates = new LinkedList<>();
for (CandidateResult result : candidateResults){
if(selector.acceptCandidate(result, getExpressedVotes()))
add(result.getCandidate());
selectedCandidates.
}return selectedCandidates;
} }