C-Programmierung: Aufgaben: Polygonzüge für geometrische Linien

Aus Wikibooks
Wechseln zu: Navigation, Suche

Augabenstellung [Bearbeiten]

Geometrische Linien können stückweise gerade durch Polygonzüge approximiert werden. Eine Linie kann dann so durch eine Menge von Punkten beschrieben, die die Koordinaten der End- und Anfangspunkte der geradem Abschnitte darstellen. Die Punkte eines Polygonzuges sind in einem Array gespeichert, das die maximale Anzahl von N Elementen hat. N soll als symbolische Konstante verwendet werden. Jeder Punkt soll durch eine Strukturvariable, die die x- und y-Koordinaten als Komponenten hat, beschrieben werden. Eine Linie wird also durch einen Vektor, dessen Elemente Strukturen sind, beschrieben.

Entwickeln Sie ein Programm, dass folgende Funktionen beinhaltet.

  • Manuelle Eingabe der Punktkoordinaten eines Polygons.
  • Bestimmung der Länge des Polygons und Ausgabe des Wertes auf dem Bildschirm.
  • Tabellarische Ausgabe der Punktkoordinaten eines Polygons auf dem Bildschrim.

Die Auswahl der Funktionen soll durch ein Menü erfolgen. Verwenden Sie dazu die switch-Konstruktion.

Musterlösung [Bearbeiten]

#include <stdio.h>
#include <math.h>
#define PUNKTE 1000  //Definieren einer Konstanten 
 
 
 
typedef struct koordinate  //Definieren der Structur "POLYGON"
{
    int  x; //kordinate x
    int  y; //kordinate y
} POLYGON;
 
//Deklarieren der Unterfunktionen
int einlesen( POLYGON p[PUNKTE] );              
void ausgabe (int anzahlpunkte,POLYGON p[PUNKTE]);
float berechnung (int anzahlpunkte, POLYGON p[PUNKTE] );
 
 
/* Beginn der Hauptfunktion*/
int main (void)
 
{       
 
    POLYGON p[PUNKTE];
    int anzahlpunkte;
    int menuezahl;
 
 
    printf("Dies ist ein Programm zur Berechnung eines Polygonzuges\n\n");
    do
    {
        /* Eingabe menue*/
        printf("*********************************************************\n");
        printf("*  Sie haben folgende Moeglichkeiten:\t\t\t*\n");
        printf("*  1: Eingabe von Werten zur Berechnung des Polygones\t*\n");
        printf("*  2: Ausgabe der eingegebenen Werte in Tabellenform\t*\n");
        printf("*  3: Berechnen des Polygonzuges\t\t\t*\n");
        printf("*  4: Beenden des Programmes\t\t\t\t*\n");
        printf("*  Bitte geben sie eine Zahl ein!\t\t\t*\n");
        printf("*********************************************************\n");
        scanf("%d",&menuezahl);
 
        switch(menuezahl)
        {
        case 1: //Funktionsaufruf: Einlesen der Punktkoordinaten
            anzahlpunkte = einlesen( p );
            break;
 
        case 2: //Funktionsaufruf: Ausgabe der eingelesenen Werte
            ausgabe(anzahlpunkte,p);
            break;
 
        case 3: //Funktionsaufruf: Berechnung des Polygonzuges
 
            printf("der eingegebene Polygonzug ist %f lang.\n\n",berechnung (anzahlpunkte,p));          
            break;
 
        case 4:  //Beenden der Funktion
            printf("Auf Wiedersehen, benutzen sie dieses Programm bald wieder!\n\n");
            break;
 
        default:  // bei falscher Eingabe
            printf("Ihrer Eingabe konnte kein Menüpunkt zugeordnet werden!\nBitte versuchen sie es erneut.\n");
 
        }
 
    }while(menuezahl!=4); //Ende der Schleife bei Eingabe der Zahl 4
 
    return 0;
}
 
 
int einlesen( POLYGON p[PUNKTE] ) //Funktion: Einlesen der Koordinaten
{
    int zeile;
    int anzahlpunkte;
 
    do
    {
        printf("Bitte geben sie die Anzahl der Punkte des Polygons ein.\nBitte beachten sie, dass es min. 2 Punkte aber max. %i Punkte sein müssen!",PUNKTE);
        scanf("%i",&anzahlpunkte);
 
        // Entscheidung, ob eingegebene Zahl verarbeitet werden kann
        if (anzahlpunkte<2 || anzahlpunkte>PUNKTE)
            printf("falsche eingabe!\n\n");
 
    }while(anzahlpunkte<2 || anzahlpunkte>PUNKTE);
 
 
    for (zeile=0;zeile<anzahlpunkte;zeile++)  //Koordinaten für Berechnung einlesen
    {
        printf(" wert %d fuer x eingeben:",zeile+1);
        scanf("%d",&p[zeile].x);
        printf( " wert %d fuer y eingeben:",zeile+1);
        scanf("%d",&p[zeile].y);
    }
    printf("\n");
    return anzahlpunkte;
}
 
 
// Funktion zur Ausgabe der eingelesenen Punkte
void ausgabe (int anzahlpunkte,POLYGON p[PUNKTE] )
{
    int zeile;
 
    printf("Anzahl\t|   x werte \t|   y werte\n");
    //Schleife zum Auslesen der Struktur und Ausgabe der Tabelle
    for (zeile=0;zeile<anzahlpunkte;zeile++)    
    {
        printf(" %5d\t|\t",zeile+1);
        printf(" %5d\t|\t",p[zeile].x);
        printf(" %5d\n",p[zeile].y);
    }
    printf("\n");
 
}
 
 
//Funktion zum Berechnen des Polygons aus den eingelesenen Werten
float berechnung (int anzahlpunkte, POLYGON p[PUNKTE])
{
    float ergebnis;
    int zeile;
    float c;
 
 
    ergebnis=0;
    //Schleife zum Auslesen und Berechnen der Punkte
    for (zeile=0;zeile<anzahlpunkte-1;zeile++)  
    {
        c = (float)sqrt(pow(p[zeile].x - p[zeile+1].x,2) + pow(p[zeile+1].y - p[zeile].y,2)); //pow(x,y) x^y
        ergebnis+=c;  //Gleichung zum Berechnen des Polygons
    }
    return ergebnis ;   
}