题解:P11387 [COCI 2024/2025 #1] 身份证 / Osobna

· · 题解

题目链接

P11387 [COCI 2024/2025 #1] 身份证 / Osobna

题意

给出一串(三段)身份证号码,输出身份证上的姓、名、出生日期以及校验码。

思路和步骤

一道模拟题,按题意模拟即可。

大致步骤如下(a 表示第一段,b 表示第二段,c 表示第三段):

  1. 输入三段字符串。
  2. 运用循环找出 c 中的姓和名,然后输出。
  3. b 中找出出生日期,并按 DD-MM-YYYY 输出。
  4. a 中找出校验码,然后输出。

疑难点

问题:

  1. 如何找出信息?
  2. 如何找出姓和名(尤其是输出完名后如何找到姓)?

回答:

  1. 我们可以通过字符串下标一位一位地输出。
  2. 我们可以当循环遇到 < 结束后,用 wz 记录下位置。

注意事项

  1. 代码中需要确保输入以及输出字符串的格式全部满足题目要求。
  2. 处理出生日期中的年份时,需要根据出生年份的范围进行判断。
  3. 对姓名要进行大小写转换。

    代码展示

#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;//养成好习惯 
}

这道题就做完了,有不懂的欢迎问我。