基于C语言的银行业务模拟系统

Withdrawn

发布日期: 2019-12-23 12:11:42 浏览量: 528
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

1.需求分析

1.1 问题描述

客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。

写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。

1.2 测试数据

一天营业开始时银行拥有的款额为10000(元),营业时间为600(分钟)。其他模拟参量自定,注意测定两种极端的情况:一是两个到达事件之间的间隔时间很短,而客户的交易时间很长,另一个恰好相反,设置两个到达事件的间隔时间很长,而客户的交易时间很短。

1.3 实现提示

事件有两类:到达银行和离开银行。初始时银行现存资金总额为total。开始营业后的第一个事件是客户到达,营业时间从0到closetime。到达事件发生时随机地设置此客户的交易时间和距下一到达事件之间的时间间隔。每个客户要办理的款额也是随机确定的,用负值和正值分别表示第一类和第二类业务。变量total、closetime以及上述两个随机量的上下界均交互地从终端读入,作为模拟参数。

两个队列和一个事件表均要用动态存储结构实现。注意弄清应该在什么条件下设置离开事件,以及第二个队列用怎样的存储结构实现时可以获得较高的效率。注意:事件表是按时间顺序有序的。

1.4 设计任务

本程序是模拟银行存取款的流程。模拟客户在银行办理存取款的排队以及办理过程,并计算出客户总的逗留时间。

程序的设计是需要实现两个排队队列(Q1、Q2),一个事件队列(Q_en)。队列1(Q1)和队列2(Q2)用于模拟客户的排队情况,客户从队尾开始排队,从队头出队。事件队列(Q_en)用于记录客户的到达/离开事件,客户到达时记录到达事件,客户办理完存取款后离开时记录离开事件。到达事件记录客户的序列号、办理金额、到达时间;离开事件记录客户的序列号、办理金额、离开时间。

客户的到达时间是随机确定的(以客户最大到达时间arriveMaxTime为上界,客户最小到达时间arriveMinTime为下界)。客户若办理完存取款离开则离开时间由客户的到达时间加上交易时间(交易时间由dealMaxTime和dealMinTime随机确定)。客户的交易额由最大交易额上限(MaxMoney)随机确定,规定负数为取款,正数为存款。

开始时,客户到达银行进入队列1(Q1)排队同时记录客户的到达事件将事件存到事件队列(Q_en)。如果客户办理存款,则更新银行的存款(total_money),然后将客户结点从队列1(Q1)删除,同时事件表(Q_en)记录客户的离开事件。如果客户办理取款,当银行当前的金额(total_money)能够满足客户的取款需求,则更新银行的存款(total_money),然后将客户结点从队列1(Q1)删除,同时事件表(Q_en)记录客户的离开事件。当银行当前的金额(total_money)不能够满足客户的取款需求,则将客户移到队列2(Q2)进行等待。每当队列1(Q1)办理完一次存款操作的时候就顺序检查队列2(Q2),查找能够完成取款操作的客户,当队列2(Q2)当前客户完成取款则更新银行存款(total_money),然后将客户从队列2(Q2)中删除,同时事件表(Q_en)记录客户的离开事件,接着转到队列1(Q1)接待客户。如果队列2(Q2)中当前客户无法完成取款则将队客户移到队列2(Q2)的队尾继续排队,接着检查下一个客户。

当银行营业结束,检查队列1(Q1)和队列2(Q2)将还在排队的客户删除同时更新客户总逗留时间和接待客户总数。最后输出客户排队情况、接待客户总人数(counter)、需要存款的人数(n_p)、成功存款的人数(s_p)、需要取款的人数(n_g)、成功取款的人数(s_g)、客户逗留总时间(totalTime)、客户逗留平均时间(totalTime/ counter)以及银行现存金额(total_money)。

1.5 输入的形式和输入值的范围

银行模拟程序需要用户输入以下几个参量

  • 银行初始存款(total_money)

  • 银行营业时间(closeTime)

  • 客户最大到达时间间隔(arriveMaxTime)

  • 客户最小到达时间间隔(arriveMinTime)

  • 业务最大处理时间(dealMaxTime)

  • 业务最小处理时间(dealMinTime)

  • 最大交易额上限(MaxMoney)

参量输入要求用户从终端输入。

total_money、closeTime、arriveMaxTime、dealMaxTime、MaxMoney、arriveMinTime、dealMinTime要求是一个大于零的整数。

