Данные, защищенные паролем - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д