《【大学课件】软件设计的概念和过程.ppt》由会员分享,可在线阅读,更多相关《【大学课件】软件设计的概念和过程.ppt(120页珍藏版)》请在三一文库上搜索。
1、第三章 软件设计的概念和过程,软件设计阶段的目的是产生一个具有良好结构的、可以初步运行的软件系统。 1. 软件设计过程:结构化设计,初步设计,设计复审,详细设计,设计复审,编码,软件结构与说明,修改,设计资料,模块算法描述,控制逻辑,修改,规格说明,源代码,http:/ 软件设计的概念和过程,指导原则: 层次化:合理地控制和划分软件成分的关系。 模块化:充分采用信息隐蔽原则,最大限度地实现程序局部化和数据局部化,控制复杂性。 功能独立:尽量使每个软件成分的功能保持相对独立。 信息驱动:尽量使用分析阶段取得的成果。 结构清晰:尽量使软件成分之间的关系简单。 控制简单:尽量使软件成分内部的控制关系
2、清晰,控制结构严格受限,避免混乱。,http:/ 软件设计的概念和过程,2. 自顶向下、逐步求精的设计方法 原则 从软件系统的最高层开始,定义一个软件的总控程序,由它驱动第二层次的任务,再逐级向下按同样的原则依次扩展,直至最底层不可再分的任务(模块),编制源代码。 基础:基于软件的控制流向或程序的控制结构。 优点:信息隐蔽。各层之间存在单向的控制关系,通过传送必要的控制信息或数据来实现,同层之间则无控制关系; 某个数据结构及其操作完全位于低层,则无需在高层定义;控制关系向下传递。,http:/ 软件设计的概念和过程,2. 【例】银行算法 A. 问题 假定某个银行有一笔若干个单位的资金,可供客户
3、项目发展贷款,寻求一个安全的贷款策略。 B. 规定: 客户预知贷款总额,且所有客户贷款总额之和将超过资金总额; 每个客户一次请贷一个单位; 对客户的贷款请求,可以立即付给,也可请其等待; 一旦客户贷足总额,立即归还全部贷款。,http:/ 软件设计的概念和过程,C. 分析 银行存在两种可能的状态:安全、不安全。 安全状态:银行无论如何贷款,都有可能使它当前的所有客户在有限的时间内完成项目建设并归还全部贷款。 不安全状态:银行将不可能实现上述目标,资金无法收回。 例如,银行有10个货币单位,3个客户,它们的贷款总额分别为:8、3、9。,http:/ 软件设计的概念和过程,状态1是安全的: 状态2
4、是不安全的:,银行资金: 4 A: 3 (5) B: 2 (1) C: 1 (8),银行资金: 1 A: 4 (4) B: 2 (1) C: 3 (6),http:/ 软件设计的概念和过程,进一步分析:在安全状态和不安全状态之间,存在一个临界状态。此时,只有按照特定的贷款策略才可以完成所有项目。 自顶向下设计 当前系统的描述: type s = record transactions: array1n of record claim, loan: int; completed: boolean end; capital, cash: int; end;,http:/ 软件设计的概念和过程,第一
5、步:确定当前系统安全否,分两步。 function safe (current_state: s) : boolean; var state: s; begin state:= current_state; 试完成所有的交易; safe:= 所有的交易是否全部完成; end;,安全否,试完成全部交易,是否全部完成,http:/ 软件设计的概念和过程,第二步:针对逐个试完成交易,又分两步。此时有两个程序:逐个试完成交易、所有交易是否完成。 逐个试完成交易 procedure complete_transactions (var state: s) ; var customer: int ; pr
6、ogress: boolean; begin repeat progress:= false; for customer:= 1 to n do if not state. transactionscustomer. completed then if 该项交易能完成 then begin,http:/ 软件设计的概念和过程,归还贷款; state. transactionscustomer. completed:= true; progress:= true; end; until not progress; end; 所有交易是否完成 function all_transactions_c
7、ompleted(state. s): boolean; begin if state. capital = state. cash then all_transactions_completed:=true else all_transactions_completed:=false; end;,http:/ 软件设计的概念和过程,这时,系统将又向下细化一级:,是否安全,试完成全部交易,是否全部完成,逐个试完成交易,归还贷款,http:/ 软件设计的概念和过程,第三步:针对逐个试完成交易,又有两项任务:试完成每一项交易、归还贷款。 试完成每一项交易 function completion_p
8、ossible(claim, cash: int): boolean; begin if claimcash then completion_possible:=false else completion_possible:=true; end; 归还贷款 procedure return_loan(var loan, cash: int); begin cash:=cash+loan; end;,http:/ 软件设计的概念和过程,于是,试完成所有交易的程序就完善了: procedure complete_transactions (var state: s) ; var customer:
9、 int ; progress: boolean; begin repeat progress:= false; for customer:= 1 to n do if not state. transactionscustomer. completed then if completion_ possible(state.transactionscustomer.claim, state.cash) then begin return_loan(state.transactionscustomer. loan, state.cash); state. transactionscustomer
10、. completed:= true; progress:= true; end; until not progress; end;,http:/ 软件设计的概念和过程,这样,通过三级的求精过程,完成了全部的设计任务。整个程序结构为: function safe(current_state: s): boolean; var: state: s; procedure complete_transactions(var state: s); procedure return_loan(loan,cash: int); function all_transactions_completed(sta
11、te: s): boolean; function completion_possible(claim, cash: int); begin state:= current_state; complete_transactions(state); safe:=all_transactions_completed(state); end;,http:/ 软件设计的概念和过程,3 软件概念 软件结构 软件结构是指程序的系统结构。通常,它意味一种特殊的层次控制体系,但不一定表示软件中各部分处理的顺序、调用的次数或判定。仅仅体现了程序各部分之间的控制关系。研究软件结构就是研究各部分划分的原则以及它们之
12、间的联系。 软件结构的好坏对软件的质量具有极其重要的影响;另一方面,从不同的角度出发,同一个问题可以由不同的软件结构。,http:/ 软件设计的概念和过程,要解决的问题 软件结构 必须着重指出,软件的层次不是固有的,在很大程度上它是人为的。是人们为了分解大系统的复杂性而引入的。不同的设计方法可以产生不同的结构,问题是何种结构使软件系统更加清晰、维护更加方便,这是人们所关心的。,http:/ 软件设计的概念和过程,模块 模块是组成软件的最小单位。严格地定义是:模块是一个可以独立编址的程序单位。 3. 结构,深度,宽度,http:/ 软件设计的概念和过程,软件结构的深度是指控制的层数; 软件结构的
13、宽度是指同一层次的最大跨度。 模块性 模块性是指软件易于开发、管理和维护的程度。 ( C(P1) C(P2) ) ( E(P1) E(P2) 但是,C(P1+P2) C(P1)+C(P2) ,因此, E(P1+P2) E(P1)+E(P2),http:/ 软件设计的概念和过程,但是,除了处理的复杂性以外,还存在模块之间接口的复杂性。开发工作量是与两者之和相关的。,工作量,模块数量,接口代价,模块代价,总代价,http:/ 软件设计的概念和过程,抽象:指开发时概括的级别,层次越高,抽象级别越高。 信息隐蔽:指模块内部定义的数据结构和操作的外部不可见性,用以防止错误蔓延。 模块独立性 模块独立性是
14、指模块可以被独立地理解、编制、测试和修改的程度。其量度的标准是内聚和耦合。 内聚:模块内部结合的紧密程度,理想的高内聚是一个模块恰好完成一件任务。,http:/ 软件设计的概念和过程,低 高 共存的:模块的语句之间实际上没有联系,仅仅从存储的角度将它们放在一起; 逻辑的:将逻辑上相似的功能合并为一个模块; 时态的:将需要同时执行的程序放在一个模块内; 以上为弱内聚的。 过程的:模块的各部分相互关联,且必须按指定的次序执行; 通信的:模块的各个处理部分都因用同样的数据;,共存的 逻辑的 时态的 过程的 通信的 顺序的 功能的,http:/ 软件设计的概念和过程,顺序的:模块中的各个处理部分都紧密
15、相关于一个功能,而且其中一个部分的输出就是另一部分的输入; 功能的:一个模块实现且仅实现一个功能。 目标:尽可能设计高内聚的模块! 耦合:模块之间相互联系和依赖的程度。模块之间的耦合依赖于模块之间接口的复杂性。 考察模块之间的耦合从三个角度: 方式,耦合的方式; 作用,共享信息的作用; 数量,模块间联系的多少,http:/ 软件设计的概念和过程,研究耦合的目的:防止错误蔓延。 低 高 数据的:模块之间通过调用进行联系,调用参数为整体变量的数据型参数; 标记的:模块之间通过调用进行联系,调用参数可以是域变量的数据型参数;,无耦合 数据的 标记的 控制的 外部的 共用的 内容的,http:/ 软件
16、设计的概念和过程,控制的:模块之间通过调用进行联系,调用参数可以控制下属模块的运行; 外部的:模块之间由于外部环境的约束而产生联系,例如,两个模块通过I/O联系、通过中断(如OS)联系等; 共用的:模块之间通过共同的数据区联系; 内容的:一个模块使用另一个模块定义的数据结构或控制信息。 总之,联系方式:调用(好),直接引用数据或指令(不好),相互作用:数据交流(好),运行控制(不好)。 目标:尽可能设计低耦合的模块联系。,http:/ 软件设计的概念和过程,设计的注意要点 模块的大小问题:在一个编程人员可以控制的复杂性以内; 高内聚、耦合 保持单入口、单出口,防止病态连接,推荐使用三种结构:,
17、http:/ 软件设计的概念和过程,争取合理的软件结构,深度过大时可以适当增加扇出、宽度过大时可以适当减少扇出。,http:/ 软件设计的概念和过程,将模块的作用范围控制在它的控制范围内。,A,B,C,D,E,F,G,H,I,A,C,D,E,F,B,G,H,I,判定影响,判定,http:/ 软件设计的概念和过程,尽可能利用“黑箱”技术,使模块的功能可预测(具有内部“存储器”的模块功能是难预测的)。,http:/ 软件设计的概念和过程,4 软件初步设计 软件初步设计的任务: 得到一个良好的软件结构,又称软件的结构设计。 良好的软件结构 良好的软件结构应该是模块单向依赖的,亦即下层模块依赖上层模块
18、而不是反之。通常的软件结构有顺序、半序和树型三种。,http:/ 软件设计的概念和过程,顺序:,偏序:,树型:,程序结构图没有徊路!,http:/ 软件设计的概念和过程,2. 设计方法分类: 面向功能的设计方法; 面向数据流的设计方法; 面向数据结构的设计方法; 面向数据流和面向数据结构相结合的设计方法; 面向对象的设计方法; 思想与手段 分解与抽象,分解软件系统的复杂性。,http:/ 软件设计的概念和过程,面向数据流的设计方法 基本思想: 利用系统分析阶段得到的DFD,导出软件的系统结构。通过定义若干“映射”规则,把不同的数据流映射到软件结构。 应用范围: 原则上可以通用。特别是对软件的信
19、息结构不十分清晰或不易用形式化手段描述时,这种方法更有效。例如嵌入式软件、复杂的数值计算和分析过程、工业过程控制、CAD、GIS应用软件等。,http:/ 软件设计的概念和过程,(1)信息流 一般来说,信息流可以分为两个大类。 转换流:具有明显的传入、处理、传出界限的信息流。是一种基本上呈现线性形状的DFD。,传入流,转换流,传出流,传入流,信息,时间,http:/ 软件设计的概念和过程,转换中心:信息和形态发生根本变化的部分,A,B,C,D,E,F,H,G,I,J,K,L,传入流,传出流,转换中心,http:/ 软件设计的概念和过程, 事务基元流:具有明显散射特性的DFD。 事务基元中心:对
20、输入信息进行判断确定处理方式的部分,A,B,C,D,H,L,M,O,E,F,G,I,J,K,动作路径:处理输入信息的部分,http:/ 软件设计的概念和过程,在大型的DFD中,这两种信息流可能同时存在。 (2)设计步骤 复审、精化DFD,考虑正确性和合理性; 确定信息流的特性,从总体上区分是转换流或事务基元流; 确定流的边界 事务基元流:以事务基元中心分界,分为传入、事务基元中心和动作路径; 转换流:从输入端向内推进,找出离输入端最远、但仍构成系统的输入,与物理输入有最小的相似性(如去掉注释、间隔符,转成内部表示,经过编辑、有效性检查等)的地方,作为传入流边界。,http:/ 软件设计的概念和
21、过程,从物理输出端开始向内推进,但仍构成系统的输出,与物理输出有最小的相似性(如未经格式编排、未作单位转换等)的地方,作为传出流的边界。 有可能传入流、传出流的边界重合,这时软件的功能就是分发、转换,没有实质性的处理。 将DFD转化为软件的结构 转换流 软件呈现三分结构:,总控模块,传入部分,转换部分,传出部分,http:/ 软件设计的概念和过程,传入部分:在无子流的情况,从边界由里向外推。,A,B,D,E,C,传入分控,E,C,D,B,A,A,http:/ 软件设计的概念和过程,传出部分:在无子流的情况,由传出边界里向外推。,I,J,K,L,传出分控,J,I,K,L,K,http:/ 软件设
22、计的概念和过程,转换中心:在无子流的情况,自传入边界向传出边界推进。,F,G,H,转换分控,F,G,H,H,http:/ 软件设计的概念和过程, 事务基元流 软件呈现出二分结构。,总控模块,接收部分,发送部分,http:/ 软件设计的概念和过程,接收部分:同转换流的传入部分类似。,A,B,接收分控,A,B,http:/ 软件设计的概念和过程,发送部分:由事务基元中心向外推。,C,D,E,F,G,H,I,J,K,L,M,O,发送分控,L,M,O,H,I,J,K,D,F,E,G,http:/ 软件设计的概念和过程, 继续分解,在有子流的情况,继续根据子流的类型转化。例如,上例中事务基元流的第二条路
23、径又是一个转换流,假定转换转换中心是I、J,就变成:,发送分控,L,M,O,路径子控,H,转换微控,K,I,J,D,F,E,G,http:/ 软件设计的概念和过程, 对得到的软件结构求精。 原则:高内聚、低耦合; 具有相同的模块可以合并,即可以产生偏序的软件结构。例如,上例的转换流中,沿着流的方向出现分叉和合并,形成的软件结构中会出现一些相同的模块。这时就可以将它们合并; 视情况省略分控制模块,如传入部分只有一个数据流进入转换中心,传入分控模块可以省略、转换分控模块也可省去,传出部分也类似。,http:/ 软件设计的概念和过程,系统总控,转换分控,传入分控,传出分控,E,D,B,A,C,F,G
24、,H,K,I,J,L,软件结构图:,http:/ 软件设计的概念和过程, 文档整理 文档整理是软件初步设计的一个重要阶段。在得到软件的结构以后,必须确定模块之间的接口。要对模块之间的调用给出明确的规定。 模块处理说明: 模块处理说明是对系统分析阶段的加工说明加以细化,比较深入地描述模块在软件系统中所处的位置及地位。要给出它使用的外部数据(包括数据库中的数据、系统的全程数据结构以及上级模块的调用参数。还要给出它调用下级模块所使用的参数。,http:/ 软件设计的概念和过程,5. 数据设计 初步设计阶段的另一个工作是进行数据设计: 数据库设计,定义数据库模式。要对系统分析阶段得到的E-R图进行细化
25、,特别是为了提高效率,需要设计部分中间数据表项,例如台帐等。 全程数据结构; 大致指出模块内部需要定义的局部数据结构; 明确每个模块的I/O数据及其结构。,http:/ 软件设计的概念和过程,模块说明的内容: 模块名; 模块处理的描述; 模块中使用的数据:数据库表、输入、输出数据、全程数据结构等; 上级模块名; 上级模块调用的参数及其含义和作用; 下级模块名; 调用下级模块使用的参数及其含义和作用。,http:/ 软件设计的概念和过程,5 面向数据结构的设计方法 数据结构与程序 程序 = 数据结构 + 算法 数据结构强烈地影响软件的设计与过程设计:处理重复数据结构的程序往往具有循环结构;处理选
26、择数据结构的程序往往具有条件判定的机构;处理分层次数据结构的程序往往具有层次结构。 面向数据结构的设计方法就是把对数据结构的描述转化为对软件结构的描述。从I/O数据结构出发,推倒软件的结构及某些细节。,http:/ 软件设计的概念和过程,例 处理工资报表,问题环境,数据结构,完成的任务,执行的操作,程序结构,读、写,程 序,http:/ 软件设计的概念和过程,适用范围 原则上,处理定义清晰、具有层次特点的信息结构,都可以使用面向数据结构的设计方法。如: 商业财政应用有明确的数据文件、输出报告 管理信息系统固定的单据、报表 系统程序OS以大型表格为基本的数据结构 DBMS处理结构定义清晰的纪录
27、GIS固定的点、线、面结构,http:/ 软件设计的概念和过程,与面向数据流方法的不同 设计出发点不同(对现实世界的观察点不同) 面向数据流方法以信息在处理时刻的流向为基础,设计一个具有鲜明时序特征的软件结构,而面向数据结构的方法以信息的构成及其在处理时刻的相互关系为基础,设计一个具有鲜明层次特征的软件结构及其处理细节。 设计的最终目标不同 前者以初步设计为目标,产生软件的模块结构,后者以详细设计为目标,产生软件的过程描述,模块结构仅仅是副产品。,http:/ 软件设计的概念和过程,设计步骤不同 评价数据结构的特性(对软件规格说明中描述的信息结构进行复审) 将数据结构表示成初等形式(顺序、选择
28、、循环) 把数据结构的初等表示映射到软件的控制层次 细化 开发软件的过程性描述(即完成软件的详细设计),http:/ 软件设计的概念和过程,Jackson方法学 基本思想:把一个问题分解成可以由三种结构形式表示的一个层次结构。 Jackson方法以特定的数据模型为基础,但是,并不意味着必须描述数据结构的物理特性(如数据类型、存储长度等)。而是指观察问题的角度,是描述数据结构的逻辑特性,指建立面向问题的数据结构。 首先,建立面向问题的、由三种结构形式表示的层次数据结构,然后映射为软件结构,同时给出“伪码”表示。,http:/ 软件设计的概念和过程,基本图形(树型)表示技术: 顺序: 数据结构A由
29、B、C、D所组成,每个成分仅出现一次。,A,C,B,D,http:/ 软件设计的概念和过程,选取: 数据结构A由B或C组成,且仅出现一次。,A,B,C,http:/ 软件设计的概念和过程,选取型的推广,A,C,B,D,http:/ 软件设计的概念和过程,重复: A由多个B所组成(并不给定重复次数)。 利用这三种基本表示,可以构造任意复杂的分层次树型数据结构。树中的每个“树叶”都可以用一棵子树代替。,A,B,*,http:/ 软件设计的概念和过程,【例】大学,大学,政,党,部,组织,宣传,统战,宣传,教学,机关,部,财务,科研,院,数学,物理,统战,统战,院,*,*,*,http:/ 软件设计的
30、概念和过程,【例】列车:车头、行李车、邮政车、餐车各一个,硬座、硬卧、软座、软卧车厢若干。,列车,车头,车体,服务车厢,旅客车厢,邮政,行李,餐车,臥,座,软,硬,软,硬,*,*,http:/ 软件设计的概念和过程,程序结构基本图形表示法:,A,B,C,A,B,C,顺序:,选取:,http:/ 软件设计的概念和过程,A,B,A,B,C,B1,B2,*,重复:,回朔:,quit,http:/ 软件设计的概念和过程,如果在一个需要作出选取判定的点上无法根据现有掌握的信息对判定条件进行测定,只能任择其中的一个分支开始执行。在随后的执行过程中逐步获得足够的信息,对先前的选择进行事后评价以确定其是否正确
31、。如发现当初假设的判定选择有误时,要返回到原判定点并转向其它的分支,这种现象称为回朔。 【例】八王后问题:如何在一个88的棋盘上放置8个王后,使它们不能自相残杀。(两个王后既不能在同一行上,也不能在同一列上),http:/ 软件设计的概念和过程,伪码: 伪码(pseudo code)是一种混杂的语言,它使用一种语言(通常是自然语言)的词汇和另一种语言(例如程序设计语言)的语法。前者用来描述处理的操作(因为其灵活、表达能力强),后者用来克化控制的结构(因为其严格、没有或较少有歧义) 因此,通常用伪码来描述程序的处理过程,用来书写详细设计的文档。,http:/ 软件设计的概念和过程,四种程序结构的
32、伪码表示: 顺序 A seq A seq 处理B; 处理B; 处理C; 处理C; A end; 推广 处理D; 处理E; A end;,A,B,C,http:/ 软件设计的概念和过程,四种基本程序结构的伪码表示: 选取 A select (条件) A select (条件1) 处理B; 处理B; A or 推广 A or (条件2) 处理C; 处理C; A end; A or (条件3) 处理D; A end;,A,B,C,http:/ 软件设计的概念和过程,重复 A iter until (条件) 处理B; A end;,A,B,*,http:/ 软件设计的概念和过程,回朔 A posit
33、(条件1) B seq quit A if (条件2) 处理B1; quit A if (条件3) 处理B2; B end; A admit 处理C; quit A end; 由此可见:条件2 V 条件3 条件1,A,B,C,B1,B2,http:/ 软件设计的概念和过程,Jackson方法的设计步骤: 复审,检查数据结构的合理性 用三种基本的图形形式表示数据结构 找出输入、输出数据结构之间的对应关系(在找不到对应关系的时候,要引入中间数据结构,形成一串对应关系链) 根据数据结构之间的对应关系,得到程序的结构 对得到的程序结构求精(考虑回朔问题、列出操作和判定条件等) 伪码表示,http:/
34、软件设计的概念和过程,【例】处理卡片 问题:一张卡片上有三个域F1、F2、F3,若F1在1,99内,则从文件中取出两个数a,b(假定ab)和一个三元组(x,y,z),若aF2b,则用(F2x,F2y,F2z)作为磁盘地址从磁盘上取出一个字符串s,若F3是s的一个子串,则打印F3。 第一步:数据结构的合理性无容置疑 第二步:画出基本图形,http:/ 软件设计的概念和过程,基本图形: 第三步:输出结构为一个字符串,基本上可以忽略,输入、输出数据结构无结构冲突。 第四步:根据输入数据结构导出程序结构,卡片,F1,F2,F3,http:/ 软件设计的概念和过程,处理卡片,此处,P1:处理F1,得到a
35、,b和(x,y,z); P2:处理F2,以( F2 x, F2 y, F2z)为地址得到串s; P3:处理F3 ,打印。,P1,P2,P3,http:/ 软件设计的概念和过程,第四步:求精。考虑卡片可能不符合规定的处理要求,无法最终打印F3。因此:,处理卡片,处理好卡片,出错处理,P1,P2,P3,http:/ 软件设计的概念和过程,用回朔结构代替,处理卡片,处理好卡片,出错处理,P,P,P,quit,http:/ 软件设计的概念和过程,第五步:伪码表示。 处理卡片 posit (卡片正确) 处理好卡片 seq quit 处理卡片 if(F199) P1; quit 处理卡片 if(F2b)
36、P2; quit 处理卡片 if(F3不是s的子串) P3; 处理好卡片 end; 处理卡片 admit 出错处理(打印出错信息); 处理卡片 end;,http:/ 软件设计的概念和过程,【例】信用卡记帐系统,支付文件,顾客文件,顾客号,日期,交易额,顾客号,结余额,http:/ 软件设计的概念和过程,记账报告:,顾客号,日期,交易额,老结余,新结余,http:/ 软件设计的概念和过程,支付文件,顾客号组,交易记录,顾客号,支付记录,日期,交易额,*,*,基本图形表示 支付文件:,http:/ 软件设计的概念和过程,顾客文件,顾客记录,顾客号,结余额,顾客文件:,*,http:/ 软件设计的
37、概念和过程,记帐报告,顾客数据,店主数据,顾客号组,顾客号,支付 记录,支付 小计,结余 小计,日期,交易额,老结余,新结余,销售 总额,总 结余,记账报告:,*,*,http:/ 软件设计的概念和过程,分析:系统有两个输入数据结构:支付文件、顾客文件;两个输出数据结构:记帐报告和顾客文件。可以看出,记帐报告的内容涵盖了支付文件和顾客文件的全部内容,而且,在内容的组织方式上亦基本上一致。 结论:可以以记帐报告的结构为主要参考点构造程序结构。同时,在处理的过程中考虑顾客文件的生成、更新。,http:/ 软件设计的概念和过程,记帐系统,处理顾客数据,处理店主数据,处理顾客号组,处理 顾客号,处理 支付记录,计算 支付小计,计算 结余,处理 老结余,计算 新结余,计算 销售总额,计算 总结余,程序结构:,*,http:/ 软件设计的概念和过程,伪码表示 记帐系统 seq 处理顾客数据 seq 打开支付文件、顾客文件; 处理顾客号组 iter until (支付文件结束) 读支付文件; 处理顾客号(读顾客文件、记下老结余);
链接地址:https://www.31doc.com/p-3025896.html