同时arriveMinTime不能大于 arriveMaxTime,dealMinTime不能大于dealMaxTime。

以及arriveMinTime、arriveMaxTime、dealMinTime、dealMaxTime均不能大于closeTime

1.6 输出的形式

银行模拟程序通过dos界面输出银行营业过程的整个排队结果以及银行办理业务的结果。

输出:

  • 需要存款的客户人数(n_p)

  • 需要取款的客户人数(n_g)

  • 成功存款的客户人数(s_p)

  • 成功取款的客户人数(s_g)

  • 客户逗留总时间(totalTime)

  • 接待客户总数(counter)

  • 客户逗留平均时间(totalTime/counter)

  • 银行结业余额(total_money)

1.7 程序所能达到的功能

程序可以根据用户自定输入的合法参量(银行初始存款(total_money)、银行营业时间(closeTime)、客户最大到达时间间隔(arriveMaxTime)、客户最小到达时间间隔(arriveMinTime)、业务最大处理时间(dealMaxTime)、业务最小处理时间(dealMinTime)、最大交易额上限(MaxMoney))来模拟银行的存取款业务。通过模拟输出结果包括客户排队情况、接待客户总人数(counter)、需要存款的人数(n_p)、成功存款的人数(s_p)、需要取款的人数(n_g)、成功取款的人数(s_g)、客户逗留总时间(totalTime)、客户逗留平均时(totalTime/ counter)以及银行现存金额(total_money)。

1.8 测试数据

1.8.1 第一次测试

  • 银行初始存款(total_money):10000

  • 银行营业时间(closeTime):600

  • 客户最大到达时间间隔(arriveMaxTime):20

  • 客户最小到达时间间隔(arriveMinTime):10

  • 业务最大处理时间(dealMaxTime):20

  • 业务最小处理时间(dealMinTime):10

  • 最大交易额上限(MaxMoney):5000

输出结果

1.8.2 第二次测试

让两个到达事件之间的间隔时间很短,而客户的交易时间很长。

  • 银行初始存款(total_money):10000

  • 银行营业时间(closeTime):600

  • 客户最大到达时间间隔(arriveMaxTime):5

  • 客户最小到达时间间隔(arriveMinTime):3

  • 业务最大处理时间(dealMaxTime):50

  • 业务最小处理时间(dealMinTime):40

  • 最大交易额上限(MaxMoney):5000

输出结果

1.8.3 第三次测试

让两个到达事件之间的间隔时间很长,而客户的交易时间很短。

  • 银行初始存款(total_money):10000

  • 银行营业时间(closeTime):600

  • 客户最大到达时间间隔(arriveMaxTime):50

  • 客户最小到达时间间隔(arriveMinTime):40

  • 业务最大处理时间(dealMaxTime):5

  • 业务最小处理时间(dealMinTime):3

  • 最大交易额上限(MaxMoney):5000

输出结果

1.8.4 第四次测试

测试输入非法数据的情况。

2.概要设计

2.1 数据类型的定义

2.1.1 结构体定义

  1. /*客户/事件结构体*/
  2. typedef struct event{
  3. int type;//事件类型到达或者离开 0为到达,1为离开
  4. int arriveTime;//到达时间
  5. int leaveTime;//离开时间
  6. int money;//存款数,正数为存款,复数为取款
  7. int num;//客户编号
  8. event* next;
  9. }event,*eventLink;
  10. /*队列结构体*/
  11. typedef struct QNode{
  12. eventLink front;//队头指针
  13. eventLink rear; //队尾指针
  14. }QNode,*Queue;

2.1.2 队列抽象数据类型的定义

  1. ADT Queue{
  2. 数据对象:D={ ai | aievent, i=1,2,...,n, n0 }
  3. 数据关系:R1={ <ai-1, ai>|ai-1, aiD, i=2,...,n }
  4. 基本操作:
  5. eventLink get_front(Queue &q);
  6. 初始条件:队列q存在
  7. 操作结果:返回队头结点指针
  8. void push(Queue &q,eventLink e);
  9. 初始条件:队列q存在,结点指针e存在
  10. 操作结果:将e指向的结点插入到队列q的队尾
  11. void destoryQueue(Queue &q);
  12. 初始条件:队列q存在
  13. 操作结果:销毁队列q,释放空间
  14. void pop(Queue &q);
  15. 初始条件:队列q存在
  16. 操作结果:删除对头结点并释放结点的空间
  17. }ADT Queue

