C++实现身份证号码过滤与排序

news2024/11/15 13:00:41

1.描述

警察办案里检索到一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序,如果是错误的身份证号,则从排序列表中删除(仅需判断前两位省级地区编码是否在下面的列表中,以及对出生年月是否在1949.10.1-2022.10.1之间进行判断)。
备注:身份证号码为18位的数字组成,省级地区编码是第1到第2位,出生日期为第7到第14位。
身份证前两位各省对应的编号是:
11 北京市\12 天津市\13 河北省\14 山西省\15 内蒙古自治区
21 辽宁省\22 吉林省\23 黑龙江省
31 上海市\32 江苏省\33 浙江省\34 安徽省\35 福建省\36 江西省\37 山东省
41 河南省\42 湖北省\43 湖南省\44 广东省\45 广西壮族自治区\46 海南省
50 重庆市51 四川省52 贵州省53 云南省54 西藏自治区
61 陕西省62 甘肃省63 青海省64 宁夏回族自治区65 新疆维吾尔自治区
71 台湾省
81 香港特别行政区82 澳门特别行政区


*输入格式
第一行一个整数n,表示有n个身份证号码 (n<100)
余下的n行,每行一个身份证号码。 (已保证输入数字是18位)

*输出格式
按出生时间从大到小排序后的身份证号,每行一条 

*样例输入
8
466272199203271156 
21585619900709197X
21585620000228197X
234804198701078365
404475727700034980//【注:地区码不对】
710351199203313165
118698189201011234//【注:出生年份不对】
50123419831343135X//【注:出生月日不对】

*样例输出
234804198701078365
21585619900709197X
710351199203313165
466272199203271156

//

2.代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <bitset>
#include <string>
#include <vector>
#include <algorithm>
// 使用脚本make.sh编译
/*
(仅需判断前两位省级地区编码是否在下面的列表中,以及对出生年月是否在1949.10.1-2022.10.1之间进行判断)。
备注:身份证号码为18位的数字组成,省级地区编码是第1到第2位,出生日期为第7到第14位。
身份证前两位各省对应的编号是:
11 北京市\12 天津市\13 河北省\14 山西省\15 内蒙古自治区
21 辽宁省\22 吉林省\23 黑龙江省
31 上海市\32 江苏省\33 浙江省\34 安徽省\35 福建省\36 江西省\37 山东省
41 河南省\42 湖北省\43 湖南省\44 广东省\45 广西壮族自治区\46 海南省
50 重庆市51 四川省52 贵州省53 云南省54 西藏自治区
61 陕西省62 甘肃省63 青海省64 宁夏回族自治区65 新疆维吾尔自治区
71 台湾省
81 香港特别行政区82 澳门特别行政区
*/

