C++ string Reading and validating a date of birth

Description

C++ string Reading and validating a date of birth

#include <iostream>
#include <string>

using std::string;

int validate_input(int lower, int upper, const string& description);
int year();//from   ww w .j  av  a 2 s.c om
int month();
int date(int month_value, int year_value);
string ending(int date_day);

int main(){
  std::cout << "Enter your date of birth." << std::endl;
  int date_year {year()};
  int date_month {month()};
  int date_day {date(date_month, date_year)};

  string months[]  {"January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December"  };

  std::cout << std::endl
    << "We have established that your were born on "
    << months[date_month - 1] << " " << date_day << ending(date_day)
    << ", " << date_year << "." << std::endl;
}

// Reads an integer that is between lower and upper inclusive
int validate_input(int lower, int upper, const string& description)
{
  int data {};
  std::cout << "Please enter " << description 
            << " from " << lower << " to " << upper << ": ";
  std::cin >> data;
  while (data < lower || data > upper)
  {
    std::cout << "Invalid entry; please re-enter " << description << ": ";
    std::cin >> data;
  }
  return data;
}


// Reads the year
int year()
{
  const int low_year {1964};         // Program only works for folks under 150 years old
  const int high_year {2012};        // and over 2 years old...
  return validate_input(low_year, high_year, "a year");
}

// Reads the month
int month()
{
  const int low_month {1};
  const int high_month {12};
  return validate_input(low_month, high_month, "a month number");
}

// Reads in the date in the given month and year
int date(int month_number, int year)
{
  const int date_min {1};
  const int feb {2};

  // Days in month:            Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
  static const int date_max[]  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

  if (month_number == feb && year % 4 == 0 && !(year % 100 == 0 && year % 400 != 0))
    return validate_input(date_min, date_max[month_number - 1] + 1, "a date");
  else
    return validate_input(date_min, date_max[month_number - 1], "a date");
}

inline string ending(int date_day){
  if (date_day == 1 || date_day == 21 || date_day == 31)
    return "st";
  else if (date_day == 2 || date_day == 22)
    return "nd";
  else if (date_day == 3 || date_day == 23)
    return "rd";
  else
    return "th";
}



PreviousNext

Related