2.1.3 全局变量的定义

  1. int total_money; //银行现存款
  2. int closeTime; //银行结束营业的时间
  3. int arriveMaxTime; //两个到达事件的时间间隔上限
  4. int arriveMinTime; //两个到达事件的时间间隔下限
  5. int dealMaxTime; //客户交易之间的时间上限
  6. int dealMinTime; //客户交易之间的时间下限
  7. int MaxMoney; //交易额上限
  8. int currentTime=0; //当前时间
  9. int totalTime; //客户逗留总时间
  10. int counter=0; //客户总数
  11. int number=1; //客户初始号码
  12. int flag=1; //判断是否有窗口在处理
  13. int TimeOfDeal; //交易时间
  14. int MaxTime; //到达时间
  15. Queue Q_en; //事件队列
  16. Queue Q1; //队列一
  17. Queue Q2; //队列二

2.1.4 函数类型定义

  1. /**
  2. 结束函数
  3. 当银行营业结束的时候调用此函数,清理释放申请的空间
  4. */
  5. void closeBank();
  6. /**
  7. 到达函数
  8. 当客户到达时调用此函数,随机生成客户信息以及相应的到达事件,分别加入队列1和事件队列。
  9. */
  10. void arrive();
  11. /**
  12. 存款函数
  13. 当客户办理存款的时候调用此函数
  14. */
  15. void putMoney();
  16. /**
  17. 取款函数
  18. 当客户办理取款的时候调用此函数
  19. */
  20. void getMoney();
  21. /**
  22. 查找函数
  23. 查找队列q中第一个可以满足取款的结点并返回,若是查找失败则返回NULL
  24. */
  25. eventLink search(Queue &q,int m);
  26. /**
  27. 处理函数
  28. 对通过【查找函数】找到的结点进行取款处理,生成相应的离开事件
  29. */
  30. void findAndDeal();
  31. /**
  32. 初始化函数
  33. 初始化三个队列,为三个队列分配空间
  34. */
  35. void initQueue();
  36. /**
  37. 主函数
  38. */
  39. int main();

2.2 主程序的流程

主程序首先先接收用户的数据输入,并对用户输入的数据进行验证,如果输入的数据不合法则要求用户重新输入。

当用户输入的数据合法后开始主要程序的运行。首先先调用initQueue()函数对队列进行初始化,以及根据客户到达时间的上下界随机生成第一个客户的到达时间。当当前时间(currentTime)小于银行结业时间(closeTime)时进行循环。每循环一次当前时间加1。

在每一次循环当中进行四次判断。

  • 当交易时间(TimeOfDeal)小于当前时间(currentTime)的时候,让交易时间等于当前时间

  • 当交易时间等于当前时间时,让flag为1表示当前有窗口在办理业务

  • 当到达时间(MaxTime)等于当前时间(currentTime)的时候调用arrive()函数让客户到达加入队列1(Q1)排队并在事件表(Q_en)中加入到达事件,同时随机生成下一个客户到达时间(MaxTime)

  • 当窗口处于交易状态(flag=1)且队列1(Q1)不为空。则进行客户交易处理,当客户是存款类型的时候调用putMoney()进行存款操作,同时调用findAndDeal()函数对队列2(Q2)进行检查是否有满足取款的客户并进行处理。当客户是取款类型的时候调用getMoney()进行取款处理

每一次循环当前时间(currentTime)加1,直到银行营业结束退出循环,输出模拟结果,最后调用closeBank()函数结束程序。

2.3 各模块的调用关系

程序分成主程序模块、存款模块、取款模块、检查处理模块、事件处理模块。主程序模块负责调用存款模块、取款模块和事件处理模块。存款模块调用事件处理模块、检查处理模块。取款模块和检查处理模块调用事件处理模块。

3.详细设计

3.1 数据类型的实现