/*
描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

声明
下面是 atoi() 函数的声明。

int atoi(const char *str)
参数
str -- 要转换为整数的字符串。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

*/
static const int ID_LEN = 18;
static const int YEAR_MIN = 1949;
static const int YEAR_MAX = 2022;
static const std::bitset<83>PROVINCE_CODES("11000000000100000111110000001111100011111100011111110000000111000001111100000000000");
struct id_info {
	id_info(const char *str) : id(str) {
	}
	bool parse_info() {
		if (id.size() != 18) {
			std::cerr << "error id size:" << id.size() << std::endl;
			return false;
		}
		code = (id[0] - '0') * 10 + id[1] - '0';
		if (code >= PROVINCE_CODES.size() || (false == PROVINCE_CODES.test(code))) {
			std::cerr << "error id code:" << code << std::endl;
			return false;
		}
		char tmp[8] = { 0 };
		memcpy(tmp, id.c_str() + 6, 4);
		year = atoi(tmp);
		memset(tmp, 0, sizeof(tmp));
		if (year < YEAR_MIN || year > YEAR_MAX) {
			std::cerr << "error id year:" << year << std::endl;
			return false;
		}
		memcpy(tmp, id.c_str() + 10, 2);
		month = atoi(tmp);
		memset(tmp, 0, sizeof(tmp));
		if (month < 1 || month > 12) {
			std::cerr << "error id month:" << month << std::endl;
			return false;
		}
		memcpy(tmp, id.c_str() + 12, 2);
		day = atoi(tmp);
		if (day < 1 || day > 31) {
			std::cerr << "error id day:" << day << std::endl;
			return false;
		}
		if (2 == month) {
			if ((0 == year % 4) && ((year % 100 != 0) || (0 == year % 400))) {
				if (day != 29) {
					std::cerr << "leap year:" << year << " error 2 month days:" << day << std::endl;
					return false;
				}
			}
			else {
				if (day != 28) {
					std::cerr << "non leap year:" << year << " error 2 month days:" << day << std::endl;
					return false;
				}
			}
		}
		return true;
	}
	std::string id;
	int code = 0;
	int year = 0;
	int month = 0;
	int day = 0;
};
class ids_process {
public:
	void add_id(const char *str) {
		if (!str) {
			return;
		}
		id_info info(str);
		if (true == info.parse_info()) {
			infos_.push_back(info);
		}
	}
	void sort_ids() {
		constexpr auto compare = [] (const id_info &info_one, const id_info &info_other) {
			if ((info_one.year == info_other.year) && (info_one.month == info_other.month) && (info_one.day == info_other.day)) {
				return info_one.id >= info_other.id;
			}
			else {
				if (info_one.year > info_other.year) {
					return true;
				}
				else if (info_one.year < info_other.year) {
					return false;
				}
				else if (info_one.month > info_other.month) {
					return true;
				}
				else if (info_one.month < info_other.month) {
					return false;
				}
				else return info_one.day >= info_other.day;
			}
		};
		std::sort(infos_.begin(), infos_.end(), compare);
	}
	void show_ids() const {
		std::cout << "=============show ids==============" << std::endl;
		for (auto &info : infos_) {
			std::cout << info.id << std::endl;
		}
	}
private:
	std::vector<id_info>infos_;
};
int main()
{
	int iCount = 0;
	const int MAX_LEN = 100;
	char id[MAX_LEN] = { 0 };
	printf("请输入身份证个数:");
	scanf("%d", &iCount);
	printf("\n");
	if (iCount > 100) {
		std::cerr << "invalid count:" << iCount << std::endl;
		return -1;
	}
	ids_process idsp;
	printf("请依次输入身份证:\n");
	getchar();
	for(int i=0; i<iCount; i++)
	{
		fgets(id, ID_LEN + 1, stdin); // add \0
		idsp.add_id(id);
		getchar();	// accept \n
	}
	idsp.sort_ids();
	idsp.show_ids();

	return 0;
}


3.编译

Makefile:

