return ost<<d.month<<"/"<<d.day<<d.year<<"\n"; return ost << d.month << "/" << d.day << d.year << "\n";
Homework 4.1.1b in
Chapter 4,
p. 366.
Class
date
has three
int
data members:
year
,
month
,
day
.
The
&& d.day>21 && d.day<32
in the Brumaire paragraph is always true and therefore does nothing.
ostream& operator<<(ostream& ost, const date& d) { switch (ost.iword(date::subscript)){ case 0: return ost<<d.month<<"/"<<d.day<<d.year<<"\n"; case 1: if(d.month==9 && d.day>21 && d.day<31){ return ost<<d.day-21<<" Vendemiaire de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==10 && d.day<22){ return ost<<d.day+9<<" Vendemiaire de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==10 && d.day>21 && d.day<32){ return ost<<d.day-21<<" Brumaire de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==11 && d.day<21){ return ost<<d.day+10<<" Brumaire de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==11 && d.day>20 && d.day<31){ return ost<<d.day-20<<" Frimaire de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==12 && d.day<21){ return ost<<d.day+10<<" Frimaire de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==12 && d.day>20 && d.day<32){ return ost<<d.day-20<<" Nivose de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==1 && d.day<20){ return ost<<d.day+11<<" Nivose de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==1 && d.day>19 && d.day<32){ return ost<<d.day-19<<" Pluviose de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==2 && d.day<19){ return ost<<d.day+12<<" Pluviose de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==2 && d.day>18 && d.day<29){ return ost<<d.day-18<<" Ventose de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==3 && d.day<21){ return ost<<d.day+10<<" Ventose de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==3 && d.day>20 && d.day<29){ return ost<<d.day-20<<" Germinal de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==4 && d.day<20){ return ost<<d.day+11<<" Germinal de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==4 && d.day>19 && d.day<31){ return ost<<d.day-19<<" Floreal de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==5 && d.day<20){ return ost<<d.day+11<<" Floreal de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==5 && d.day>19 && d.day<32){ return ost<<d.day-19<<" Prairal de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==6 && d.day<19){ return ost<<d.day+12<<" Prairal de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==6 && d.day>18 && d.day<31){ return ost<<d.day-18<<" Messidor de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==7 && d.day<19){ return ost<<d.day+12<<" Messidor de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==7 && d.day>18 && d.day<32){ return ost<<d.day-18<<" Thermidor de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==8 && d.day<18){ return ost<<d.day+13<<" Thermidor de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==8 && d.day>17 && d.day<32){ return ost<<d.day-17<<" Fructidor de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==9 && d.day<17){ return ost<<d.day+14<<" Fructidor de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==9 && d.day==17){ return ost<<" Fete de la vertu de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==9 && d.day==18){ return ost<<" Fete du genie de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==9 && d.day==19){ return ost<<" Fete du travail de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==9 && d.day==20){ return ost<<" Fete de l'opinion de l'Annee "<<d.year+1-1792<<" de la Republic\n";} if(d.month==9 && d.day==21){ return ost<<" Fete des recompenses de l'Annee "<<d.year+1-1792<<" de la Republic\n";} else{ return ost<<"Date not available.";} case 2: return ost<<d.month<<"/"<<d.day<<d.year<<"\n"; default: cerr<<ost.iword(date::subscript)<<" is neither revolutionary or nonrevolutionary.\n"; exit(EXIT_FAILURE); } }
Let’s strip out the code that does nothing.
ostream& operator<<(ostream& ost, const date& d) { switch (ost.iword(date::subscript)) { case 0: return ost << d.month << "/" << d.day << d.year << "\n"; case 1: if (d.month == 9 && d.day > 21) { return ost << d.day-21 << " Vendemiaire de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 10 && d.day < 22) { return ost << d.day+9 <<" Vendemiaire de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 10) { return ost << d.day-21 << " Brumaire de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 11 && d.day < 21) { return ost << d.day+10 << " Brumaire de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 11) { return ost << d.day-20 << " Frimaire de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 12 && d.day < 21) { return ost << d.day+10 << " Frimaire de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 12 && d.day > 20) { return ost << d.day-20 << " Nivose de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 1 && d.day < 20) { return ost << d.day+11 << " Nivose de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 1) { return ost << d.day-19 << " Pluviose de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 2 && d.day < 19) { return ost << d.day+12 << " Pluviose de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 2) { return ost << d.day-18 << " Ventose de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 3 && d.day < 21) { return ost << d.day+10 << " Ventose de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 3) { return ost << d.day-20 << " Germinal de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 4 && d.day < 20) { return ost << d.day+11 << " Germinal de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 4) { return ost << d.day-19 << " Floreal de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 5 && d.day < 20) { return ost << d.day+11 << " Floreal de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 5) { return ost << d.day-19 << " Prairal de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 6 && d.day < 19) { return ost << d.day+12 << " Prairal de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 6) { return ost << d.day-18 << " Messidor de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 7 && d.day < 19) { return ost << d.day+12 << " Messidor de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 7) { return ost << d.day-18 << " Thermidor de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 8 && d.day < 18) { return ost << d.day+13 << " Thermidor de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 8) { return ost << d.day-17 << " Fructidor de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 9 && d.day < 17) { return ost << d.day+14 << " Fructidor de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 9 && d.day == 17) { return ost << " Fete de la vertu de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 9 && d.day == 18) { return ost << " Fete du genie de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 9 && d.day == 19) { return ost << " Fete du travail de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 9 && d.day == 20) { return ost << " Fete de l'opinion de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.month == 9 && d.day == 21) { return ost << " Fete des recompenses de l'Annee " << d.year+1-1792 << " de la Republic\n"; } else { return ost << "Date not available."; } case 2: return ost << d.month << "/" << d.day <<d.year << "\n"; default: cerr << ost.iword(date::subscript) << " is neither revolutionary nor nonrevolutionary.\n"; exit(EXIT_FAILURE); } }
The above code compares
d.month
to 9 in 7 places.
#include <string> using namespace std; struct month { int cutoff; string name; int offset1; int offset2; }; month a[] = { {0, "", 0, -0}, {19, "Novose", 11, -19}, {18, "Pluviose", 12, -18}, {20, "Ventose", 10, -20}, {19, "Germinal", 11, -19}, {19, "Floreal", 11, -19}, {18, "Prairal", 12, -18}, {18, "Messidor", 12, -18}, {17, "Thermidor", 13, -17}, {17, "Fructidor", 13, -17}, {21, "Vendemiaire", 9, -21}, {21, "Brumaire", 9, -21}, {20, "Frimaire", 10, -20} }; const size_t n = sizeof a / sizeof a[0]; ostream& operator<<(ostream& ost, const date& d) { switch (ost.iword(date::subscript)) { case 0: case 2: return ost << d.month << "/" << d.day << d.year <<"\n"; case 1: { if (d.month != 9 || d.day < 17 || d.day > 21) { const int cutoff = a[d.month].cutoff; string name; if (d.day <= cutoff) { name = a[d.month].name; } else { name = a[d.month < 12 ? d.month + 1 : 1].name; } const int offset = d.day <= cutoff ? a[d.month].cutoff1 : a[d.month].cutoff2; return ost << d.day + offset << " " << name << " de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.day == 17) { return ost << " Fete de la vertu de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.day == 18) { return ost << " Fete du genie de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.day == 19) { return ost << " Fete du travail de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.day == 20) { return ost << " Fete de l'opinion de l'Annee " << d.year+1-1792 << " de la Republic\n"; } if (d.day == 21) { return ost << " Fete des recompenses de l'Annee " << d.year+1-1792 << " de la Republic\n"; } } default: cerr << ost.iword(date::subscript) << " is neither revolutionary nor nonrevolutionary.\n"; exit(EXIT_FAILURE); } }
#include <string> using namespace std; struct month { int cutoff; string name; int offset1; int offset2; }; month a[] = { {0, "", 0, -0}, {19, "Novose", 11, -19}, {18, "Pluviose", 12, -18}, {20, "Ventose", 10, -20}, {19, "Germinal", 11, -19}, {19, "Floreal", 11, -19}, {18, "Prairal", 12, -18}, {18, "Messidor", 12, -18}, {17, "Thermidor", 13, -17}, {17, "Fructidor", 13, -17}, {21, "Vendemiaire", 9, -21}, {21, "Brumaire", 9, -21}, {20, "Frimaire", 10, -20} }; const size_t n = sizeof a / sizeof a[0]; const string holiday[] = { "de la vertu", "du genie", "du travail", "de l'opinion", "des recompenses" }; ostream& operator<<(ostream& ost, const date& d) { switch (ost.iword(date::subscript)) { case 0: case 2: return ost << d.month << "/" << d.day << d.year << "\n"; case 1: { if (d.month != 9 || d.day < 17 || d.day > 21) { const int cutoff = a[d.month].cutoff; string name; if (d.day <= cutoff) { name = a[d.month].name; } else { name = a[d.month < 12 ? d.month + 1 : 1].name; } const int offset = d.day <= cutoff ? a[d.month].cutoff1 : a[d.month].cutoff2; return ost << d.day + offset << " " << name << " de l'Annee " << d.year+1-1792 << " de la Republic\n"; } return ost << " Fete " << holiday[d.day - 17] << " de l'Annee " << d.year+1-1792 << " de la Republic\n"; } default: cerr << ost.iword(date::subscript) << " is neither revolutionary nor nonrevolutionary.\n"; exit(EXIT_FAILURE); } }