1. (25 Points) Given a number of scores, in the range 1-100, we want to print them out in 5 columns. The first column will have the scores in the range 1-20, the second the scores in the range 21-40, the third the scores in the range 41-60, the fourth the scores in the range 61-80 and the fifth the scores in the range 81-100.

Sample run:

   How many scores ? 7
   Enter 7 scores: 32 77 80 55 19 95 66
 
32
 
 
 
 
 
 
77
 
 
 
 
80
 
 
 
55
 
 
19
 
 
 
 
 
 
 
 
95
 
 
 
66
 
Hints, hints, hints:


   PROGRAM Test;

   { Arrange scores in 5 columns }

   USES Crt;

   VAR score, howMany, index, column : integer;

   BEGIN

      ClrScr;

      write('How many scores ? ');
      readln(howMany);
      write('Enter ', howMany,' scores: ');

      { Loop through scores }

      FOR index := 1 TO howMany DO
      BEGIN
      
         { Read one score at a time and process }
	 
	 read(score);

	 { To get the column: a) subtract 1 to score (for end points) }
	 {                    b) DIV by 20 and add 1}

	 column := (score - 1) DIV 20 + 1;
	 writeln(score:(column*4));

      END;

   END.


2. (25 points) We want to produce the 16 bit binary representation of an unsigned integer in the range 0-65535. To obtain the binary representation, in reverse order, you repeatedly do the following operations:

Sample run:

   Enter number: 77
   Reversed binary: 1011001000000000
Notes:


   PROGRAM Binary;
   { Output 16 bit binary version of number in reverse order }
   
   USES Crt;

   VAR number : word;       { number unsigned 16 bit integer }
       index  : integer;

   BEGIN
      ClrScr;

      write('Enter number: ');
      readln(number);
      write('Reverse binary: ');

      { Loop through the 16 bits }
      
      FOR index := 1 TO 16 DO
      BEGIN

         { Display 1 for odd, 0 for even }

         write(number MOD 2);

	 { Update number }

	 number := number DIV 2;

      END;

      writeln;
   END.


3. (20 points) What does the following code produce ?

   PROGRAM Test;
   VAR ind1, ind2, ind3 :  integer;
   BEGIN
      FOR ind1 := 1 TO 4 DO
         FOR ind2 := 1 TO 4 DO
         BEGIN
            FOR ind3 := 1 TO (ind1 * ind2) DO
               write('+');
         END;
   END.


   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Those are 100 (10+20+30+40) '+'.


4. (15 points) The following code contains at least 5 syntax errors. Identify the line number and the error.

   1. PROGRAM Test;
   2. VAR value, limit : real;
   3.    index, test   : integer;
   4. BEGIN
   5.    value := 50;
   6.    readln('limit');
   7.    FOR index := 1 TO limit DO
   8.    BEGIN
   9.       test := index * value;
  10.       writeln(test:4:1);
  11.    END;
  12. END.

Number Line Error
1.     Cannot use same name (test) for program and for variable.
2.     Cannot use a constant string as argument to readln.
3.     limit is a real and cannot be used as the end value of a FOR loop.
4.     The operation index * value returns a real and test is an integer variable.
5. 10    test is an integer variable, the precision qualifier in writeln can be used only with reals.


5. (15 Points)

i What is the value of the following expression ?  4.0   
  (12 - 3) DIV (17 MOD 6) * (8 / 2)  
     
ii How many times does the following loop execute ?  11    
  FOR I := 10 DOWNTO (33 MOD 11) DO  
     
iii How many times does the following loop execute ?  4     
  FOR I := 'a' TO CHR(ORD('b')+2) DO  
     
iv Given the following input:  
 
4 Valerio 63
42.1 a
   
 
  What will be the value of r after the following satements ?  2.1   
 
VAR n    : string[20];
    c, b : char;
    r    : real;
    a    : integer;
...
   readln(a, n);
   read(c, r, b);
   
 
v Given the following input:  
 
53.0 3 2
b
4
   
 
  What will be the value of c1 after the following satements ?  b     
 
VAR c1, c2 : char;
    r      : real;
    i1, i2 : integer;
...
   read(r);
   read(i1);
   readln(i2);
   readln(c1);
   readln(c2);