#include #include #include #include #include // for size() using namespace std; static const char* ordinal(int n) { switch (n) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th"; } } int main() { const string a[] { "", // dummy element (index 0) "partridge in a pear tree.", // 1 "turtle doves", // 2 "French hens", // 3 "calling birds", // 4 "gold rings", // 5 "geese a-laying", // 6 "swans a-swimming", // 7 "maids a-milking", // 8 "ladies dancing", // 9 "lords a-leaping", // 10 "pipers piping", // 11 "drummers drumming" // 12 }; const size_t ndays {size(a) - 1}; for (size_t day {1}; day <= ndays; ++day) { cout << "On the " << day << ordinal(day) << " day of Christmas\n" << "My true love gave to me\n"; for (size_t gift {day}; gift >= 1; --gift) { if (gift > 1) { cout << setw(2) << gift << " " << a[gift] << "\n"; } else if (day == 1) { cout << "A " << a[gift] << "\n"; } else { cout << "And a " << a[gift] << "\n"; } if (gift == 1) break; // prevent wraparound on size_t underflow } cout << "\n"; } return EXIT_SUCCESS; }