cs61B-sp21 | lab6

cs61B-sp21 | lab6

TODO 1

在 CapersRepository.java 中

static final File CAPERS_FOLDER = null; 
// TODO Hint: look at the `join`  
//      function in Utils

在 Utils.java 我们找到 join 函数,第一个 join 的作用是将 first 和 others 连接起来形成一个路径,并将其转换为 File 对象返回。而第二个 join 的作用是将 first 对象的路径和 others 连接起来形成一个新的对象并转换为 File 返回。

回到 CAPERS_FOLDER,实际上我们是要创建主工作目录,也就是 ( u s e r . d i r ) / . c a p e r s (user.dir)/.capers (user.dir)/.capers

static final File CAPERS_FOLDER = join(CWD, ".capers");

TODO 2

在 Dog.java 中

public class Dog { // TODO
	...
}

我们需要添加 Serializable 接口

public class Dog implements Serializable

TODO 4

static final File DOG_FOLDER = null; // TODO (hint: look at the `join`  
                                     //      function in Utils)

对于 DOG_FOLDER,我们要在 .capers 下创建 dogs 文件夹

static final File DOG_FOLDER = join(".capers", "dogs");

TODO 5

根据注释,这段代码要执行持久化的操作,也就是创建文件夹或者文件,让数据在程序关闭后仍然存在。

/**  
 * Does required filesystem operations to allow for persistence. 
 * (creates any necessary folders or files) 
 * Remember: recommended structure (you do not have to follow): 
 * * .capers/ -- top level folder for all persistent data in your lab12 folder 
 *    - dogs/ -- folder containing all of the persistent data for dogs 
 *    - story -- file containing the current story 
*/
public static void setupPersistence() {  
    // TODO  
}

创建 .capers 文件夹,以及 .capers/dogs 文件夹。

CAPERS_FOLDER.mkdir();
Dog.DOG_FOLDER.mkdir();

TODO 6

/**  
 * Appends the first non-command argument in args 
 * to a file called `story` in the .capers directory. 
 * @param text String of the text to be appended to the story  
 */
 public static void writeStory(String text) {  
    // TODO  
}

需要先在 .capers 文件夹下创建一个叫做 “story” 的文件,用 join 函数将 .capers 路径和 story 文件名连接。如果该文件存在,说明之前已经写入过字符串,那么提取原来的内容并且与新内容连接。如果该文件不存在,那么文件中内容就是 text。

public static void writeStory(String text) {  
    File f = join(CAPERS_FOLDER, "story");  
    String newStory;  
    if(!f.exists()) {  
        newStory = text;  
    } else {  
        String originStory = readContentsAsString(f);  
        newStory = originStory + '\n' + text;  
    }    writeContents(f, newStory);  
    System.out.println(newStory);  
}

TODO 7

在 Main.java 中的 main 函数

case "dog":  
    validateNumArgs("dog", args, 4);  
    // TODO: make a dog  
    break;

首先,输入的参数为\dog [name] [breed] [age],name 对应 args[1],breed 对应 args[2],age 对应 args[3]。再调用 CapersRepository 中的 makeDog 函数即可。注意 age 需要整型,所以我们要进行类型转换。

case "dog":  
    validateNumArgs("dog", args, 4);  
    String name = args[1];  
    String breed = args[2];  
    int age = Integer.parseInt(args[3]);  
    CapersRepository.makeDog(name, breed, age);  
    break;

TODO 8

需要创建并且保存 dog 并传入它的三个参数,并且需要打印这只狗的信息。

/**  
 * Creates and persistently saves a dog using the first 
 * three non-command arguments of args (name, breed, age). 
 * Also prints out the dog's information using toString(). 
*/
public static void makeDog(String name, String breed, int age) {  
    // TODO  
}

观察 Dog.java


saveDog 用来将 dog 存储至文件中,toString() 返回一个包含狗的信息的字符串。

public static void makeDog(String name, String breed, int age) {  
    Dog newDog = new Dog(name, breed, age);  
    newDog.saveDog();  
    System.out.println(newDog);  
}

