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

Aus Wikibooks

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;	
}