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