3.1.1 队列抽象数据结构的实现

  1. //入队操作
  2. void push(Queue &q,eventLink e){
  3. if(e==NULL){//结点指针为空
  4. return;
  5. }
  6. if(q->front==NULL){//队列为空
  7. q->front=e;
  8. q->rear=e;
  9. }else{
  10. q->rear->next=e;
  11. q->rear=q->rear->next;
  12. }
  13. }
  14. //销毁队列
  15. void destoryQueue(Queue &q){
  16. eventLink e,e1;
  17. e=q->front;
  18. if(q->front==q->rear==NULL){//队空
  19. return;
  20. }
  21. while(e!=NULL){
  22. e1=e->next;
  23. free(e);
  24. e=NULL;
  25. e=e1;
  26. }
  27. }
  28. //删除队首元素
  29. void pop(Queue &q){
  30. eventLink e;
  31. e = q->front;
  32. if(q->front==NULL){//队列为空
  33. return;
  34. }else if(q->front->next==NULL){//队列只有一个元素
  35. q->front=q->rear=NULL;
  36. }else{
  37. q->front=q->front->next;
  38. }
  39. free(e);//释放空间
  40. e=NULL;
  41. }
  42. //返回队首元素
  43. eventLink get_front(Queue &q){
  44. return q->front;
  45. }

3.1.2 函数类型的实现

  1. /**
  2. 结束函数
  3. 当银行营业结束的时候调用此函数,清理释放申请的空间
  4. /
  5. void closeBank(){
  6. //调用destoryQueue()函数销毁三个队列Q1、Q2、Q_en
  7. destoryQueue(Q1);
  8. destoryQueue(Q2);
  9. destoryQueue(Q_en);
  10. }
  11. /**
  12. 到达函数
  13. 当客户到达时调用此函数,随机生成客户信息以及相应的到达事件,分别加入队列1和事件队列。
  14. */
  15. void arrive(){
  16. //声明两个eventLink结点指针e、e1
  17. //用malloc函数为两个结点指针分配空间
  18. if(e为空或者e1为空){
  19. //退出函数
  20. }
  21. //用(rand()%(2*MaxMoney)-MaxMoney)随机生成e和e1的办理金额
  22. //将当前时间(currentTime)作为e和e1的到达时间
  23. //将(number)作为e和e1的序列号,number++
  24. //将e1的类型设置为0(到达)
  25. //将e加入队列1(Q1)
  26. //将e1加入事件队列(Q_en)
  27. }
  28. /**
  29. 存款函数
  30. 当客户办理存款的时候调用此函数
  31. */
  32. void putMoney(){
  33. //声明两个eventLink结点指针e、e1
  34. //用malloc函数为结点指针e1分配空间
  35. if(e1为空){
  36. //退出函数
  37. }
  38. //用get_front()函数获取队列1的队头元素
  39. //更新银行金额total_money
  40. //利用获得到的对头元素信息设置离开事件e1
  41. //e1的离开时间为客户的到达时间+随机的处理时间
  42. //e1加入事件队列
  43. //删除队列1对头元素
  44. //增加客户的总逗留时间(客户的离开时间-客户的到达时间)
  45. //接待客户人数加1
  46. //客户的离开时间为交易时间
  47. //将窗口设置为空闲状态
  48. }
  49. /**
  50. 取款函数
  51. 当客户办理取款的时候调用此函数
  52. */
  53. void getMoney(){
  54. //声明两个eventLink结点指针e、e1
  55. //用malloc函数为结点指针e1分配空间
  56. if(e1为空){
  57. //退出函数
  58. }
  59. //用get_front()函数获取队列1的队头元素
  60. if(客户的取款金额大于银行现存金额){
  61. //取款失败
  62. //e1为队列2客户元素
  63. //将客户从队列1删除,让客户进入队列2继续排队
  64. }else{
  65. //取款成功
  66. //更新银行现存金额
  67. //向事件队列添加相应的离开事件e1
  68. //将客户从队列1删除
  69. //接待客户人数加1
  70. //增加客户的总逗留时间(客户的离开时间-客户的到达时间)
  71. //客户的离开时间为交易时间
  72. //将窗口设置为空闲状态
  73. }
  74. }
  75. /**
  76. 查找函数
  77. 查找队列q中第一个可以满足取款的结点并返回,若是查找失败则返回NULL
  78. */
  79. eventLink search(Queue &q,int m){
  80. //声明两个eventLink结点指针e、e1
  81. //取队列的队头元素e
  82. while(队头元素不为空){//遍历队列
  83. if(客户办理金额小于等于银行现存金额){
  84. if(队列只有一个元素){
  85. //队列头尾指针置空
  86. //返回客户指针e1
  87. }else{
  88. //队头指针移动一位
  89. //返回客户指针e1
  90. }
  91. }else{//资金不足,查找下一个客户
  92. if(队列只有一个元素){
  93. //不做操作
  94. }else{
  95. //将队头结点放到队尾
  96. }
  97. }
  98. if(队列遍历了一遍){
  99. //返回NULL
  100. }
  101. }
  102. //返回NULL
  103. }
  104. /**
  105. 处理函数
  106. 对通过【查找函数】找到的结点进行取款处理,生成相应的离开事件
  107. */
  108. void findAndDeal(){
  109. //声明两个eventLink结点指针e、e1
  110. while(调用search函数查找客户结点e){
  111. //用malloc函数为结点指针e1分配空间
  112. //更新银行现存款total_money
  113. //离开事件e1的离开时间为当前时间+随机处理时间
  114. //设置离开事件e1加入事件表(Q_en)
  115. //接待客户人数增加
  116. //交易时间加上处理时间
  117. //增加客户总逗留时间(客户的离开时间-客户的到达时间)
  118. //释放结点e的空间
  119. }
  120. //将交易状态设为空闲状态
  121. }
  122. /**
  123. 初始化函数
  124. 初始化三个队列,为三个队列分配空间
  125. */
  126. void initQueue(){
  127. //为三个队列Q1、Q2、Q_en分配空间
  128. if(Q1Q2Q_en其中一个为空){
  129. //退出函数
  130. }
  131. //将三个队列的头尾指针置空
  132. }