TODO 9

/**  
 * Saves a dog to a file for future use. 
*/
public void saveDog() {  
    // TODO (hint: don't forget dog names are unique)  
}

在 Dogs 文件夹下创建这只新狗狗的文件并写入对象。

public void saveDog() {  
    File newDog = join(DOG_FOLDER, name);  
    writeObject(newDog, this);  
}

TODO 10

case "birthday":  
    validateNumArgs("birthday", args, 2);  
    // TODO: celebrate this dog's birthday  
    break;

获取要庆祝生日的小狗名称,也就是 args[1],并且调用 CapersRepository 中的 celebrateBirthday 函数。

case "birthday":  
    validateNumArgs("birthday", args, 2);  
    name = args[1];  
    CapersRepository.celebrateBirthday(name);  
    break;

TODO 11

/**  
 * Advances a dog's age persistently and prints out a celebratory message. 
 * Also prints out the dog's information using toString(). 
 * Chooses dog to advance based on the first non-command argument of args. 
 * @param name String name of the Dog whose birthday we're celebrating.  
 */
 public static void celebrateBirthday(String name) {  
    // TODO  
}

先从文件中获取 Dog,再调用 haveBirthday 函数,最终保存。

public static void celebrateBirthday(String name) {  
    // TODO  
    Dog theDog = Dog.fromFile(name);  
	theDog.haveBirthday();  
	theDog.saveDog();  
}

TODO 12

/**  
 * Reads in and deserializes a dog from a file with name NAME in DOG_FOLDER. 
 * @param name Name of dog to load  
 * @return Dog read from file  
 */
 public static Dog fromFile(String name) {  
    // TODO (hint: look at the Utils file)  
    return null;  
}

先获取文件,再读取里面的对象即可。

