《计算机程序设计基础 第五章程序组织与软件开发方法.ppt》由会员分享,可在线阅读,更多相关《计算机程序设计基础 第五章程序组织与软件开发方法.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 西安电子科技大学西安电子科技大学计算机程序设计基础计算机程序设计基础第五章第五章 程序组织与程序组织与软件开发方法软件开发方法2 2 西安电子科技大学西安电子科技大学提提 纲纲l5.1 库与接口(库与接口(阅读阅读)l5.2 随机数库(随机数库(阅读阅读)l5.3 作用域与生存期(作用域与生存期(阅读阅读)l5.4 宏宏l5.5 条件编译条件编译l5.6 典型软件开发流程典型软件开发流程l本章小结本章小结3 3 西安电子科技大学西安电子科技大学5.1 库与接口库与接口l库与程序文件库与程序文件程序文件:源文件(程序文件:源文件(*.c)、头文件()、头文件(*.h)、工程文件)、工程文件库:
2、源文件与头文件库:源文件与头文件l接接 口口通过接口使用库:包括指定库的头文件与源文件通过接口使用库:包括指定库的头文件与源文件优势:不需了解库的实现细节,只需了解库的使用方法优势:不需了解库的实现细节,只需了解库的使用方法4 4 西安电子科技大学西安电子科技大学标准标准 I/O 库库l输入输出函数输入输出函数l常用函数列表常用函数列表STRING gets(STRING buffer);int printf(CSTRING fmt,);int puts(CSTRING str);int scanf(CSTRING fmt,);5 5 西安电子科技大学西安电子科技大学数学库数学库l数学函数数学
3、函数l常用函数列表常用函数列表三角函数与反三角函数系列三角函数与反三角函数系列ldouble acos(double x);ldouble sin(double x);l幂函数与对数函数系列幂函数与对数函数系列lduoble log(double x);ldouble pow(double x,double y);l其他数学函数其他数学函数ldouble sqrt(double x);l6 6 西安电子科技大学西安电子科技大学标准辅助函数库标准辅助函数库l工具与辅助函数工具与辅助函数l常用函数列表常用函数列表void exit(int status);void free(void*p);voi
4、d*malloc(size_t size);int rand();void srand(unsigned int seed);7 7 西安电子科技大学西安电子科技大学头文件的包含策略头文件的包含策略l包含头文件的格式包含头文件的格式尖括号:在尖括号:在 C 编译器的标准目录下查找该头文件编译器的标准目录下查找该头文件双引号:首先在当前工程项目所在的目录下查找,若不双引号:首先在当前工程项目所在的目录下查找,若不存在,则查找标准目录存在,则查找标准目录使用双引号包含自己或其他编写的非使用双引号包含自己或其他编写的非 C 标准库标准库l头文件的多次包含头文件的多次包含多个文件包含同一个头文件多个文
5、件包含同一个头文件例:例:“zyrandom.h”包含包含“zylib.h”,“main.c”包包含含“zyrandom.h”与与“zylib.h”,则,则“main.c”不仅不仅主动包含了主动包含了“zylib.h”,还通过,还通过“zyrandom.h”被动被动包含了包含了“zylib.h”多次包含同一个头文件可能会导致程序问题多次包含同一个头文件可能会导致程序问题8 8 西安电子科技大学西安电子科技大学头文件的包含策略头文件的包含策略l解决方法解决方法使用条件编译指令使用条件编译指令#ifndef(条件判断,若未定义)、(条件判断,若未定义)、#define(定义)与(定义)与#endi
6、f(结束条件判断)(结束条件判断)l被包含的头文件被包含的头文件#ifndef _ZYLIB_#define _ZYLIB_头文件的具体内容在此头文件的具体内容在此#endifl源文件或包含文件源文件或包含文件#ifndef _ZYLIB_#include zylib.h#endif源文件或包含文件的具体内容在此源文件或包含文件的具体内容在此9 9 西安电子科技大学西安电子科技大学5.2 随机数库随机数库l随机数的生成随机数的生成l库的设计原则库的设计原则l随机数库接口随机数库接口l随机数库实现随机数库实现l随机数库测试随机数库测试1010 西安电子科技大学西安电子科技大学随机数的生成第一版随
7、机数的生成第一版l编写程序,调用编写程序,调用 rand 函数生成五个随机数函数生成五个随机数#include#include int main()int i;printf(On this computer,the RAND_MAX is%d.n,RAND_MAX);printf(Five numbers the rand function generates as follows:n);for(i=0;i 5;i+)printf(%d;,rand();printf(n);return 0;1111 西安电子科技大学西安电子科技大学随机数的生成第二版随机数的生成第二版l编写程序,调用编写程序,
8、调用 rand 函数生成五个随机数函数生成五个随机数#include#include#include int main()int i;printf(On this computer,the RAND_MAX is%d.n,RAND_MAX);printf(Five numbers the rand function generates as follows:n);srand(int)time(0);for(i=0;i 5;i+)printf(%d;,rand();printf(n);return 0;1212 西安电子科技大学西安电子科技大学接口设计原则接口设计原则l用途一致用途一致接口中所有
9、函数都属于同一类问题接口中所有函数都属于同一类问题l操作简单操作简单函数调用方便,最大限度隐藏操作细节函数调用方便,最大限度隐藏操作细节l功能充足功能充足满足不同潜在用户的需要满足不同潜在用户的需要l性能稳定性能稳定经过严格测试,不存在程序缺陷经过严格测试,不存在程序缺陷1313 西安电子科技大学西安电子科技大学随机数库接口随机数库接口l设计随机数接口设计随机数接口#ifndef _ZYRANDOM_#define _ZYRANDOM_#ifndef _ZYLIB_#include zylib.h#endifvoid Randomize();int GenerateRandomNumber(i
10、nt low,int high);double GenerateRandomReal(double low,double high);#endif1414 西安电子科技大学西安电子科技大学随机数库实现随机数库实现l实现随机数库实现随机数库#include#include#ifndef _ZYRANDOM_#include zyrandom.h#endif#ifndef _ZYLIB_#include zylib.h#endifvoid Randomize()srand(int)time(NULL);1515 西安电子科技大学西安电子科技大学随机数库实现随机数库实现int GenerateRan
11、domNumber(int low,int high)double _d;if(low high)PrintErrorMessage(FALSE,GenerateRandomNumber:Make sure low high)PrintErrorMessage(FALSE,GenerateRandomReal:Make sure low=high.n);_d=(double)rand()/(double)RAND_MAX+1.0);return(low+_d*(high-low);1616 西安电子科技大学西安电子科技大学随机数库测试随机数库测试l单独测试库的所有函数单独测试库的所有函数合法参
12、数时返回结果是否正确合法参数时返回结果是否正确非法参数时返回结果是否正确,即容错功能是非法参数时返回结果是否正确,即容错功能是否正常否正常l联合测试联合测试多次运行程序,查看生成的数据是否随机多次运行程序,查看生成的数据是否随机测试整数与浮点数随机数是否均能正确工作测试整数与浮点数随机数是否均能正确工作1717 西安电子科技大学西安电子科技大学5.3 作用域与生存期作用域与生存期l量的作用域与可见性量的作用域与可见性l量的存储类与生存期量的存储类与生存期l函数的作用域与生存期函数的作用域与生存期l声明与定义声明与定义1818 西安电子科技大学西安电子科技大学量的作用域与可见性量的作用域与可见性
13、l作用域与可见性作用域与可见性作用域:标识符的有效范围作用域:标识符的有效范围可见性:程序中某个位置是否可以使用某个标识符可见性:程序中某个位置是否可以使用某个标识符标识符仅在其作用域内可见标识符仅在其作用域内可见位于作用域内的标识符不一定可见位于作用域内的标识符不一定可见l局部数据对象局部数据对象定义于函数或复合语句块内部的数据对象(包括变量、定义于函数或复合语句块内部的数据对象(包括变量、常量与函数形式参数等)常量与函数形式参数等)局部数据对象具有块作用域,仅在定义它的块内有效局部数据对象具有块作用域,仅在定义它的块内有效有效性从定义处开始直到该块结束有效性从定义处开始直到该块结束多个函数
14、定义同名的数据对象是允许的,多个函数定义同名的数据对象是允许的,原因?原因?1919 西安电子科技大学西安电子科技大学局部数据对象的作用域局部数据对象的作用域int func(int x,int y)int t;t=x+y;/*单独出现的花括号对用于引入嵌套块单独出现的花括号对用于引入嵌套块*/*允许在块中定义数据对象,作用域仅限本块允许在块中定义数据对象,作用域仅限本块*/int n=2;printf(n=%d.n,n);return t;2020 西安电子科技大学西安电子科技大学量的作用域与可见性量的作用域与可见性l全局数据对象全局数据对象定义于函数或复合语句块之外的数据对象定义于函数或复
15、合语句块之外的数据对象全局数据对象具有文件(全局)作用域,有效性从定义全局数据对象具有文件(全局)作用域,有效性从定义处开始直到本文件结束,其后函数都可直接使用处开始直到本文件结束,其后函数都可直接使用若包含全局数据对象定义的文件被其他文件包含,则其若包含全局数据对象定义的文件被其他文件包含,则其作用域扩展到宿主文件中,作用域扩展到宿主文件中,这可能会导致问题,为什么这可能会导致问题,为什么?不要在头文件中定义全局数据对象!不要在头文件中定义全局数据对象!l函数原型作用域函数原型作用域定义在函数原型中的参数具有函数原型作用域,其有效定义在函数原型中的参数具有函数原型作用域,其有效性仅延续到此函
16、数原型结束性仅延续到此函数原型结束函数原型中参数名称可以与函数实现中的不同,也可以函数原型中参数名称可以与函数实现中的不同,也可以省略省略2121 西安电子科技大学西安电子科技大学作用域与可见性示例作用域与可见性示例1int i;/*全局变量全局变量 i 作用域开始,可见作用域开始,可见*/2int main()34 int n;/*局部变量局部变量 n 作用域开始,可见作用域开始,可见*/5 i=10;/*全局变量全局变量 i 有效且可见有效且可见*/6 printf(i=%2d;n=%2dn,i,n);7 n=func(i);8 printf(i=%2d;n=%2dn,i,n);9/*局部
17、变量局部变量 n 作用域结束,不再可见作用域结束,不再可见*/10 int n;/*全局变量全局变量 n 作用域开始,可见作用域开始,可见*/11 int func(int x)/*形式参数形式参数 x 作用域开始,可见作用域开始,可见*/12 13 i=0;/*全局变量全局变量 i 有效且可见有效且可见*/14 printf(i=%2d;n=%2dn,i,n);15 n=20;/*全局变量全局变量 n 有效且可见有效且可见*/16 /*嵌套块开始嵌套块开始*/17 int i=n+x;/*局部变量局部变量 i、x 有效可见;全局变量有效可见;全局变量 n 有效可见;全局变量有效可见;全局变量
18、 i 有效不可见有效不可见*/18 printf(i=%2d;n=%2dn,i,n);19 /*局部变量局部变量 i 作用域结束,全局变量作用域结束,全局变量 i 有效且可见有效且可见*/20 return+i;21/*局部变量局部变量 x 作用域结束,不再可见作用域结束,不再可见*/22/*文件结束,全局变量文件结束,全局变量 i、n 作用域结束作用域结束*/2222 西安电子科技大学西安电子科技大学量的存储类与生存期量的存储类与生存期l生存期:量在程序中存在的时间范围生存期:量在程序中存在的时间范围C 使用存储类表示生存期使用存储类表示生存期作用域表达量的空间特性,存储类表达量的时间特性作
19、用域表达量的空间特性,存储类表达量的时间特性l静态(全局)生存期静态(全局)生存期全局数据对象具有静态(全局)生存期全局数据对象具有静态(全局)生存期生死仅与程序是否执行有关生死仅与程序是否执行有关l自动(局部)生存期自动(局部)生存期局部数据对象具有自动(局部)生存期局部数据对象具有自动(局部)生存期生死仅与程序流程是否位于该块中有关生死仅与程序流程是否位于该块中有关程序每次进入该块时就为该对象分配内存,退出该块时程序每次进入该块时就为该对象分配内存,退出该块时释放内存;释放内存;两次进入该块时使用的不是同一个数据对象两次进入该块时使用的不是同一个数据对象2323 西安电子科技大学西安电子科
20、技大学static 关键字关键字l修饰局部变量:静态局部变量修饰局部变量:静态局部变量使局部变量具有静态生存期使局部变量具有静态生存期程序退出该块时局部变量仍存在,并且下次进入该块时程序退出该块时局部变量仍存在,并且下次进入该块时使用上一次的数据值使用上一次的数据值静态局部变量必须进行初始化静态局部变量必须进行初始化不改变量的作用域,仍具有块作用域,即只能在该块中不改变量的作用域,仍具有块作用域,即只能在该块中访问,其他代码段不可见访问,其他代码段不可见l修饰全局变量修饰全局变量使其作用域仅限定于本文件内部,其他文件不可见使其作用域仅限定于本文件内部,其他文件不可见2424 西安电子科技大学西
21、安电子科技大学静态局部变量示例静态局部变量示例l检查下述程序的输出结果检查下述程序的输出结果#include int func(int x);int main()int i;for(i=1;i (y)?(x):(y)可以使用上述宏判断整数或浮点数等类型数据的大小关系,可以使用上述宏判断整数或浮点数等类型数据的大小关系,C 语言语言是不允许为不同数据类型编写同名函数的!是不允许为不同数据类型编写同名函数的!l函数调用在程序执行时处理,含参宏在编译前处理函数调用在程序执行时处理,含参宏在编译前处理l函数形式参数会在执行时分配存储空间,含参宏的参数不函数形式参数会在执行时分配存储空间,含参宏的参数不
22、会分配存储空间,不会发生参数传递,也没有返回值会分配存储空间,不会发生参数传递,也没有返回值l函数调用占用程序执行时间,含参宏替换不占用程序执行函数调用占用程序执行时间,含参宏替换不占用程序执行时间,仅占用编译时间时间,仅占用编译时间l函数调用节省程序代码空间(多次调用使用同样代码),函数调用节省程序代码空间(多次调用使用同样代码),含参宏浪费程序代码空间(多次替换会使得代码膨胀)含参宏浪费程序代码空间(多次替换会使得代码膨胀)3535 西安电子科技大学西安电子科技大学宏的特殊用法宏的特殊用法l略略l感兴趣的可以自学感兴趣的可以自学l阅读阅读 zylib 库代码需要了解这部分内容库代码需要了解
23、这部分内容3636 西安电子科技大学西安电子科技大学5.5 条件编译条件编译l略略l基础知识:见头文件的包含策略基础知识:见头文件的包含策略l复杂内容:感兴趣的可以自学,开发大型程复杂内容:感兴趣的可以自学,开发大型程序才需要了解序才需要了解3737 西安电子科技大学西安电子科技大学5.6 典型软件开发流程典型软件开发流程l软件工程概要软件工程概要l问题的提出问题的提出l需求分析需求分析l概要设计概要设计l详细设计详细设计l编码实现编码实现l系统测试系统测试l经验总结经验总结3838 西安电子科技大学西安电子科技大学软件工程概要软件工程概要l需求分析:确定软件需要解决什么问题需求分析:确定软件
24、需要解决什么问题决定因素:人决定因素:人软件开发人员需要与用户深入交流,明确问题的输入、软件开发人员需要与用户深入交流,明确问题的输入、输出以及其他附加信息输出以及其他附加信息不要轻视任何问题!不要轻视任何问题!l方案设计:设计程序框架方案设计:设计程序框架概要设计:设计总体方案,形成高层模块划分概要设计:设计总体方案,形成高层模块划分详细设计:细化模块,获得各模块的输入、输出与算法详细设计:细化模块,获得各模块的输入、输出与算法l编码实现:实际编程编码实现:实际编程l系统测试:测试程序的正确性与稳定性系统测试:测试程序的正确性与稳定性l经验总结经验总结3939 西安电子科技大学西安电子科技大
25、学软件开发流程图软件开发流程图4040 西安电子科技大学西安电子科技大学软件开发问题软件开发问题l我猜!我猜!我猜猜猜!我猜!我猜!我猜猜猜!编程实现一个简单的猜价格游戏编程实现一个简单的猜价格游戏假设有某物品,已知其最低价格与最高价格假设有某物品,已知其最低价格与最高价格游戏参与者在给定次数内猜测其价格具体值游戏参与者在给定次数内猜测其价格具体值若游戏者成功猜出其价格,作为奖励将得到该若游戏者成功猜出其价格,作为奖励将得到该物品物品4141 西安电子科技大学西安电子科技大学需求分析需求分析l需求需求A:游戏运行前首先应向游戏参与者介绍游戏功能:游戏运行前首先应向游戏参与者介绍游戏功能l需求需
26、求B:首期工程不需要解决游戏难度问题,用户迫切希:首期工程不需要解决游戏难度问题,用户迫切希望程序能在最短时间内运行起来,因此只考虑最简单情形望程序能在最短时间内运行起来,因此只考虑最简单情形l需求需求C:在每个游戏回合结束时允许用户选择是否重新开:在每个游戏回合结束时允许用户选择是否重新开始新游戏,这里游戏回合是指游戏参与者或者猜中价格或始新游戏,这里游戏回合是指游戏参与者或者猜中价格或者其猜测机会已用完,如果用户没有选择退出,游戏应无者其猜测机会已用完,如果用户没有选择退出,游戏应无休止地玩下去休止地玩下去l需求需求D:能够记录游戏参与者的游戏信息,目前仅统计用:能够记录游戏参与者的游戏信
27、息,目前仅统计用户玩了多少回合以及赢了多少回合户玩了多少回合以及赢了多少回合l需求需求E:在用户退出游戏时,给出此次游戏胜率:在用户退出游戏时,给出此次游戏胜率4242 西安电子科技大学西安电子科技大学需求分析需求分析l不明确的地方:什么是最简单情形?与用户再次不明确的地方:什么是最简单情形?与用户再次沟通沟通需求需求B1:设物品最低价格为:设物品最低价格为100元,最高价格为元,最高价格为200元元需求需求B2:物品实际价格由系统运行时随机生成:物品实际价格由系统运行时随机生成需求需求B3:游戏参与者最多允许猜:游戏参与者最多允许猜6次次需求需求B4:若游戏参与者猜测价格比实际价格高,则程:
28、若游戏参与者猜测价格比实际价格高,则程序提示序提示“高高”;若猜测价格比实际价格低,提示;若猜测价格比实际价格低,提示“低低”l用户补充需求用户补充需求需求需求F:需要定义游戏初始化过程,未来有可能通过它:需要定义游戏初始化过程,未来有可能通过它调整游戏难度,程序必须为此提供接口调整游戏难度,程序必须为此提供接口4343 西安电子科技大学西安电子科技大学概要设计概要设计l响应需求响应需求 A、E、F将游戏划分为四个模块:欢迎信息显示模块、游戏初始将游戏划分为四个模块:欢迎信息显示模块、游戏初始化模块、游戏模块、游戏结束模块化模块、游戏模块、游戏结束模块程序架构:主文件程序架构:主文件“main
29、.c”,程序主体函数库,程序主体函数库“guess.h”与与“guess.c”;此外需要使用;此外需要使用 zylib 与与 zyrandom 库库l设计函数原型设计函数原型胜率信息需要从游戏模块传递给游戏结束模块胜率信息需要从游戏模块传递给游戏结束模块void PrintWelcomeInfo();void InitializeGame();double PlayGame();void PrintGameOverInfo(double prevailed_ratio);4444 西安电子科技大学西安电子科技大学guess.h#ifndef _EG0507GUESS_#define _EG05
30、07GUESS_void PrintWelcomeInfo();void InitializeGame();double PlayGame();void PrintGameOverInfo(double prevailed_ratio);#endif4545 西安电子科技大学西安电子科技大学main.c#ifndef _EG0507GUESS_#include guess.h#endifint main()double prevailed_ratio;PrintWelcomeInfo();InitializeGame();prevailed_ratio=PlayGame();PrintGame
31、OverInfo(prevailed_ratio);return 0;4646 西安电子科技大学西安电子科技大学概要设计概要设计l响应需求响应需求 C使用无限循环作为游戏模块的主架构:初始化游戏回合,使用无限循环作为游戏模块的主架构:初始化游戏回合,进行游戏回合,判断游戏参与者是否开始新游戏回合进行游戏回合,判断游戏参与者是否开始新游戏回合l响应需求响应需求 B2每一回合需要随机生成物品价格,应在游戏回合初始化每一回合需要随机生成物品价格,应在游戏回合初始化阶段完成阶段完成抽象出单独的游戏回合初始化函数,返回值为初始化的抽象出单独的游戏回合初始化函数,返回值为初始化的物品价格(整数类型)物品价
32、格(整数类型)int InitializeBout();l响应需求响应需求 D游戏参与者的回合数与获胜回合数:使用整数类型保存,游戏参与者的回合数与获胜回合数:使用整数类型保存,游戏开始时初始化为游戏开始时初始化为 0,并随着游戏进程变化,并随着游戏进程变化4747 西安电子科技大学西安电子科技大学概要设计概要设计l游戏回合活动分析游戏回合活动分析将每一回合游戏抽象成函数,函数返回值为将每一回合游戏抽象成函数,函数返回值为 BOOL,表示该游戏,表示该游戏回合游戏参与者是否获胜回合游戏参与者是否获胜BOOL PlayBout();l判断用户是否进入下一回合判断用户是否进入下一回合BOOL Ag
33、ain();Again函数负责在函数负责在 PlayGame 函数中充当哨兵,在返回值为函数中充当哨兵,在返回值为 FALSE 时退出游戏时退出游戏l响应需求响应需求 B1、B3:数据初始化工作:数据初始化工作const int lowest_price=100;const int highest_price=200;const int guesstimate_count=6;4848 西安电子科技大学西安电子科技大学详细设计详细设计l响应需求响应需求 B4:细化:细化 PlayBout在给定猜测次数内接受游戏参与者的输入价格,判断与在给定猜测次数内接受游戏参与者的输入价格,判断与实际价格是否
34、相同,如果不同则给出提示信息,如果相实际价格是否相同,如果不同则给出提示信息,如果相同则恭喜游戏参与者获胜同则恭喜游戏参与者获胜但是但是l需求需求 G:一旦游戏参与者给出了猜测价格,当该:一旦游戏参与者给出了猜测价格,当该价格或高或低时,提示游戏参与者的信息应能够价格或高或低时,提示游戏参与者的信息应能够相应缩小价格区间以反映此变化相应缩小价格区间以反映此变化l响应需求响应需求 G:修改:修改 PlayBout 函数,添加参数函数,添加参数BOOL PlayBout(int actual_price,int lower_price,int higher_price,int chances_le
35、ft);4949 西安电子科技大学西安电子科技大学详细设计详细设计l欢迎信息模块设计欢迎信息模块设计要求:将游戏性质与游戏方法告诉游戏参与者,要求:将游戏性质与游戏方法告诉游戏参与者,系统应尽可能输出详细信息,例如物品最低价系统应尽可能输出详细信息,例如物品最低价格、最高价格与猜测次数都应通知游戏参与者格、最高价格与猜测次数都应通知游戏参与者l伪代码伪代码void PrintWelcomeInfo()输出程序性质信息输出程序性质信息 物品最低价格、最高价格与猜测次数一并输出物品最低价格、最高价格与猜测次数一并输出5050 西安电子科技大学西安电子科技大学详细设计详细设计l游戏初始化模块设计游戏
36、初始化模块设计要求:不知道要求:不知道l伪代码伪代码void InitializeGame()5151 西安电子科技大学西安电子科技大学详细设计详细设计l游戏结束模块设计游戏结束模块设计要求:如果能够在游戏结束模块不仅输出游戏参与者胜率,还针对要求:如果能够在游戏结束模块不仅输出游戏参与者胜率,还针对其胜率高低输出不同鼓励信息就好了其胜率高低输出不同鼓励信息就好了l需求需求 H:当游戏参与者胜率超过:当游戏参与者胜率超过75%(含)时,输出(含)时,输出“You luckyyyyyyyyyyyyy!”;当胜率低于;当胜率低于75%但超过但超过50%(含)(含)时,输出时,输出“So goooo
37、ooood.”;其他输出;其他输出“You can do it better.Wish you luck.”l伪代码伪代码void PrintGameOverInfo(double prevailed_ratio)输出百分制胜率输出百分制胜率 根据胜率分别输出不同信息根据胜率分别输出不同信息5252 西安电子科技大学西安电子科技大学详细设计详细设计l游戏模块细化游戏模块细化l伪代码伪代码double PlayGame()while(TRUE)调用调用 InitializeBout 获得实际价格获得实际价格 调用调用 PlayBout 启动游戏回合启动游戏回合 如果游戏回合结束后结果为如果游戏回
38、合结束后结果为 TRUE,递增获胜回合数,递增获胜回合数 递增总回合数递增总回合数 调用调用 Again,若结果为,若结果为 FALSE,终止游戏,否则继续,终止游戏,否则继续 返回最终胜率返回最终胜率5353 西安电子科技大学西安电子科技大学详细设计详细设计l游戏回合初始化与游戏初始化模块细化游戏回合初始化与游戏初始化模块细化l伪代码伪代码int InitializeBout()调用调用 GenerateRandomNumber 函数函数 并返回其结果并返回其结果void InitializeGame()调用调用 Randomize 函数启动随机数发生器函数启动随机数发生器5454 西安电子
39、科技大学西安电子科技大学详细设计详细设计l游戏回合模块细化游戏回合模块细化l需求需求 I:如果游戏参与者给出的猜测价格不在当时:如果游戏参与者给出的猜测价格不在当时价格范围内,应提醒用户重新提供新价格,此次价格范围内,应提醒用户重新提供新价格,此次操作不应递减用户猜测次数,以防止用户输入错操作不应递减用户猜测次数,以防止用户输入错误,也就是说,需要检查猜测价格的合法性误,也就是说,需要检查猜测价格的合法性l需求需求 J:当最后一次机会也未猜中价格时,不需要:当最后一次机会也未猜中价格时,不需要再输出提示价格高低信息,直接输出用户本回合再输出提示价格高低信息,直接输出用户本回合失败信息,并将实际
40、价格告诉用户失败信息,并将实际价格告诉用户5555 西安电子科技大学西安电子科技大学详细设计详细设计BOOL PlayBout(int actual_price,int lower_price,int higher_price,int chances_left)while(还有猜测机会还有猜测机会)获得游戏参与者猜测价格,检查游戏参与者猜测价格是否在给定范围获得游戏参与者猜测价格,检查游戏参与者猜测价格是否在给定范围 递减游戏参与者猜测机会递减游戏参与者猜测机会 判断猜测价格高低判断猜测价格高低 switch(判断结果判断结果)case 高了高了:if(还有猜测机会还有猜测机会)输出价格高了信
41、息,降低最高价格值,缩小猜测区间输出价格高了信息,降低最高价格值,缩小猜测区间 else 输出失败信息与物品实际价格,结束函数,返回本回合失败值输出失败信息与物品实际价格,结束函数,返回本回合失败值 FALSE break;case 低了低了:if(还有猜测机会还有猜测机会)输出价格低了信息,增大最低价格值,缩小猜测区间输出价格低了信息,增大最低价格值,缩小猜测区间 else 输出失败信息与物品实际价格,结束函数,返回本回合失败值输出失败信息与物品实际价格,结束函数,返回本回合失败值 FALSE break;default:输出游戏参与者获胜信息,结束函数,返回输出游戏参与者获胜信息,结束函数
42、,返回 TRUE 程序流程至此,说明游戏参与者本回合已失败,返回程序流程至此,说明游戏参与者本回合已失败,返回 FALSE5656 西安电子科技大学西安电子科技大学详细设计详细设计l进一步细化游戏回合函数进一步细化游戏回合函数抽象三个辅助函数抽象三个辅助函数获得游戏参与者猜测价格:获得游戏参与者猜测价格:int GetGuesstimatePrice(int lower_price,int higher_price,int chances_left);检查游戏参与者猜测价格是否在给定范围:检查游戏参与者猜测价格是否在给定范围:int CheckValidationOfGuesstimatePr
43、ice(int lower_price,int higher_price,int guesstimate_price);判断猜测价格高低:判断猜测价格高低:int JudgeGuesstimatePrice(int actual_price,int guesstimate_price);5757 西安电子科技大学西安电子科技大学详细设计详细设计int GetGuesstimatePrice(int lower_price,int higher_price,int chances_left)输出提示信息,包括最低价格,最高价格与剩余猜测次数输出提示信息,包括最低价格,最高价格与剩余猜测次数 调用
44、调用 GetIntegerFromKeyboard 获取猜测价格并返回获取猜测价格并返回int CheckValidationOfGuesstimatePrice(int lower_price,int higher_price,int guesstimate_price)while(猜测价格小于最低价格或高于最高价格猜测价格小于最低价格或高于最高价格)通知游戏参与者猜测价格超出范围,提醒用户重新输入新价格通知游戏参与者猜测价格超出范围,提醒用户重新输入新价格 调用调用 GetIntegerFromKeyboard 获取新猜测价格获取新猜测价格 返回新猜测价格返回新猜测价格int JudgeG
45、uesstimatePrice(int actual_price,int guesstimate_price)获得猜测价格与实际价格之差获得猜测价格与实际价格之差 if(差值大于差值大于0)return 1;else if(差值小于差值小于0)return-1;else return 0;5858 西安电子科技大学西安电子科技大学详细设计详细设计l细化细化 Again 函数函数lZylib 库的字符串比较函数库的字符串比较函数BOOL IsStringEqual(STRING s1,STRING s2)BOOL IsStringEqualWithoutCase(STRING s1,STRING
46、 s2)l伪代码伪代码BOOL Again()询问游戏参与者是否开始新游戏询问游戏参与者是否开始新游戏 获取游戏参与者的响应获取游戏参与者的响应 调用调用!IsStringEqualWithoutCase 函数,函数,判断游戏参与者的响应是否为判断游戏参与者的响应是否为“n”如果真,返回如果真,返回 FALSE,即将上述返回值取反返回,即将上述返回值取反返回5959 西安电子科技大学西安电子科技大学详细设计详细设计6060 西安电子科技大学西安电子科技大学编码实现编码实现#include#ifndef _ZYLIB_#include zylib.h#endif#ifndef _ZYRANDOM
47、_#include zyrandom.h#endif#ifndef _EG0507GUESS_#include guess.h#endifconst int lowest_price=100;const int highest_price=200;const int guesstimate_count=6;6161 西安电子科技大学西安电子科技大学编码实现编码实现static int InitializeBout();static BOOL PlayBout(int actual_price,int lower_price,int higher_price,int chances_left);
48、static BOOL Again();static int GetGuesstimatePrice(int lower_price,int higher_price,int chances_left);static int CheckValidationOfGuesstimatePrice(int lower_price,int higher_price,int guesstimate_price);static int JudgeGuesstimatePrice(int actual_price,int guesstimate_price);6262 西安电子科技大学西安电子科技大学编码实
49、现编码实现void PrintWelcomeInfo()printf(The program lists a product with price between%d and%d(RMB Yuan).n,lowest_price,highest_price);printf(You give a guesstimate price.If the price you give is correct,you win.n);printf(You have%d chances.n,guesstimate_count);printf(Rise to the challenge to win your bo
50、nus.n);void InitializeGame()int i,n;Randomize();6363 西安电子科技大学西安电子科技大学编码实现编码实现double PlayGame()int actual_price,lower_price=lowest_price,higher_price=highest_price;int chances_left=guesstimate_count;int bout_count=0,prevailed_bout_count=0;while(TRUE)printf(n);actual_price=InitializeBout();if(PlayBout