第十章 表的进一步处理
最后更新于:2022-04-02 04:14:20
[TOC]
## 习题 10.1.8
设计求解二次方程的函数 quadratic-roots,该函数的输入为方程的系数,即a、b以及c,所执行的计算根据输入而定
```
(define (base-root a b c)
(sqrt (- (* b b) (* 4 a c))))
(define (root-add a b c)
(/ (+ (- b) (base-root a b c)) (* 2 a)))
(define (root-desc a b c)
(/ (- (- b) (base-root a b c)) (* 2 a)))
(define (quadratic-roots a b c)
(cond
[(= a 0) 'degenrate]
[(< (* b b) (* 4 a c)) 'none]
[(= (* b b) (* 4 a c))
(/ (- b) (* 2 a))]
[(> (* b b) (* 4 a c))
(cons (root-add a b c) (cons (root-desc a b c) empty))]))
;(quadratic-roots 1 2 1) ;-1
;(quadratic-roots 3 4 5) ;'none
(quadratic-roots 3 40 5) ;'(-0.1261943765504725 -13.207138956782861)
```
## 习题 10.1.9
在许多杂货店,收银员需要向顾客报出价格。收银员的计算机对于顾客必须支付的金额,构造含有如下五个元素的表
1.元的数额;
2.如果元的数额是1,这一元素是符号 'dollar,否则就是 'dollars
3.符号and;
4.分的数额;
5.如果分的数额是1,这一元素是符号cent,否则就是'cents。
开发函数 controller,该函数读入一个数,返回如上描述的表。例如,如果金额数是$1.03,那么`( controller 103)`的计算过程如下:
```
(controller 103)
;;预期值
;;(cons 1 (cons dollar (cons and (cons 3(cons cents empty))))
```
提示: Scheme提供了算术操作 quotient和 remainder,对于整数n和m,分别生成n/m的商和余数。
解答
```
; 通过美元价格输出 cons
; 模板
;(define (controller price)
; (cons 美元
; (cons ('dollar 或 'dollars)
; (cons 'and
; (cons 美分
; (cons ('cent 或 'cents) empty))))
;预期
;(cons 1 (cons dollar (cons and (cons 3 (cons cents empty)))))
(define (controller money)
(cons (quotient money 100)
(cons (cond[(= (quotient money 100) 1) 'dollar]
[else 'dollars])
(cons 'and
(cons (remainder money 100)
(cons (cond[(= (remainder money 100) 1) 'cent]
[else 'cents]) empty))))))
(controller 230) ;(list 2 'dollars 'and 30 'cents)
(controller 101) ;(list 1 'dollar 'and 1 'cent)
```
## 习题 10.2.2
给出包含每个物品照片的库存清单的数据定义和结构体定义。说明如何表示图103所示的库存清单。
设计函数 show-picture,该函数读入一个符号(玩具的名字)和一个上述定义的库存清单,函数返回相应的玩具照片,如果库存清单中没有此种玩具,返回 false。
![D05015CE-B155-436F-9C6B-738E77D9D612.png](http://yanxuan.nosdn.127.net/651d7930199a52486d0ef45be656c2ee.png)
解答:
```
; 设置物品的结构体
(define-struct goods (name price pictrue))
; 通过物品名称获取物品照片
(define (shop-symbol? name list-struct)
(cond
[(empty? list-struct) false]
[(symbol=? name (goods-name (first list-struct))) (goods-pictrue (first list-struct))]
[else (shop-symbol? name (rest list-struct)) ]
))
;初始化商店物品
(define list-goods
(cons (make-goods 'robot 29.95 'robot-p)
(cons (make-goods 'doll 11.95 'doll-p)
(cons (make-goods 'rocket 19.95 'rocket-p) empty))))
(shop-symbol? 'robot list-goods ) ;'robot-p
(shop-symbol? 'robot empty) ;#flase
```
';