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