---------------------------------------------------------------------- --| --| From: Eugene Giuliano --| To: Dr. Levine --| Date: Nov 13, 1996 --| Subj: Calculator, Version III (Working, thanks to you) --| --| Notes: --| This is the third submission of my Calculator program. --| I have several questions regarding my difficulties with it. --| I will prepare handouts for class on Nov 14, 1996. --| If OK with you, perhaps we could have a class discussion. --| If not I will see you privatly. --| Once again, thank you for your help. --| ---------------------------------------------------------------------- --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Calculator.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: Main routine ------------------------------------------------------------------ with TEXT_IO; with CAL_FUNCTIONS; procedure CALCULATOR is type VALUE_TYPE is range -100 .. 100; FIRST_NUMBER : VALUE_TYPE; SECOND_NUMBER : VALUE_TYPE; RESULT : VALUE_TYPE; OPERATION : CHARACTER; REPEAT : BOOLEAN := TRUE; package NEW_CAL_FUNCTIONS is new CAL_FUNCTIONS(VALUE_TYPE => VALUE_TYPE); begin -- Calculator while REPEAT loop NEW_CAL_FUNCTIONS.GET_NUMBER("Enter the first number: ", FIRST_NUMBER); NEW_CAL_FUNCTIONS.GET_OPERATOR(OPERATION); NEW_CAL_FUNCTIONS.GET_NUMBER("Enter the second number: ", SECOND_NUMBER); NEW_CAL_FUNCTIONS.PERFORM_OPERATION(FIRST_NUMBER, SECOND_NUMBER, OPERATION, RESULT); TEXT_IO.PUT(ITEM => "Result = "); NEW_CAL_FUNCTIONS.DATA_IO.PUT(ITEM => RESULT); TEXT_IO.NEW_LINE; NEW_CAL_FUNCTIONS.PROMPT_AGAIN(REPEAT); end loop; end CALCULATOR; --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Cal_Functions_.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: Specification file ------------------------------------------------------------------ with TEXT_IO; generic type VALUE_TYPE is range <>; package CAL_FUNCTIONS is procedure GET_OPERATOR(OPERATOR : out CHARACTER); procedure PROMPT_AGAIN(RESPONSE : out BOOLEAN); procedure GET_NUMBER(PROMPT_STRING : in STRING; DIGIT : out VALUE_TYPE); procedure PERFORM_OPERATION(FIRST_DIGIT : in VALUE_TYPE; SECOND_DIGIT : in VALUE_TYPE; OPERATION : in CHARACTER; RESULT : out VALUE_TYPE); package DATA_IO is new TEXT_IO.INTEGER_IO(VALUE_TYPE); end CAL_FUNCTIONS; --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Cal_Functions.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: Package body ------------------------------------------------------------------ with TEXT_IO; package body CAL_FUNCTIONS is procedure GET_OPERATOR(OPERATOR : out CHARACTER) is separate; procedure PROMPT_AGAIN(RESPONSE : out BOOLEAN) is separate; procedure GET_NUMBER(PROMPT_STRING : in STRING; DIGIT : out VALUE_TYPE) is separate; procedure PERFORM_OPERATION(FIRST_DIGIT : in VALUE_TYPE; SECOND_DIGIT : in VALUE_TYPE; OPERATION : in CHARACTER; RESULT : out VALUE_TYPE) is separate; end CAL_FUNCTIONS; --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Get_Number_.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: Generic speicifier ------------------------------------------------------------------ generic type INPUT_VALUE is range <>; procedure GET_NUMBER(PROMPT_STRING : in STRING; DIGIT : out INPUT_VALUE); --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Get_Number.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: - ------------------------------------------------------------------ with TEXT_IO; separate(CAL_FUNCTIONS) procedure GET_NUMBER(PROMPT_STRING : in STRING; DIGIT : out VALUE_TYPE) is TEMP : VALUE_TYPE; begin -- Get_First_Digit loop begin TEXT_IO.PUT(ITEM => PROMPT_STRING); DATA_IO.GET(ITEM => TEMP); DIGIT := TEMP; exit; exception when CONSTRAINT_ERROR => TEXT_IO.PUT("Value entered is out of range. Please try again."); TEXT_IO.NEW_LINE; when TEXT_IO.DATA_ERROR => TEXT_IO.PUT("Value entered is not an integer. Please try again."); TEXT_IO.NEW_LINE; TEXT_IO.SKIP_LINE; end; end loop; end GET_NUMBER; --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Get_Operator.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: - ------------------------------------------------------------------ with TEXT_IO; separate(CAL_FUNCTIONS) procedure GET_OPERATOR(OPERATOR : out CHARACTER) is TEMP : CHARACTER; RESPONSE_OK : BOOLEAN := FALSE; begin -- Get_Operator while not RESPONSE_OK loop TEXT_IO.PUT(ITEM => "Enter the operator [+,-,*,/]: "); TEXT_IO.GET(ITEM => TEMP); case TEMP is when '+' | '-' | '*' | '/' => OPERATOR := TEMP; RESPONSE_OK := TRUE; when others => TEXT_IO.PUT("Unrecognized operator. Please try again."); TEXT_IO.NEW_LINE; end case; end loop; end GET_OPERATOR; --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Perform_Operation.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: - ------------------------------------------------------------------ with TEXT_IO; separate(CAL_FUNCTIONS) procedure PERFORM_OPERATION(FIRST_DIGIT : in VALUE_TYPE; SECOND_DIGIT : in VALUE_TYPE; OPERATION : in CHARACTER; RESULT : out VALUE_TYPE) is begin -- Perform_Operation case OPERATION is when '+' => RESULT := FIRST_DIGIT + SECOND_DIGIT; when '-' => RESULT := FIRST_DIGIT - SECOND_DIGIT; when '*' => RESULT := FIRST_DIGIT * SECOND_DIGIT; when '/' => RESULT := FIRST_DIGIT / SECOND_DIGIT; when others => RESULT := 0; TEXT_IO.PUT("Unrecognized operator. Please try again."); TEXT_IO.NEW_LINE; end case; exception when CONSTRAINT_ERROR => RESULT := 0; TEXT_IO.PUT("Value generated is out of range. Result set to zero."); TEXT_IO.NEW_LINE; when TEXT_IO.DATA_ERROR => TEXT_IO.PUT("Value entered is not an integer. Please try again."); TEXT_IO.NEW_LINE; TEXT_IO.SKIP_LINE; end PERFORM_OPERATION; --|********************* CUT HERE ************************************ ------------------------------------------------------------------ --| File: Prompt_Again.Ada --| Author: Eugene Giuliano --| Date: Nov 13, 1996 --| Comments: - ------------------------------------------------------------------ with TEXT_IO; separate(CAL_FUNCTIONS) procedure PROMPT_AGAIN(RESPONSE : out BOOLEAN) is TEMP : CHARACTER; RESPONSE_OK : BOOLEAN := FALSE; begin -- Prompt_Again while not RESPONSE_OK loop TEXT_IO.PUT(ITEM => "Perform Another Calculation [Y/N]? "); TEXT_IO.GET(ITEM => TEMP); case TEMP is when 'y' | 'Y' => RESPONSE := TRUE; RESPONSE_OK := TRUE; when 'n' | 'N' => RESPONSE := FALSE; RESPONSE_OK := TRUE; when others => TEXT_IO.PUT("Enter only a 'Y' or 'N'. Please try again."); TEXT_IO.NEW_LINE; end case; end loop; end PROMPT_AGAIN; -- comment by G. Levine -- This is much better. You might improve your exception handling. -- You can't get a Constraint_Error with input, and you should -- probably put an exception handler in the main- perhaps a -- "when others" , incase output fails.