Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- #include <string.h>
- #include <locale.h>
- #define PATH_MAX 4096 /* # chars in a path name including nul */
- #define MAXPUNKTE 6
- void Menu2(double *feldX, double *feldY, int *pFeldLen);
- void DatenAufnehmen(double *feldX, double *feldY, int *pFeldLen);
- void DatenAusgeben(double *feldX, double *feldY, int *pFeldLen);
- void DatenKorrigieren(double *feldX, double *feldY, int *pFeldLen);
- void DatenSpeichern(double *feldX, double *feldY, int *pFeldLen);
- void DatenLaden(double *feldX, double *feldY, int *pFeldLen);
- void DatenBerechnen(double *feldX, double *feldY, int *pFeldLen);
- void DatenGenerieren(double *feldX, double *feldY, int *pFeldLen);
- int main(void)
- {
- double feldX[MAXPUNKTE];
- double feldY[MAXPUNKTE];
- int feldLen = 0;
- setlocale(LC_ALL, "de_DE");
- Menu2(feldX, feldY, &feldLen);
- printf("bye...\n");
- }
- void DrawMenu()
- {
- printf("\n");
- printf("Berechnung eines Flächeninhalts\n");
- printf("===============================\n");
- printf("(1) Daten aufnehmen\n");
- printf("(2) Daten ausgeben\n");
- printf("(3) Daten korrigieren\n");
- printf("(4) Daten speichern\n");
- printf("(5) Daten laden\n");
- printf("(6) Flächeninhalt ermitteln\n");
- printf("(7) Testdaten generieren\n");
- printf("(0) Ende [ESC]\n");
- printf("Treffen Sie eine Wahl:\n");
- }
- void Menu2(double *feldX, double *feldY, int *pFeldLen)
- {
- char key;
- DrawMenu();
- do
- {
- key = getch();
- if (key == '1')
- {
- DatenAufnehmen(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- else if (key == '2')
- {
- DatenAusgeben(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- else if (key == '3')
- {
- DatenKorrigieren(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- else if (key == '4')
- {
- DatenSpeichern(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- else if (key == '5')
- {
- DatenLaden(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- else if (key == '6')
- {
- DatenBerechnen(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- else if (key == '7')
- {
- DatenGenerieren(feldX, feldY, pFeldLen);
- DrawMenu();
- }
- } while (key != '0' && key != 27);
- }
- int LeseIntZahl(char *queryText)
- {
- int input;
- int scanned;
- do
- {
- printf("%s", queryText);
- scanned = scanf("%d", &input);
- if (scanned != 1) {
- printf("ERROR: Ungültige Eingabe. Bitte geben Sie eine gültige Zahl ein.\n");
- }
- while (getchar() != '\n'); // clear the input buffer
- } while (scanned != 1);
- return input;
- }
- double LeseDoubleZahl(char *queryText)
- {
- double input;
- int scanned;
- do
- {
- printf("%s", queryText);
- scanned = scanf("%lf", &input);
- if (scanned != 1) {
- printf("ERROR: Ungültige Eingabe. Bitte geben Sie eine gültige Zahl ein.\n");
- }
- while (getchar() != '\n'); // clear the input buffer
- } while (scanned != 1);
- return input;
- }
- // 2do: Diese Funktion sieht viel zu kompliziert aus. Ich brauche wieder scanf. Keine Ahnung wie ich das mit dem Array-Zurück-Geben lösen soll. Naja, jetzt nich mein Problem. Das löse ich ein ander mal noch.
- void LeseStringWert_old(char *text, char *ziel, int maxLaenge) {
- do {
- printf("%s", text);
- fgets(ziel, maxLaenge, stdin);
- // Entferne das newline-Zeichen am Ende des Strings
- size_t laenge = strlen(ziel);
- if (laenge > 0 && ziel[laenge - 1] == '\n') {
- ziel[laenge - 1] = '\0';
- }
- // Überprüfe, ob der eingegebene Pfad gültig ist
- if (ziel[0] == '\0' || ziel[0] == '\n') {
- printf("Ungültiger Pfad. Bitte geben Sie einen gültigen Pfad ein.\n");
- }
- else {
- break;
- }
- } while (1);
- }
- void LeseStringWert(char *ziel, int maxLaenge) {
- fgets(ziel, maxLaenge, stdin);
- // Entferne das newline-Zeichen am Ende des Strings
- size_t laenge = strlen(ziel);
- if (laenge > 0 && ziel[laenge - 1] == '\n') {
- ziel[laenge - 1] = '\0';
- printf("DEBUG: Entferne das newline-Zeichen am Ende des Strings\n");
- }
- }
- void DatenAufnehmen(double *feldX, double *feldY, int *pFeldLen)
- {
- printf("\n");
- printf("(1) Daten aufnehmen: (Ende: Ersten Punkt noch einmal eingeben)\n");
- printf("-------------------\n");
- int c = 0;
- double readX;
- double readY;
- char text[32];
- do
- {
- // X-Wert
- sprintf(text, "%3i. Punkt: x : ", c + 1);
- readX = LeseDoubleZahl(text);
- // Y-Wert
- sprintf(text, " y : ");
- readY = LeseDoubleZahl(text);
- printf("%lf %lf\n", readX, readY);
- if (c > 0 && readX == feldX[0] && readY == feldY[0])
- {
- if (c <= 2) {
- printf("ERROR! Es müssen mindestens drei Punkte eingegeben werden.\n");
- continue; // Diesen Wert werden wir NICHT speichern!
- }
- else {
- *pFeldLen = c;
- break; // wir haben genug
- }
- }
- // Info: nur speichern wenn wir noch nicht genug hatten
- feldX[c] = readX;
- feldY[c] = readY;
- c++;
- } while (c < MAXPUNKTE);
- if (c >= MAXPUNKTE) {
- printf("WARNUNG! Das Array ist voll. Die Eingabe wird beendet.\n");
- *pFeldLen = MAXPUNKTE;
- }
- printf("Es wurden %d Punkte eingegeben.\n", *pFeldLen);
- }
- void DatenAusgeben(double *feldX, double *feldY, int *pFeldLen)
- {
- // 2do: "Bei der Funktion ausgabe() soll nach jeweils zehnn Punkten und am Ende der Ausgabe auf das Betätigen der Enter - Taste gewartet werden."
- printf("\n");
- printf("(2) Daten ausgeben:\n");
- printf("-------------------\n");
- if (*pFeldLen == 0)
- {
- printf("ERROR! Es gibt noch keine Punkte.\n");
- }
- printf("Wir haben %i Punke.\n", *pFeldLen);
- for (int i = 0; i < *pFeldLen; i++)
- {
- printf("%3i. Punkt: x : %lf\n", i + 1, feldX[i]);
- printf(" y : %lf\n", feldY[i]);
- }
- }
- void DatenKorrigieren(double *feldX, double *feldY, int *pFeldLen) {
- printf("\n");
- printf("(3) Daten korrigieren:\n");
- printf("----------------------\n");
- int index;
- do {
- index = LeseIntZahl("Welchen Punkt wollen Sie korrigieren (0 für Ende): ");
- if (index == 0) {
- printf("Korrekturen beendet.\n");
- break;
- }
- if (index < 1 || index > *pFeldLen) {
- printf("Ungültiger Punkt. Bitte geben Sie einen gültigen Punkt ein. (1 bis %d)\n", MAXPUNKTE);
- continue;
- }
- printf("Alter x-Wert = %.2lf\n", feldX[index - 1]);
- double neuerX = LeseDoubleZahl("Neuer x-Wert : ");
- printf("Alter y-Wert = %.2lf\n", feldY[index - 1]);
- double neuerY = LeseDoubleZahl("Neuer y-Wert : ");
- feldX[index - 1] = neuerX;
- feldY[index - 1] = neuerY;
- } while (index != 0);
- }
- void DatenSpeichern(double *feldX, double *feldY, int *pFeldLen) {
- printf("\n");
- printf("(4) Daten speichern:\n");
- printf("--------------------\n");
- printf("Pfadname (Default: koord.txt):");
- char dateipfad[PATH_MAX];
- LeseStringWert(dateipfad, PATH_MAX);
- if (dateipfad[0] == '\0') {
- strcpy(dateipfad, "koord.txt");
- }
- FILE *datei = fopen(dateipfad, "w");
- if (datei == NULL) {
- printf("FEHLER: Die Datei %s konnte nicht zum Schreiben geöffnet werden.\n", dateipfad);
- return;
- }
- for (int i = 0; i < *pFeldLen; i++) {
- fprintf(datei, "%.2lf %.2lf\n", feldX[i], feldY[i]);
- }
- fclose(datei);
- printf("Es wurden %d Wertepaare in %s gespeichert.\n", *pFeldLen, dateipfad);
- }
- void DatenLaden(double *feldX, double *feldY, int *pFeldLen) {
- printf("\n");
- printf("(5) Daten laden:\n");
- printf("--------------------\n");
- printf("Pfadname (Default: koord.txt):");
- char dateipfad[PATH_MAX];
- LeseStringWert(dateipfad, PATH_MAX);
- if (dateipfad[0] == '\0') {
- strcpy(dateipfad, "koord.txt");
- }
- FILE *datei = fopen(dateipfad, "r");
- if (datei == NULL) {
- printf("FEHLER: Die Datei %s konnte nicht zum Lesen geöffnet werden.\n", dateipfad);
- return;
- }
- int c = 0;
- while (fscanf(datei, "%lf %lf", &feldX[c], &feldY[c]) == 2) {
- c++;
- if (c >= MAXPUNKTE) {
- printf("WARNUNG: Das Array ist voll. Die Daten werden nur bis zum Maximum von %d gelesen.\n", MAXPUNKTE);
- break;
- }
- }
- *pFeldLen = c;
- fclose(datei);
- printf("Es wurden %d Wertepaare aus %s geladen.\n", *pFeldLen, dateipfad);
- }
- void DatenBerechnen(double *feldX, double *feldY, int *pFeldLen) {
- double summeXiYiPlus1 = 0.0;
- double summeXiPlus1Yi = 0.0;
- for (int i = 0; i < *pFeldLen; i++) {
- int naechsterIndex = (i + 1) % *pFeldLen; // Berücksichtige den Spezialfall für den letzten Punkt
- summeXiYiPlus1 += feldX[naechsterIndex] * feldY[i];
- summeXiPlus1Yi += feldX[i] * feldY[naechsterIndex];
- }
- double flaecheninhalt = (summeXiYiPlus1 - summeXiPlus1Yi) / 2.0;
- printf("Flächeninhalt: %.2lf\n", flaecheninhalt);
- }
- // 2do: DEBUG-Only, remove later
- void DatenGenerieren(double *feldX, double *feldY, int *pFeldLen) {
- if (MAXPUNKTE >= 4)
- {
- // 2do: DB löschen-Abfrage
- feldX[0] = 2;
- feldY[0] = 1;
- feldX[1] = 3;
- feldY[1] = 8;
- feldX[2] = 5;
- feldY[2] = 7;
- feldX[3] = 6;
- feldY[3] = 4;
- *pFeldLen = 4;
- printf("Info: Es wurden %d Testdaten generiert. Der Flächeninhalt sollte 15 sein.\n", *pFeldLen);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement