Rust面试宝典第10题:绘制各种图形

news2024/11/26 23:51:39

题目

        我们需要编写一个图形相关的应用程序,并处理大量图形(Shape)信息,图形有矩形(Rectangle)、正方形(Square)、圆形(Circle)等种类。应用程序需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式作为示意)。

        (1)请使用面向对象的设计方法对以上需求进行设计,编写可能需要的结构体及其实现。

        (2)请给出实现以上功能的示例性代码,从某处获取图形信息并且进行计算和显示。

解析

        这道题主要考察应聘者对结构体、特征、封装等知识的整体理解和把控能力,涉及的知识点比较多,对于Rust初学者还是有一定难度的。

        先来看第一道小题,我们需要使用面向对象的设计方法来进行类的封装和实现。根据题目所述,图形有矩形(Rectangle)、正方形(Square)、圆形(Circle)等种类,那么,如何进行封装呢?矩形、正方形、圆形虽然形状不同,但它们都有一些基本的共同的属性,比如:具有周长、面积等性质。因此,我们可以先定义一个图形的Trait,在这个Trait中定义一些通用的属性和方法,具体可参考下面的示例代码。

trait Shape {
    fn area(&self) -> f64;
    fn display(&self);
}

        接下来,我们定义了下面名为Rectangle的结构体。这个结构体代表了一个矩形,包含两个关键的属性:width(宽度)和height(高度)。这两个属性都是64位浮点数类型(f64),这意味着矩形的尺寸可以是小数,从而提供了更高的精度和灵活性。随后,通过impl Shape for Rectangle语句,代码为Rectangle类型实现了Shape trait。这个实现包括了两个方法。

        area方法:计算矩形的面积,通过将宽度乘以高度得出结果。这个方法没有副作用,它接收一个自身的引用(&self),并返回一个f64类型的面积值。

        display方法:用于显示矩形的信息。这个方法使用println!宏来格式化并打印出矩形的宽度、高度和面积。值得注意的是:在打印面积时,它直接调用了之前定义的area方法,这展示了方法之间的互相调用以及代码的复用。

struct Rectangle {
    width: f64,
    height: f64,
}

impl Shape for Rectangle {
    fn area(&self) -> f64 {
        self.width * self.height
    }

    fn display(&self) {
        println!(
            "Rectangle: width = {}, height = {}, area = {}",
            self.width,
            self.height,
            self.area()
        );
    }
}

        正方形结构体Square的实现与矩形结构体相似,但其只有一个side的属性。具体的实现,可参考下面的示例代码。

struct Square {
    side: f64,
}

impl Shape for Square {
    fn area(&self) -> f64 {
        self.side * self.side
    }

    fn display(&self) {
        println!("Square: side = {}, area = {}", self.side, self.area());
    }
}

        最后,我们来封装圆形结构体Circle。Circle也只有一个属性,就是圆形的半径radius。具体的实现,可参考下面的示例代码。

struct Circle {
    radius: f64,
}

impl Shape for Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * self.radius * self.radius
    }

    fn display(&self) {
        println!("Circle: radius = {}, area = {}", self.radius, self.area());
    }
}

        在第二道小题中,要求应聘者从某处获取图形信息并且进行计算和显示。实际上,就是编写一个使用上述图形类的简单程序。在下面的示例代码中,我们首先创建了一个名为shapes的向量(Vec),该向量中存储了不同类型的形状对象。这些对象都被装箱(Box::new)并转换为Box<dyn Shape>类型的trait对象。这意味着,尽管这些形状在内存中的具体表示可能不同,但它们都实现了Shape trait,因此可以以一种统一的方式被处理。

        最后,代码通过一个for循环遍历shapes向量中的每个形状对象,并调用其display方法。由于每个对象都实现了Shape trait,因此它们都拥有display方法,这使得能够统一地处理和显示不同形状的信息。在循环中调用shape.display()时,Rust会在运行时动态地确定应该调用哪个具体实现的display方法。

fn main() {  
    let shapes = vec![  
        Box::new(Rectangle { width: 4.0, height: 5.0 }) as Box<dyn Shape>,  
        Box::new(Square { side: 6.0 }) as Box<dyn Shape>,  
        Box::new(Circle { radius: 3.0 }) as Box<dyn Shape>,  
    ];  
  
    for shape in shapes {  
        shape.display();  
    }  
}

        执行上述示例代码后,其打印输出如下。

Rectangle: width = 4, height = 5, area = 20
Square: side = 6, area = 36
Circle: radius = 3, area = 28.274333882308138

总结

        在本题中,我们学习了Rust中面向对象编程的一些关键概念,包括:多态性、Trait对象的使用以及动态方法分发。它允许程序员以一种灵活且类型安全的方式处理不同类型的对象,同时保持代码的简洁性和可读性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Eclipse C++ 无法debug 问题

环境&#xff1a; ubuntu20.04 Eclipse CDT&#xff08;x86_64) 工程&#xff0c;使用的是默认的CMake Project 现象&#xff1a; 1. 使用Eclipse&#xff0c; 加了断点后&#xff0c;debug 无法停在断点&#xff1b;step over 执行后是从main 直接执行到exit &#xff…

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

React | React.cloneElement 的使用

我看到同事的代码里有 cloneElement&#xff0c;于是去了解了一下这个函数。 就跟它的名字一样&#xff0c;克隆元素&#xff0c;可以基于一个元素创建一个新的元素&#xff0c;并且为新元素添加新的属性或者覆盖已有的属性。 下面是一个简单例子&#xff1a; .node1 {backg…

