球拍:为特定产品添加新数量
Racket: add a new quantity to a specific product
代码的目标就是这样。添加新项目后,我需要为我想要的产品添加新数量,并通过使用 set!,我需要新数量真正改变。
(define-struct articulo (nombre cantidadDisponible))
(define listaArticulos empty)
(define (productoNuevo nom can)
(set! listaArticulos
(cons (make-articulo nom can) listaArticulos)))
(define (agregarValor datoABuscar datoASumar)
(local
(
(define (agregar lista buscar valorSumar)
(cond
[(empty? lista)empty]
[(string=? buscar (articulo-nombre (car listaArticulos)))
(make-articulo (+ (articulo-cantidadDisponible(car lista)) valorSumar)
(agregar (cdr lista)buscar valorSumar))]
[else (make-articulo (car lista) (agregar (cdr lista) buscar valorSumar))]
)
)
)
(begin
(set! listaArticulos (agregar listaArticulos datoABuscar datoASumar))
)
)
)
正在向项目列表添加新项目
(productoNuevo "tomatoes" 20)
(productoNuevo "oranges" 20)
然后我需要为我想要的产品添加一个新的数量
(agregarValor "tomatoes" 10)
那我要确认新的数量已经添加了
listaArticulos
输出必须是
(list (make-articulo "oranges" 20) (make-articulo "tomatoes" 30))
而是
(make-articulo 30 (make-articulo 30 '()))
你能帮我解决这个问题吗?
恐怕程序的逻辑不对。这些是主要问题:
- 您需要构建一个新的列表作为输出,然后才
set!
将结果输出到外部列表。
- 第二个和第三个条件都需要重写,所以他们用
cons
构造输出列表。
- 条件为
string=?
的行不正确,你取的是错误列表的car
。
- 调用
make-articulo
时,您忘记传递项目的名称。
这应该可以解决问题:
(define (agregarValor datoABuscar datoASumar)
(local
((define (agregar lista buscar valorSumar)
(cond
[(empty? lista) empty]
[(string=? buscar (articulo-nombre (car lista)))
(cons
(make-articulo (articulo-nombre (car lista))
(+ (articulo-cantidadDisponible (car lista)) valorSumar))
(agregar (cdr lista) buscar valorSumar))]
[else (cons (car lista) (agregar (cdr lista) buscar valorSumar))])))
(begin
(set! listaArticulos (agregar listaArticulos datoABuscar datoASumar)))))
现在它按预期工作了:
(define (print lst)
(for-each (λ (articulo)
(printf "~s: ~s ~n"
(articulo-nombre articulo)
(articulo-cantidadDisponible articulo)))
lst))
(productoNuevo "tomatoes" 20)
(productoNuevo "oranges" 20)
(print listaArticulos)
=> "oranges": 20
"tomatoes": 20
(agregarValor "tomatoes" 10)
(print listaArticulos)
=> "oranges": 20
"tomatoes": 30
代码的目标就是这样。添加新项目后,我需要为我想要的产品添加新数量,并通过使用 set!,我需要新数量真正改变。
(define-struct articulo (nombre cantidadDisponible))
(define listaArticulos empty)
(define (productoNuevo nom can)
(set! listaArticulos
(cons (make-articulo nom can) listaArticulos)))
(define (agregarValor datoABuscar datoASumar)
(local
(
(define (agregar lista buscar valorSumar)
(cond
[(empty? lista)empty]
[(string=? buscar (articulo-nombre (car listaArticulos)))
(make-articulo (+ (articulo-cantidadDisponible(car lista)) valorSumar)
(agregar (cdr lista)buscar valorSumar))]
[else (make-articulo (car lista) (agregar (cdr lista) buscar valorSumar))]
)
)
)
(begin
(set! listaArticulos (agregar listaArticulos datoABuscar datoASumar))
)
)
)
正在向项目列表添加新项目
(productoNuevo "tomatoes" 20)
(productoNuevo "oranges" 20)
然后我需要为我想要的产品添加一个新的数量
(agregarValor "tomatoes" 10)
那我要确认新的数量已经添加了
listaArticulos
输出必须是
(list (make-articulo "oranges" 20) (make-articulo "tomatoes" 30))
而是
(make-articulo 30 (make-articulo 30 '()))
你能帮我解决这个问题吗?
恐怕程序的逻辑不对。这些是主要问题:
- 您需要构建一个新的列表作为输出,然后才
set!
将结果输出到外部列表。 - 第二个和第三个条件都需要重写,所以他们用
cons
构造输出列表。 - 条件为
string=?
的行不正确,你取的是错误列表的car
。 - 调用
make-articulo
时,您忘记传递项目的名称。
这应该可以解决问题:
(define (agregarValor datoABuscar datoASumar)
(local
((define (agregar lista buscar valorSumar)
(cond
[(empty? lista) empty]
[(string=? buscar (articulo-nombre (car lista)))
(cons
(make-articulo (articulo-nombre (car lista))
(+ (articulo-cantidadDisponible (car lista)) valorSumar))
(agregar (cdr lista) buscar valorSumar))]
[else (cons (car lista) (agregar (cdr lista) buscar valorSumar))])))
(begin
(set! listaArticulos (agregar listaArticulos datoABuscar datoASumar)))))
现在它按预期工作了:
(define (print lst)
(for-each (λ (articulo)
(printf "~s: ~s ~n"
(articulo-nombre articulo)
(articulo-cantidadDisponible articulo)))
lst))
(productoNuevo "tomatoes" 20)
(productoNuevo "oranges" 20)
(print listaArticulos)
=> "oranges": 20
"tomatoes": 20
(agregarValor "tomatoes" 10)
(print listaArticulos)
=> "oranges": 20
"tomatoes": 30