1. A BOOLEAN variable can have either a TRUE or FALSE value.
2. Order of operations for Modula-2 Boolean expressions:
First NOT (~)
Second *, /, DIV, MOD, AND (&)
3. (a) FALSE (b) TRUE (c) TRUE (d) TRUE
4. (a) TRUE (b) TRUE (c) TRUE (d) FALSE (e) TRUE (f) FALSE
5. Change to:
IF finished THEN a := a + 1; END;
6.
REPEAT WriteString ("enter a cardinal here ==>"); ReadCard (myCard) flag := ReadResult () = allRight; SkipLine UNTIL ~flag;
7. The count will never equal 0 because decreasing an odd number by 2 will never result in an even number.
8. Unless count is a CARDINAL, nothing is wrong because the count will eventually be less than 0.
9. Variables used in the DEC (or INC) procedure have to be of type INTEGER or CARDINAL.
10. realCount = 0 has to be changed to realCount = 0.0.
11. STextIO:
ReadString: Any read into a compatible variable will be legal because all characters can be part of a string.
ReadChar: Any read will also be all right for the same reason, however only the first character will be read if there is a SkipLine following.
SWholeIO:
ReadCard;
ReadCard (x):
flag := ReadResult () = allRight;
SRealIO:
ReadReal:
12. In the import section...
FROM RealInOut IMPORT Done; IMPORT InOut;
In the code... refer to the first as Done; refer to the second as InOut.Done;
13. Answers may vary.
14. Answers left to the student.
15. (i) Include temporary print statements in the code.
(ii) Test a program with alternate data.
(iii) Hand check results for reasonability.
(iv) Check loops for efficiency and correctness.
(v) Use comments.
(vi) Watch for spelling and punctuation errors.
Note: Not all problems are shown. Most problems are left up students as labs.
(* Created June 10, 1999 Chpater 3 Question 16 ERROR TRAPPING *) MODULE Convert; FROM STextIO IMPORT WriteString, WriteLn, ReadChar, SkipLine; FROM SRealIO IMPORT ReadReal, WriteFixed; FROM SWholeIO IMPORT ReadCard; FROM SIOResult IMPORT ReadResult, ReadResults; VAR option : CARDINAL; toConvert, converted : REAL; exit : CHAR; ok : BOOLEAN; CONST inchFactor = 2.54; (* conversion factor: 1in. = 2.54cm *) BEGIN REPEAT (* Ask to choose what they want to convert *) REPEAT WriteString ("Choose one of the following options:"); WriteLn; WriteString ("1) Convert inches to centimeters."); WriteLn; WriteString ("2) Convert centimeters to inches."); WriteLn; WriteLn; WriteString ("Choice: "); ReadCard (option); ok := ReadResult() = allRight; IF NOT ok THEN WriteString ("Not an option!! Retry"); WriteLn; END; SkipLine; UNTIL ok; (* Get number to convert *) ok := FALSE; WHILE NOT ok DO WriteString ("Enter the amount to convert: "); ReadReal (toConvert); ok := ReadResult() = allRight; IF NOT ok THEN WriteString ("Enter a proper number"); WriteLn; END; SkipLine; END; (* Do calculations and display*) IF option = 1 THEN converted := inchFactor * toConvert; WriteFixed (toConvert, 2, 1); WriteString (" inch(es) is equivalent to"); WriteFixed (converted, 2, 0); WriteString (" centimeters."); ELSE converted := toConvert/inchFactor; WriteFixed (toConvert, 2, 1); WriteString (" centimeters is equivalent to"); WriteFixed (converted, 2, 0); WriteString (" inch(es)."); END; (* For exiting *) ok := FALSE; WriteLn; WriteString ("Enter x to exit or any key run program again "); ReadChar (exit); SkipLine; IF (exit = 'x') OR (exit = 'X') THEN ok := TRUE; END; WriteLn; WriteLn; UNTIL ok; END Convert.
(* Created June.10.1999 Chapter 3 Question 19 NO ERROR TRAPPING *) MODULE Sort3; FROM STextIO IMPORT WriteString, WriteLn, SkipLine; FROM SWholeIO IMPORT ReadCard, WriteCard; CONST fieldLength = 6; VAR num1, num2, num3, temp : CARDINAL; BEGIN (* information *) WriteString ("This program sorts two cardinal numbers from smallest to largest."); WriteLn; (* collect the numbers from the user *) WriteString ("Enter the first number please. ==> "); ReadCard (num1); SkipLine; WriteLn; WriteString ("Enter the second number please. ==> "); ReadCard (num2); SkipLine; WriteLn; WriteString ("Enter the third number please. ==> "); ReadCard (num3); SkipLine; WriteLn; WriteString ("From least to greatest, the numbers are: "); (* Sort them first *) IF num1 > num2 THEN temp := num2; num2 := num1; num1 := temp; END; IF num1 > num3 THEN temp := num3; num3 := num1; num1 := temp; END; IF num2 > num3 THEN temp := num2; num2 := num3; num3 := temp; END; (* Write them out *) WriteCard (num1, fieldLength); WriteString (", "); WriteCard (num2, fieldLength); WriteString (", "); WriteCard (num3, fieldLength); WriteLn; SkipLine; END Sort3.