public static Dog fromFile(String name) {  
    File f = join(DOG_FOLDER, name);  
    return readObject(f, Dog.class);    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/657783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGISPro】3.1.5下载和安装教程

下载教程 arcgis下载地址:Трекер (rutracker.net) 点击磁力链下载弹出对应的软件进行下载 ArcGISPro3.1新特性 ArcGIS Pro 3.1是ArcGIS Pro的最新版本,它引入了一些新的特性和功能,以提高用户的工作效率和数据分析能力。以下是ArcGIS…

c#对操作系统的时间无法更新?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

I.MX6ULL主频和时钟配置实验

系列文章目录 I.MX6ULL主频和时钟配置实验 I.MX6ULL主频和时钟配置实验 系列文章目录一、前言二、I.MX6U 时钟系统详解三、硬件原理四、 7 路 PLL 时钟源五、时钟树简介六、内核时钟设置七、PFD 时钟设置八、AHB、IPG 和 PERCLK 根时钟设置九、实验程序编写十、编译下载10.1编写…

线程池的实现

线程池是一种池式组件,通过创建和维护一定数量的线程,实现这些线程的重复使用,避免了频繁创建和销毁线程的开销,从而提升了性能 线程池的作用: 1.复用线程资源; 2.减少线程创建和销毁的开销; …

LBank研究院: DePIN赛道解析|加密精神与Jevons悖论的第三世界

作者:Eva,LBank研究员 *本人谨代表作者观点,不构成任何交易建议。 *本文内容为原创,版权为LBank所有,如需转载请注明作者和出处,否则将追究法律责任。 TLDR: DePIN是对传统老牌硬件的洗牌挑战&#xff…

excel 点击单元格的内容 跳转到其他sheet设置

如图点击1处跳转到2 按照如下图步骤操作即可

js setTimeout、setInterval、promise、async await执行顺序梳理

基础知识 async: 关键字用于标记一个函数为异步函数,该函数中有一个或多个promise对象,需要等待执行完成后才会继续执行。 await:关键字,用于等待一个promise对象执行完,并返回其中的值,只能在async函数内部使用。可…

【PB案例学习笔记】-11动画显示窗口

写在前面 这是PB案例学习笔记系列文章的第11篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…

调用萨姆索诺夫函数:深入探索函数的参数与返回值

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、萨姆索诺夫函数的引入与调用 二、如何获取函数的返回值 三、无参数与无返回值的函数调…

基于魔搭开源推理引擎 DashInfer实现CPU服务器大模型推理--理论篇

前言 在人工智能技术飞速发展的今天,如何高效地在CPU上运行大规模的预训练语言模型(LLM)成为了加速生成式AI应用广泛落地的核心问题。阿里巴巴达摩院模型开源社区ModelScope近期推出了一款名为DashInfer的推理引擎,旨在解决这一挑…

语音控制系统的安全挑战与防御策略(上)

语音控制系统(VCS)提供了便捷的用户界面,涉及智能家居、自动驾驶汽车、智能客服等众多应用场景,已成为现代智能设备不可或缺的一部分。其市场规模预计到2023年达到70亿美元,这种扩张带来了重大的安全挑战,如…

STM32简易音乐播放器(HAL库)

一、设计描述 本设计以STM32MP157A单片机为核心控制器,加上其他的模块一起组成基于单片机的音乐盒的整个系统,通过不同频率的PWM使蜂鸣器播放音乐,通过按键中断实现歌曲切换,音量调节,定时器中断实现播放速度调节&…

如何为 kNN 搜索选择最佳 k 和 num_candidates

作者:Madhusudhan Konda 如何选择最好的 k 和 num_candidates? 向量搜索在当前的生成式人工智能/机器学习领域中已经成为一个改变游戏规则的技术。它允许我们基于语义含义而不仅仅是精确的关键词匹配来找到相似的项目。 Elasticsearch的 k-近邻&#x…

使用 Flask 实现异步请求处理

文章目录 为什么需要异步请求处理?在 Flask 中实现异步请求处理使用 Flask-Cors 扩展 总结 在开发 Web 应用程序时,异步请求处理是提高性能和并发能力的重要方法之一。Flask 是一个轻量级的 Web 框架,它提供了易于使用的工具来实现异步请求处…

STM32高级控制定时器(STM32F103):检测输入PWM周期和占空比

目录 概述 1 PWM 输入模式 1.1 原理介绍 1.2 应用实例 1.3 示例时序图 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM占空比函数 3.2 输入捕捉回调函数 4 功能测试 4.1 测试软件框架结构 4.2 实验实现 4.2.1 测试实…

邀请媒体参会,媒体邀约的正确打开方式

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 邀请媒体参会是一项重要的公关活动,需要细致的规划和执行。以下是一些步骤和建议,可以帮助你更有效地进行媒体邀约: 1. 拟定邀约媒体名单:…

python数据分析——分组操作1

参考资料:活用pandas库 1、简介 借助“分割-应用-组合”(split-apply-combine)模式,分组操作可以有效地聚合、转换和过滤数据。 分割:基于键,把要处理的数据分割为小片段。 应用:分别处理每个数…

【CUDA】Nsight profile驱动的CUDA优化

前置准备 安装NVIDIA Nsight Compute。 安装好后选择使用管理员权限启动下载官方 Demo 代码官方博客Shuffle warp 1. 任务介绍及CPU版本 1.1 任务介绍 任务理解: 有一个 L x M 的矩阵 M 1 M_1 M1​ 对其每行取平均值 得到 V 1 ∈ R L 1 V_1 \in \mathbb{R}^{…

Java | Leetcode Java题解之第117题填充每个节点的下一个右侧节点指针II

题目: 题解: class Solution {Node last null, nextStart null;public Node connect(Node root) {if (root null) {return null;}Node start root;while (start ! null) {last null;nextStart null;for (Node p start; p ! null; p p.next) {if…

学习笔记——数据通信基础——数据通信网络(拓扑结构)

网络拓扑 网络拓扑(Network Topology)是指用传输介质(例如双绞线、光纤等)互连各种设备(例如计算机终端、路由器、交换机等)所呈现的结构化布局。 1、网络拓扑形态 星型网络∶所有节点通过一个中心节点连接在一起。 优点∶容易在网络中增加新的节点。通信数据必须经过中心节点…