#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define NOREACH()
namespace{
//卡号的长度
const unsigned int kCardLenght = 8;
//有效卡字符
const char kCardAlphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
#define ARRAYSIZE(x) sizeof(x) / sizeof(0[x])
//卡字母类型
enum CardAlphabetType
{
UNKNOWN_TYPE = -1,
DIGIT_TYPE = 0,
CHAR_TYPE = 1
};
//检查器使用的格式标志
const unsigned char kSegFlags = 0xF0;
const unsigned int kSegBits = 8;
#define ALPHA(c) (c - 'A')
#define DIGIT(d) (d - '0' + 26)
//第一段
// AG-AH
const int kSegOneBegin[] = {ALPHA('A'), ALPHA('G')};
const int kSegOneEnd[] = {ALPHA('A'), ALPHA('G')};
const CardAlphabetType kSegOneType = CHAR_TYPE;
//第二段
//21-22
const int kSegTwoBegin[] = {DIGIT('2'), DIGIT('1')};
const int kSegTwoEnd[] = {DIGIT('2'), DIGIT('1')};
const CardAlphabetType kSegTwoType = DIGIT_TYPE;
//第三段
//A-Z
const int kSegThreeBegin[] = {ALPHA('A')};
const int kSegThreeEnd[] = {ALPHA('B')};
const CardAlphabetType kSegThreeType = CHAR_TYPE;
//第二段
//1001-2002
const int kSegFourBegin[] = {DIGIT('1'), DIGIT('0'),DIGIT('0'), DIGIT('1')};
const int kSegFourEnd[] = {DIGIT('1'), DIGIT('0'),DIGIT('0'), DIGIT('2')};
const CardAlphabetType kSegFourType = DIGIT_TYPE;
}//namespace
namespace Card
{
//卡号段
//比如四位数字 0000-9999
//三位字母 AAA-ZZZ
//如果当前段无法表示,则可以要求高位递增
//卡号字符全局用下标表示
class CardSegment
{
public:
CardSegment(vector<int> seg_range_begin, vector<int> seg_range_end, CardAlphabetType type)
:seg_range_begin_(seg_range_begin),
seg_range_end_(seg_range_end),
seg_current_(seg_range_begin),
seg_bit_range_begin_(type == CHAR_TYPE ? 0 : type == DIGIT_TYPE ? 26 : -1),
seg_bit_range_end_(type == CHAR_TYPE ? 25 : type == DIGIT_TYPE ? 35 : -1),
seg_bit_status_(seg_range_end_.size(), FILL)
{
UpdateBitState();
}
CardSegment(vector<int> seg_range_begin, vector<int> seg_range_end, vector<int> seg_current, CardAlphabetType type)
:seg_range_begin_(seg_range_begin),
seg_range_end_(seg_range_end),
seg_current_(seg_current),
seg_bit_range_begin_(type == CHAR_TYPE ? 0 : type == DIGIT_TYPE ? 26 : -1),
seg_bit_range_end_(type == CHAR_TYPE ? 25 : type == DIGIT_TYPE ? 35 : -1)
{
UpdateBitState();
}
//将卡号段重置
void Reset()
{
seg_current_.clear();
copy(seg_range_begin_.begin(), seg_range_begin_.end(), back_inserter(seg_current_));
UpdateBitState();
}
bool NextCardNoReturn()
{
bool find = false;
if(!IsFull())
{
//更新低位
IncrementMostLowBit(static_cast<int>(seg_current_.size()) - 1);
UpdateBitState();
find = true;
}
return find;
}
//获取一下卡号
void GetCurSeg(vector<int>& seg)
{
seg.clear();
copy(seg_current_.begin(), seg_current_.end(), back_inserter(seg));
reverse(seg.begin(), seg.end());
}
//是否可以更新
bool IsFull()
{
int size = static_cast<int>(seg_bit_status_.size());
for(int i = 0; i < size; i++)
{
if(GetBitState(i) == FILL)
{
return false;
}
}
return true;
}
private:
enum SegBitState
{
FULL = 0, //已满
FILL = 1 //未满
};
//设置位的状态
void SetBitState(int bit, SegBitState state)
{
seg_bit_status_[bit] = state;
}
SegBitState GetBitState(int bit){return seg_bit_status_[bit];}
//对比seg_current_与seg_range_end_
//更新各位的状态
void UpdateBitState()
{
int size = static_cast<int>(seg_current_.size());
for(int i = 0; i < size; i++)
{
if(seg_current_[i] >= seg_range_end_[i])
SetBitState(i, FULL);
else
SetBitState(i, FILL);
}
}
//找到高位,更新后位
void IncrementMostLowBit(int cur)
{
if(cur < 0)
{
NOREACH();
return;
}
if(seg_current_[cur] >= seg_bit_range_end_)
{
//进位
seg_current_[cur] = seg_bit_range_begin_;
IncrementMostLowBit(cur - 1);
return;
}
seg_current_[cur]++;
}
private:
//段号范围
vector<int> seg_range_begin_; //一般用不上
vector<int> seg_range_end_;
vector<int> seg_current_;
//每位的变化范围
int seg_bit_range_begin_;
int seg_bit_range_end_;
//每位的当前状态
vector<SegBitState> seg_bit_status_;
};
//卡号管理器
class CardManager
{
private:
CardManager()
:last_used_(false)
{
vector<int> seg_four_range_beg(kSegFourBegin, kSegFourBegin + ARRAYSIZE(kSegFourBegin));
vector<int> seg_four_range_end(kSegFourEnd, kSegFourEnd + ARRAYSIZE(kSegFourEnd));
CardSegment seg_four(seg_four_range_beg, seg_four_range_end, kSegFourType);
AppendCardSegment(seg_four);
vector<int> seg_three_range_beg(kSegThreeBegin, kSegThreeBegin + ARRAYSIZE(kSegThreeBegin));
vector<int> seg_three_range_end(kSegThreeEnd, kSegThreeEnd + ARRAYSIZE(kSegThreeEnd));
CardSegment seg_three(seg_three_range_beg, seg_three_range_end, kSegThreeType);
AppendCardSegment(seg_three);
vector<int> seg_two_range_beg(kSegTwoBegin, kSegTwoBegin + ARRAYSIZE(kSegTwoBegin));
vector<int> seg_two_range_end(kSegTwoEnd, kSegTwoEnd + ARRAYSIZE(kSegTwoEnd));
CardSegment seg_two(seg_two_range_beg, seg_two_range_end, kSegTwoType);
AppendCardSegment(seg_two);
vector<int> seg_one__range_beg(kSegOneBegin, kSegOneBegin + ARRAYSIZE(kSegOneBegin));
vector<int> seg_one_range_end(kSegOneEnd, kSegOneEnd + ARRAYSIZE(kSegOneEnd));
CardSegment seg_one(seg_one__range_beg, seg_one_range_end, kSegOneType);
AppendCardSegment(seg_one);
}
virtual ~CardManager()
{
}
public:
//单件
static CardManager& Instance(){return manager_;}
public:
void AppendCardSegment(CardSegment& seg)
{
seg_list_.push_back(seg);
}
public:
//获取卡号
bool GetCardNumber(string& number)
{
vector<int> idx;
bool succ = GetCardNumberIdx(idx);
if(succ)
{
number = CardIndexToString(idx);
}
return succ;
}
//从下标转为字符串
static string CardIndexToString(vector<int>& pos)
{
string card_number;
for(vector<int>::const_iterator itr = pos.begin(); itr != pos.end(); ++itr)
{
card_number.append(1, kCardAlphabet[*itr]);
}
return card_number;
}
bool IsCardNumberFull()
{
for(size_t i = (size_t)0; i < seg_list_.size(); i++)
{
if(!seg_list_[i].IsFull())
{
return false;
}
}
return true;
}
private:
bool GetCardNumberIdx(vector<int>& number)
{
if(!IsCardNumberFull())
{
GetCurrentCardNumber(number);
IncrementMostLowSegment(0);
return true;
}
else if(last_used_ == false)
{
last_used_ = true;
GetCurrentCardNumber(number);
return true;
}
return false;
}
void GetCurrentCardNumber(vector<int>& number)
{
vector<int> seg;
number.clear();
for(int i = static_cast<int>(seg_list_.size()) - 1; i >= 0; i--)
{
seg.clear();
seg_list_[i].GetCurSeg(seg);
reverse(seg.begin(), seg.end());
copy(seg.begin(), seg.end(), back_inserter(number));
}
}
void IncrementMostLowSegment(int cur)
{
if(cur > static_cast<int>(seg_list_.size()))
{
NOREACH();
return;
}
if(seg_list_[cur].IsFull())
{
//进位
seg_list_[cur].Reset();
IncrementMostLowSegment(cur+1);
return;
}
seg_list_[cur].NextCardNoReturn();
}
private:
//卡号段
vector<CardSegment> seg_list_;
//最后一个号码
bool last_used_;
static CardManager manager_;
};
CardManager CardManager::manager_;
} //namespace
using namespace Card;
int _tmain(int argc, _TCHAR* argv[])
{
for(int i = 0; i < 100; i++)
{
string card_number;
if(CardManager::Instance().GetCardNumber(card_number))
cout << card_number << endl;
else
{
cout << "no any more card..." << endl;
break;
}
}
return 0;
}
Python 课程方向: Web全栈(前端Vue,后端服务(前端App-小程序、 Android/iOS 手机App、 H5 响应式网站)、 自动化测试(UI/功能性测试、 接口测试)、开发运维(Linux、部署、 Docker) ) 、 数据分析+AI+开发...
本详细设计说明书是在机房收费系统概要设计的基础上进一步明确系统结构,详细地介绍系统的各个模块,为进行后面的实现和测试作准备。本详细设计说明书的预期读者为小组成员、系统测试维护人员。 1.2背景 A. 所...
1,数据库 1)概念 数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。 常见数据库管理系统有:Access、mysql、sql server 2)特点 ...逻辑数据独立性(logical data...
本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
测试开发笔记 第一章 测试基础 7 什么是软件测试: 7 ★软件测试的目的、意义:(怎么做好软件测试) 7 3.软件生命周期: 7 第二章 测试过程 8 1.测试模型 8 H模型: 8 V模型 9 2.内部测试 10 ...
外卖小程序对接飞鹅小票打印的实现 外卖点餐在流程处理上是争分夺秒的,大多数买家都是临近饭点才点餐,这样下单之后就会盼望着能尽快送到,作为点餐流程环节一部分的小票打印也就要求越便捷越省时间越好。...
不用数据库实现数据库功能 简略版本 阶段1: 无事务, 单线程, 仅存在于内存的数据库. 该状态下的数据库, 其实就是一个”索引结构”+”语法分析器”. 语法分析器分析SQL语句, 然后根据逻辑, 去执行相应的操作....
网吧计费管理系统 main.c #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include"menu.h" #include"model.h" int main() { int nSelection = -1; //输入菜单项编号 printf("\n 欢迎进入计费管理系统...
作用:变量用来记录数值,使用变量进行代数计算,则该变量中数值可以随着程序的逻辑计算而改变。当计算全部结束后,再将数值拿出展示给用户。 常用java数据类型 数据类型 说明 byte、short、int...
个人财务管理系统设计与实现 1 绪论 1.1 个人财务管理系统的研究背景与意义 随着中国经济的快速发展,无论是企业或是个人,各个环节都已经进入了金融化领域。在经济化潮流和金融危机的影响下,社会群体和个人...
(该系统在DEV编译器中不出现问题,在VC6.0中,要注意这样子设置就可以了,在“工程”->“设置”->“C/C++”->“工程选项中”在”/c“之前加上“/Zm1000”) #include #include #include ...
银行排队系统的设计与实现 学生姓名:*** 学 号:*** 年级专业及班级:**级计算机科学与技术(2)班 指导老师及职称:** 讲师 专 业:计算机科学与技术 *** 提交日期:2013年06月 ...
1:什么是GPRS? 2:GPRS/GSM模块功能通俗概述? 3:两个GPRS模块之间能进行通信吗? 4:GPRS模块可以作为DTU来使用吗? 5:GPRS/GSM模块的典型应用? 6:常用的几种GPRS/GSM模块和选型?...目前,第二代移动通信技术...
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 说明 关于大学的寒假和暑假,另外一种说法称之为“学术休假”,...
在工作中,我发现很多同学在设计之初都是直接按照单线程的思路来写程序的,而忽略了本应该重视的并发问题;等上线后的某天,突然发现诡异的 Bug,再历经千辛万苦终于定位到问题所在,却发现对于如何解决已经没有了...
将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确。 2、一些可能的实现 刚才提到过,实现秒杀的关键点是控制线程对...
本文以射频卡门禁控制器为例,说明用射频卡卡号作为关键字,用Hash查找法确定此卡能否开门,并给出对应的Keil C51程序。 单片机应用系统中,经常要涉及到数据的存储和查找。以射频卡门禁系统为例,见图1。系统由51系列...
产品运营中Oneid的实现-合理标识用户的唯一性 “平生不修善果,只爱杀人放火。忽地顿开金绳,这里扯断玉锁。钱塘江上潮信来,今日方知我是我”,这是鲁智深生前在杭州六合寺对自己的人生总结和一生的感悟。仿佛在此...
用户填写 姓名 性别 生日 电话 等信息 ,提交到后台 ,后台管理员根据信息分配code(卡号)给用户。 2.客户根据code,执行领取激活操作 代码如下: 前端: <a class="layui-btn" onclick="check()" ...
医院信息管理系统 一、导言 1.1 编写目的 本需求说明文档描述了医院管理系统项目的要求,作为系统设计、项目目标以及项目验收的依据。需求分析详细描述了用户对功能的需求、对性能的需求以及对运行环境的需求。...
文章分五部分:需求分析、项目所需知识点、思路讲解、代码实现、功能演示 本文内容较长,建议是按照我自己的思路给大家讲解的,如果有其他问题,欢迎评论区讨论 文章中的代码是在linux下编译实现的,注意自己的环境...
如何用面向对象思想写好并发程序1. 封装共享变量2. 识别共享变量间的约束条件3. 制定并发访问策略4. 总结5. 思考 面向对象思想与并发编程有关系吗?本来是没关系的,它们分属两个不同的领域,但是在 Java 语言里...
问题描述:银行储蓄系统的设计与实现 模拟银行柜台业务的要求,实现一个小型的“银行储蓄系统”软件的开发,其中包括开户、存款、取款、转账、改密、挂失、解挂、销户等功能。 在开发过程中,请按照问题求解过程的...
/******************************************************************************...按要求使用了相关数据结构 实现了要求的所有功能 并在功能上有所扩展 2.程序多次使用了 ?:表达式、do.while 循环 等 代码比较简
课程设计要求: 1、课程设计的任务要求: 大数据时代来临,寻找东林最美味的美食,最值得读的书。 已知:现有3个文件的结构,分别记录...2.4 编写程序实现各种数据的统计功能。 2.4.1统计东林最好吃的美食,给出最...
正式写技术博客也有一段时间了,一直在陆陆续续的看一些有关于分库分表相关的文章,但我发现网上同质化的资料太多了,知识点又都比较零碎,而且又没有详细的实战性案例,在某些平台买了点付费课程,看了看对于新手来...
前序:这里了解一下各个参数的含义以及一些基本概念。 样本长度(sample):样本是记录音频数据最基本的单位,常见的有8位和16位。 通道数(channel):该参数为1表示单声道,2则是立体声。...
一些过程几乎不需要人工干预,并且大多是自动化... 本教程向您展示如何通过在IBM BPM流程应用程序中同时使用业务流程和案例应用程序来解决业务问题。 您将学习如何使用链接的流程在两种类型的流程之间共享数据。 ...
十个c语言案例 (1)贪吃蛇 (2)五子棋游戏 (3)电话薄管理系统 (4)计算器 (5)万年历 (6)电子表 (7)客户端和服务器通信 (8)潜艇大战游戏 (9)鼠标器程序 (10)手机通讯录系统
2020美赛特等奖A题8篇论文