src = $(wildcard ./*.cpp) # 获取当前目录下所有.cpp文件
objs = $(patsubst %.cpp, %.o, $(src)) # 字符串替换,将.cpp替换为.o,%表示任意字符串
target = idsort
INCLUDE := -I.
LIBS    := -lpthread
CFLAGS  := -g -Wall  $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -std=c++11 -DHAVE_CONFIG_H
$(target): $(objs)
	$(CXX)  $^ $(LIBS) -o $@ 
# $(CXX) 代表g++
# $^ 表示所有的依赖文件
# $@ 表示要生产的目标


idsort.o: idsort.cpp
	$(CXX)  $(CXXFLAGS) -c $< -o $@

.PHONY:clean  # clean不是一个要生成的文件,假目标
clean:
	rm *.o -f

4.运行测试

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/71327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识图谱-KGE-语义匹配-双线性模型-2016:NAM

【paper】 Probabilistic Reasoning via Deep Learning: Neural Association Models【简介】 本文是中科大和科大讯飞联合发表在 IJCAI 2016 上的工作&#xff0c;本文提出了 NAM&#xff08;Neural Association Model&#xff09;用于概率推理&#xff0c;并具体化为 DNN&…

十二月7号

一、uboot概念 1.1 uboot和bootloader关系 1.bootloader:是一系列引导加载程序的统称 boot:引导 loader&#xff1a;加载 2.uboot是引导加载程序中的一种 1.2 uboot特点 1.uboot是由德国DNEX小组进行维护的 2.uboot是一个开源分布式系统 3.uboot支持多种硬件架构平台(ARM/X8…

Blazor 部署 pdf.js 不能正确显示中文资源解决办法

原文链接 [https://www.cnblogs.com/densen2014/p/16964858.html] 在Blazor项目嵌入 pdf.js 时不能正确显示中文,浏览器F12显示如下错误 错误 l10n.js /web/locale/locale.properties not found. 我找到了解决方案。它不仅消除了上面提到的错误&#xff08;即 404 - locale.p…

nextjs13 webpack5 使用wasm报错

问题描述&#xff1a; 在next 13, webpack 5, react 18的项目中使用Rust编写的wasm报错&#xff1a; ./node_modules/image-map-path/image_map_path_bg.wasm Module parse failed: Unexpected character (1:0) The module seem to be a WebAssembly module, but module is n…

freemarker

文章目录创建项目引入依赖创建配置文件创建启动类和测试类语法listMapif运算符处理空值使用??指定缺失变量默认值内建函数集合长度数据类型布尔值时间类型数值类型字符串类型sequence序列类型hash类型常见指令assign自定义变量指令json转成对象实例list通过下标取值map取值通…

「Redis数据结构」集合对象(Set)

「Redis数据结构」集合对象&#xff08;Set&#xff09; 文章目录「Redis数据结构」集合对象&#xff08;Set&#xff09;一、概述二、结构三、编码转换四、小结一、概述 Set是Redis中的单列集合&#xff0c;其特点为不保证有序性、保证元素唯一、可以求交集、并集、差集。 从…

Python入门自学进阶-Web框架——28、DjangoAdmin项目应用-只读字段与后端表单验证

有时候&#xff0c;记录的某些字段在生成后就不允许再修改了&#xff0c;这时前端只能显示&#xff0c;不能修改。这时&#xff0c;可在AdminClass中进行设置&#xff1a;readonly_fields[字段名&#xff0c;字段名&#xff0c;。。。]&#xff0c;前端格式就显示成只显示不能修…

联想电脑怎么录屏?这3个方法,轻松解决

录屏是现在最常见的办公功能之一&#xff0c;最近有朋友问联想电脑怎么录屏。联想电脑是使用Windows系统的。如果想用联想电脑录屏&#xff0c;可以使用Windows系统自带了的录屏软件进行录屏。下面小编将详细的介绍3个方法&#xff0c;解决联想电脑怎么录屏的问题&#xff0c;感…

8086寻址方式图解

目录 1&#xff1a;立即寻址 2&#xff1a;寄存器寻址 3&#xff1a;直接寻址&#xff08;存储器直接寻址&#xff09; 4&#xff1a;寄存器间接寻址&#xff08;重点&#xff09; 5&#xff1a;基址寻址&#xff08;相对寻址&#xff09; 6&#xff1a;变址寻址 &#x…

后端程序员必备的Linux基础知识+常见命令(2023年最新版教程)

文章目录[1. 从认识操作系统开始](https://link.juejin.cn?targethttps%3A%2F%2Fsnailclimb.gitee.io%2Fjavaguide%2F%23%2Fdocs%2Foperating-system%2Flinux%3Fid%3D_1-%E4%BB%8E%E8%AE%A4%E8%AF%86%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%A7%8B)[1.1. 操作系统简…

【与达梦同行】数据库coredump的配置方式与截断测试

一、简述 Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成。在国产操作系统麒麟V10中运维的时候&#xff0c;经常遇见一个问…

一、OpenAI ChatGPT 注册使用

文章目录注册购买openai的官网问题今天早上在sheep公众号里面看到了关于openai 旗下研发的chatgpt的产品&#xff0c;去到chatgpt的网页&#xff0c;我们可以看到他的标语。ChatGPT: Optimizing Language Models for Dialogue 哈哈&#xff0c;我百度了一下&#xff0c;大概意…

文教资料杂志文教资料杂志社文教资料编辑部2022年第17期目录

语言文学研《文教资料》投稿&#xff1a;cn7kantougao163.com 从MRC认知模型看《释大》中的同源关系 苏楚然; 1-4 徐志摩《再别康桥》英译本对比分析——基于许渊冲诗译的“三美论” 牟逸飞;梁楚涵; 5-9 严歌苓小说“笑”书写的语言修辞学视角分析 孙婷婷; 10-12 …

得物云原生全链路追踪Trace2.0-采集篇

一、0xcc开篇 2020年3月&#xff0c;得物技术团队在三个月的时间内完成了整个交易体系的重构&#xff0c;交付了五彩石项目&#xff0c;业务系统也进入了微服务时代。系统服务拆分之后&#xff0c;虽然每个服务都会有不同的团队各司其职&#xff0c;但服务之间的依赖也变得复杂…

学1个月爬虫就月赚6000?别被骗了,老师傅告诉你爬虫的真实情况!

用爬虫赚外快的事情我也干了很多年&#xff0c;爬虫自然不在话下。 那么今天我来说说5个深入一点的爬虫问题&#xff0c;让你清楚爬虫的真实情况&#xff1a; 1.现在的爬虫接单真能1个月赚6000的快外&#xff1f; 2.初级爬虫只能接一些小单&#xff0c;怎样才算初级爬虫水平&…

Kafka ui 搭建以及使用

Kafka ui 序 kafka 本身没有自带相关的 ui 界面&#xff0c;但是很多时候没有页面意味着只有使用命令行进行相关操作如创建 topic、更改 topic 信息、重置 offset 等等。但实际使用中这种效果很差劲&#xff0c;我们一般还是会借助其他软件&#xff0c;实现对 kafka 的页面管…

windows服务器搭建原神私服教程(附客户端+服务端+环境配置)

今天给大家带来的是windows服务器搭建原神私服的教程&#xff0c;服务端搭建于私人windows服务器&#xff0c;客户端支持情况&#xff1a;PC、iOS支持国服 /国际服均可&#xff0c;Android仅支持国际服。本篇文章附有客户端和服务端环境配置文件&#xff0c;请大家按需下载使用…

MobileNet v1神经网络剖析

本文参考: MobileNet网络_-断言-的博客-CSDN博客_mobile-ne Conv2d中的groups参数&#xff08;分组卷积&#xff09;怎么理解&#xff1f; 【分组卷积可以减少参数量、且不容易过拟合&#xff08;类似正则化&#xff09;】_马鹏森的博客-CSDN博客_conv groups Pytorch Mobil…

阿里巴巴正式开源云原生应用脚手架

12 月 3 日&#xff0c;微服务 x 容器开源开发者 Meetup 上海站上&#xff0c;阿里云智能技术专家&#xff0c;云原生应用脚手架项目负责人良名宣布阿里巴巴云原生应用脚手架项目正式开源&#xff0c;并在现场做了相关内容介绍。本次开源的云原生应用脚手架是一款基于 Spring I…

监控Kubernetes集群证书过期时间的三种方案

前言 Kubernetes 中大量用到了证书, 比如 ca证书、以及 kubelet、apiserver、proxy、etcd等组件&#xff0c;还有 kubeconfig 文件。 如果证书过期&#xff0c;轻则无法登录 Kubernetes 集群&#xff0c;重则整个集群异常。 为了解决证书过期的问题&#xff0c;一般有以下几…