2024最新docker部署gitlab

docker部署gitlab 快速命令 1 拉取镜像 docker pull gitlab/gitlab-ce2 启动容器 docker run -itd \-p 9980:80 \-p 9922:22 \-v /opt/soft/docker/gitlab/etc:/etc/gitlab \-v /opt/soft/docker/gitlab/log:/var/log/gitlab \-v /opt/soft/docker/gitlab/opt:/var/opt/g…

MATLAB语音信号分析与合成——MATLAB语音信号分析学习资料汇总(图书、代码和视频)

教科书&#xff1a;MATLAB语音信号分析与合成&#xff08;第2版&#xff09; 链接&#xff08;含配套源代码&#xff09;&#xff1a;https://pan.baidu.com/s/1pXMPD_9TRpJmubPGaRKANw?pwd32rf 提取码&#xff1a;32rf 基础入门视频&#xff1a; 视频链接&#xff1a; 清…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

红黑树笔记

2-3树 -> 左倾红黑树 红黑树实际上是2-3树的一种基于BST的实现。普通二叉搜索树&#xff08;BST&#xff09;中的每一个节点&#xff0c;只有一个键&#xff0c;两条链接&#xff08;两个子节点&#xff09;&#xff0c;这种节点被称为2节点。2-3树中&#xff0c;引入了一个…

利用二叉检索树将文章中的单词建立索引(正则表达式)

知识储备 链接: 【二叉检索树的实现——增删改查、读取命令文件、将结果写入新文件】 1、正则表达式的处理 &#xff08;1&#xff09;r’前缀的作用 r’前缀的用于定义原始字符串&#xff0c;特点是不会处理反斜杠\作为转义字符 &#xff08;2&#xff09;正则表达式中元…

335GB,台北地区倾斜摄影OSGB数据V0.2版介绍!

前几天发布了台北地区倾斜摄影OSGB数据第一个版本(139GB,台北倾斜摄影OSGB数据V0.1版),虽然数据还是一个半成品&#xff0c;完全没想到热度很高&#xff0c;很多读者对这份数据都有比较浓厚的兴趣&#xff0c;在这里首先感谢各位读者的大力支持与鼓励&#xff0c;给了我持续更新…

Arm Linux 移植 Air724UG 4G模块-USB方式

目录 一、开发环境二、连接方式三、4G模组的 VID 和 PID四、Linux kernel 的配置五、ppp的编译六、测试 一、开发环境 开发板&#xff1a;NUC980 iot开发板 4G模块&#xff1a;银尔达 Core-Air724 二、连接方式 micro usb线&#xff0c;一端连接4G模组&#xff0c;一端连接N…

亚马逊云科技AWS将推出数据工程师全新认证(有资料)

AWS认证体系最近更新&#xff0c;在原有12张的基础上&#xff0c;将在2023年11月27日添加第13张&#xff0c;数据工程师助理级认证(Data Engineer Associate)&#xff0c;并且在2024/1/12前半价(省75刀&#xff1d;544人民币。 原有的数据分析专家级认证(Data Analytics Specia…

Spark-机器学习(7)分类学习之决策树

在之前的文章中&#xff0c;我们学习了分类学习之支持向量机&#xff0c;并带来简单案例&#xff0c;学习用法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。…

java-链表排序

需求 思路 排序&#xff1a;讲所有的值都取出来&#xff0c;存储到ArrayList中&#xff0c;然后排序&#xff0c;将排序之后的元素依次使用add方法添加到自定义链表合并排序&#xff1a;先合并&#xff0c;然后调用刚才写的排序算法合并&#xff1a;将表一的头结点作为新链表的…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…

[动画+注释详解]数据结构 - 直接插入排序

一. 直接插入排序算法的实现 1.1 基本思想 直接插入排序&#xff08;Straight Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是将一个待排序的记录插入到已经排序好的有序表中&#xff0c;从而得到一个新的、记录数增加1的有序表。 实际中&am…

Oracle对空值(NULL)的 聚合函数 排序

除count之外sum、avg、max、min都为null&#xff0c;count为0 Null 不支持加减乘除&#xff0c;大小比较&#xff0c;相等比较&#xff0c;否则只能为空&#xff1b;只能用‘is [not] null’来进行判断&#xff1b; Max等聚合函数会自动“过滤null” null排序默认最大&#xf…

特别的时钟特别的倒计时

念念不忘的歌曲&#xff1a;Thats Why You Go Away <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

线上线下交友社区系统,支持打包小程序/公众号/H5,源码交付!

上网交友的好处有很多&#xff0c;以下是一些主要的好处&#xff1a; 1. 拓展人际关系&#xff1a;通过上网交友可以认识更多的人&#xff0c;拓展自己的社交圈。这有助于扩大自己的视野、增加人生经验和开阔心胸。 2. 找到志同道合的朋友&#xff1a;在网络上&#xff0c;我们…

《面向云计算的零信任体系第1部分:总体架构》行业标准正式发布

中华人民共和国工业和信息化部公告2024年第4号文件正式发布行业标准&#xff1a;YD/T 4598.1-2024《面向云计算的零信任体系 第1部分&#xff1a;总体架构》&#xff08;后简称“总体架构”&#xff09;&#xff0c;并于2024年7月1日正式施行。 该标准由中国信通院牵头&#xf…