------------------------------------------------------------------ --| File: Calculator.Ada --| Comments: Main routine --| Author: Eugene Giuliano ------------------------------------------------------------------ with TEXT_IO; with CAL_TEXT_IO; with CAL_FUNCTIONS; procedure CALCULATOR is FIRST_NUMBER : CAL_FUNCTIONS.VALUE_TYPE := 0; SECOND_NUMBER : CAL_FUNCTIONS.VALUE_TYPE := 0; RESULT : CAL_FUNCTIONS.VALUE_TYPE := 0; OPERATION : CHARACTER := '+'; REPEAT : BOOLEAN := TRUE; begin -- Calculator while REPEAT loop CAL_FUNCTIONS.GET_NUMBER("first", FIRST_NUMBER); CAL_FUNCTIONS.GET_OPERATOR(OPERATION); CAL_FUNCTIONS.GET_NUMBER("second", SECOND_NUMBER); CAL_FUNCTIONS.PERFORM_OPERATION(FIRST_NUMBER, SECOND_NUMBER, OPERATION, RESULT); TEXT_IO.PUT(ITEM => "Result = "); CAL_TEXT_IO.DATA_IO.PUT(ITEM => RESULT); TEXT_IO.NEW_LINE; CAL_FUNCTIONS.PROMPT_AGAIN(REPEAT); end loop; end CALCULATOR; ------------------------------------------------------------------ --| File: Cal_Functions_.Ada --| Comments: Specification file - DEC convention, --| use .ads for gnat compiler --| Author: Eugene Giuliano ------------------------------------------------------------------ package CAL_FUNCTIONS is type VALUE_TYPE is range -32768 .. 32767; procedure GET_OPERATOR(OPERATOR : out CHARACTER); procedure PROMPT_AGAIN(RESPONSE : out BOOLEAN); procedure GET_NUMBER(WORD : 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); end CAL_FUNCTIONS; ------------------------------------------------------------------ --| File: Cal_Functions.Ada --| Comments: Package body --| Author: Eugene Giuliano ------------------------------------------------------------------ package body CAL_FUNCTIONS is procedure GET_OPERATOR(OPERATOR : out CHARACTER) is separate; procedure PROMPT_AGAIN(RESPONSE : out BOOLEAN) is separate; procedure GET_NUMBER(WORD : 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; ------------------------------------------------------------------ --| File: Cal_Text_IO_.Ada --| Comments: Package spec (DEC convention) use .abs for gnat --| Author: Eugene Giuliano ------------------------------------------------------------------ with TEXT_IO; with CAL_FUNCTIONS; package CAL_TEXT_IO is package DATA_IO is new TEXT_IO.INTEGER_IO(CAL_FUNCTIONS.VALUE_TYPE); end CAL_TEXT_IO; ------------------------------------------------------------------ --| File: Get_Operator_.Ada --| Comments: Generic speicifier (DEC Convention) --| Author: Eugene Giuliano ------------------------------------------------------------------ generic type INPUT_VALUE is range <>; procedure GET_NUMBER(WORD : in STRING; DIGIT : out INPUT_VALUE); ------------------------------------------------------------------ --| File: Get_Number.Ada --| Comments: - --| Author: Eugene Giuliano ------------------------------------------------------------------ with TEXT_IO; with CAL_TEXT_IO; separate(CAL_FUNCTIONS) procedure GET_NUMBER(WORD : in STRING; DIGIT : out VALUE_TYPE) is TEMP : VALUE_TYPE; begin -- Get_First_Digit loop begin TEXT_IO.PUT(ITEM => "Enter the "); TEXT_IO.PUT(ITEM => WORD); TEXT_IO.PUT(ITEM => " number: "); CAL_TEXT_IO.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; ------------------------------------------------------------------ --| File: Get_Operator.Ada --| Comments: - --| Author: Eugene Giuliano ------------------------------------------------------------------ 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; ------------------------------------------------------------------ --| File: Perform_Operation.Ada --| Comments: - --| Author: Eugene Giuliano ------------------------------------------------------------------ with TEXT_IO; separate(CAL_FUNCTIONS) procedure PERFORM_OPERATION(FIRST_DIGIT : in CAL_FUNCTIONS.VALUE_TYPE; SECOND_DIGIT : in CAL_FUNCTIONS.VALUE_TYPE; OPERATION : in CHARACTER; RESULT : out CAL_FUNCTIONS.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; ------------------------------------------------------------------ --| File: Prompt_Again.Ada --| Comments: - --| Author: Eugene Giuliano ------------------------------------------------------------------ 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;