3.1.3 主函数的实现

  1. int main(){
  2. while(用户选择进入模拟程序){
  3. //用户输入模拟数据
  4. //初始化三个队列
  5. //随机产生到达时间(MaxTime)用来确定第一个到达的客户
  6. while(当前时间<银行结业时间){
  7. //当前时间加1
  8. if(当交易时间<当前时间){
  9. //让交易时间等于当前时间
  10. }
  11. if(交易时间==当前时间){
  12. //让flag为1
  13. }
  14. if(到达时间==当前时间){
  15. //调用到达函数arrive()
  16. //随机生成下一个到达时间(MaxTime)
  17. }
  18. if(flag==1并且队列1不为空){
  19. if(队列1队头客户办理存款){
  20. //调用存款函数putMoney()
  21. //调用查找函数findAndDeal()
  22. }else{//办理取款
  23. //调用取款函数getMoney()
  24. }
  25. }
  26. }
  27. //输出事件队列信息
  28. while(事件队列队头不为空){//遍历事件队列
  29. if(事件为离开类型){
  30. //输出事件信息
  31. if(事件为存款类型){
  32. //成功存款人数加1
  33. }else{
  34. //事件为取款类型
  35. //成功取款人数加1
  36. }
  37. }else{
  38. //事件为到达类型
  39. //输出事件信息
  40. if(事件为存款类型){
  41. //需要存款人数加1
  42. }else{
  43. //事件为取款类型
  44. //需要存款人数加1
  45. }
  46. }
  47. //删除事件队列队头元素
  48. }
  49. //事件队列遍历结束
  50. while(队列1队头元素不为空){
  51. //更新总逗留时间
  52. //接待客户人数加一
  53. //删除事件队列1队头元素
  54. }
  55. while(队列2队头元素不为空){
  56. //更新总逗留时间
  57. //接待客户人数加一
  58. //删除事件队列2队头元素
  59. }
  60. //调用结束函数closeBank()
  61. //输出最终模拟营业结果
  62. }//退出循环
  63. }//main

3.2 程序模块调用关系图

程序分成主程序模块、存款模块、取款模块、检查处理模块、事件处理模块。

3.3 银行业务模拟程序的流程图

4.调试分析

4.1 调试过程中遇到的问题以及解决办法

程序调试阶段中遇到了几个问题,下面将对遇到的问题进行描述以及给出解决办法

4.1.1 问题1

问题:在运行程序的一开始就无法运行。

解决过程:首先排除输入数据的错误,我取了几组正常的数据进行验证,排除是输入的数据的错误。接着我在程序中设置调试输出语句进行调试,发现程序在调用存款函数的时候出错。经过检查发现是在使用节点的时候,忘记给结点指针分配空间。

解决方法:给待使用的结点指针分配空间。

