


The program performs the following key functions:
Takes user input for three product prices, each greater than 0.
Validates that the entered prices are numbers and greater than zero.
Calculates the total bill amount by summing the three product prices.
Applies a discount of 10% on the total amount.
Calculates the final payable amount after discount.
Displays the results:
Price of each product
Total amount before discount
Discount applied
Final payable amount (formatted to 2 decimal places)
Program:
;; Product Discount Calculator
(defun calculate-discount (average total)
"Return discount rate and final amount after discount."
(let ((discount-rate
(cond ((>= average 1000) 0.20)
((>= average 500) 0.10)
((>= average 100) 0.05)
(t 0.0))))
(values discount-rate (* total (- 1 discount-rate)))))
(defun get-valid-price (prompt)
"Ask user for a valid product price (number > 0)."
(format t "~%~A (Enter price > 0): " prompt)
(let ((price (read)))
(if (and (numberp price) (> price 0))
price
(progn
(format t "Invalid price! Please enter a number greater than 0.~%")
(get-valid-price prompt)))))
(defun main ()
(format t "~%Welcome to Product Discount Calculator~%")
;; Get three product prices
(let* ((p1 (get-valid-price "Enter price of Product 1"))
(p2 (get-valid-price "Enter price of Product 2"))
(p3 (get-valid-price "Enter price of Product 3"))
(total (+ p1 p2 p3))
(average (/ total 3.0)))
;; Properly bind discount-rate and final-amount
(multiple-value-bind (discount-rate final-amount)
(calculate-discount average total)
;; Display results
(format t "~%Results:~%")
(format t "Product 1 Price: ~,2F~%" p1)
(format t "Product 2 Price: ~,2F~%" p2)
(format t "Product 3 Price: ~,2F~%" p3)
(format t "Total Price: ~,2F~%" total)
(format t "Average Price: ~,2F~%" average)
(format t "Discount Applied: ~,2F%%~%" (* discount-rate 100))
(format t "Final Payable Amount: ~,2F~%" final-amount))))
;; Run the program
(main)
Output: