CS 117 Assignment
Due Wednesday, 11/6/96


For this assignment you will write a more sophisticated version of the data processing program you wrote at the beginning of the term.

The input file will look something like this:

Bernice 10 23 443 24 7
Zebediah 4 55 32 1
Agatha 2 34
Neville 32 222 1 3 1 2 2

Note that this time, the name comes first. Also, the number of "scores" listed for each person is variable--Agatha has only two scores here, while Neville has seven. You may assume that no person has more than ten scores, and that there will be no more than 100 people in the data file.

Your task is to read this data file in, and print out two lists of names, maxima, and averages. The first list should be sorted alphabetically by name, and the second should be sorted by average score.

Thus, the output corresponding to the 4-person file example above should look something like this:

Name        Max       Avg
--------------------------
Agatha       34      18.00
Bernice     443     101.40
Neville     222      37.57
Zebediah     55      23.00


Name        Max       Avg
--------------------------
Bernice     443     101.40
Neville     222      37.57
Zebediah     55      23.00
Agatha       34      18.00

This program is big enough that you need to think carefully about how to organize it, what the interfaces of your procedures and functions should look like, and in what order you will implement and test the routines.

Here's a little gift:


{====================================================
	ReadWord reads the next "word" from standard
	input (i.e. the keyboard, or the input file
	specified by "< file" at the Unix command line),
	returning it via the variable parameter "word".
	Here, a word consists of a block of contiguous
	non-space characters.  That is, a word is
	surrounded by spaces, tabs, eoln, or eof.  Note
	that punctuation will be part of a word, and that
	ReadWord will read past eoln when it is searching
	for the next word.

	We'll discuss this rather complicated code in
	class 11/1/96. If you can figure out a simpler way
	to reliably read words in Pascal (taking eof, eoln,
	and leading whitespace into account), I will be
	extremely pleased to see your method.  
 ====================================================}
procedure ReadWord( var word : string );

const	tab = chr(9);     {The tab character has ASCII value 9}
		space = chr(32);  {The space character has ASCII value 32}	

type	stateType = (beforeWord,duringWord,done);
  {See pages 198-200 of Abernethy & Allen to see what
   this is about.}

var		ch : char;
		state : stateType;
begin
	word := '';
	state := beforeWord;

	while state <> done do
	begin
		if eof then
			state := done

		else if eoln then
		begin
			if state = beforeWord then
				readln
			else
				state := done
		end
		
		else
		begin
			read( ch );
			if (ch <> tab) and (ch <> space) then
			begin
				word := word + ch;
				state := duringWord
			end
			
			else if state = duringWord then
				state := done
		end
	end
end;

Start early, stay in touch, and have fun. The interested US citizen might consider getting this done early enough to watch election returns on Tuesday night.



Jeff Ondich, Department of Mathematics and Computer Science, Carleton College, Northfield, MN 55057
(507) 663-4364, jondich@carleton.edu