Eiffel "Gocha" #3.B - Min and Max 
Author Message
 Eiffel "Gocha" #3.B - Min and Max

What's wrong with this routine? It's supposed to print two INTEGERs
in ascending order.

   print_ascending(i1, i2: INTEGER) is
      do
         print( i1.min(i2) )
         print( i1.max(i2) )
      end

Answer tomorrow.

Regards,
Roger
--
--
-- Roger Browne, 6 Bambers Walk, Wesham, PR4 3DG, UK | Ph 01772-687525
-- Everything Eiffel: http://www.*-*-*.com/ | +44-1772-687525



Mon, 01 Nov 1999 03:00:00 GMT  
 Eiffel "Gocha" #3.B - Min and Max

Quote:
> What's wrong with this routine? It's supposed to print two INTEGERs
> in ascending order.

>    print_ascending(i1, i2: INTEGER) is
>       do
>          print( i1.min(i2) )
>          print( i1.max(i2) )
>       end

Oops - I simplified it too much and more-or-less removed the "Gocha". The
code above does print the right answer, but not always for quite the right
reasons. Let me try again:

What's wrong with this routine? It's supposed to print the object_id of two
COMPARABLE objects in ascending comparable order (not ascending object_id
order).

   print_ascending(c1: COMPARABLE; c2: like c1) is
      require
         not_void: c1 /= void and c2 /= void
      do
         print( c1.min(c2).object_id.out )
         print( c1.max(c2).object_id.out )
      end

(Don't worry about incidentals like the lack of newlines in the output
format)

Regards,
Roger
--
--
-- Roger Browne, 6 Bambers Walk, Wesham, PR4 3DG, UK | Ph 01772-687525
-- Everything Eiffel: http://www.eiffel.demon.co.uk/ | +44-1772-687525



Mon, 01 Nov 1999 03:00:00 GMT  
 Eiffel "Gocha" #3.B - Min and Max

Quote:
> What's wrong with this routine? It's supposed to print the object_id of two
> COMPARABLE objects in ascending comparable order (not ascending object_id
> order).

>    print_ascending(c1: COMPARABLE; c2: like c1) is
>       require
>          not_void: c1 /= void and c2 /= void
>       do
>          print( c1.min(c2).object_id.out )
>          print( c1.max(c2).object_id.out )
>       end

The "Gocha" is that 'min' and 'max' both return 'current' when both
objects have the same sorting order. So if c1 and c2 are comparably
equal, the object-id for c1 will be printed twice.

For example, suppose we have a class TENNIS_PLAYER
that inherits from COMPARABLE and redefines the comparison operators according
to ranking order. Suppose we print 'name' rather than 'object_id'.

Suppose we call "print_ascending(becker, navratilova)". If Becker is ranked
higher, the routine will print

  Martina Navratilova
  Boris Becker

If Navratilova is ranked higher, the routine will print

  Boris Becker
  Martina Navratilova

But if they are equally ranked, the routine will print

  Boris Becker
  Boris Becker

This is unlikely to be the intended output, hence the "gocha". There would
be no "gocha" if 'min' returned 'current' and 'max' returned 'other' in the
case of equal ranking, but that's not how 'min' and 'max' are specified.

Eiffel compilers differ on whether they allow two objects for which
'is_equal' returns false to nevertheless have equal sorting order from the
point of view of COMPARABLE. In other words, whether "a < b or a > b or
a.is_equal(b)" is ever allowed to be false. ETL suggests that it can be (by
giving tennis rankings as an example - p475), yet the Eiffel Library Standard
Vintage 95 clearly specifies that it can't be - by this postcondition to
'is_equal' in class COMPARABLE:

  trichotomy: result = (not (current < other) and not (other < current))

The behaviour of 'min' and 'max' for comparably-equal 'current' and 'other' is
also rigorously spelled out:

Here's the postcondition for 'min':

  ensure
    current_if_not_greater: (current <= other) implies (result = current)
    other_if_greater: (current > other) implies (result = other)

and here's the postcondition for 'max':

  ensure
    current_if_not_smaller: (current >= other) implies (result = current)
    other_if_smaller: (current < other) implies (result = other)

Regards,
Roger
--
--
-- Roger Browne, 6 Bambers Walk, Wesham, PR4 3DG, UK | Ph 01772-687525
-- Everything Eiffel: http://www.eiffel.demon.co.uk/ | +44-1772-687525



Tue, 02 Nov 1999 03:00:00 GMT  
 
 [ 3 post ] 

 Relevant Pages 

1. Eiffel "Gocha" #6 - forbidden comments

2. Eiffel "Gocha" #5 - null pointers

3. Eiffel "Gocha" #4 - Array items

4. Eiffel "Gocha" #1

5. Eiffel "Gocha" #3

6. string.join(["Tk 4.2p2", "Python 1.4", "Win32", "free"], "for")

7. BEGIN{want[]={"s1o", "s2o", "s2q", "s3q"}

8. "clipping" a signal using MIN() & MAX()

9. Building a "record" in Eiffel

10. Obvious Fake (was "Record in Eiffel")

11. Who is working on "Visual Eiffel"?

12. "Eiffel: The Language" available in French

 

 
Powered by phpBB® Forum Software