C-Programmierung: Aufgaben: Polygonzüge für geometrische Linien
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 ; }