题解:P11387 [COCI 2024/2025 #1] 身份证 / Osobna
题目链接
P11387 [COCI 2024/2025 #1] 身份证 / Osobna
题意
给出一串(三段)身份证号码,输出身份证上的姓、名、出生日期以及校验码。
思路和步骤
一道模拟题,按题意模拟即可。
大致步骤如下(
- 输入三段字符串。
- 运用循环找出
c 中的姓和名,然后输出。 - 从
b 中找出出生日期,并按 DD-MM-YYYY 输出。 - 从
a 中找出校验码,然后输出。
疑难点
问题:
- 如何找出信息?
- 如何找出姓和名(尤其是输出完名后如何找到姓)?
回答:
- 我们可以通过字符串下标一位一位地输出。
- 我们可以当循环遇到
< 结束后,用wz 记录下位置。
注意事项
- 代码中需要确保输入以及输出字符串的格式全部满足题目要求。
- 处理出生日期中的年份时,需要根据出生年份的范围进行判断。
- 对姓名要进行大小写转换。
代码展示
#include <bits/stdc++.h>//万能头文件
using namespace std;//命名空间
int i=0;//之所以把i定义在全局变量里,是为了后面直接用
string a,b,c;//我把三段分开了,也可以合上
int main()//主函数
{
cin>>a>>b>>c; //输入
cout<<"Ime: ";
for(i=0;i<c.size();i++)
{
if(c[i]=='<') break;//如果输出完毕,跳出
else
{
if(i==0&&c[i]>='A'&&c[i]<='Z') cout<<c[i];//首字母原来就是大写,直接输出
else if(i==0) cout<<char(c[i]-32);//否则要转换下
//首字母处理完了
else if(c[i]>='a'&&c[i]<='z') cout<<c[i];//其余字母原来就是小写,直接输出
else cout<<char(c[i]+32);//否则要转换下
//全部处理完了
}
}
cout<<endl;
//此为名字的输出
int wz=i;//记录位置
cout<<"Prezime: ";
for(i=i+2;i<c.size();i++)//i=i+2表示姓氏的位置
{
if(c[i]=='<') break;//如果输出完毕,跳出
else
{
if(i==wz+2&&c[i]>='A'&&c[i]<='Z') cout<<c[i];//首字母原来就是大写,直接输出
else if(i==wz+2) cout<<char(c[i]-32);//否则要转换下
//首字母处理完了
else if(c[i]>='a'&&c[i]<='z') cout<<c[i];//其余字母原来就是小写,直接输出
else cout<<char(c[i]+32);//否则要转换下
//全部处理完了
}
}
cout<<endl;
//此为姓氏的输出(判断部分一致,建议自己写)
cout<<"Datum rodjenja: ";
cout<<b[4]<<b[5]<<"-"<<b[2]<<b[3]<<"-";//日期和月份
if((b[0]-48)*10+b[1]-48<=24) cout<<20;//20开头
else cout<<19;//19开头
cout<<b[0]<<b[1];
cout<<endl;
//此为出生日期的输出
cout<<"OIB: ";
cout<<a[15]<<a[16]<<a[17]<<a[18]<<a[19]<<a[20]<<a[21]<<a[22]<<a[23]<<a[24]<<a[25];//校验码
cout<<endl;
//此为校验码的输出
return 0;//养成好习惯
}
这道题就做完了,有不懂的欢迎问我。