Einlesen, Rechnen und Ausgabe ohne undefiniertes Verhalten

27/06/2015 - 13:03 von Thomas Koenig | Report spam
Hallo miteinander,

mal als Gedankenspiel: Wie müsste ein Programm aussehen, das zwei
Zahlen einliest, mit ihnen eine Rechenoperation durchführt und das
Ergebnis ausgibt, und zwar für verschiedene Standard-Datentypen
(int, float, double). Rechenoperation könnte Addition, Subtraktion,
Multiplikation oder Division sein. Das Ergebnis soll korrekt
sein.

Nebenbedingungen:

a) Die Eingabe soll beliebig sein.

b) Das Programm soll unter keinen Umstànden "undefined behavior"
verwenden

c) Fehlermeldungen bei Überschreitung von Implementierungs-Limits
sind OK.

d) Das Programm soll die vorhandene Breite der Datentypen voll ausnutzen
(also z.B. nicht bei einer Multiplikation von zwei int-Werten eine
Fehlermeldung ausgeben, wenn eine der beiden Zahlen größer als 255
ist).

Deutlich erschwerend wàre noch eine Bedingung

e) Das Programm darf nur den Datentyp verwenden, mit dem auch
gerechnet werden soll.

Spannende Themen wàren z.B:

Integer-Zahlen wie 12345678901234567890123456789012345678901234567890
sollten bei Eingabe eine Fehlermeldung erzeugen, wenn der Datentyp es nicht
packt. Was macht denn scanf() damit...?

Real-Zahlen wie 1.2e345678 bei der Eingabe (ebenso, wwas macht scanf damit)?

Subtraktion von 2147483640 - (-2147483648 )

Division von 1e30 durch 1e-30 bei typischen Float-Implementierungen

Multiplikation von 123456 mit 654321

usw.
 

Lesen sie die antworten

#1 Helmut Schellong
27/06/2015 - 14:23 | Warnen spam
On 06/27/15 13:03, Thomas Koenig wrote:
[...]
Spannende Themen wàren z.B:

Integer-Zahlen wie 12345678901234567890123456789012345678901234567890
sollten bei Eingabe eine Fehlermeldung erzeugen, wenn der Datentyp es nicht
packt. Was macht denn scanf() damit...?




Einerseits ist das gar kein Problem.
Man kann vielfàltig prüfen und Signale abfangen.

Andererseits kann es keine korrekten Ergebnisse geben, wenn der
Input gar nicht (genau) verarbeitet werden kann.

Ich würde nicht einfach so Standard-Funktionen für sowas
verwenden. Ein wenig Mühe geben muß man sich schon.

Lies den Standard und die man-Page zu scanf() ...



Mit freundlichen Grüßen
Helmut Schellong
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm

Ähnliche fragen