Данные, защищенные паролем - Lisp

Узнай цену своей работы

Формулировка задачи:

Недавно начала изучать лисп и столкнулась с такой проблемой: Есть процедура make-account которая создает счета, защищенные паролем. Непосредственно, что делать с самой процедурой я понимаю, а вот как защитить ее паролем - не совсем. Объясните, пожалуйста)) Вот код, но он не работает((
#lang racket
(define (make-account balance password)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Недостаточно денег на счете"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
  
       (define (secret-password sp)
         (cond ((= password sp)
              secret-password)
               (else (error "Неверный пароль"))))
  
(define (dispatch m)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
 
       ((eq? m 'secret-password) secret-password)
 
(else (error "Неизвестный вызов -- MAKE-ACCOUNT"
m))))
dispatch)
 
(define acc (make-account 100 'secret-password))

Решение задачи: «Данные, защищенные паролем»

textual
Листинг программы
(define (make-account balance password)
  (define (wrong-passwd arg) "Incorrect password")
  (define (withdraw amount)
    (if (>= balance amount)
           (begin (set! balance (- balance amount))
                  balance)
       "Insufficient funds"))
    (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch passwrd m)
    (if (eq? passwrd password)
      (cond ((eq? m 'withdraw) withdraw)
              ((eq? m 'deposit) deposit)
              (else (error "Unknown request -- MAKE-ACCOUNT"
                m)))
       wrong-passwd))
  dispatch)
 
(define acc (make-account 100 'secret-password))
 
(display ((acc 'secret-password 'withdraw) 40)) (newline)
(display ((acc 'secret-password 'withdraw) 40)) (newline)
(display ((acc 'secret-password 'withdraw) 40)) (newline)
(display ((acc 'some-other-password 'deposit) 50)) (newline)

Объяснение кода листинга программы

В коде определена функция make-account, которая принимает два аргумента: balance (баланс счёта) и password (пароль). Внутри функции определены три вспомогательные функции:

  1. wrong-passwd (ошибочный пароль) — возвращает строку Incorrect password.
  2. withdraw (снятие средств) — принимает аргумент amount (сумма снятия). Если на счёте достаточно средств, то функция уменьшает баланс на снятую сумму и возвращает новую величину баланса. В противном случае возвращается строка Insufficient funds.
  3. deposit (внесение средств) — принимает аргумент amount (сумма внесения). Функция увеличивает баланс на внесённую сумму и возвращает новую величину баланса. Также в коде определена функция dispatch (диспетчер), которая принимает два аргумента: passwrd (пароль) и m (код операции). Если пароль верный, то функция в зависимости от кода операции вызывает соответствующую функцию: withdraw или deposit. В противном случае возвращается строка Incorrect password. В основной части кода создаётся экземпляр счёта с балансом 100 и паролем 'secret-password'. Затем с помощью функции display выводятся результаты выполнения функций withdraw и deposit для данного экземпляра счёта и пароля 'secret-password'. Также выводится результат выполнения функции dispatch для пароля 'some-other-password' и кода операции deposit.

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы