-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGolfHandicap.cpp
More file actions
95 lines (84 loc) · 2.49 KB
/
GolfHandicap.cpp
File metadata and controls
95 lines (84 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "GolfHandicap.hpp"
#include "math.h" // floor
#include <algorithm> // sort
#include <iostream>
#include <numeric> // accumulate
#include <vector>
GolfHandicap::GolfHandicap(){
differentials = {0};
handicap = 0.0;
idx = 0;
enteredScores = 0;
}
void GolfHandicap::addDifferential(float differential){
differentials[idx] = differential;
idx = (idx + 1) % DIFFERENTIALS_SIZE;
enteredScores++;
handicap = calculateHandicap(enteredScores, differentials);
}
unsigned GolfHandicap::totalScores(){
return enteredScores;
}
float calculateHandicap(unsigned enteredScores, std::array<float, DIFFERENTIALS_SIZE> differentials){
unsigned scoresToUse = 0;
float adjustment = 0.0;
if (enteredScores < 3){
return 0.0;
}
else if (enteredScores == 3){
scoresToUse = 1;
adjustment = -2.0;
}
else if(enteredScores == 4){
scoresToUse = 1;
adjustment = -1.0;
}
else if (enteredScores == 5){
scoresToUse = 1;
}
else if (enteredScores == 6){
scoresToUse = 2;
adjustment = -1.0;
}
else if (enteredScores == 7 || enteredScores == 8){
scoresToUse = 2;
}
else if (enteredScores >= 9 && enteredScores <= 11){
scoresToUse = 3;
}
else if (enteredScores >= 12 && enteredScores <= 14){
scoresToUse = 4;
}
else if (enteredScores == 15 || enteredScores == 16){
scoresToUse = 5;
}
else if (enteredScores == 17 || enteredScores == 18){
scoresToUse = 6;
}
else if (enteredScores == 19){
scoresToUse = 7;
}
else if (enteredScores >= DIFFERENTIALS_SIZE){
scoresToUse = 8;
}
std::vector<float> sorted;
unsigned activeDifferentials = enteredScores > DIFFERENTIALS_SIZE? DIFFERENTIALS_SIZE : enteredScores;
for (auto it=0; it < activeDifferentials; it++){
sorted.push_back(differentials[it]);
}
std::sort(sorted.begin(), sorted.end());
float average = (std::accumulate(sorted.begin(), sorted.begin() + scoresToUse, 0.0) / scoresToUse) + adjustment;
float handicap = (float)floor(average*10+0.5)/10;
return handicap;
}
float GolfHandicap::currentHandicap(){
return handicap;
}
float calculateScoreDifferential(GolfScore score){
return (113.0 / score.course.slope) * (score.score - score.course.rating);
}
void GolfHandicap::printDifferentials(){
for (auto it=0; it < differentials.size(); it++){
std::cout << differentials[it] << std::endl;
}
}