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

Aufgabenstellung

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

Online-Compiler ideone

#include <stdio.h>
#include <math.h>

enum { PUNKTE = 100 };  /* Definieren einer Konstanten */

typedef struct /* Definieren der Struktur POLYGON */
{
    int  x; /* koordinate x */
    int  y; /* koordinate y */
} POLYGON;

/* Funktions-Prototypen */
int einlesen( POLYGON p[PUNKTE] );		
void ausgabe (int anzahlpunkte,POLYGON p[PUNKTE]);
double berechnung (int anzahlpunkte, POLYGON p[PUNKTE] );

int main (void)
{
    POLYGON p[PUNKTE];
    int anzahlpunkte;
    int menuezahl;
	
    puts("Dies ist ein Programm zur Berechnung eines Polygonzuges");
    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 */
            puts("Ihrer Eingabe konnte kein Menüpunkt zugeordnet werden!\n"\
                 "Bitte versuchen sie es erneut.");
			
        }
    }
    while( menuezahl!=4 ); /* Ende der Schleife bei Eingabe der Zahl 4 */
	
    return 0;
}

int einlesen( POLYGON p[PUNKTE] )
{
    int zeile;
    int anzahlpunkte;

    do
    {
        printf("Bitte geben sie die Anzahl der Punkte des Polygons ein.\n"\
               "Bitte beachten sie, dass es min. 2 Punkte aber max. %i Punkte sein müssen!",PUNKTE);
        scanf("%d",&anzahlpunkte);
		
        if (anzahlpunkte<2 || anzahlpunkte>PUNKTE)
            puts("falsche eingabe!");
		
    }
    while(anzahlpunkte<2 || anzahlpunkte>PUNKTE);
	
    for (zeile=0;zeile<anzahlpunkte;zeile++)
    {
        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);
    }
    puts("");
    
    return anzahlpunkte;
}

/* Funktion zur Ausgabe der eingelesenen Punkte */
void ausgabe (int anzahlpunkte,POLYGON p[PUNKTE] )
{
    int zeile;
	
    puts("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);
    }
    puts("");
}

/* Funktion zum Berechnen des Polygons aus den eingelesenen Werten */
double berechnung (int anzahlpunkte, POLYGON p[PUNKTE])
{
    double ergebnis;
    int zeile;

    ergebnis=0;
    /* Schleife zum Auslesen und Berechnen der Punkte */
    for (zeile=0;zeile<anzahlpunkte-1;zeile++)  
    {
    	/* pow(x,y) x^y */
        ergebnis += sqrt(pow(p[zeile].x - p[zeile+1].x,2) + pow(p[zeile+1].y - p[zeile].y,2));
    }
    return ergebnis;	
}