4.1.2 问题2

问题:在输出结果的时候发现需要存款和需要取款的人数之和有时候会小于总的客户接待数量。

解决过程:首先我是想到可能是在存款和取款函数里添加离开事件的时候忘记更新客户总数。在对存取款函数进行排查后发现并不是这个问题。接着我对更新需要存款和需要取款的人数进行检查,发现这两个变量的增加是符合逻辑的,并没有错误。最后我通过不断的调试和判断发现原来是在营业结束后没有对队列2里面还在排队的客户进行计算。

解决方法:在结束模拟营业后增加一个循环对队列2还存在的客户进行计算、更新总逗留时间并释放空间。

4.1.3 问题3

问题:在程序运行到搜索函数的时候会出错,程序无法运行。

解决过程:我对搜索函数进行调试发现函数陷入循环里面无法退出循环,在对程序的逻辑进行研究后我发现我的逻辑存在问题,在对队列2进行遍历的时候忘记在遍历一遍之后强制退出循环。

解决办法:在处理函数的循环语句中增加一个判断,当队列遍历一遍后退出寻环

4.2 算法的时空分析以及改进设想

下面给出程序中各个操作的时间复杂度和空间复杂度的分析。

4.2.1 get_front(Queue &q)//返回队首元素

由函数的操作可以看出此操作只需要返回队列头指针,所以时间复杂度为O(1),空间复杂度也为O(1)。

由函数的操作可以看出来函数里没有循环语句只有简单的判断语句,没有额外的空间,只有指针的赋值操作。所以时间复杂度为O(1),空间复杂度也为O(1)。

4.2.3 destoryQueue(Queue &q)// 销毁队列

在这个函数中存在循环用以遍历队列,所以这个操作的时间复杂度为O(n),函数 没有额外的空间,所以空间复杂度为O(1)。

4.2.4 pop(Queue &q)// 删除队首元素

通过分析可以知道函数的操作可以看出来函数里没有循环语句只有简单的判断语句,没有额外的空间,只有指针的操作。所以时间复杂度为O(1),空间复杂度也为O(1)。

4.2.5 closeBank()//结束函数

函数只是调用了三个函数而调用的函数时间复杂度为O(n),所以函数时间复杂度为O(n),空间复杂度为O(1)。

4.2.6 arrive();//到达函数

通过对函数操作的分析可以知道,这个函数与问题规模无关所以时间复杂度为O(1),空间复杂度也为O(1)。

4.2.7 putMoney()//存款函数

通过对函数操作的分析可以知道,这个函数与问题规模无关所以时间复杂度为O(1),空间复杂度也为O(1)。

4.2.8 getMoney()//取款函数

通过对函数操作的分析可以知道,这个函数与问题规模无关所以时间复杂度为O(1),空间复杂度也为O(1)。

4.2.9 search(Queue &q,int m)// 搜索函数

通过分析可以知道函数里面存在一个循环用来遍历队列,所以这个操作的时间复杂度为O(n),函数 没有额外的空间,所以空间复杂度为O(1)。

4.2.10 findAndDeal()//处理函数

通过分析可以知道函数里面存在一个循环用来调用查找函数,所以这个操作的时间复杂度为O(n),函数 没有额外的空间,所以空间复杂度为O(1)。

4.2.11 initQueue()//队列初始化

通过对函数操作的分析可以知道,这个函数与问题规模无关所以时间复杂度为O(1),空间复杂度也为O(1)。

5.经验和体会

一开始在选这个课题的时候其实心里挺没底的,因为没有完整的用c语言做过一个课题。在看完这个课题的要求之后发现这个题目主要是需要用队列进行实现。所以我先把队列这部分的知识认真的复习了一遍。之后通过反复看设计需求大致了解了题目的设计要求,在对要求存在疑问的地方我也通过和同学讨论逐渐解决了疑惑。

在对要求有了一个大致的了解后,我通过写伪代码和思维导图逐渐理清设计思路。接着就是通过题目具体的要求设计了数据结构,和一些基本模块。在经过认真编写后程序的架构基本完成。

上传的附件 cloud_download 基于C语言的银行业务模拟系统.7z ( 1.41mb, 11次下载 )
error_outline 下载需要8点积分

发送私信

一帘红雨桃花谢,十里清阴柳影斜

14
文章数
37
评论数
最近文章
eject