问题描述 :
问题描述:判断某人是否为青年的标准是男性不超过35周岁或女性不超过40周岁。已知身份证号从第7位开始的连续8位表示持证人的出生年月日,身份证号的第17位为奇数表示持证人为男性,身份证号第17位数字为偶数表示持证人为女性。例如:身份证号为32110219830103191X的持证人出生年月为1983年1月3日,性别为男性。试定义一个类ID,根据身份证号判断持证人截止到2015年10月1日是否为青年。具体要求如下:
(1) 私有数据成员:
char *id; 保存18位身份证号
int year, month, date; y,m,d分别表示持证人的出生年、月、日
char sex; 持证人的性别(”M”或”F”) M代表男性,F代表女性
(2) 公有成员函数:
set_ID(char * s); 用参数s初始化成员id(需申请动态内存),并将year,month,date初始化为0
void fun( ); 根据身份证号计算持证人的出生年月和性别,并判断其是否为青年,并将获得的信息存储到对应的数据成员中
void print( ); 输出持证人的信息
~ID(); 析构函数,进行必要的操作
要求使用以下main函数测试:
int main(){
int T, i;
char id[19];
cin>>T;
ID person[T];
for(i = 0; i < T; i++){
if(i> 0 && i < T) cout<<endl;
cin>>id;
person[i].set_ID(id);
person[i].fun();
person[i].print();
}
return 0;
}
输入说明 :
第一行:身份证数目T
第二行至第T+1行:输入身份证id,行与行之间无多余的空行
输出说明 :
输出T组身份证的信息,组与组之间的信息有一空行
每组的信息如下:
身份证id
year.month.date
M/F M:男 F:女
Y/N Y:青年 N:非青年
输入范例 :
6
321102197504011201
321102196103011213
11010119801001315X
110101198510016381
130102198509306242
513436198511019834
输出范例 :
321102197504011201
1975.4.1
F
N321102196103011213
1961.3.1
M
N11010119801001315X
1980.10.1
M
Y110101198510016381
1985.10.1
F
Y130102198509306242
1985.9.30
F
Y513436198511019834
1985.11.1
M
Y
解题代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
using namespace std;
bool check(int x)
{
if (x % 4 == 0 && x % 100 != 0)
return 1;
else if (x % 400 == 0)
return 1;
else
return 0;
}
int days[15] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
class Date {
int year;
int month;
int day;
public:
Date(int y, int m, int d) :year(y), month(m), day(d) {};
int getYear() const { return year; }
int getMonth() const { return month; }
int getDay() const { return day; }
};
int CalDay(const Date& d1, const Date& d2)
{
int n1, y1, r1;
int n2, y2, r2;
int i, j;
int ans = 0;
n1 = d1.getYear();
n2 = d2.getYear();
y1 = d1.getMonth();
y2 = d2.getMonth();
r1 = d1.getDay();
r2 = d2.getDay();
while (1)
{
if ((n1 == n2 && y1 == y2 && r1 == r2))
break;
ans++;
r1++;
if (r1 > days[y1])
r1 = 1, y1++;
if (y1 > 12)
n1++, y1 = 1;
if (check(n1))
days[2] = 29;
else
days[2] = 28;
}
return ans;
}
class ID {
private:
char* id;
int year, month, date;
char sex;
char Y;// M代表男性,F代表女性
public:
void set_ID(char* s);
void fun(void);
void print(void);
~ID(void);
ID(void);
};
void ID::set_ID(char* s)
{
id = new char [20] ;
strcpy(id, s);
year = 0, month = 0, date = 0;
return;
}
void ID::fun(void)
{
char lis[20];
strcpy(lis, id);
year = (lis[6] - '0') * 1000 + (lis[7] - '0') * 100 + (lis[8] - '0') * 10 + (lis[9] - '0');
month = (lis[10] - '0') * 10 + (lis[11] - '0');
date= (lis[12] - '0') * 10 + (lis[13] - '0');
if ((lis[16] - '0') % 2 == 0)
sex = 'F';
else sex = 'M';
int dla = 2015-year;
dla++;
if (month == 10)
if (date >= 1)
dla--;
if (month > 10)
dla--;
if (sex == 'M')
{
if (dla<= 35)
Y = 'Y';
else
Y = 'N';
}
else
{
if (dla <= 40)
Y = 'Y';
else
Y = 'N';
}
}
void ID::print(void)
{
cout << id << endl;
cout << year << '.' << month << '.' << date << endl;
cout << sex << endl;
cout << Y << endl;
}
ID::~ID(void)
{
//delete [] id;
return;
}
ID::ID(void)
{
;
}
int main() {
int T, i;
char id[19];
cin >> T;
ID person[500];
for (i = 0; i < T; i++) {
if (i > 0 && i < T) cout << endl;
cin >> id;
person[i].set_ID(id);
person[i].fun();
person[i].print();
}
return 0;
}