3. ANSI-C-Aufgabe: Fließ­komma­arithmetik und Modularisierung

Letztes Update: Dienstag, 16. August 2016 - 16:41 Uhr

Original-Aufgabenstellung:

Winkelfunktionen

Schreibt ein Programm, daß einen Winkel im rechtwinkligen Dreieck an Hand von zwei gegebenen Seitenlängen bestimmt. Das Programm erwartet zu jeder Seite einen Parameter, der anzeigt um welche Seite es sich handelt, und die zu dieser Seite gehörende Länge.

  • Option -a: Länge der Ankathete
  • Option -g: Länge der Gegenkathete
  • Option -y: Länge der Hypotenuse
  • Option -h: Ausgabe der Hilfe

Bei unzulässigen Eingaben oder ähnlichen Fehlern (zu beachten ist z.B., daß immer genau zwei (verschiedene) Seiten mit dazugehöriger Seitenlänge angegeben werden, die Hypotenuse (natürlich) immer länger als eine Kathete ist, Seiten länger als Null sein müssen) soll die Hilfe ausgegeben werden.

Ansonsten soll eine Ausgabe dieser Form erscheinen:

	% ./ueb03 -a 33 -g 45
	Ankathete: 33.00 Gegenkathete: 45.00 -> Winkel: 53.75 Grad
	% ./ueb03 -g 45 -a 33
	Gegenkathete: 45.00 Ankathete: 33.00 -> Winkel: 53.75 Grad
	% ./ueb03 -y 33 -a 32.999999
	Hypotenuse: 33.00 Ankathete: 33.00 -> Winkel: 0.01 Grad
	% ./ueb03 -y 33 -a 32.9999999999999999999999999
	usage: ueb03 [-h, -a "Seitenlaenge", -g "Seitenlaenge", -h "Seitenlaenge"]
	        -h: Hilfe
	        -a: Ankathete
	        -g: Gegenkathete
	        -y: Hypotenuse
	% ./ueb03 -g 45 -a foo
	usage: ueb03 [-h, -a "Seitenlaenge", -g "Seitenlaenge", -h "Seitenlaenge"]
    	        -h: Hilfe
	        -a: Ankathete
	        -g: Gegenkathete
	        -y: Hypotenuse

Alle Zahlen sollen auf zwei Nachkommastellen mathematisch korrekt gerundet werden. Winkel werden in Grad angegeben (kein Bogenmaß). Angegebene Seiten werden in der Ausgabe in der gleichen Reihenfolge wiederholt, wie sie eingegeben wurden. Haltet Euch bei der Ausgabe am besten an die obigen Beispiele, um Fehler beim automatischen Test zu vermeiden ;-)

Modularisierung

In dieser Übung wollen wir nun auch das Konzept der Modularisierung benutzen. Daher implementiert bitte für das Programm diese Schnittstelle.

  • dreieck.c
    Enthält Funktionen zur Berechnung. Das Design dieser Funktionen ist, bis auf die Schnittstelle, noch weitgehend Euch selbst überlassen.
  • dreieck.h
    Enthält Prototypen und Konstanten für die Funktionen aus dreieck.h.
  • ueb03.c
    Enthält z.B. die Funktion main() und bindet die Header-Datei dreieck.h für die Prototypen der Hilfsfunktionen ein.

Es empfiehlt sich auf jeden Fall so weit und so gut es geht auch intern zu modularisieren, da wir vielleicht auf dieser Übung aufbauen werden und es euch die spätere Arbeit vereinfachen wird.

Hinweise

  • Mathematische Funktionen
    Benötigt ihr mathematische Funktionen sucht sie euch aus der entsprechenden Mathebibliothek heraus. Zur Benutzung der mathematischen Funktionen muß der Header math.h eingebunden werden. Unter Unix muss zusätzlich beim Linken des Programms die Mathematik-Bibliothek hinzugelinkt werden. Dazu wird beim Linken die Option -lm benötigt. Fügt diese also eurem Makefile hinzu.

  • Vergleiche bei Fließkommazahlen
    Für den Test auf Null und alle anderen Gleichheitsvergleiche zwischen Fließkommazahlen soll die Konstante DBL_EPSILON aus der Headerdatei float.h benutzt werden.
    Hier ein Beispiel:
    double d1, d2;
    /* ... */
    if (fabs (d1 - d2) < DBL_EPSILON)
      {
        /* d1 und d2 sind gleich */
      }
    else
      {
        /* d1 und d2 sind verschieden */
      }
    if (fabs (d1) < DBL_EPSILON)
      {
        /* d1 ist gleich 0 */
      }
    else
      {
        /* d1 ist ungleich 0 */
      }
    
  • Welcher Winkel soll bestimmt werden
    Es wird immer der Winkel zwischen der Hypotenuse und der Ankathete bestimmt. Schließlich hat die Ankathete ihren Namen daher, weil sie an dem Winkel liegt (im Gegensatz zur Gegenkathete, die dem Winkel gegenüber liegt).

  • Berechnung des Winkels
    Die 3 Formeln sind sehr simpel. Schaut in euren Mathe-Unterlagen oder im Internet nach.

Viel Erfolg!

 

Download Beispiel-Lösungsvorschlag, Quelltext inkl. Projektdateien für VC6 (ZIP-Archiv, 51 KB)

 

Zur Aufgaben-Übersicht

 

Gefällt dir die C Übungsaufgabe? Schreibe doch einen Kommentar...

 

Neuen Kommentar abgeben

d987p