首页 > 其他分享 >sicp每日一题[2.3]

sicp每日一题[2.3]

时间:2024-09-09 12:24:20浏览次数:1  
标签:point 每日 get sicp 2.3 矩形 segment make left

Exercise 2.3

Implement a representation for rectangles in a plane. (Hint: You may want to make use of Exercise 2.2.) In terms of your constructors and selectors, create procedures that compute the perimeter and the area of a given rectangle. Now implement a different representation for rectangles. Can you design your system with suitable abstraction barriers, so that the same perimeter and area procedures will work using either representation?


首先借用 Exercise 2.2 的函数来表示矩形,我们已经有了线段的表示方法,那矩形就是2组平行且相等的线段,且邻边垂直。为了简单起见,把矩形左下角的顶点坐标设为(0, 0),且一条边落在 x 轴上。然后采用矩形左边的那条边和对角线交点坐标来确定一个矩形,同样为了简便起见,把交点坐标设为(0, 0)。可以看出 make-point, x-point, y-point; make-segment, start-segment, end-segment; make-rect, make-rect-by-meeting-point; get-line-length, get-perimeter, get-area 是四层不同的函数,某一层的函数实现逻辑的改变,不会影响到其他层的调用。

; 用左下的顶点和经过该顶点的两条邻边来确定一个矩形,为简单起见,左下的顶点坐标设为(0, 0)
; length, width 分别表示矩形的长和宽
(define (make-rect length width)
  (let ((left-bottom (make-point 0 0)))
    (cons (make-segment left-bottom (make-point (car left-bottom) (+ (cdr left-bottom) width)))    ; 竖直的那条边
          (make-segment left-bottom (make-point (+ (car left-bottom) length) (cdr left-bottom))))))    ; 水平的那条边

; 用矩形的对角线交点和左边的边来确定一个矩形,为简单起见,对角线交点坐标设为(0, 0)
; left-line 表示左边的边
(define (make-rect-by-meeting-point left-line)
  (cons left-line (make-segment (start-segment left-line) (make-point (- 0 (x-point (start-segment left-line)))
                                                                      (y-point (start-segment left-line))))))

; 用两点间距离公式 d = sqrt(x^2 + y^2) 计算线段的长度
(define (get-line-length segment)
  (sqrt (+ (square (- (x-point (end-segment segment))
                      (x-point (start-segment segment))))
           (square (- (y-point (end-segment segment))
                      (y-point (start-segment segment)))))))

; 计算矩形的周长
(define (get-perimeter rect)
  (* 2 (+ (get-line-length (car rect))
          (get-line-length (cdr rect)))))

; 计算矩形的面积
(define (get-area rect)
  (* (get-line-length (car rect))
     (get-line-length (cdr rect))))


; 设置一个长为7宽为5的矩形
(define test-rect1 (make-rect 7 5))

(display "矩形test-rect1周长为:")
(display (get-perimeter test-rect1))
(newline)
(display "矩形test-rect1面积为:")
(display (get-area test-rect1))
(newline)

; 设置一个长为7宽为5的矩形
(define A (make-point -3.5 -2.5))
(define B (make-point -3.5 2.5))
(define left-line (make-segment A B))
(define test-rect2 (make-rect-by-meeting-point left-line))
(display "矩形test-rect2周长为:")
(display (get-perimeter test-rect2))
(newline)
(display "矩形test-rect2面积为:")
(display (get-area test-rect2))
(newline)

; 执行结果
矩形test-rect1周长为:24.000000282646763
矩形test-rect1面积为:35.00000070672435
矩形test-rect2周长为:24.000000282646763
矩形test-rect2面积为:35.00000070672435

标签:point,每日,get,sicp,2.3,矩形,segment,make,left
From: https://www.cnblogs.com/think2times/p/18404310

相关文章

  • GitHub每日最火火火项目(9.8)
    项目名称:polarsource/polar项目介绍:polar是一个开源的项目,它是LemonSqueezy的替代方案,并且具有更优惠的价格。这个项目的目标是让开发者能够在自己热爱的编码工作中获得报酬。它为开发者提供了一种新的选择,使他们能够以更低的成本实现自己的项目,并从中获得收益。通过......
  • sicp每日一题[2.2]
    Exercise2.2Considertheproblemofrepresentinglinesegmentsinaplane.Eachsegmentisrepresentedasapairofpoints:astartingpointandanendingpoint.Defineaconstructormake-segmentandselectorsstart-segmentandend-segmentthatdefinet......
  • 每日OJ_牛客_骆驼命名法(递归深搜)
    目录牛客_骆驼命名法(简单模拟)解析代码牛客_骆驼命名法(简单模拟)骆驼命名法__牛客网解析代码首先一个字符一个字符的读取内容:遇到_就直接跳过。如果上一个字符是_则下一个字符转大写字母。#include<iostream>#include<string>usingnamespacestd;intmai......
  • GitHub每日最火火火项目(9.6)
    项目名称:Zeyi-Lin/HivisionIDPhotos项目介绍:HivisionIDPhotos是一个轻量级且高效的AI证件照制作工具。它能够通过人工智能技术,快速、准确地生成符合要求的证件照。这个工具具有较高的实用性,可以帮助用户节省时间和精力,无需专业的摄影知识和技能,就能轻松制作出满意的......
  • Unity(2022.3.41LTS) - 音频
    目录一、音频系统概述二、音频资源类型三、音频组件四、音频空间定位五、音频效果处理六.音乐框架设计一、音频系统概述Unity的音频系统允许开发者在游戏中添加各种声音效果,包括背景音乐、音效、环境音等。它提供了丰富的功能来控制音频的播放、音量、循环、空间定......
  • 【每日刷题】Day112
    【每日刷题】Day112......
  • java计算机毕业设计每日一课微党课学习管理平台(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,党员教育工作面临着新的机遇与挑战。传统的党员学习模式往往受限于时间、空间及资源,难以适应新时代党员教育高效化、个性化的......
  • 必应每日壁纸API封装
    简介这个类封装了必应首页的每日壁纸查看功能,提供了查看、保存壁纸的方法,最大支持查看近8天的壁纸使用方法asyncTaskMain(){ try { varbing=BingWallpaperAPI.CreateInstance(8);//初始化,参数8表示一共会加载8张图片 vartask=awaitbing.Current(); task.Wal......
  • 【每日一练】tkinter输入文本框实例
    """代码思路1.先创建一个文本框2.定义一个函数执行文本的获取和另一个文本框的赋值3.创建按钮,并调用函数4.创建另一个文本框"""importtkinterastkroot=tk.Tk()root.title("复制输入框")root.geometry("400x300+800+200")#创建一个输入文本框,显示为*的属性设......
  • 2.3 在同一个图形界面中分别画出6条曲线 y=kx^2+2k k=1,2,3...
    点击查看代码importnumpyasnpimportmatplotlib.pyplotasplt#定义x的范围x=np.linspace(-10,10,400)#创建一个图形和坐标轴plt.figure(figsize=(10,6))ax=plt.gca()#循环绘制每条曲线colors=['r','g','b','c......