Scala编程_实现Rational的基本操作

在Scala中实现一个简单的有理数(Rational)类,并对其进行加法、比较等基本操作.

有理数的定义

        有理数是可以表示为两个整数的比值的数,通常形式为 n / d,其中 n 是分子,d 是分母。为了确保我们的有理数始终处于最简形式,我们将在构造函数中计算最大公约数,并将分子和分母分别除以这个值。

package ScalaBianchengimport avro.shaded.com.google.common.math.IntMath.gcdobject Scala06_Rational {/*** @描述: 实现的功能,将对有理数的各项行为进行建模,并进行加减乘除*      《scala编程》 第六章*      函数式对象 - 类-构造方法*      定义类Rational,类参数为n,d,Scala编译器会接收到这两个类参数,并且创建一个主构造方法,接收同样的这两个参数,*      凸显出Java与Scala的不同,再Java中,类有构造方法,构造方法可以接收参数,而在Scala中,类可以直接接收参数,*      在scala中,类定义体内可以直接使用类参数,不需要定义字段并编写将构造方法参数赋值给字段的代码。* @param n* @param d*/class Rational(n: Int, d: Int) { //n,d是类参数require(d != 0, "分母不能为0")//私有字段,保证为正数所以是abs//分子分母绝对值的最大公约数private val gongyueshu = gcd(n.abs, d.abs)// 类参数值除以最大公约数得到最简的分数val number = n / gongyueshuval denom = d / gongyueshu// toString 实现打印分子和分母,通过给Rational类添加toString方法重写默认的实现,// override修饰符表示前一个方法定义被重写覆盖了override def toString: String = number + "/" + denomdef add(that: Rational): Rational =new Rational(number * that.denom + that.number * denom, denom * that.denom)//自引用,关键字this指向当前执行方法的调用对象,当被用在构造方法里的时候,指向被构造的对象实例//这里面的this 可以省略def lessThan(that: Rational) =this.number * that.denom < that.number * this.denom// 第一个this可以省略,第二个this不能省略 省略了就没结果了def max(that: Rational) =if (this.lessThan(that)) that else this/*** scala的辅助构造方法,--- > 主构造方法之外的方法称为辅助构造方法.* 每个辅助构造方法都必须首先调用同一个类的另一个构造方法,他的格式必须是 this(......)* 并且被调用的构造方法要么是主构造方法,要么是另一个发起调用前的辅助构造方法,也就是scala的每个构造方法都会调用到这个累的主构造方法,* 即主构造方法是类的单一入口* 在Java中,构造方法要么调用同一个类的另一个构造方法,要么直接调用超类的构造方法。** @param n*/def this(n: Int) = this(n, 1) //接收一个分子参数/*** 定义操作符,标识符......*/}/*** 执行** @param args*/def main(args: Array[String]): Unit = {val half = new Rational(1, 2)val half2 = new Rational(3, 4)val half3 = new Rational(88, 100)//从对象外部访问分子分母的值println(half.denom)println(half.number)println(half)//定义的加法println(half add (half2))//最大公约数验证println(half3)val x = new Rational(4, 5)println(x)}}

        在 Rational 类中,定义一个主构造函数,两个参数:分子 n 和分母 d。使用 require 语句确保分母不为零.

参考

《scala编程》 

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

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

相关文章

若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值

目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的&#xff0c;但由于业务需求&#xff0c;我需要新添加一个age字段&#xff1a; 修改SysUser类 添加age字段后&#xff0c;要在SysUser类 …

霍夫变换法是基于传统视觉特征的道路车道线检测算法中的一种经典方法

霍夫变换法是基于传统视觉特征的道路车道线检测算法中的一种经典方法&#xff0c;以下是对它的详细介绍&#xff1a; 基本原理 霍夫变换的基本思想是将图像空间中的点映射到参数空间中&#xff0c;通过在参数空间中寻找峰值来确定图像中特定形状的参数。在车道线检测中&#…

【论文笔记】Best Practices and Lessons Learned on Synthetic Data for Language Models

论文信息 论文标题&#xff1a;Best Practices and Lessons Learned on Synthetic Data for Language Models 作者信息&#xff1a; Ruibo Liu, Jerry Wei, Fangyu Liu, Chenglei Si, Yanzhe Zhang, Jinmeng Rao, Steven Zheng, Daiyi Peng, Diyi Yang, Denny Zhou1 and Andre…

Android调试工具之ADB

Android Debug Bridge ADB介绍**一、ADB下载****二、ADB安装****三、ADB基础使用命令** ADB介绍 ADB&#xff08;Android Debug Bridge&#xff09;是Android开发与调试的必备工具&#xff0c;掌握它能极大提升开发效率。 一、ADB下载 Windows版本&#xff1a;https://dl.goo…

第三篇《RMAN 备份与恢复指南:保障数据库安全》(RMAN)

《Oracle 数据迁移与备份系列》 第三篇&#xff1a;《RMAN 备份与恢复指南&#xff1a;保障数据库安全》&#xff08;RMAN&#xff09; 1.概述 RMAN&#xff08;Recovery Manager&#xff09; 是 Oracle 数据库内置的专用备份与恢复工具&#xff0c;提供高效、安全的物理级数…

【测试框架篇】单元测试框架pytest(4):assert断言详解

一、前言 用例三要素之一就是对预期结果的断言。 何为断言&#xff1f;简单来说就是实际结果和期望结果去对比&#xff0c;符合预期就测试pass&#xff0c;不符合预期那就测试 failed。断言内容就是你要的预期结果。断言包含对接口响应内容做断言、也包含对落DB的数据做断言。…

什么是大模型微调?

在大模型&#xff08;如GPT、BERT、LLaMA等&#xff09;广泛应用的今天&#xff0c;“微调”&#xff08;Fine-Tuning&#xff09;已成为释放模型潜力的关键技术。它通过针对特定任务调整预训练模型&#xff0c;使其从“通才”变为“专才”。本文将从概念、原理到实践&#xff…

C# Channel

核心概念创建Channel无界通道有界通道FullMode选项 生产者-消费者模式生产者写入数据消费者读取数据 完整示例高级配置优化选项&#xff1a;取消操作&#xff1a;通过 CancellationToken 取消读写。 错误处理适用场景Channel的类型创建Channel写入和读取消息使用场景示例代码注…

基于Spring Boot的牙科诊所管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

upload-labs-靶场(1-19关)通关攻略

文件上传漏洞是指由于程序员再开发时&#xff0c;未对用户上传的文件进行严格的验证和过滤&#xff0c;而导致用户可以上传可执行的动态脚本文件 Pass-01&#xff08;前端验证绕过&#xff09; 上传111.php文件&#xff0c;发现弹窗显示不允许&#xff0c;并给出白名单文件类…

使用 pytesseract 进行 OCR 识别:以固定区域经纬度提取为例

引言 在智能交通、地图定位等应用场景中&#xff0c;经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 Python 的 pytesseract 库结合 PIL 对图像进行预处理&#xff0c;通过固定区域裁剪&#xff0c;来有效地识别出图像上显示的经纬度信息。 1. OCR 与 …

docker安装和卸载

服务器系统&#xff1a;Ubuntu Server 18.04.2 64bit 1 安装docker&#xff1a; 1.1 在线安装 1.# yum install docker 1.2 离线安装 https://download.csdn.net/download/qq_27106141/90477700 1.# docker-18.03.1-ce.tgz 1.2.1 解压 tar -xzvf docker-18.03.1-ce.tgz 1.2.2…

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境&#xff08;如未安装&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…

【Go每日一练】构建一个简单的用户信息管理系统

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.&#x1f636;‍&#x1f32b;️题目&#xff1a;简单的用户信息管理系统2.&#x1f636;‍&#x1f32b;️代码开发3.&#x1f636;‍&a…

全员DeepSeek时代,前端能做些什么?

全员DeepSeek时代&#xff0c;前端能做些什么&#xff1f; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…

Machine Learning: 十大基本机器学习算法

机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 基本的机器学习算法&#xff1a; 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类&#xff1a; 监督学习算法 (Sup…

【Linux docker 容器】关于想要让虚拟机在开机时候也docker自己启动,容器也自己启动,省去要自己开docker和容器

确认 Docker 服务状态&#xff1a; 首先&#xff0c;你需要确保 Docker 服务已经在虚拟机上安装并正确配置。你可以使用如下命令来检查 Docker 服务的状态&#xff1a; systemctl status docker.service 如果服务没有运行&#xff0c;你可以使用以下命令启动它&#xff1a; s…

前端系统测试(单元、集成、数据|性能|回归)

有关前端测试的面试题 系统测试 首先,功能测试部分。根据资料,单元测试是验证最小可测试单元的正确性,比如函数或组件。都提到了单元测试的重要性,强调其在开发早期发现问题,并通过自动化提高效率。需要整合我搜索到的资料中的观点,比如单元测试的方法(接口测试、路径覆…

linux 命令 ls

ls 是 Linux 系统中用于列出目录内容的核心命令&#xff0c;几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时&#xff0c;默认列出当前目录的内容。 可以指定文件或目录路径&#xff0c;支持通配符&#xff08;如…

CI/CD—GitLab部署

GitLab简介&#xff1a; GitLab 是一个用于代码托管和软件开发协作的平台&#xff0c;在全球开发者社区及企业中应用广泛&#xff0c;以下是对它的详细介绍&#xff1a; 主要功能 代码托管&#xff1a;提供了基于 Git 的代码仓库管理功能&#xff0c;支持创建、克隆、推送、…