#include using namespace std; bool is_valid_date(int year, int month, int day) { return (!((month < 1 || month > 12 || day < 1) || (month == 2 && day > (28 + (year % 4 == 0 && (year % 100 != 0 ||year % 400 == 0)))) || (month <= 7 && day > (30 + month%2)) || (month >= 8 && day > (31 - month%2)))); } unsigned int luhn(string const& number) { unsigned short int q{1}; unsigned int r{0}; for ( string::const_reverse_iterator it = number.crbegin(); it != number.crend(); ++it ) { if ( *it != 45 ) { if (q*(*it-48)>9) r+=q*(*it-48)-9; else r+=q*(*it-48); (q%=2)++; } } return r; } int main(int argc, char* argv[]) { if ( argc != 2) { cerr << "usage: " << argv[0] << " person-number" << endl; return 1; } if ( string(argv[1]).size() != 11 || string(argv[1]).at(6) != '-' ) { cerr << "person number '" << argv[1] << "' have wrong format" << endl; return 1; } if ( ! is_valid_date( stoi( string(argv[1]).substr(0, 2) ), stoi( string(argv[1]).substr(2, 2) ), stoi( string(argv[1]).substr(4, 2) ) ) ) cout << "'" << argv[1] << "' is not a valid person number (date check failed) " << endl; else if ( luhn( argv[1] ) % 10 != 0 ) cout << "'" << argv[1] << "' is not a valid person number (wrong check digit)" << endl; else if ( (string(argv[1]).at(9)-48) % 2 == 0 ) cout << "'" << argv[1] << "' is a valid person number for a female" << endl; else if ( (string(argv[1]).at(9)-48) % 2 != 0 ) cout << "'" << argv[1] << "' is a valid person number for a male" << endl; return 0; }