精华内容
下载资源
问答
  • 方面放置了一个印有邮储logo的绿色地球图片作为背景。右上方放置白色中国邮政储蓄银行logo。 PowerPoint模板内容页,由25张绿色扁平化幻灯片图表制作。 本模板适合用于制作邮政储蓄银行金融贷款服务介绍PPT等。.PPTX...
  • 幻灯片模板封面,使用了一张邮政储蓄银行办公场景,与一位手持爱心的银行工作人员图片作为背景。右侧放置绿色邮政储蓄银行logo。 PowerPoint模板内容页,由25张绿色幻灯片图表制作。 本模板适合用于制作邮政储蓄银行...
  • 幻灯片模板封面使用了蓝天白云、草地、绿叶,以及一个像房子造型一样的“贷”字作为背景图片。左下角放置中国邮政储蓄银行logo,中间填写银行贷款服务PPT标题文字。界面设计风格与银行贷款搭配。 PowerPoint模板内容...
  • 幻灯片模板封面,使用了绿色与黄色渐变的曲线图形作为背景图片。中间放置中国邮政logo。在logo下方填写PPT标题文字。界面设计简洁实用。 PowerPoint模板内容页,由25张绿色幻灯片图表制作。图表类型丰富满足制作大...
  • 人生储蓄比特币

    千次阅读 热门讨论 2021-01-09 09:21:24
    (图片来源于网络)8号比特币日内修正之后继续大幅上涨,站上41000刀的高位。一个比特币的价值已经超过了一辆特斯拉Model 3。和一个在行业里摸爬滚打三四年的小伙伴聊天,我问他炒币这些...

    (图片来源于网络)

    8号比特币日内修正之后继续大幅上涨,站上41000刀的高位。一个比特币的价值已经超过了一辆特斯拉Model 3。和一个在行业里摸爬滚打三四年的小伙伴聊天,我问他炒币这些年,赚到钱了没?他说没赚到。牛市来了,他的手上并没有多少大饼。我说你有没有考虑参考我的方法?他说,你的方法不就是每周买一点儿比特币么。我说对呀,就是这么简单枯燥,朴实无华。他连连摆手说,学不来、学不来。

    对比特币缺乏信仰,却对山寨币情有独钟。受不了坚守现货的安宁,却痴迷于合约杠杆的刺激。也许大部分人都是如此执着吧。《论语》里孔子提到四个“勿”,勿意、勿必、勿固、勿我。这其中第三个“勿固”就是指不要太执着。

    我和妻说比特币已经4万刀一个了。她淡淡地说,还不都是美国乱糟糟的闹的,等他们消停了,也许价格就要下来了。这种淡然的心境正合我意。多年来我所坚持的,正是币投不炒的原则。不仅如此,甚至于在长投比特币的数年中,我在努力建立一种比特币本位的思维。在比特币本位思维下,将法币资产换成比特币资产,在我看来甚至不再是一种投资行为,而成为一种长期储蓄行为。

    我们对当今世界赖以运转的这套法币体系,尤其是1971年以来的法币体系,了解越多,就会越坚定上述观念。在1月5号的文章《拼多多女孩之死:当代世界的扎心真相》中我们已经指出了当代资本主义经济的两个真相,或者说两个让底层群体饱受剥削的秘密,一个是对于合作共同体(现代公司制度下的股份制公司)权益占有的不平等,另一个是对于超发货币分配和占有的不平等。

    对于第一个问题的解决方案已经有大量实践,比如互联网公司的期权,华为那样的虚拟分红股,以及很多公司搞的员工持股计划,等等。让雇员真正参与到企业价值的权益分享当中来,这是当代资本主义生产关系的改良,也是雇员动员和激励机制的优化。但是这种改良却只是暂时掩盖了问题的本质,并由于进一步的激励提升了劳动者的过度勤奋和过度竞争水平。正如生一个孩子需要10个月,这个世界上很多事物有其内在的自然规律和节奏,而我们却试图通过过度努力去打破自然规律,就像试图让孩子1个月出生一样,其结果就是产生大量的试错、浪费和生产事故。更大的问题是造成亚当斯密在《国富论》里说的对劳动力本身的毁损,并侵蚀整个国家和民族的根基。

    而第二个问题,无限超发的当代法币带来了两个严重的副作用。一个副作用是,虚幻的泡沫加剧了第一个问题,让所有陷入“囚徒困境”过度竞争的企业和个人缺乏了一个准确衡量自己的勤奋努力是否恰当的标尺,结果就是企业家被增长的数字所迷惑,以为这些工作仍然是有利可图的、为市场所接受的,从而造成了大量的无效劳动和浪费。从幼儿园开始我们就教育每一个儿童,浪费一粒米饭都是可耻的。但是今天,企业在大量浪费和透支劳动力资源,甚至劳动者的生命,却常常为庸俗经济学者所称道。

    如果我们开始定投并持有比特币,很快就会发现,以比特币为标尺,不是所有的勤奋和努力都是意义的。一切不能跑赢比特币的勤奋,都是愚蠢的努力,是可耻的浪费。大量占据着决策角色和位置的资本代理人,或代理人的授权代表,没有这样的标尺,也就经常性的作出愚蠢的决策,把整个团队带入到低效努力的泥潭之中。这个问题可以通过全体劳动阶级持有比特币,并建立集体标尺意识,而自觉拒绝从事不能跑赢比特币的业务,从而完成自下而上的决策筛选,淘汰愚蠢和低效的浪费。每一个执币人,都是执剑人。

    另一个副作用则是货币超发带来的财富转移和隐形再分配的“劫贫济富”。在2020年美国印出了史无前例的海量美元之后,特斯拉的股价连创新高。特斯拉创始人Elon Musk登顶世界首富。如果用马斯克的财富增长量(美元计价)除以美联储超发的美元,会发现大概有4.5%的超发美元被揣到了马斯克个人的口袋里。

    通胀(就目前被篡改过的定义而言)是劳动阶级的收入增长率,但是美联储的货币政策是控制通胀率温和平稳。并且事实上,只要物资不短缺,通胀就可以通过统计压制被控制在合适的水平。大量的新增货币被导入到某一种货币蓄水池中,比如过去15年中国的房地产,或者过去10年美国的股市。持有蓄水池资产的人,或者有权力在这个蓄水池中创造新资产的人(比如能够创办公司并上市的企业家,比如房地产开发商),就变相拥有了“印钞权”。假设当货币总量是10的时候,5在通胀,5在蓄水池;货币增发90,10在通胀,90在蓄水池。劳动者的收入从5增长到了10,名义收入翻番,实际财富占有比例从50%下降到了10%;资产拥有者的资产从5增长到了90,资产增长了17倍,实际财富占有比例从50%增长到了90%。劳动者创造了财富,但资产拥有者分享了绝大部分财富。这就是货币超发造成的合法、隐形的“劫贫济富”。

    在资本主义塑造的当代社会意识形态中度过一生的绝大多数人,潜移默化都是采取一种亚当斯密称之为“重商主义”的思维模式。在这种思维模式下,我们把货币数量的积累和增加当成了财富的积累和增加。正是在这种思维下,才产生了资本主义的生产方式,即马克思讲的“为卖而买”的货币增殖模式。但是这是一种幻觉。一共只有100个馒头,大家总共手里有100元,那么一元代表一个馒头;如果还是100个馒头,不过大家手里有了1000元,货币收入平均增长了10倍(注意贫富差距),但是社会总财富其实并没有增加,还是100个馒头。

    如果我们开始定投并持有比特币,很快就会从这个幻觉中觉醒。不能被任何人控制和超发的、最终总量有限的(2100万上限)比特币,让我们得以切实感知所有认可比特币的人和实体所掌握的财富总量的增长情况,其背后,既反映了共识的扩大,共识圈中财富的增加,也反映了生产力的提升。在比特币快速扩大共识的早期(现在),前面的因素起主导作用;当比特币已经趋于普及和成熟(未来),后面的因素也就是生产力因素则起主导作用。

    要知道,全世界100万美元富豪的总人数都要超过比特币的总量上限2100万。如果我是一个没有100万美元资产的“穷人”,而我在早期储蓄了1个比特币,那么我参与这个公平分配的游戏就是非常划算的,因为这意味着,其他拥有更多资产而后参与进来的“富人”,将自愿接受这样一个游戏规则,即大家都把各自的财富放在一起,然后每1个比特币对应这些财富总量的2100万分之一。

    因此,当我们定期把劳动收入节约出一部分,储蓄成比特币,只需三五年,每个人都会渐渐领悟上面的道理,并最终,建立比特币本位思维,以比特币为标尺,去丈量这个世界上的财富真相。祝你好运,朋友!

    (公众号:刘教链)

    (免责声明:本文内容均不构成任何投资建议。加密货币为极高风险品种,有随时归零的风险,请谨慎参与,自我负责。)

    展开全文
  • 储蓄分红DAPP 储蓄分红合约简介 储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期...

    储蓄分红DAPP

    储蓄分红合约简介

    储蓄分红合约指的是项目方发起了一个锁仓计划(即储蓄合约和取现合约),用户可以在准备期自由选择锁仓金额参与该计划,等到锁仓到期之后还可以自动获取锁仓的利润。用户可以在准备期内(dueBlockHeight)参与储蓄,按照合约规定可以 1:1 获取同等数量的储蓄票据资产,同时用户锁仓的资产(deposit)将放到取现合约中,并且项目方是无法动用的,等到锁仓期限(expireBlockHeight)一到,用户便可以调用取现合约将自己储蓄的资产连本待息一同取出来。其示意图如下:

    [外链图片转存失败(img-BkRGpB9m-1563417221728)(https://raw.githubusercontent.com/oysheng/bufferserver/master/docs/images/diagram.png)]

    从上图中可以看出,项目方发布了一个利润为20%的锁仓项目,其中储蓄合约FixedLimitCollect锁定了1000个票据资产(bill),同时项目方将200个储蓄资产(deposit)锁定到利息合约中。待项目方发布完合约之后,所有用户便可以参与了。例如上图中user1调用合约储蓄了500,这500个储蓄资产将被锁定在取现合约FixedLimitProfit中,同时user1获得了500个票据资产,剩余找零的资产将继续锁定在储蓄合约FixedLimitCollect中,以此类推,user2user3也是相同的流程,直到储蓄合约没有资产为止。取现合约FixedLimitProfit跟储蓄合约的模型大致相同,只是取现合约是由多个UTXO组成的,用户在取现的时候可以并行操作。但是如果合约中的面值不能支持用户一次性取现的话,需要分多次提取。例如user1拥有500个票据资产,而可以获得的本息总额为600,但是取现的UTXO面值为500,那么user1一次最多只能取500,剩下的100需要再构造一笔交易来提现。

    合约源代码

    // 储蓄合约
    import "./FixedLimitProfit"
    contract FixedLimitCollect(assetDeposited: Asset,
                            totalAmountBill: Amount,
                            totalAmountCapital: Amount,
                            dueBlockHeight: Integer,
                            expireBlockHeight: Integer,
                            additionalBlockHeight: Integer,
                            banker: Program,
                            bankerKey: PublicKey) locks billAmount of billAsset {
        clause collect(amountDeposited: Amount, saver: Program) {
            verify below(dueBlockHeight)
            verify amountDeposited <= billAmount && totalAmountBill <= totalAmountCapital
            define sAmountDeposited: Integer = amountDeposited/100000000
            define sTotalAmountBill: Integer = totalAmountBill/100000000
            verify sAmountDeposited > 0 && sTotalAmountBill > 0
            if amountDeposited < billAmount {
                lock amountDeposited of assetDeposited with FixedLimitProfit(billAsset, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
                lock amountDeposited of billAsset with saver
                lock billAmount-amountDeposited of billAsset with FixedLimitCollect(assetDeposited, totalAmountBill, totalAmountCapital, dueBlockHeight, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
            } else {
                lock amountDeposited of assetDeposited with FixedLimitProfit(billAsset, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
                lock billAmount of billAsset with saver
            }
        }
        clause cancel(bankerSig: Signature) {
            verify above(dueBlockHeight)
            verify checkTxSig(bankerKey, bankerSig)
            unlock billAmount of billAsset
        }
    }
    
    // 取现合约(本金加利息)
    contract FixedLimitProfit(assetBill: Asset,
                            totalAmountBill: Amount,
                            totalAmountCapital: Amount,
                            expireBlockHeight: Integer,
                            additionalBlockHeight: Integer,
                            banker: Program,
                            bankerKey: PublicKey) locks capitalAmount of capitalAsset {
        clause profit(amountBill: Amount, saver: Program) {
            verify above(expireBlockHeight)
            define sAmountBill: Integer = amountBill/100000000
            define sTotalAmountBill: Integer = totalAmountBill/100000000
            verify sAmountBill > 0 && sTotalAmountBill > 0 && amountBill < totalAmountBill
            define gain: Integer = totalAmountCapital*sAmountBill/sTotalAmountBill
            verify gain > 0 && gain <= capitalAmount
            if gain < capitalAmount {
                lock amountBill of assetBill with banker
                lock gain of capitalAsset with saver
                lock capitalAmount - gain of capitalAsset with FixedLimitProfit(assetBill, totalAmountBill, totalAmountCapital, expireBlockHeight, additionalBlockHeight, banker, bankerKey)
            } else {
                lock amountBill of assetBill with banker
                lock capitalAmount of capitalAsset with saver
            }
        }
        clause cancel(bankerSig: Signature) {
            verify above(additionalBlockHeight)
            verify checkTxSig(bankerKey, bankerSig)
            unlock capitalAmount of capitalAsset
        }
    }
    

    合约的源代码说明可以具体参考Equity合约介绍.

    注意事项:

    • 时间期限不是具体的时间,而是通过区块高度来大概估算的(平均区块时间间隔大概为2.5分钟)
    • 比原的精度是8, 即 1BTM = 100000000 neu,正常情况下参与计算都是以neu为单位的,然而虚拟机的int64类型的最大值是9223372036854775807,为了避免数值太大导致计算溢出,所以对计算的金额提出了金额限制(即amountBill/100000000
    • 另外clause cancel是项目方的管理方法,如果储蓄或者取现没有满额,项目方也可以回收剩余的资产

    编译并实例化合约

    编译Equity合约可以参考一下Equity编译器的介绍说明。假如储蓄合约FixedLimitCollect的参数如下:

    assetDeposited          :c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    totalAmountBill         :10000000000
    totalAmountCapital      :20000000000
    dueBlockHeight          :1070
    expireBlockHeight       :1090
    additionalBlockHeight   :1100
    banker                  :0014dedfd406c591aa221a047a260107f877da92fec5
    bankerKey               :055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    

    其中bankerKey是管理员的publicKey,可以通过比原链的接口list-pubkeys来获取,注意管理员需要保存一下对应的rootXpubPath,否则无法正确调用clause cancel

    实例化合约命令如下:

    // 储蓄合约
    ./equity FixedLimitCollect --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1070 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    
    // 取现合约
    ./equity FixedLimitProfit --instance c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee 10000000000 20000000000 1090 1100 0014dedfd406c591aa221a047a260107f877da92fec5 055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf
    

    发布合约交易

    发布合约交易即将资产锁定到合约中。由于目前无法在比原的dashboard上构造合约交易,所以需要借助外部工具来发送合约交易,比如postman。按照上述示意图所示,项目方需要发布1000个储蓄资产的储蓄合约和200个利息资产取现合约。假设项目方需要发布1000个储蓄资产(假如精度为8,那么1000个在比原链中表示为100000000000)的锁仓合约,那么他需要将对应数量的票据锁定在储蓄合约中,其交易模板如下:

    {
      "base_transaction": null,
      "actions": [
        {
          "account_id": "0ILGLSTC00A02",
          "amount": 20000000,
          "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
          "type": "spend_account"
        },
        {
          "account_id": "0ILGLSTC00A02",
          "amount": 100000000000,
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
          "type": "spend_account"
        },
        {
          "amount": 100000000000,
          "asset_id": "13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3",
          "control_program": "20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0",
          "type": "control_program"
        }
      ],
      "ttl": 0,
      "time_range": 1521625823
    }
    

    合约交易成功后,合约control_program对应的UTXO将会被所有用户查询到,使用比原链的接口list-unspent-outputs即可查询。

    此外,开发者需要存储一下合约UTXOassetIDprogram,以便在DAPP的前端页面的config配置文件和bufferserver缓冲服务器中调用。如上所示:

    // 储蓄合约
    assetID:13016eff73ffb7539a69e122f80f5c1cc94446773ac3f64dec290429f87e73b3
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c04024204022e040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4d3b02597a642f0200005479cda069c35b797ca153795579a19a695a790400e1f5059653790400e1f505967c00a07c00a09a69c35b797c9f9161644d010000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec169632a020000005b79c2547951005e79895d79895c79895b7989597989587989537a894caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c169633b020000547acd9f69587a587aae7cac747800c0
    
    // 取现合约
    assetID:c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee
    program:20055539eb36abcaaf127c63ae20e3d049cd28d0f1fe569df84da3aedb018ca1bf160014dedfd406c591aa221a047a260107f877da92fec5024c040242040500c817a8040500e40b540220c6b12af8326df37b8d77c77bfa2547e083cbacde15cc48da56d4aa4e4235a3ee4caa587a649e0000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f91616487000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696399000000005b795479515b79c16951c3c2515d79c16963aa000000557acd9f69577a577aae7cac747800c0
    

    储蓄分红DAPP架构模型

    比原链的DAPP总体框架模型描述了DAPP的大致结构模型,结合储蓄分红合约案例,其具体流程如下:

    [外链图片转存失败(img-fahnB8vF-1563417221729)(https://raw.githubusercontent.com/oysheng/bufferserver/master/docs/images/flow.png)]

    DAPP前端

    储蓄分红合约前端逻辑处理流程大致如下:

    • 1)调用插件

      比原的chrome插件源码位于Bytom-JS-SDK,开发比原DAPP时调用插件的说明可以参考Dapp Developer Guide

    • 2)配置合约参数

      Dapp demo中需要配置实例化的参数为assetDepositedtotalAmountBilltotalAmountCapitaldueBlockHeightexpireBlockHeightadditionalBlockHeightbankerbankerKey。其前端配置文件为configure.json.js

      var config = {
          "solonet": {
              "depositProgram": "2091194ddbf3614cafbadb1274c33e61afd4d5044c6ec4c30f8202980199c30083160014c800033d5e94de5f22e23a6d3cbeaed87b55bd640600204aa9d101050010a5d4e8203310d9951697418af3cdbe7a9cdde1dc49bb5439503dacb33828d6c9ef5af5a24dfc01567a64f5010000c358797ca153795579a19a6957790400e1f5059653790400e1f505967c00a07c00a09a69c358797c9f91616429010000005879c2547951005b79895a7989597989587989537a894c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac890274787e008901c07ec169515879c2515a79c16952c3597994c251005a79895979895879895779895679895579890274787e008901c07ec16963f0010000005879c2547951005b79895a7989597989587989537a894c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac890274787e008901c07ec16951c3c2515a79c16963fc010000567a567aae7cac747800c0",
              "profitProgram": "2091194ddbf3614cafbadb1274c33e61afd4d5044c6ec4c30f8202980199c30083160014c800033d5e94de5f22e23a6d3cbeaed87b55bd640600204aa9d101050010a5d4e820666f298d34806a6db0528c3b3d081bc00fa58aa393e7c42f90d67eb7db2a524f4c9a567a649300000057790400e1f5059653790400e1f505967800a07800a09a5a7956799f9a6955797b957c96c37800a052797ba19a69c3787c9f9161647c0000000059795479515979c1695178c2515b79c16952c3527994c251005b79895a79895979895879895779895679890274787e008901c07ec169638e0000000059795479515979c16951c3c2515b79c169639a000000567a567aae7cac747800c0",
              "assetDeposited": "3310d9951697418af3cdbe7a9cdde1dc49bb5439503dacb33828d6c9ef5af5a2",
              "assetBill": "666f298d34806a6db0528c3b3d081bc00fa58aa393e7c42f90d67eb7db2a524f",
              "totalAmountBill": 1000000000000,
              "totalAmountCapital": 2000000000000,
              "dueBlockHeight": 0,
              "expireBlockHeight": 0,
              "banker": "0014c800033d5e94de5f22e23a6d3cbeaed87b55bd64",
              "gas": 0.4
          },
          "testnet":{
              "depositProgram": "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da240203da2402060080f420e6b50600407a10f35a2000d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd4d4302597a64370200005479cda069c35b790400e1f5059600a05c797ba19a53795579a19a695a790400e1f5059653790400e1f505967800a07800a09a6955797b957c9600a069c35b797c9f9161645b010000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec169515b79c2515d79c16952c35c7994c251005d79895c79895b79895a79895979895879895779895679895579890274787e008901c07ec1696332020000005b79c2547951005e79895d79895c79895b7989597989587989537a894ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac890274787e008901c07ec16951c3c2515d79c1696343020000547acd9f69587a587aae7cac747800c0",
              "profitProgram": "20f39af759065598406ca988f0dd79af9175dd7adcbe019317a2d605578b1597ac1600147211ec12410ce8bd0d71cab0a29be3ea61c71eb103c8260203da2402060080f420e6b50600407a10f35a20f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c4ca4587a64980000005479cd9f6959790400e1f5059653790400e1f505967800a07800a09a5c7956799f9a6955797b957c967600a069c3787c9f91616481000000005b795479515b79c1695178c2515d79c16952c3527994c251005d79895c79895b79895a79895979895879895779895679890274787e008901c07ec1696393000000005b795479515b79c16951c3c2515d79c16963a4000000557acd9f69577a577aae7cac747800c0",
              "assetDeposited": "00d38a1c946e8cba1a69493240f281cd925002a43b81f516c4391b5fb2ffdacd",
              "assetBill": "f855baf98778a892bad0371f5afca845191824dc8584585d566fbbc8ef1f304c",
              "totalAmountBill": 100000000000000,
              "totalAmountCapital": 200000000000000,
              "dueBlockHeight": 140506,
              "expireBlockHeight": 140506,
              "banker": "00147211ec12410ce8bd0d71cab0a29be3ea61c71eb1",
              "gas": 0.4
          }
      }
      
    • 3)前端预计算处理

      以储蓄合约FixedLimitCollect为例,前端需要对该合约进行verify语句的预判断逻辑,以防用户输入参数之后执行失败。此外,合约中billAmount of billAsset表示锁定的资产和数量,而billAmountbillAssetutxohash都是储存在缓冲服务器的数据表里面,因此前端需要调用list-utxo查找与该资产assetprogram相关的所有未花费的utxo。 具体可以参考DAPP DEMO前端案例

    • 4)交易组成

      比原的交易是多输入多输出的模板结构,如果合约中包含了多个lockunlock语句,那么就需要用户构造多输入多输出的交易模板,同时,构造交易还需要根据lock语句或unlock语句来变换。交易构造具体可以参考储蓄合约交易模型取现合约交易模型的前端源代码。

      • 交易input结构如下:

        spendUTXOAction(utxohash)表示花费的合约utxo,其中utxohash表示合约UTXOhash,而spendWalletAction(amount, Constant.assetDeposited)表示用户输入的储蓄或取现的数量(仅包含中需要资产交换的合约中),而资产类型则由前端固定。

        export function spendUTXOAction(utxohash){
            return {
                "type": "spend_utxo",
                "output_id": utxohash
            }
        }
        
        export function spendWalletAction(amount, asset){
            return {
                "amount": amount,
                "asset": asset,
                "type": "spend_wallet"
            }
        }
        
        const input = []
        input.push(spendUTXOAction(utxohash))
        input.push(spendWalletAction(amount, Constant.assetDeposited))
        
      • 交易output结构如下:

        根据合约中if-else判定逻辑,下面便是储蓄分红合约的output的构造模型。

        export function controlProgramAction(amount, asset, program){
            return {
                "amount": amount,
                "asset": asset,
                "control_program": program,
                "type": "control_program"
            }
        }
        
        export function controlAddressAction(amount, asset, address){
            return {
                "amount": amount,
                "asset": asset,
                "address": address,
                "type": "control_address"
            }
        }
        
        const output = []
        if(amountDeposited < billAmount){
            output.push(controlProgramAction(amountDeposited, Constant.assetDeposited, Constant.profitProgram))
            output.push(controlAddressAction(amountDeposited, billAsset, saver))
            output.push(controlProgramAction((billAmount-amountDeposited), billAsset, Constant.depositProgram))
        }else{
            output.push(controlProgramAction(amountDeposited, Constant.assetDeposited, Constant.profitProgram))
            output.push(controlAddressAction(billAmount, billAsset, saver))
        }
        
    • 5)启动前端服务

      编译前端命令如下:

      npm run build
      

      启动之前需要先启动bufferserver缓冲服务器,然后再启动前端服务,其前端启动命令如下:

      npm start
      

    DAPP缓冲服务器

    缓冲服务器主要是为了在管理合约UTXO层面做一些效率方面的处理,包括了对bycoin服务器是如何同步请求的,此外对DAPP的相关交易记录也进行了存储。具体可以参考一下bufferserver源代码

    • 1)储蓄分红合约的架构说明如下:

      • 缓冲服务器构成,目前设计了3张数据表:baseutxobalance表。其中base表用于初始化该DAPP关注的合约program,即在查找utxo集合的时候,仅仅只需过滤出对应的program和资产即可; utxo表是该DAPP合约的utxo集合,其数据是从bycoin服务器中实时同步过来的,主要是为了提高DAPP的并发性; balance表是为了记录用户参与该合约的交易列表。

      • 后端服务由API进程和同步进程组成,其中API服务进程用于管理对外的用户请求,而同步进程包含了两个方面:一个是从bycoin服务器同步utxo,另一个是则是通过区块链浏览器查询交易状态

      • 项目管理员调用update-base接口更新DAPP关注的合约programasset。而utxo同步进程会根据base表的记录来定时扫描并更新本地的utxo表中的信息,并且根据超时时间定期解锁被锁定的utxo

      • 用户在调用储蓄或取现之前需要查询合约的utxo是否可用,可用的utxo集合中包含了未确认的utxo。用户在前端在点击储蓄或取现按键的时候,会调用utxo最优匹配算法选择最佳的utxo,然后调用update-utxo接口对该utxo进行锁定,最后就用户就可以通过插件钱包调用bycoin服务器的构建交易接口来创建交易、签名交易和提交交易。倘若所有合约utxo都被锁定了,则会缩短第一个utxo的锁定时间为60s,设置该时间间隔是为了保证未确认的交易被成功验证并生成未确认的utxo。如果该时间间隔并没有产生新的utxo,则认为前面一个用户并没有产生交易,则60s后可以再次花费该utxo

      • 用户发送交易成功后会生成两条balance记录表,默认状态是失败的,其中交易ID用于向区块链浏览器查询交易状态,如果交易成功则会更新balance的交易状态。此外,前端页面的balance列表表只显示交易成功的记录。

    • 2)编译bufferserver源代码

      按照README安装部署服务需要的软件包MysqlRedis,然后下载源代码并编译:

      make all
      

      编译完成之后,在target目录下会生成可执行文件apiupdater

    • 3)启动服务

      使用root用户创建数据库和数据表,其命令如下:

      mysql -u root -p < database/dump.sql
      

      修改配置文件config_local.json,字段说明参考READMEconfig配置参数详解。

      启动apiupdater服务器,其中api是提供JSON RPC请求的服务进程,updater是提供同步blockcenter和区块链浏览器数据请求的服务进程。

      ./target/api config_local.json
      
      ./target/updater config_local.json
      
    展开全文
  • 幻灯片模板封面使用了蓝天白云、草地、绿叶,以及一个像房子造型一样的“贷”字作为背景图片。左下角放置中国邮政储蓄银行logo,中间填写银行贷款服务PPT标题文字。界面设计风格与银行贷款搭配。 PowerPoint模板...
  • 课程设计-银行储蓄系统

    千次阅读 2015-07-16 23:15:36
    银行储蓄系统这个项目在寒假的时候使用结构体的类型写了一份,贺老要求作为实训的项目,所以重新用面向对象的程序设计重新写了一份。 结构体方式——》银行储蓄系统结构体版 介绍: 银行储蓄系统包括:支持多...

    银行储蓄系统这个项目在寒假的时候使用结构体的类型写了一份,贺老要求作为实训的项目,所以重新用面向对象的程序设计重新写了一份。

    结构体方式——》银行储蓄系统结构体版


    介绍:

    银行储蓄系统包括:支持多名储户开户、存款、取款、转帐、改密、挂失、解挂、销户等功能。
    登录
    输入业务员用户名和密码。3次输入不正确,强制退出程序。
    基本要求
    可以只设一名业务员,用全局变量表示其用户名和密码,写在程序中。

    系统菜单
    当业务员信息验证后,进入到系统主控菜单,由业务员为储户办理各种业务,直到按0后退出。
    基本要求
    每次启动系统,都是从0用户开始办理业务


    开户
    账号由系统自动分配
    确认密码和密码不同时要拒绝。
    开户后,账号状态为0-正常

    销户
    输入账号,确认后,将余额全部取完,并将状态state置为2-销户。
    办理销户的账号,其状态必须为“0-正常“。

    存款
    输入账号、金额,记录存款后的余额。

    取款
    输入账号、金额,记录取款后的余额。
    取款额不能超过余额。

    查询
    输入账号,显示账户信息。

    转账
    输入转出账号、金额、转入账户,记录转账后的余额。
    账户必须存在,扣除转出账户的金额,要与转入账户增加的金额相同。

    挂失
    输入账号,将状态改变为 1-挂失

    解挂
    输入账号,将状态为 1-挂失 的账户状态改为 0-正常

    改密
    用新密码替代旧密码。
    新密码必须与确认密码相同。

    源代码:

    下面是源代码:

    userdata.h

    /***********************************************************
    * 版权所有 (C)2015,shao shuai.
    *
    * 文件名称:bankdata.cpp
    * 文件标识:无
    * 内容摘要:该代码为UserData类的声明和Admin结构体的声明
    * 其它说明:无
    * 当前版本: V1.0
    * 作   者:邵帅
    * 完成日期: 20150715
    *
    * 修改记录1:
    * 修改日期: 20150715
    * 版本号: V1.0
    * 修改人: shao shuai
    * 修改内容:创建
    **********************************************************/
    #ifndef USERDATA_H_INCLUDED
    #define USERDATA_H_INCLUDED
    #include <iostream>
    #include <string>
    using namespace std;
    class UserData//用户类
    {
    private:
    	long accNumber;//卡号
    	string accName;//户主
    	string password;//密码
    	double balance;//余额
    	string identity;//身份证号
    	string homeads;//家庭住址
    	int state;//状态 0:正常 -1:挂失 2:销户
    public:
    	void SetUser(long a, string n, string p, double b, string i, string h, int s);
    	long get_accNumber(){ return accNumber; }
    	string get_accName(){ return accName; }
    	string get_password(){ return password; }
    	double get_balance(){ return balance; }
    	string get_id(){ return identity; }
    	string get_homeads(){ return homeads; }
    	int get_state(){ return state; }
    	void set_accNumber(long num){ accNumber = num; }
    	void set_accName(string n){ accName = n; }
    	void set_password(string p){ password = p; }
    	void set_balance(double b){ balance = b; }
    	void set_id(string id){ identity = id; }
    	void set_homeads(string h){ homeads=h; }
    	void set_state(int s){ state = s; }
    	bool CheckUserPass();
    };
    struct Admin//业务员结构体
    {
    	string name;
    	string password;
    };
    #endif // USERDATA_H_INCLUDED


    bankdata.h

    /***********************************************************
    * 版权所有 (C)2015,shao shuai.
    *
    * 文件名称:bankdata.cpp
    * 文件标识:无
    * 内容摘要:该代码为BankData类的声明
    * 其它说明:无
    * 当前版本: V1.0
    * 作   者:邵帅
    * 完成日期: 20150715
    *
    * 修改记录1:
    * 修改日期: 20150715
    * 版本号: V1.0
    * 修改人: shao shuai
    * 修改内容:创建
    **********************************************************/
    #ifndef BANKDATA_H_INCLUDED
    #define BANKDATA_H_INCLUDED
    #include <iostream>
    #include "userdata.h"
    using namespace std;
    class BankData//银行数据类
    {
    public:
    	BankData();
    	~BankData();
    	Admin admin[10];
        UserData *user=new UserData[2000];
    	int UserNum;
    	bool HomePage();//主页
    	int OpenAdmin();//读取Admin的信息
    	int SearchAdmin(string, int);//查找Admin
    	bool CheckAdminPass(int);//检验用户名是否正确
    	void MenuShow();//显示User办理菜单
    	bool CheckUser(long acc);//查找User用户名
    	//User业务办理
    	void OpenUserData();//读取User信息
    	void SaveUserData();//保存User信息
    	void AddNumber(int);//开户
    	void DelNumber(void);//销户
    	void AddMoney(void);//存款
    	void DelMoney(void);//取款
    	void ShowInfo(void);//查询
    	void TransferMoney(void);//转账
    	void LossReport(void);//挂失
    	void SolutionLinked(void);//解挂
    	void ChangePass(void);//改密
    	//扩展类
    	string int2str(int num);//将int型转换成string型
    	string gettime();//获取当前系统时间
    	void SaveUserLog(int,int);//记录用户日志
    	void about();//扩展的关于界面
    };
    #endif // BANKDATA_H_INCLUDED
    

    userdata.cpp

    /***********************************************************
    * 版权所有 (C)2015,shao shuai.
    *
    * 文件名称:bankdata.cpp
    * 文件标识:无
    * 内容摘要:该代码为UserData类的定义
    * 其它说明:无
    * 当前版本: V1.0
    * 作   者:邵帅
    * 完成日期: 20150715
    *
    * 修改记录1:
    * 修改日期: 20150715
    * 版本号: V1.0
    * 修改人: shao shuai
    * 修改内容:创建
    **********************************************************/
    #include <iostream>
    #include "userdata.h"
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    /*********************************************************
     * 功能描述:建立user的信息
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:从指定文件读取
     ************************************************************/
    void UserData::SetUser(long a, string n, string p, double b, string i, string h, int s)
    {
    	accNumber = a;
    	accName = n;
    	password = p;
    	balance = b;
    	identity = i;
    	homeads = h;
    	state = s;
    }
    /*********************************************************
     * 功能描述:检验输入user的密码是否正确
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    bool UserData::CheckUserPass()
    {
    	string pass;
    	int wrong = 0;
    	while (1)
    	{
    		cout << "请输入密码:";
    		cin >> pass;
    		if (pass == password)
    			return true;
    		else
    		{
    			cerr << "密码输入错误,请重新输入。" << endl;
    			wrong++;
    			if (wrong > 2)
    			{
    				cout << "User密码输入错误超过3次,即将退出系统..." << endl;
    				system("PAUSE");
    				return false;
    			}
    			continue;
    		}
    	}
    }
    

    bankdata.cpp

    /***********************************************************
    * 版权所有 (C)2015,shao shuai.
    *
    * 文件名称:bankdata.cpp
    * 文件标识:无
    * 内容摘要:该代码为BankData类的定义
    * 其它说明:无
    * 当前版本: V1.0
    * 作   者:邵帅
    * 完成日期: 20150715
    *
    * 修改记录1:
    * 修改日期: 20150715
    * 版本号: V1.0
    * 修改人: shao shuai
    * 修改内容:创建
    **********************************************************/
    #include <iostream>
    #include "bankdata.h"
    #include <cstring>
    #include <cstdlib>
    #include <fstream>
    #include <ctime>
    #include <cmath>
    using namespace std;
    /*********************************************************
     * 功能描述:BankData的默认构造函数
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    BankData::BankData()//构造函数
    {
    	long number;
    	string name, pass, id, h;
    	double balance;
    	int state;
    	UserNum = 0;
    	//开始读取User的信息
    	ifstream infile("BankUser.dat", ios::in);
    	if (!infile)
    	{
    		cerr << "打开数据库(BankUser.dat)文件失败!";
    		exit(1);
    	}
    	while (infile >> number >> name >> pass >> balance >> id >> h >> state)
    	{
    		user[UserNum].SetUser(number, name, pass, balance, id, h, state);
    		UserNum++;
    	}
    	infile.close();
    	//User信息读取完毕,总数存入UserNum
    }
    /*********************************************************
     * 功能描述:BankData的析构函数
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:删除动态数组创建的user
     ************************************************************/
    BankData::~BankData()//析构函数
    {
        delete []user;
    }
    /*********************************************************
     * 功能描述:BankData的默认构造函数
     * 输入参数:num-将要转换的int型数值
     * 输出参数:无
     * 返回值:string类型的int数值
     * 其它说明:无
     ************************************************************/
    string BankData::int2str(int num)//int 2 str
    {
        if (num==0)
        return "0" ;
        string str="";
        int num_=num>0?num:-1*num;
        while (num_)
        {
            str=(char)(num_%10+48)+str;
            num_/=10 ;
        }
        if (num<0)
            str="-"+str;
        return str;
    }
    /*********************************************************
     * 功能描述:获取系统时间
     * 输入参数:无
     * 输出参数:无
     * 返回值:系统时间
     * 其它说明:无
     ************************************************************/
    string BankData::gettime()//获取系统时间
    {
        time_t curtime=time(0);
        tm tim =*localtime(&curtime);
        int day,mon,year;
        int hour,min,sec;
        string time;
        hour=tim.tm_hour;//时
        min=tim.tm_min;//分
        sec=tim.tm_sec;//秒
        day=tim.tm_mday;//日
        mon=tim.tm_mon;//月
        year=tim.tm_year;//年
        time=int2str(year+1900)+"-"+int2str(mon+1)+"-"+int2str(day)+"_"+int2str(hour)+":"+int2str(min)+":"+int2str(sec);
        return time;
    }
    /*********************************************************
     * 功能描述:关于界面
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::about()//关于
    {
        double x,y;
        int H=3;
        for(y=-4;y<=0;y+=0.3)
        {
            for(x=-4;x<=4;x+=0.2)
                if(fabs(sqrt(x*x+y*y)-H*sin(2*atan(y/x)))<=1 || fabs(sqrt(x*x+y*y)-H*sin(2*atan(-y/x)))<=1)
                    cout<<"*";
                else
                    cout<<" ";
            cout<<endl;
        }
        for(y=-1;y<=0;y+=0.2)
        {
            for(x=-4;x<=4;x+=0.2)
                if(fabs(y)-0.65*x*x>=0.2)
                    cout<<"*";
                else
                    cout<<" ";
            cout<<endl;
        };
        cout<<"             银行储蓄系统"<<endl<<"             版本:3.0"<<endl<<endl;;
        system("PAUSE");
    }
    /*********************************************************
     * 功能描述:打开user的数据库
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:通过文件读取打开
     ************************************************************/
    void BankData::OpenUserData()
    {
        long number;
    	string name, pass, id, h;
    	double balance;
    	int state;
    	UserNum = 0;
    	//开始读取User的信息
    	ifstream infile("BankUser.dat", ios::in);
    	if (!infile)
    	{
    		cerr << "打开数据库(BankUser.dat)文件失败!";
    		exit(1);
    	}
    	while (infile >> number >> name >> pass >> balance >> id >> h>> state)
    	{
    		user[UserNum].SetUser(number, name, pass, balance, id, h, state);
    		UserNum++;
    	}
    	infile.close();
    	//User信息读取完毕,总数存入UserNum
    }
    /*********************************************************
     * 功能描述:查找用户名
     * 输入参数:acc-输入的用户名
     * 输出参数:无
     * 返回值:ture 或者 false
     * 其它说明:无
     ************************************************************/
    bool BankData::CheckUser(long acc)
    {
    	for (int i = 0; i < UserNum;)
    	{
    		if (user[i].get_accNumber() == acc)
    			return true;
    		else
    		{
    			i++;
    		}
    	}
    	cout << "没有找到此账户。" << endl;
    	system("PAUSE");
    	return false;
    }
    /*********************************************************
     * 功能描述:记录用户的操作日志
     * 输入参数:i-操作状态 acc-用户帐号
     * 输出参数:无
     * 返回值:无
     * 其它说明:写入到指定文件中
     ************************************************************/
    void BankData::SaveUserLog(int i,int acc)//记录用户日志
    {
        string type,time,state;
        switch(i)
        {
            case 1:state="开户";break;
            case 2:state="销户";break;
            case 3:state="存款";break;
            case 4:state="取款";break;
            case 6:state="转账";break;
            case 7:state="挂失";break;
            case 8:state="解挂";break;
            case 9:state="改密";break;
        }
        time=gettime();
        type=int2str(acc+10001);
        //strcpy(p,type.data());类型转换:string 2 char*
        char ch1[25]="BankUser";
        char ch2[8]=".log";
        char ch[8];
        strcpy(ch,type.c_str());
        char *typen=new char[50];
        typen=strcat(strcat(ch1,ch),ch2);
        ofstream outfile(typen,ios::app);
    	if (!outfile)
    	{
    		cerr << "打开用户名数据库文件失败!";
    		exit(1);
    	}
    	outfile<<user[acc].get_accName()<<" "<<time<<" "<<state<<endl;
        outfile.close();
        delete typen;
    }
    /*********************************************************
     * 功能描述:保存用户数据
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:写入到指定文件中
     ************************************************************/
    void BankData::SaveUserData()
    {
    	ofstream outfile("BankUser.dat", ios::out);
    	if (!outfile)
    	{
    		cerr << "打开数据库(BankUser.dat)文件失败!";
    		exit(1);
    	}
    	int i;
    	for (i = 0; i<UserNum; i++)
    	{
    		outfile << user[i].get_accNumber() << " " << user[i].get_accName() << " " << user[i].get_password() << " " << user[i].get_balance() << " " << user[i].get_id() << " " << user[i].get_homeads() << " " << user[i].get_state() << endl;
    	}
    	outfile.close();
    
    }
    /*********************************************************
     * 功能描述:主页显示
     * 输入参数:无
     * 输出参数:无
     * 返回值:ture 或者 false
     * 其它说明:验证管理员用户名和密码
     ************************************************************/
    bool BankData::HomePage()//主页
    {
    	//return true;//调试语句
    	string name;
    	int i;
    	cout << "+-----------------------+" << endl;
    	cout << "   欢迎光临Mayuko银行" << endl;
    	cout << "+-----------------------+" << endl;
    	cout << "请输入业务员用户名:";
    	cin >> name;
    	i = SearchAdmin(name, OpenAdmin());
    	while (1)
    	{
    		if (i >= 0)
    		{
    			if (CheckAdminPass(i))
    			{
    				cerr << "欢迎进入!" << endl;
    				system("PAUSE");
    				return true;
    			}
    		}
    		else
    		{
    			cerr << "没有找到此管理员!" << endl;
    			return false;
    		}
    	}
    }
    /*********************************************************
     * 功能描述:读取Admin的信息
     * 输入参数:无
     * 输出参数:无
     * 返回值:Admin的个数
     * 其它说明:通过文件读取
     ************************************************************/
    int BankData::OpenAdmin()//读取Admin的信息
    {
    	int anum;
    	//开始读取Admin信息到admin数组中
    	ifstream infile("BankAdmin.dat", ios::in);
    	anum = 0;
    	if (!infile)
    	{
    		cerr << "打开管理员(BankAdmin.dat)文件失败!" << endl;
    		exit(1);
    	}
    	while (!infile.eof())
    	{
    		infile >> admin[anum].name >> admin[anum].password;
    		anum++;
    	}
    	infile.close();
    	//信息读取完毕,admin数组中已存入Admin信息
    	return anum;//返回一共读取到多少Admin条信息
    }
    /*********************************************************
     * 功能描述:查找Admin
     * 输入参数:anum-Admin的个数 n-输入的用户名
     * 输出参数:无
     * 返回值:无
     * 其它说明:通过文件查找
     ************************************************************/
    int BankData::SearchAdmin(string n, int anum)//查找Admin
    {
    	for (int i = 0; i<anum; i++)
    	{
    		if (n == admin[i].name)
    			return i;
    	}
    	return -1;
    }
    /*********************************************************
     * 功能描述:检验Admin密码是否正确
     * 输入参数:无
     * 输出参数:无
     * 返回值:ture 或者 false
     * 其它说明:
     ************************************************************/
    bool BankData::CheckAdminPass(int i)
    {
    	int wrong = 0;
    	string pass;
    	while (1)
    	{
    		cout << "请输入密码:";
    		cin >> pass;
    		if (pass == admin[i].password)
    			return true;
    		else//密码输入错误触发
    		{
    			cerr << "密码输入有误,请重新输入!" << endl;
    			wrong++;
    			if (wrong > 2)
    			{
    				cerr << "Admin密码输入错误超过3次,即将退出系统..." << endl;
    			}
    			return false;
    		}
    	}
    }
    /*********************************************************
     * 功能描述:菜单显示
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:通过一个函数来显示可选择的菜单
     ************************************************************/
    void BankData::MenuShow()//菜单显示函数
    {
    	cout << "+--------------------------+" << endl;
    	cout << "+ 1 开户   2 销户   3 存款 +" << endl;
    	cout << "+ 4 取款   5 查询   6 转账 +" << endl;
    	cout << "+ 7 挂失   8 解挂   9 改密 +" << endl;
    	cout << "+          i 关于   0 退出 +" << endl;
    	cout << "+--------------------------+" << endl;
    }
    /*********************************************************
     * 功能描述:增加一个user
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::AddNumber(int n)
    {
    	string pass1, pass2, name, id ,h;
    	double money;
    	long acc;
    	acc = 10001 + n;
        cout << "正在开户" << endl;
    	while (1)
    	{
    		cout << "帐号:" << acc << endl;
    		cout << "户主姓名:";
    		cin >> name;
    		cout << "密码:";
    		cin >> pass1;
    		cout << "确认密码:";
    		cin >> pass2;
    		//将开户的信息加入到User文件的末尾
    		if (pass1 == pass2)
    		{
    		    cout << "存入金额:";
    	    	cin >> money;
    		    cout << "身份证号:";
    		    cin >> id;
    		    cout << "家庭住址:";
    		    cin  >> h;
    			ofstream outfile("BankUser.dat", ios::app);
    			if (!outfile)
    			{
    				cerr << "打开数据库(BankUser.dat)文件失败!";
    				exit(1);
    			}
    			outfile << acc << " " << name << " " << pass1 << " " << money << " " << id << " " << h << " " << 0 << endl;
    			outfile.close();
    			cout << "开户成功!" << endl;
    			user[UserNum].SetUser(acc,name,pass1,money,id,h,0);
    			SaveUserLog(1,n);
    			UserNum++;
    			system("PAUSE ");
    			//文件写入结束
    			break;
    		}
    		else
    		{
    			cout << "两次密码输入不一致,请重新输入。" << endl;
    			continue;
    		}
    		//信息更新完毕
    	}
    }
    /*********************************************************
     * 功能描述:删除一个user
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::DelNumber()
    {
    	long acc;
    	string pass;
    	char check;
    	cout << "销户" << endl;
    	cout << "待销户帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
            cout << "姓名:" << user[acc].get_accName() << endl;
    		while (1)
    		{
    			if (user[acc].CheckUserPass())
    			{
    				if (user[acc].get_state() == 0)
    				{
    					cout << "余额:" << user[acc].get_balance() << endl;
    					cout << "确认销户(y/Y)?";
    					cin >> check;
    					if (check == 'y' || check == 'Y')
    					{
    						cout << "取款" << user[acc].get_balance() << "元,销户成功!" << endl;
    						user[acc].set_balance(0);
    						user[acc].set_state(2);
    						SaveUserLog(2,acc);
    						system("PAUSE ");
    						break;
    					}
    					else
    					{
    						cout << "销户程序已取消。" << endl;
    						system("PAUSE");
    						break;
    					}
    				}
    				else
    				{
    					cout << "该账户为挂失或已经销户,无法进行销户操作。" << endl;
    					system("PAUSE");
    					break;
    				}
    			}
    		}
    	}
    }
    /*********************************************************
     * 功能描述:给指定user存款
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::AddMoney()
    {
    	long acc;
    	double addmoney;
    	cout << "存款" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		if (user[acc].get_state()==0)
            {
    		    cout << "姓名:" << user[acc].get_accName() << endl;
    		    cout << "存款额:";
    		    cin >> addmoney;
    		    user[acc].set_balance(user[acc].get_balance() + addmoney);//将addmoney钱存入User的信息中
    		    cout << "现余额共计" << user[acc].get_balance() << "元,存款成功!" << endl;
    		    SaveUserLog(3,acc);
    		    system("PAUSE ");
            }
            else if(user[acc].get_state()==2)
            {
                cout<<"该账户目前已经销户."<<endl;
                system("PAUSE ");
            }
            else
            {
                 cout<<"该账户目前已经挂失."<<endl;
                 system("PAUSE ");
            }
    	}
    }
    /*********************************************************
     * 功能描述:user取款
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::DelMoney()
    {
    	long acc;
    	double money;
    	cout << "取款" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		cout << "姓名:" << user[acc].get_accName() << endl;
    		if (user[acc].CheckUserPass())
    		{
    			if (user[acc].get_state() == 0)
    			{
    				cout << "余额:" << user[acc].get_balance() << endl;
    				while (1)
    				{
    					cout << "取款额:";
    					cin >> money;
    					if (money > user[acc].get_balance())
    					{
    						cout << "余额不足,取款失败!" << endl;
    						continue;
    					}
    					else
    					{
    						user[acc].set_balance(user[acc].get_balance() - money);
    						cout << "取出" << money << "元,现余额" << user[acc].get_balance() << "元。" << endl;
    						SaveUserLog(4,acc);
    						system("PAUSE ");
    						break;
    					}
    				}
    			}
    			else
    			{
    				cout << "该账户挂失或者销户,无法进行取款操作。" << endl;
    				system("PAUSE ");
    			}
    		}
    	}
    
    }
    /*********************************************************
     * 功能描述:显示user的信息和日志记录
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::ShowInfo()
    {
    	long acc;
    	string logname,logtime,logstate;
    	int lognum=0;
    	cout << "查询" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		cout << "姓名:" << user[acc].get_accName() << endl;
    		if (user[acc].CheckUserPass())
    		{
    			cout << "余额:" << user[acc].get_balance() << endl;
    			cout << "身份证号:" << user[acc].get_id() << endl;
    			cout << "家庭住址:" << user[acc].get_homeads() << endl;
    			cout << "当前状态:";
    			switch (user[acc].get_state())//判断User的状态
    			{
    			case 0:cout << "正常" << endl; break;
    			case 1:cout << "挂失" << endl; break;
    			case 2:cout << "销户" << endl; break;
    			}
    			//开始进行日志读取
    			string type;
    			//生成将要读取的文件名
    			type=int2str(acc+10001);
                char ch1[25]="BankUser";
                char ch2[8]=".log";
                char ch[8];
                strcpy(ch,type.c_str());
                char *typen=new char[50];
                typen=strcat(strcat(ch1,ch),ch2);
    			ifstream infile(typen,ios::in);
    			if (!infile)
    	        {
    		        cerr << "打开用户日志文件失败!" << endl;
    		        exit(1);
    	        }
    	        cout<<"---------------------------"<<endl;
    	        cout<<"日志记录:"<<endl;
    	        while (infile >> logname >> logtime >> logstate)
    	        {
                    cout<< logname <<" "<< logtime <<" "<< logstate << endl;
                    lognum++;
    	        }
    	        infile.close();
    	        delete typen;
    	        cout<<"查询完毕,共"<<lognum<<"条记录。"<<endl;
    	        cout<<"---------------------------"<<endl;
    			system("PAUSE ");
    		}
    	}
    }
    /*********************************************************
     * 功能描述:转账到其他user
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::TransferMoney()
    {
    	long acc, acc2;
    	double money;
    	cout << "转账" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		cout << "姓名:" << user[acc].get_accName() << endl;
    		if (user[acc].CheckUserPass())
    		{
    			if (user[acc].get_state() == 0)
    			{
    				cout << "余额:" << user[acc].get_balance() << endl;
    				while (1)
    				{
    					cout << "转账帐号:";
    					cin >> acc2;
                        cout << "转账金额:";
    				    cin >> money;
    					if (CheckUser(acc2))
    					{
    						acc2 -= 10001;
    						if (user[acc].get_balance() >= money)
    						{
    							user[acc].set_balance(user[acc].get_balance() - money);
    							user[acc2].set_balance(user[acc2].get_balance() + money);
    							cout << "转账成功!本账户余额" << user[acc].get_balance() << "元。" << endl;
    							SaveUserLog(6,acc);
    							system("PAUSE ");
    							break;
    						}
    						else
    						{
    							cout << "余额不足,转账失败!" << endl;
    							system("PAUSE");
    							continue;
    						}
    					}
    				}
    			}
    			else
    			{
    				cout << "该账户挂失或者销户,无法进行转账操作。" << endl;
    				system("PAUSE ");
    			}
    		}
    	}
    }
    /*********************************************************
     * 功能描述:挂失user
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:状态-1
     ************************************************************/
    void BankData::LossReport()
    {
    	long acc;
    	cout << "挂失" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		cout << "姓名:" << user[acc].get_accName() << endl;
    		if (user[acc].CheckUserPass())
    		{
    			if (user[acc].get_state() == 0)
    			{
    				user[acc].set_state(1);
    				cout << "挂失成功!"<<endl;
    				SaveUserLog(7,acc);
    				system("PAUSE ");
    			}
    			else
    			{
    				cout << "该账户已经销户或挂失!" << endl;
    				system("PAUSE ");
    			}
    		}
    	}
    }
    /*********************************************************
     * 功能描述:解挂user
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:状态-0
     ************************************************************/
    void BankData::SolutionLinked()
    {
    	long acc;
    	cout << "解挂" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		cout << "姓名:" << user[acc].get_accName() << endl;
    		if (user[acc].CheckUserPass())
    		{
    			if (user[acc].get_state() == 1)
    			{
    				user[acc].set_state(0);
    				cout << "解挂成功" << endl;
    				SaveUserLog(8,acc);
    			}
    			else if (user[acc].get_state() == 0)
    			{
    				cout << "该账户状态正常,无需解挂。" << endl;
    			}
    			else if (user[acc].get_state() == 2)
    			{
    				cout << "该账户已经销户,无法解挂。" << endl;
    			}
    			system("PAUSE ");
    		}
    	}
    }
    /*********************************************************
     * 功能描述:更改user的密码
     * 输入参数:无
     * 输出参数:无
     * 返回值:无
     * 其它说明:无
     ************************************************************/
    void BankData::ChangePass()
    {
    	long acc;
    	string pass1, pass2;
    	cout << "改密" << endl;
    	cout << "帐号:";
    	cin >> acc;
    	if (CheckUser(acc))
    	{
    		acc -= 10001;
    		cout << "姓名:" << user[acc].get_accName() << endl;
    		if (user[acc].CheckUserPass())
    		{
    			if (user[acc].get_state() == 0)
    			{
    				while (1)
    				{
    					cout << "请输入新密码:";
    					cin >> pass1;
    					cout << "确认密码:";
    					cin >> pass2;
    					if (pass1 == pass2)
    					{
    						user[acc].set_password(pass1);
    						cout << "更改密码成功!" << endl;
    						SaveUserLog(9,acc);
    						system("PAUSE ");
    						break;
    					}
    					else
    					{
    						cout << "两次密码输入不一致,请重新输入。" << endl;
    						continue;
    					}
    
    				}
    			}
    			else
    			{
    				cout << "该账户挂失或者销户,无法进行改密操作。" << endl;
    				system("PAUSE");
    			}
    		}
    	}
    }
    

    main.cpp

    /***********************************************************
    * 版权所有 (C)2015,shao shuai.
    *
    * 文件名称:bankdata.cpp
    * 文件标识:无
    * 内容摘要:该代码为main主函数
    * 其它说明:无
    * 当前版本: V1.0
    * 作   者:邵帅
    * 完成日期: 20150715
    *
    * 修改记录1:
    * 修改日期: 20150715
    * 版本号: V1.0
    * 修改人: shao shuai
    * 修改内容:创建
    **********************************************************/
    #include <iostream>
    #include "userdata.h"
    #include "bankdata.h"
    #include <cstdlib>
    using namespace std;
    /*********************************************************
     * 功能描述:主函数main
     * 输入参数:无
     * 输出参数:无
     * 返回值:0
     * 其它说明:无
     ************************************************************/
    int main()
    {
    	BankData bank;
    	if (bank.HomePage())
    	{
    		char choice;
    		while (1)
    		{
    			system("cls");
    			bank.MenuShow();
    			cout << "请输入操作指令:";
    			cin >> choice;
    			switch (choice)
    			{
    			case '0':exit(1);
    			case '1':bank.AddNumber(bank.UserNum); break;
    			case '2':bank.DelNumber(); bank.SaveUserData(); break;
    			case '3':bank.AddMoney(); bank.SaveUserData(); break;
    			case '4':bank.DelMoney(); bank.SaveUserData(); break;
    			case '5':bank.ShowInfo(); break;
    			case '6':bank.TransferMoney(); bank.SaveUserData(); break;
    			case '7':bank.LossReport(); bank.SaveUserData(); break;
    			case '8':bank.SolutionLinked(); bank.SaveUserData(); break;
    			case '9':bank.ChangePass(); bank.SaveUserData(); break;
    			case 'i':bank.about();break;
    			default:
    				cerr << "输入错误,请重新输入."<<endl;
    				system("PAUSE");
    				continue;
    			}
    		}
    	}
    	return 0;
    }
    

    运行截图:

    下面是软件运行截图:

    管理员进入界面:



    管理菜单:

    开户:


    销户:


    存款:


    取款:


    查询:


    转账:


    挂失:


    解挂:(账户10007当前状态正常)


    改密:


    彩蛋~关于界面:



    下面是用户指令输入错误的运行截图:

    密码输入错误三次退出系统:


    挂失状态下无法取款:


    销户状态下不能任何操作(除了查询):


    密码两次不一致系统拒绝:



    还有一些文件的截图:


    用户的操作将以log的形式记录下来:



    BankUser.dat(用户数据库):


    BankAdmin.dat(管理员数据库):




    课程报告将以图片的形式上传本文中。

    麻鱼同步了本文章——》mayuko.cn


    @ Mayuko


    展开全文
  • 银行储蓄程序(C++,simple)

    千次阅读 2016-06-01 22:24:56
    */ ... * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhello ... * 问题描述: 实现一个简单的银行储蓄系统,承担活期用户的存款和取款业务 (只是初步的写出) 1. 要求如下: 1)
    */
     * Copyright (c) 2016,烟台大学计算机与控制工程学院
     * All rights reserved.
     * 文件名:text.cpp
     * 作者:常轩
     * 微信公众号:Worldhello
     * 完成日期:2016年6月1日
     * 版本号:V1.0
     * 问题描述: 	实现一个简单的银行储蓄系统,承担活期用户的存款和取款业务 (只是初步的写出)
    1. 要求如下:
    
    1) 实现描述银行的类Bank,记录系统中现有哪些储户(可用数组或vector实现),定义了生成储户的函数append,
    按照账户删除储户的函数的deleteUser,按账号查询储户的函数query,并显示结果。
    
    2) 定义储户基类Account,具有属性账号,存款人姓名和余额,操作saveMoney、getoutMoney和showAccountInfo。
    虚函数saveMoney存储业务,虚函数getoutMoney处理取款业务,虚showAccountInfo函数显示储户所有信息。
    
    3) 定义储户派生类普通储户NormalAccount,实现操作saveMoney、getoutMoney和showAccountInfo,
    函数getoutMoney处理取款业务时余额不足不予取并提示信息,函数showAccountInfo显示普通储户的所有信息。
    
    4) 定义储户派生类高级储户VIPAccount,包含普通账户的所有信息,同时包含透支上限,透支总额,
    函数getoutMoney处理取款业务时超过透支上限不予取并提示信息,函数showAccountInfo显示高级储户的所有信息。
    
    5) 编写main函数,测试上述所要求的各种功能,即可以根据菜单命令增加,删除,和查询储户,
    以及储户存款和取款操作:
    
    
    
    
       a   增加账户时可选择增加普通账户和高级账户,普通账户帐号格式为“N001”,高级账户帐号格式为“V001”;
       b   根据输入的帐号删除和查询账户;
    
       c   储户取款和存款时要求输入帐号,根据帐号来操作账户。
     * 程序输入:无
     * 程序输出:见运行结果
     */
    
    #include<iostream>
    #include<string>
    using namespace std;
    //储户基类
    class Account 
    {
    public:
    	Account(string i,string n,double m=0);
    	virtual void saveMoney(double s);     //存钱
    	virtual void getoutMoney(double g);   //取钱
    	virtual void showAccountInfo();         //查询
    	string getId();
    protected:
    	string id;                                    //用户账号
    	string name;                                  //用户姓名
        double money;                                  //用户余额
    };
    Account::Account(string i,string n,double m)
    {
    	id=i;
    	name=n;
    	money=m;
    }
    string Account::getId()
    {
      return id;
    }
    void Account::showAccountInfo()         //V查询函数定义
    {
    	
    }
    void Account::getoutMoney(double g)         //V查询函数定义
    {
    	
    }
    void Account::saveMoney(double s)         //V查询函数定义
    {
    	
    }
    //普通储户类
    class NormalAccount:public Account{
    public:
    	NormalAccount(string i,string n,double m):Account(i,n,m)
    	{
          
    	}
    	void saveMoney(double s);             //N存钱
    	void getoutMoney(double g);           //N取钱
        void showAccountInfo();                 //N查询
    private:
    	/*string name;
    	string Nid;
    	double money;*/
    };
    
    void NormalAccount::saveMoney(double s)  //N存钱函数定义  
    {
        this->money=this->money+s;
    }
    void NormalAccount::getoutMoney(double g)//N取钱函数定义
    {
    	if(this->money<g)
    	{
    		cout<<"您的余额已不足!"<<endl;
    	}
    	else
    	{
    		this->money=this->money-g;
    		cout<<"取款成功!"<<endl;
    	}
    }
    void NormalAccount::showAccountInfo()            //N查询函数定义
    {
    	cout<<"姓名:"<<name<<endl<<"账号:"<<this->id<<endl<<"余额:"<<this->money<<endl;
    	
    }
    
    //VIP储户类
    class VipAccount:public Account{
    public:
    		VipAccount(string i,string n,double m):Account(i,n,m)
    	{
        
        touzhilimit=20000;                     //V透支上限两万
    	touzhimoney=0;                          //V透支总额(初始化为零
    	}                               //V构造函数(初始化透支上限与总额)
    	void saveMoney(double s);            //V存钱
    	void getoutMoney(double g);          //V取钱
        void showAccountInfo();                //V查询
    private:
    /*	string name;
    	string Vid;
    	double money;*/
    	double touzhilimit;                         //V透支上限
    	double touzhimoney;                         //V透支总额
    };
    /*
    VipAccount::VipAccount()                   //VIP储户类构造函数定义
    {
    	touzhilimit=20000;                     //V透支上限两万
    	touzhimoney=0;                          //V透支总额(初始化为零)
    }*/
    void VipAccount::saveMoney(double s)     //V存钱函数定义
    {
    	if(this->money=0)                                                                           
        {
    		if(touzhimoney>0)
    			touzhimoney=touzhimoney-s;
    		else
    			this->money=this->money+s;
    	}
    	else
            this->money=this->money+s;
     
    }
    void VipAccount::getoutMoney(double g)   //V取钱函数定义
    {
    	if(g>(this->money+(touzhilimit-touzhimoney)))
    	{
    		cout<<"您的余额不足,已达到透支上限!"<<endl;
    	}
    	else
    	{
    		this->money=this->money-g;
    		if(this->money<0)
    		{
    			touzhimoney=this->money*(-1)+touzhimoney;
    			this->money=0;
    		}
    		cout<<"取款成功!"<<endl;
    	}
    }
    void VipAccount::showAccountInfo()         //V查询函数定义
    {
    	cout<<"姓名:"<<this->name<<endl<<"账号:"<<this->id<<endl<<"余额:"<<this->money<<endl<<"透支总额:"<<this->touzhimoney<<"透支上限:"<<this->touzhilimit<<endl;
    
    }
    
    //银行类
    class Bank{
    public:
    	Bank();
    	void deleteuser();
    	void query();
    	void append();
    	void del();
    public:
    	int Index;
    	
    	Account *user[1000];
    	
    };
    Bank::Bank()
    {
    	for(int i=0;i<1000;i++)
    	{
    	      user[i] =NULL;
    	      Index=0;
    	}
    }
    void Bank::append()
    {
    	int choose;
    	string ID;
    	string Name;
    	double Money;
        cout<<"*****        你好,选择开普通账户请按——1        *****"<<endl<<"*****              选择开高级账户请按——2        *****"<<endl;
        cin>>choose;
    	if(choose==1)
    	{   
    		
    		cout<<"开户中..."<<endl;
    		cout<<"请输入账号,例如:N001或者N080"<<endl<<"账号:";
    		cin>>ID;
    		int tmp =1;
    		for(int i=0;i<Index;i++)
    		{
    			
    			if(user[i]->getId()==ID)
    			{
    				cout<<"该账号已存在!"<<endl;
    				tmp =2;
    			}
    		}
    		if(tmp==2)
    			return;
    		else
    		{
    		cout<<"姓名:";
    		cin>>Name;
    		cout<<"存入:";
    		cin>>Money;
    	    
    		
    		Account *n=new NormalAccount(ID,Name,Money);
    		cout<<"开户成功!"<<endl;
    		
            user[Index]=n;
    		cout<<endl<<"当前账户状态:"<<endl;
    		user[Index]->showAccountInfo();
    		Index++;
    		
    		}
    	}
        else
    	{   
    		cout<<"开户中..."<<endl;
    		cout<<"请输入账号,例如:V001或者V080"<<endl<<"账号:";
    		cin>>ID;
    		int tmp =1;
    		for(int i=0;i++;i<1000)
    		{
    			if(user[i]->getId()==ID)
    			{
    				cout<<"该账号已存在!"<<endl;
    				tmp =2;
    			}
    		}
    		if(tmp==2)
    			return;
    		cout<<"姓名:";
    		cin>>Name;
    		cout<<"存入:";
    		cin>>Money;
    		Account *n;
    		n=new VipAccount(ID,Name,Money);
    		cout<<"开户成功!"<<endl;
            user[Index]=n;
    		cout<<endl<<"当前账户状态:"<<endl;
    		user[Index]->showAccountInfo();
    		Index++;
    		
    	}
    }
    void Bank::query()
    {
    	string n;
    	cout << "请输入您要查询的用户账号:" << endl;
    	cin>>n;
    	int tem=1;
    	for(int i=0;i<Index;i++)
    	{
    		if(user[i]->getId() == n)
    		{
    			tem=2;
    			break;
    		}
    	}
    	if(tem==2)
          user[i]->showAccountInfo();
    	else
          cout<<"账户不存在!"<<endl;
    }
    void Bank::del()
    {
    	string n;
    	cout << "请输入要注销的用户账号" << endl;
    	cin>>n;
    	int tem=1;
    	int j;                            //用来记录应删除账户的下标
    	for(int i=0;i<Index;i++)
    	{   
            if(user[i]->getId()==n)
    		{
    			tem=2;
    			j=i;
    	        break;
    		}
    		
    	}
    	if(tem==2)
    	{
    		delete user[j];
    		Index--;
    		cout<<"注销成功!"<<endl;
    	}
    	else
            cout<<"没有这个账号"<<endl;
    }
    int menu_select();
    
    int main()
    {
    	Bank bank;
        char choice;
       
    	for(;;)
    	{
    		choice=menu_select();
    		if(choice==1)
                   bank.append();
    			   
    		else if(choice==2)
                   bank.del();
    		else if(choice==3)
    		{
    			string n;
    	          cout<<"请输入您要存取款的账号"<<endl;
                  cin>>n;
    			  int tem=1;
                  for(int i=0;i<1000;i++)
    			  {
    				  if(bank.user[i]->getId()==n)
    				  {
    					  tem=2;
    					  break;
    				  }
    			  }
    		      if(tem==1)
    			  {
    			    cout<<"账号输入错误"<<endl;
    			  }
    	       	  if(tem==2)
    			  {
    			        int choice;
    			
    							cout<<"1.取款"<<endl;
    							cout<<"2.存款"<<endl;
    							cout<<"请选择"<<endl;
    						
    			               cin>>choice;
    		               	if(choice == 1)
    						{
    			 				double jine;
    							cout<<"请输入取款金额:"<<endl;
    							cin >> jine;
    							bank.user[i]->getoutMoney(jine);
    							bank.user[i]->showAccountInfo();
    											
    						}
    			            if(choice == 2)
    						{
    							double qkuan;
    							cout<<"请输入存款金额:"<<endl;
    							cin>>qkuan;
    							bank.user[i]->saveMoney(qkuan);
    							bank.user[i]->showAccountInfo();
    						}
    			  }
    		
    			  
    		}
            else if(choice==4)
                  bank.query();
    		
        	else
    			break;
    		}
    	
    	return 0;
    }
    
    int menu_select()
    {
       char c;
       cout<<"***************************************************************"<<endl;
       cout<<"***********************银行储蓄系统 v1.0***********************"<<endl;
       cout<<"*                                                             *"<<endl;
       cout<<"*                         1.开户                              *"<<endl;
       cout<<"*                         2.销户                              *"<<endl;
       cout<<"*                         3.取款或存款                        *"<<endl;
       cout<<"*                         4.查询账户                          *"<<endl;
       cout<<"*                         5.退出                              *"<<endl;
       cout<<"***************************************************************"<<endl;
       cout<<"                    请输入(1-5)进行操作:"<<endl;
       do{
    	   cin.get(c);
       }while(c<'1'||c>'5');
       return c-48;
    
    }


    下面有两张简单的运行图片:




    结语:

          或许运行起来还是有BUG的,希望大家可以给我指正!

    展开全文
  • 幻灯片模板封面,使用了绿色与黄色渐变的曲线图形作为背景图片。中间放置中国邮政logo。在logo下方填写PPT标题文字。界面设计简洁实用。 PowerPoint模板内容页,由25张绿色幻灯片图表制作。图表类型丰富满足制作大...
  • 图片未被压缩的显示格式是什么:png,jpg,bmp,gif 12. 加密解密算法在IOS七层模型中的第几层(表示层) 13. 硬件包括。。。(这个又不记得了) 14. CPU中包括什么 15. 操作系统中段页式的区别(什么一维二维) 16. 信息...
  • 1.梦想相册:收集一些与自己愿望有关的照片,把他们贴起来,通过图片思考。 2.看着相册,做白日梦。 3.准备梦想储蓄罐,存起来。 每一个有所成功的人的成功秘诀就是他曾梦想着有成功的那一天,他们不停的想象着...
  • 导入绘图工具包 %config InlineBackend.figure_format = 'retina' # 设置图片清晰度 plt.rcParams['font.sans-serif']=['SimHei'] # 设置中文字体 # 预测未来15年的情况,并换算到月份 forecast_months = 12*15 # ...
  • 首先在SQL Server中建立一个图片存储的数库表,ImageData Column为图象二进制数据储存字段,ImageContentType Column为图象文件类型记录字段,ImageDescription Column为储蓄图 象文件说明字段,ImageSize Column为...
  • 以上图片均来自马月朋友圈。 我比较拖延,所以拖了10天,到今天才写了这篇文章,昨天我又问过马月下这件事目前处理状态。说是银行成立了一个小组处理他这个案子,但最终怎么处理,到目前还没有确定的结论。 顺便问一...
  • 前言 要相信,你现在所有的努力和付出都会在将来...有需要这些学习笔记资料的朋友注意啦:戳这里即可免费领取 还有更多学习笔记面试资料也分享如下(都可免费领取): [外链图片转存中…(img-GxSel4Db-1621056258912)]
  • 银行提供了整存整取定期储蓄业务,其存期分为一年、两年、三年、五年到期凭存单支取本息。年利率如表所示。 在这里插入图片描述 编写一个程序,输入存入的本金数目,计算假设存一年、二年、三年或五年,到期取款时,...
  • 手势手型人手PPT图片素材。真人手势图片素材,共33张。关键词:手托美元符号 手拿钥匙 竖大拇指 手拿杯子 手拿放大镜 手拿储蓄罐 手拿金币
  • ASP。NET下如何上传图片到数据库,并且读出图片 ...,ImageContentType Column为图象文件类型记录字段,ImageDescription Column为储蓄图 象文件说明字段,ImageSize Column为储存图象文件长度字段,结构...
  • 咳咳,沉寂了那么多天,终于开始写东西了,估计今后发东西不太会发和技术有关的东西而是一些我比较感兴趣的话题,这有可能不符合这个社区的宗旨,但是由于鄙人实在是水平有限,于是还请见谅。 ...
  • 首先在SQL Server中建立一个图片存储的数库表,ImageData Column为图象二进制数据储存字段 ,ImageContentType Column为图象文件类型记录字段,ImageDescription Column为储蓄图 象文件说明字段,ImageSize Column...
  • 仓库管理系统 患者监护系统 计算机储蓄系统 主文件修改系统

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,603
精华内容 641
关键字:

储蓄图片