ECM1410面向对象程序设计课程课业
本课程包含全部模块评估的100%。这是一个双人练习,请注意大学关于合作和抄袭的指导方针手册(exeter.ac.uk/学生/行政管理/投诉和申诉/学术不端行为/)。本评估涵盖了使用Java编程的一系列面向对象概念的使用和实现您在ECM1410中所涵盖的语言。这项课业是总结性的。请确保您阅读了整个文档在开始评估之前。本课程将帮助您增强对面向对象编程的理解。记得关注模块的ELE页面中已确定的截止日期和提交指南。
1发展模式
ECM1410的这门总结性课程是两人一组提交的,详细信息如前所述“总结性课程中的ECM1410面向对象编程开发范例”。重申关键早期文件中的要点:预计提交的文件将在两名成员之间按50:50的比例进行加权。在不寻常的情况下如果这对成员的贡献率不是50:50,则您有机会指示不同的比例双方在提交材料的封面上达成一致,最大分歧为60:40。结对编程绝对不是两个开发人员在两台不同的机器上分别工作。并排在单机上开发(或虚拟、共享屏幕)通信是该方法的一个关键方面。模块负责人有权在一名学生不参与的情况下进行分组课程课业。协调人也保留给没有贡献的学生打分的权利共0个。在极少数情况下,你与没有贡献的学生配对(例如,不回复电子邮件和/或不参加配对编程会议),您必须在发布一周的课业规范,以便于上述分组,如果必需的一对学生的双方都将被分配一个单独的课程变体(但是,如果如果是多对,在这种情况下,可以改革由参与学生组成的对,以及非参与学生)。不允许学生学习个别变体的课程与任何其他学生合作。鉴于上述流程和时间表,请确保您安排亲自或虚拟会面并开始课程规范发布后立代 写ECM1410面向对象程序设计即进行课业,以确保您与希望对课程做出积极贡献的学生。这是一种至少两人一组的期望在课程发布的第一周进行两次配对编程。不允许从事结对编程课业的学生合作完成课业除了他们指定的伴侣之外,其他任何学生。这样做的人将受到学术不端的惩罚条例和处罚。有关串通、剽窃等的详细信息,请参阅本科生手册(请参阅本文档封面上的web链接)。
2分配-编码(100分)
这项任务是基于后端Java包的开发。系统所需的功能具有已经确定,并且提供了一个接口,以便后端可以与前端通信由模块负责人开发。模块负责人应该能够简单地在的jar文件中编译您开发的包,以及他们系统的其他部分,以产生一个功能齐全的解决方案。
2.1问题
骑自行车是一项非常受欢迎的运动,它已经被证明会产生超出运动范围的积极影响。城市参加自行车比赛通常会有更多的通勤者。自行车在日常活动中的使用越来越多也与健康改善有关。为了培养未来的运动员和更健康的社区,当地一家自行车俱乐部决定举办一场自行车比赛比赛其理念是拥有与著名的自行车大巡游相同的结构和规则。因此,俱乐部需要支持此次和未来活动的系统。
该系统可分为三部分:
1.骑手管理-系统必须能够管理骑手和车队。
2.比赛设计-系统必须具有允许创建赛段比赛的功能。也就是说,必须能够管理比赛中的赛段并对其进行配置。例如,在这些配置中,应该有一个能够定义中间冲刺和山峰。
3.比赛结果-系统必须具有处理实现指定比赛的功能设计换句话说,该系统必须允许记录骑手在比赛中的成绩。分阶段比赛是一种自行车比赛,分布在不同日期的多个阶段。那里也是在一个阶段性比赛中同时发生的多个比赛。为了简单起见,俱乐部决定只设三个
种族内的竞争。它们按重要性排序如下:
1.总分类(GC)-这是比赛中最重要的奖项。获胜的骑手以最少的时间完成所有阶段。注意,这位骑手可能永远不会赢得一个赛段,但仍然是
聚合总时间时速度最快。
2.积分(短跑运动员)分类-在该分类中不考虑实际时间,而是考虑的排名骑手。根据比赛类型的不同,在顶级中完成一个赛段会给骑手一定的分数阶段除了终点之外,赛段还可以进行中间冲刺。这些冲刺起到了中间作用终点线和骑手根据他们的位置通过他们获得分数。积分分类中的获胜者是指在一场比赛的所有赛段后积分最多的骑手。见图1中的点分布。
3.登山分级-这是一项特殊的比赛,奖励比赛中最优秀的登山者。类似于根据短跑运动员的分类,山地积分是给那些第一次登顶的运动员的阶段。正如预期的那样,更艰难的攀登值得更多的分数。比赛结束时,山地国王/王后(KOM/QOM)是获得最多山地积分的骑手。见中的山地点分布赛段代表了自行车比赛展开的不同赛道,每一个赛段都为骑手提供了独特的挑战和机会。这些阶段分为四个不同的类别:平坦、丘陵/中等山地、高山地赛和计时赛,每一项都需要自行车运动员的不同策略和技能。在这些阶段中是检查点,如中间冲刺和分类爬坡,它们为短跑运动员的成绩贡献分数和山脉分类(示例见图3)。值得注意的是,计时赛阶段与他们缺乏大规模的起跑,骑手们争分夺秒地单独比赛,每个人都在错开的时间起跑。此外与其他阶段不同,时间试验没有检查点。对于点分布的可视化表示
关于短跑运动员的分类,请参阅图1,而图2则列出了根据在他们的类别上。俱乐部希望新自行车门户网站的后端与正在开发的前端兼容由另一个小组,他们已经为新系统设计了一个Java接口,他们的前端应用程序将使用。您要开发一个实现此接口的类,并开发必要的附加支持Java包中名为cycling的类。后端系统的操作正确性将是提交时通过此提供的接口进行测试。
您的任务是设计和编写额外的程序包成员,以完成循环程序包。你需要设计和编写一个实现CyclingPortal接口的类。未配对的个人应实施MiniCyclingPortal接口定义的简化版本。ECM1410上有两个接口Assignment ELE页面以及本文档末尾。
实现者类必须是一个名为CyclingPortalImpl的公共类。如果不是,则前端系统将无法使用后端解决方案进行编译,并且标记的操作组件将为0。你
还需要编写您认为合适的任何其他包成员来支持此类及其功能。所有开发的类都必须位于循环包中。除了接口,我还在包中提供了每个接口所需的一组异常类。
图1:不同阶段和中间冲刺阶段根据骑手等级的冲刺积分分布检查点。摘自http://en.wikipedia.org/wiki/Points环法自行车赛的分类(2022年2月11日查阅)。图2:不同类型山地检查站根据骑手等级的山地积分分布。提取来自环法自行车赛的en.wikipedia.org/wiki/山脉分类(2022年2月11日访问)。
图3:2023年环法自行车赛第14赛段。它有五个山区检查站和一个中间冲刺点。摘录从…起https://www.cyclingstage.com/tour-de-france-2023-route/(2024年2月13日查阅)。
2.2发展考虑
应注意以下几点:
您的源代码应该包括适当的注释和断言。
当骑手被从平台上移除时,其所有结果也应被移除。比赛结果必须是更新。您将不需要提交可执行的应用程序(即,您不需要提交具有公共循环包内的静态空隙主方法)。尽管如此,强烈建议在提交之前,编写一个应用程序来测试您的包是否符合要求。我们提供了已发布包中的骨架测试类(CyclingPortalTestApp.java)。除了你自己开发的课程,或者作为课程的一部分给你的课程之外,你只能使用Java内置包(Java.*)中提供的那些。使用任何其他软件包将被处以10分。您应该参考MiniCyclingPortal和CyclingPortal接口,以获得更详细的描述实现适合您或您的配对的接口的类的预期行为(在Javadoc)。
3提交
该课程要求以电子方式提交至ELE平台。中午前上传您的文件(详见下文)在本文件封面上指定的截止日期。下面提到的路径(文件夹结构)应该全部小写,但文件夹中的文件应遵循Java命名约定。您的工作环境应该至少有五个文件夹:
?测试系统–(可选)包含您的测试文件。
?src–保存源代码(.java文件),包括作为课程的一部分提供的代码。
?bin–保存字节码(.class文件)。
?doc–从代码中保存Javadoc。
?res–添加除类图和封面之外所需的任何其他资源。
1.类图-包括一个PDF文件,其中包含表示类循环的类图。CyclingPortalImpl以及您创建的所有辅助类。不需要包括接口或异常类。对于每个类,包括所有属性和公共方法。您可以使用任何软件来创建图表,用于例如,word、powerpoint、dravio等,只要您将其导出为PDF即可。
2.封面页–详细说明相应配对的两个学生编号的封面页。如果不同寻常的是,您同意了一个不是50:50的分割,本页还应详细说明您希望如何最终分数将根据您同意的输入分配给这对选手。这不能相差超过60:40. 由于提交是匿名的,请再次使用您的学生编号。此页面应该有
一个开发日志,其中包括配对编程会话的日期、时间和持续时间,包括每个开发人员在这些会话中扮演的角色,每个日志条目由两个成员使用
学生编号,以确保匿名评分。如果你是独自工作,你仍然需要提交封面上有你的学号,但你不需要添加开发日志。此文件应命名为cover_sheet.pdf。我在ELE页面1中添加了一个封面示例.未能提交任何详细说明成员学生人数和发展日志的封面将导致罚5分。在发布的zip文件中,转到res/封面页example.pdf。此示例强调了封面需要哪些信息包括你不需要遵循这个确切的格式。build–保存将要提交的jar文件。您需要生成一个jar包,其中包含您的完整的成品包装,名为cycling.jar。jar文件必须包括:(i)字节码(.class),(ii)源代码提交包的文件(.java),包括CyclingPortal接口和所有异常类
作为课程的一部分提供给您,(iii)包的Javadoc,以及(iv)封面和类图。也就是说,它应该是一个完整的自包含包,我的测试程序可以通过
你的自行车。CyclingPortalImpl类。假设您遵循了上述文件夹结构,以下是如何生成的示例2预期的jar包:
ls
TestSystem bin构建文档res src
javac-dbin/src/cycling/*.java
jar cvf build/cycling.jar-C bin。
(列出添加的文件,省略输出)
jar uvf build/cycling.jar-C src。
(列出添加的文件,省略输出)
jar uvf构建/cycling.jar文档
(列出添加的文件,省略输出)
jar uvf构建/cycling.jar res
您可能需要检查jar文件中的文件:
jar-tf构建/cycling.jar
或提取其内容:
jar-xvf-build/cycling.jar
您可以使用接口和其他文件提供的CyclingPortalTestApp.java类来测试您的包。
cd测试系统
javac-cp/build/cycling.jar CyclingPortalTestApp.java
java-cp.:/build/cycling.jar CyclingPortalTestApp
系统编译并开始执行。。。
最后,您将只向ELE提交jar文件build/cycling.jar。
4建议
1.不要直接进入编码:先花时间考虑解决方案的设计。想想您将使用的对象,它们将包含的数据,它们应该提供的方法是什么(除了那些通过接口强制执行的),它们如何相互关联等等。一旦你对你的设计感到满意,开始编程。在经历过程中,不要害怕重新评估你的设计,但要检查其影响对系统中使用更改部件的所有其他对象进行更改。
2.检查对象的行为是否符合您的意愿——使用测试应用程序并使用断言。
3.慢慢填写功能--最好提交一个能提供大部分但不是全部所需内容的解决方案操作正确,而不是一个不提供任何/不编译的操作,作为一个不提供任何正确的功能都会得到操作条件的0。从CyclingPortalImpl开始这些命令在Mac机器上进行了测试,但在Linux机器上应该是相同的。如果您有Windows,您可以:使用本机Windows PowerShell应用程序使用相同的命令;或将命令ls替换为dir,前斜杠“/”替换为如果使用cmd应用程序,则使用反斜杠“\”和冒号“:”加分号“;”。类,该类编译并缓慢(增量)添加功能。我提供了一个实现发布的包(称为BadCyclingPortalImpl)上的CyclingPortal就是这样做的——它编译,
但是不提供任何正确的功能。单独的版本被称为BadMiniCyclingPortalImpl。
4.保留工作代码的副本。如果最坏的情况发生了,而你的版本对50%的操作,并且您所做的更改似乎破坏了一切,因此能够“回滚”到请选择早期版本,然后重试。
5.不要更改我为您提供的接口和类。如果您更改它们,标记将不会能够与您的提交一起编译我的代码库,您将收到的“操作”组件标记为
0,因为该接口将无法连接到系统的前端。
6.使用以下GitHub课堂课业练习创建jar文件https://classroom.github.com/a/icpw4zB4。
5标记标准此评估将使用以下标准进行标记。标准描述标记可获得的注释和注释。文件注释、代码的质量和适当性程度评论和注释。Java约定。对Java的遵守程度命名约定和格式。参见课堂讲稿和例如https://google.github.io/styleguide/javaguide.html
活动提供的程度
CyclingPortalImpl类的操作方式为必需,由软件包支持成员。提交的jar文件无法与测试一起编译代码(例如,由于接口定义被更改,所需的包成员失踪等)将收到0的操作标记。操作是通过交付的功能进行评估。例如,如果系统未能创建比赛,那么它必然会失败最多其他功既不能创建检查点也不能创建结果。
OO设计。代码面向对象、结构良好、呈现清晰、设计连贯的程度以及对对象的适当管理具有良好封装的对象的状态,计算负载在对象之间的适当分布以及类型和断言的适当使用/
公共接口MiniCyclingPortal扩展了Serializable{
/**
*获取平台中当前创建的比赛。
*@return系统中种族ID的数组,如果不存在,则为空数组。
*/
int[]getRaceIds();
/**
*该方法在平台中创建一个具有给定名称和
描述
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param name种族的名字。
*@param description种族的描述(可以为null)。
*@throws IllegalNameException如果该名称已存在于平台中。
*@throws InvalidNameException如果名称为null,为空,并且超过30
*字符,或具有空格。
*@返回已创建种族的唯一ID。
*/
int createRace(字符串名称,字符串描述)抛出IllegalNameException,InvalidNameException;
/**
*从比赛中获取详细信息。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return包含比赛ID、名称、描述、
*阶段数和总长度(即所有阶段的总和)
长
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
字符串viewRaceDetails(int raceId)引发IDNotRecognisedException;
/**
*该方法去除竞赛及其所有相关信息,
*检查点和结果。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId要删除的比赛的ID。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
void removeReaceById(int raceId)引发IDNotRecognisedException;
/**
*该方法查询为比赛创建的赛段数。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return为比赛创建的赛段数。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int getNumberOfStages(int raceId)引发IDNotRecognisedException;
/**
*创建一个新赛段并将其添加到比赛中。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId将要添加赛段的比赛。
*@param stageName阶段的标识符名称。
*@param description阶段的描述性文本。
*@param length以千米为单位的阶段长度。
*@param startTime赛段比赛的日期和时间。它
*不能为null。
*@param type阶段的类型。这用于确定
*给获胜者的分数。
*@返回舞台的唯一ID。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*@throws IllegalNameException如果该名称已存在于平台中。
*@throws InvalidNameException如果名称为null,为空,并且超过30
*字符,或具有空格。
*@throws InvalidLengthException如果长度小于5km。
*/
int addStageToRace(int raceId,String stageName,字符串描述,双倍长度,LocalDateTime
startTime,StageType类型)
9
throws IDNotRecognisedException、IllegalNameException、InvalidNameException、InvalidLengthException;
/**
*检索比赛的阶段ID列表。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return一个阶段ID数组,按其在
*race或空数组(如果不存在)。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int[]getRaceStaties(int raceId)抛出IDNotRecognisedException;
/**
*获取比赛中一个赛段的长度,单位为千米。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId正在查询的阶段的ID。
*@return舞台的长度。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
double getStageLength(int stageId)throws IDNotRecognisedException;
/**
*删除阶段及其所有相关数据,即检查点和结果。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId要删除的阶段的ID。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
void removeStageById(int stageId)引发IDNotRecognisedException;
/**
*将爬升检查点添加到阶段。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId爬升检查点所在阶段的ID
*正在添加。
*@param location攀登完成的千米位置
*舞台。
*@param-type爬升的类别-{@link CheckpointType#C4},
*{@link CheckpointType#C3}、{@link CheckpointType#C2},
*{@link CheckpointType#C1}或{@link CheckpointType#HC}。
*@param averageGradient攀登的平均坡度。
10
*@param length以千米为单位的攀登长度。
*@return创建的检查点的ID。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
*系统。
*@throws InvalidLocationException如果位置超出
*舞台长度。
*@throws InvalidStageStateException如果阶段是“等待结果”。
*@throws InvalidStageTypeException时间试用阶段不能包含任何
*检查点。
*/
int addCategorizedClimb ToStage(int stageId,Double location,CheckpointType类型,Double averageGradient,
双倍长度)抛出IDNotRecognisedException、InvalidLocationException,
InvalidStageStateException,InvalidStageTypeException;
/**
*将中间冲刺添加到阶段中。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId中间sprint检查点所在阶段的ID
*正在添加。
*@param location中间冲刺结束的公里位置
*在阶段内。
*@return创建的检查点的ID。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
*系统。
*@throws InvalidLocationException如果位置超出
*舞台长度。
*@throws InvalidStageStateException如果阶段是“等待结果”。
*@throws InvalidStageTypeException时间试用阶段不能包含任何
*检查点。
*/
int addIntermediateSprintToStage(int stageId,双位置)抛出IDNotRecognisedException,
InvalidLocationException、InvalidStageStateException和InvalidStageTypeException;
/**
*从阶段中删除检查点。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param checkpointId要删除的检查点的ID。
*@throws IDNotRecognisedException如果ID与中的任何检查点都不匹配
*系统。
*@throws InvalidStageStateException如果阶段是“等待结果”。
*/
void removeCheckpoint(int checkpointId)引发IDNotRecognisedException,InvalidStageStateException;
/**
*结束一个阶段的准备工作。结束后,阶段的状态
*应该“等待结果”。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
11
*@param stageId要结束的阶段的ID。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
*系统。
*@throws InvalidStageStateException如果阶段是“等待结果”。
*/
void concludeStagePrepair(int stageId)抛出IDNotRecognisedException、InvalidStageStateException;
/**
*检索阶段的检查点(山地和短跑)ID的列表。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId正在查询的阶段的ID。
*@return按检查点ID在中的位置排序(从第一个到最后一个)的检查点ID列表
阶段
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
int[]getStageCheckpoints(int stageId)抛出IDNotRecognisedException;
/**
*创建一个具有名称和描述的团队。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param name团队的标识符名称。
*@param description团队的描述。
*@return创建的团队的ID。
*@throws IllegalNameException如果该名称已存在于平台中。
*@throws InvalidNameException如果名称为null,为空,并且超过30
*字符,或具有空格。
*/
int createTeam(字符串名称,字符串描述)抛出IllegalNameException,InvalidNameException;
/**
*从系统中删除团队。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param teamId要删除的团队的ID。
*@throws IDNotRecognisedException如果ID与中的任何团队都不匹配
系统
*/
void removeTeam(int teamId)引发IDNotRecognisedException;
/**
*获取系统中团队ID的列表。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
12
*@return系统中团队的ID列表。如果有空列表
*系统中没有团队。
*/
int[]getTeams();
/**
*召集一个团队的骑手。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param teamId被查询的团队的ID。
*@return带有骑手ID的列表。
*@throws IDNotRecognisedException如果ID与中的任何团队都不匹配
系统
*/
int[]getTeamRiders(int teamId)抛出IDNotRecognisedException;
/**
*创建一个骑手。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param teamID ID骑手的团队。
*@param name骑手的名字。
*@param yearOfBirth骑手的出生年份。
*@return系统中骑手的ID。
*@throws IDNotRecognisedException如果ID与中的任何团队都不匹配
系统
*@throws IllegalArgumentException如果骑手的名字为null或为空,
*或者出生年份小于1900年。
*/
int createRider(int teamID,String name,int yearOfBirth)抛出IDNotRecognisedException,
非法辩论例外;
/**
*将骑手从系统中移除。当骑车人从平台上移开时,
*它的所有结果也应该被删除。比赛结果必须更新。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param riderId要删除的骑手的ID。
*@throws IDNotRecognisedException如果ID与中的任何骑手都不匹配
系统
*/
void removeRider(int riderId)引发IDNotRecognisedException;
/**
*记录骑手在一个赛段中的次数。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
13
*@param stageId结果引用的阶段的ID。
*@param riderId骑手的ID。
*@param checkpointTimes骑手到达每个
*阶段的检查点,包括开始时间和
*终点线。
*@throws IDNotRecognisedException如果ID与任何骑手或
*阶段。
*@throws DuplicatedResultException如果骑手已经有结果则抛出
*为舞台。每个骑手只能
*每个阶段一个结果。
*@throws InvalidCheckpointTimesException如果checkpointTimes的长度为
*不等于n+2,其中n是数字
*该阶段检查站的数量+2代表
*的开始时间和结束时间
阶段
*@throws InvalidStageStateException如果阶段不是“等待”
*results”。结果只能添加到
*阶段,而它是“等待结果”。
*/
void registerReaderResultsIstage(int stageId,int riderId,LocalTime…checkpointTimes)
throws IDNotRecognisedException、DuplicatedResultException、InvalidCheckpointTimesException,
InvalidStageStateException;
/**
*获取一个赛段中骑手的时间。
*如果出现任何异常,则此MiniCyclingPortal的状态必须保持不变
*抛出。
*@param stageId结果引用的阶段的ID。
*@param riderId骑手的ID。
*@return骑手到达每个检查站的时间数组
*阶段的时间和总经过时间。经过的时间是
*结束时间和开始时间之间的差异。返回
*空数组,如果中没有为骑手注册结果
阶段假设一个阶段的总运行时间从不超过24小时
*因此,可以用LocalTime变量来表示。有
*无需检查此条件或引发任何异常。
*@throws IDNotRecognisedException如果ID与任何骑手或
*阶段。
*/
LocalTime[]getRiderResultsIstage(int stageId,int riderId)抛出IDNotRecognisedException;
/**
*对于一般分类,累计时间基于调整后的
*经过的时间,而不是实际经过的时间。进行调整是为了考虑
*车手们靠得很近的账户组,例如peloton。如果
*骑手的完成时间比
*之前的骑手,那么他们调整后的经过时间是两者中最小的。对于
*例如,一个有200名骑手“一起”完成比赛的阶段(即少于1名
*连续骑手之间的第二个),所有骑手调整后的经过时间
*应该和所有这些车手中的第一个一样,即使真正的差距
*第200名和第1名之间的距离远大于1秒。没有
*对计时赛的经过时间进行调整。
14
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId结果引用的阶段的ID。
*@param riderId骑手的ID。
*@return骑手在赛段中调整的经过时间。如果返回null
*该阶段没有为该骑手注册结果。
*@throws IDNotRecognisedException如果ID与任何骑手或
*阶段。
*/
LocalTime getRiderAdjustedElapsedTimeInStage(int stageId,int riderId)
抛出IDNotRecognisedException;
/**
*从附加项中删除阶段结果。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId结果引用的阶段的ID。
*@param riderId骑手的ID。
*@throws IDNotRecognisedException如果ID与任何骑手或
*阶段。
*/
void deleteRiderResultsIstage(int stageId,int riderId)抛出IDNotRecognisedException;
/**
*让骑手在一个赛段中完成位置。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId正在查询的阶段的ID。
*@return按经过时间排序的骑手ID列表。空列表如果
*这个阶段没有结果。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
int[]getRidersRankInStage(int stageId)抛出IDNotRecognisedException;
/**
*获取一个赛段中骑手调整后的经过时间。
*如果出现任何异常,则此MiniCyclingPortal的状态必须保持不变
*抛出。
*@param stageId正在查询的阶段的ID。
*@return按完成时间排序的调整后经过时间的排序列表
时间如果阶段没有结果,则为空列表。这些时候
*应该与返回的骑手相匹配
*{@link#getRidersRankInStage(int)}。假设的总运行时间
*在一个阶段中,永远不会超过24小时,因此,可以用
*LocalTime变量。无需检查这种情况或
*提出任何例外。
15
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
LocalTime[]getRankedAdjustedElapsedTimesInSage(int stageId)引发IDNotRecognisedException;
/**
*获取每个骑手在一个赛段中获得的分数。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId正在查询的阶段的ID。
*@return每个骑手在赛段内获得的积分排名列表,排序
*通过它们经过的时间。如果没有结果,则为空列表
阶段这些积分应该与返回的骑手相匹配
*{@link#getRidersRankInStage(int)}。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
int[]getRidersPointsInSage(int stageId)抛出IDNotRecognisedException;
/**
*获取每个骑手在一个赛段中获得的山地点数。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param stageId正在查询的阶段的ID。
*@return每个车手在赛段内获得的山地积分排行榜,
*按完成时间排序。如果没有结果,则为空列表
*舞台。这些积分应该与返回的骑手相匹配
*{@link#getRidersRankInStage(int)}。
*@throws IDNotRecognisedException如果ID与中的任何阶段都不匹配
系统
*/
int[]getRidersMountainPointsInSage(int stageId)抛出IDNotRecognisedException;
/**
*方法清空此MiniCyclingPortal的内容并重置所有
*内部计数器。
*/
void擦除CyclingPortal();
/**
*方法将此MiniCyclingPortal内容保存到串行文件中,
*参数中给出的文件名。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param filename要保存的文件的位置。
*@throws IOException如果在尝试保存时遇到问题
*将内容存储到文件中。
*/
void saveCyclingPortal(字符串文件名)引发IOException;
16
/**
*方法应加载此MiniCyclingPortal内容,并将其替换为
*存储在参数中给定的文件中的序列化内容。
*此MiniCyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param filename要加载的文件的位置。
*@throws IOException如果在尝试时遇到问题
*以从文件加载存储内容。
*@throws ClassNotFoundException如果在以下情况下找不到所需的类文件
*加载。
*/
void loadCyclingPortal(字符串文件名)抛出IOException、ClassNotFoundException;
}
7 CyclingPortal.java
包装循环;
导入java.time。LocalTime;
/**
*CyclingPortal界面。类的无参数构造函数
*实现该接口应将CyclingPortal初始化为
*一个空的平台,里面没有最初的比赛队伍,也没有比赛。对于双人组
*仅提交。
*@作者Diogo Pacheco
*@版本2.0
*/
公共接口CyclingPortal扩展了MiniCyclingPortal{
/**
*该方法去除竞赛及其所有相关信息,
*检查点和结果。
*此CyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param name要删除的种族的名称。
*@throws NameNotRecognisedException如果名称与中的任何种族都不匹配
*系统。
*/
void removeRacedByName(字符串名称)抛出NameNotRecognisedException;
/**
*获取比赛中骑手的一般分类排名。
*此CyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
17
*@param raceId正在查询的比赛的ID。
*@return骑手ID的排名列表,按其ID的总和升序排列
*在比赛的所有阶段调整的经过时间。也就是说,第一
*在这个列表中是赢家(最少的一次)。如果没有,则为空列表
*比赛中任何阶段的成绩。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int[]getRidersGeneralClassificationRank(int raceId)抛出IDNotRecognisedException;
/**
*获取比赛中骑手的一般分类时间。
*如果出现任何异常,则此CyclingPortal的状态必须保持不变
*抛出。
*@param raceId正在查询的比赛的ID。
*@return骑手的时间列表,按调整后的累计时间排序
*比赛各个阶段的时间。如果没有结果,则为空列表
*在比赛的任何阶段。这些时间应该与骑手相匹配
*由{@link#getRidersGeneralClassificationRank(int)}返回。假定
*一场比赛的总经过时间(所有赛段的总和)从来没有
*超过24小时,因此可以用LocalTime表示
变量无需检查这种情况或提出任何
例外
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
LocalTime[]getGeneralClassificationTimesInRace(int raceId)抛出IDNotRecognisedException;
/**
*在比赛中获得车手的总积分。
*此CyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return骑手积分的数组(即所有阶段积分的总和
*比赛的时间),按总调整的经过时间排序。一个空数组,如果
*比赛的任何阶段都没有结果。这些要点应该
*匹配{@link#getRidersGeneralClassificationRank(int)}返回的骑手。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int[]getRidersPointsInSpace(int raceId)抛出IDNotRecognisedException;
/**
*在比赛中获得车手的总山地积分。
*此CyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return一组骑手的山点(即他们的山的总和
18
*比赛所有阶段的积分),按调整后的总经过时间排序。
*如果比赛中的任何阶段都没有结果,则为空数组。这些
*积分应与返回的骑手相匹配
*{@link#getRidersGeneralClassificationRank(int)}。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int[]getRidersMountainPointsInSpace(int raceId)抛出IDNotRecognisedException;
/**
*根据比赛中的积分分类,获得车手的排名列表。
*此CyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return骑手ID的排名列表,按其ID的总和降序排列
*在比赛的所有阶段都获得分数。也就是说,这个列表中的第一个是
*获胜者(更多分数)。如果没有任何结果,则为空列表
*赛段。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int[]getRidersPointClassificationRank(int raceId)抛出IDNotRecognisedException;
/**
*根据比赛中的山地分类,获得车手的排名列表。
*此CyclingPortal的状态必须保持不变(如果有的话)
*抛出异常。
*@param raceId正在查询的比赛的ID。
*@return骑手ID的排名列表,按其ID的总和降序排列
*在比赛的各个阶段都有山地积分。也就是说,这是第一个
*名单是赢家(更多的分数)。如果没有结果,则为空列表
*在比赛的任何阶段。
*@throws IDNotRecognisedException如果ID与中的任何种族都不匹配
系统
*/
int[]getRidersMountainPointClassificationRank(int raceId)抛出IDNotRecognisedException;
}