Advertisement
TRToC

Untitled

Oct 18th, 2023
1,023
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.78 KB | Source Code | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <locale.h>
  5.  
  6. #define PATH_MAX    4096    /* # chars in a path name including nul */
  7. #define MAXPUNKTE   6
  8.  
  9. void Menu2(double *feldX, double *feldY, int *pFeldLen);
  10. void DatenAufnehmen(double *feldX, double *feldY, int *pFeldLen);
  11. void DatenAusgeben(double *feldX, double *feldY, int *pFeldLen);
  12. void DatenKorrigieren(double *feldX, double *feldY, int *pFeldLen);
  13. void DatenSpeichern(double *feldX, double *feldY, int *pFeldLen);
  14. void DatenLaden(double *feldX, double *feldY, int *pFeldLen);
  15. void DatenBerechnen(double *feldX, double *feldY, int *pFeldLen);
  16. void DatenGenerieren(double *feldX, double *feldY, int *pFeldLen);
  17.  
  18.  
  19. int main(void)
  20. {
  21.     double feldX[MAXPUNKTE];
  22.     double feldY[MAXPUNKTE];
  23.     int feldLen = 0;
  24.  
  25.     setlocale(LC_ALL, "de_DE");
  26.     Menu2(feldX, feldY, &feldLen);
  27.     printf("bye...\n");
  28. }
  29.  
  30. void DrawMenu()
  31. {
  32.     printf("\n");
  33.     printf("Berechnung eines Flächeninhalts\n");
  34.     printf("===============================\n");
  35.     printf("(1) Daten aufnehmen\n");
  36.     printf("(2) Daten ausgeben\n");
  37.     printf("(3) Daten korrigieren\n");
  38.     printf("(4) Daten speichern\n");
  39.     printf("(5) Daten laden\n");
  40.     printf("(6) Flächeninhalt ermitteln\n");
  41.     printf("(7) Testdaten generieren\n");
  42.     printf("(0) Ende [ESC]\n");
  43.     printf("Treffen Sie eine Wahl:\n");
  44. }
  45.  
  46. void Menu2(double *feldX, double *feldY, int *pFeldLen)
  47. {
  48.     char key;
  49.     DrawMenu();
  50.     do
  51.     {
  52.         key = getch();
  53.         if (key == '1')
  54.         {
  55.             DatenAufnehmen(feldX, feldY, pFeldLen);
  56.             DrawMenu();
  57.         }
  58.         else if (key == '2')
  59.         {
  60.             DatenAusgeben(feldX, feldY, pFeldLen);
  61.             DrawMenu();
  62.         }
  63.         else if (key == '3')
  64.         {
  65.             DatenKorrigieren(feldX, feldY, pFeldLen);
  66.             DrawMenu();
  67.         }
  68.         else if (key == '4')
  69.         {
  70.             DatenSpeichern(feldX, feldY, pFeldLen);
  71.             DrawMenu();
  72.         }
  73.         else if (key == '5')
  74.         {
  75.             DatenLaden(feldX, feldY, pFeldLen);
  76.             DrawMenu();
  77.         }
  78.         else if (key == '6')
  79.         {
  80.             DatenBerechnen(feldX, feldY, pFeldLen);
  81.             DrawMenu();
  82.         }
  83.         else if (key == '7')
  84.         {
  85.             DatenGenerieren(feldX, feldY, pFeldLen);
  86.             DrawMenu();
  87.         }
  88.  
  89.     } while (key != '0' && key != 27);
  90. }
  91.  
  92. int LeseIntZahl(char *queryText)
  93. {
  94.     int input;
  95.     int scanned;
  96.     do
  97.     {
  98.         printf("%s", queryText);
  99.         scanned = scanf("%d", &input);
  100.         if (scanned != 1) {
  101.             printf("ERROR: Ungültige Eingabe. Bitte geben Sie eine gültige Zahl ein.\n");
  102.         }
  103.         while (getchar() != '\n'); // clear the input buffer
  104.     } while (scanned != 1);
  105.     return input;
  106. }
  107.  
  108. double LeseDoubleZahl(char *queryText)
  109. {
  110.     double input;
  111.     int scanned;
  112.     do
  113.     {
  114.         printf("%s", queryText);
  115.         scanned = scanf("%lf", &input);
  116.         if (scanned != 1) {
  117.             printf("ERROR: Ungültige Eingabe. Bitte geben Sie eine gültige Zahl ein.\n");
  118.         }
  119.         while (getchar() != '\n'); // clear the input buffer
  120.     } while (scanned != 1);
  121.     return input;
  122. }
  123.  
  124. // 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.
  125. void LeseStringWert_old(char *text, char *ziel, int maxLaenge) {
  126.     do {
  127.         printf("%s", text);
  128.         fgets(ziel, maxLaenge, stdin);
  129.  
  130.         // Entferne das newline-Zeichen am Ende des Strings
  131.         size_t laenge = strlen(ziel);
  132.         if (laenge > 0 && ziel[laenge - 1] == '\n') {
  133.             ziel[laenge - 1] = '\0';
  134.         }
  135.  
  136.         // Überprüfe, ob der eingegebene Pfad gültig ist
  137.         if (ziel[0] == '\0' || ziel[0] == '\n') {
  138.             printf("Ungültiger Pfad. Bitte geben Sie einen gültigen Pfad ein.\n");
  139.         }
  140.         else {
  141.             break;
  142.         }
  143.     } while (1);
  144. }
  145.  
  146. void LeseStringWert(char *ziel, int maxLaenge) {
  147.     fgets(ziel, maxLaenge, stdin);
  148.  
  149.     // Entferne das newline-Zeichen am Ende des Strings
  150.     size_t laenge = strlen(ziel);
  151.     if (laenge > 0 && ziel[laenge - 1] == '\n') {
  152.         ziel[laenge - 1] = '\0';
  153.         printf("DEBUG: Entferne das newline-Zeichen am Ende des Strings\n");
  154.     }
  155. }
  156.  
  157. void DatenAufnehmen(double *feldX, double *feldY, int *pFeldLen)
  158. {
  159.     printf("\n");
  160.     printf("(1) Daten aufnehmen: (Ende: Ersten Punkt noch einmal eingeben)\n");
  161.     printf("-------------------\n");
  162.     int c = 0;
  163.     double readX;
  164.     double readY;
  165.     char text[32];
  166.     do
  167.     {
  168.         // X-Wert
  169.         sprintf(text, "%3i. Punkt: x : ", c + 1);
  170.         readX = LeseDoubleZahl(text);
  171.  
  172.         // Y-Wert
  173.         sprintf(text, "            y : ");
  174.         readY = LeseDoubleZahl(text);
  175.  
  176.         printf("%lf %lf\n", readX, readY);
  177.         if (c > 0 && readX == feldX[0] && readY == feldY[0])
  178.         {
  179.             if (c <= 2) {
  180.                 printf("ERROR! Es müssen mindestens drei Punkte eingegeben werden.\n");
  181.                 continue; // Diesen Wert werden wir NICHT speichern!
  182.             }
  183.             else {
  184.                 *pFeldLen = c;
  185.                 break; // wir haben genug
  186.             }
  187.         }
  188.  
  189.         // Info: nur speichern wenn wir noch nicht genug hatten
  190.         feldX[c] = readX;
  191.         feldY[c] = readY;
  192.         c++;
  193.     } while (c < MAXPUNKTE);
  194.  
  195.     if (c >= MAXPUNKTE) {
  196.         printf("WARNUNG! Das Array ist voll. Die Eingabe wird beendet.\n");
  197.         *pFeldLen = MAXPUNKTE;
  198.     }
  199.     printf("Es wurden %d Punkte eingegeben.\n", *pFeldLen);
  200. }
  201.  
  202. void DatenAusgeben(double *feldX, double *feldY, int *pFeldLen)
  203. {
  204.     // 2do: "Bei der Funktion ausgabe() soll nach jeweils zehnn Punkten und am Ende der Ausgabe auf das Betätigen der Enter - Taste gewartet werden."
  205.     printf("\n");
  206.     printf("(2) Daten ausgeben:\n");
  207.     printf("-------------------\n");
  208.     if (*pFeldLen == 0)
  209.     {
  210.         printf("ERROR! Es gibt noch keine Punkte.\n");
  211.     }
  212.     printf("Wir haben %i Punke.\n", *pFeldLen);
  213.     for (int i = 0; i < *pFeldLen; i++)
  214.     {
  215.         printf("%3i. Punkt: x : %lf\n", i + 1, feldX[i]);
  216.         printf("            y : %lf\n", feldY[i]);
  217.     }
  218. }
  219.  
  220. void DatenKorrigieren(double *feldX, double *feldY, int *pFeldLen) {
  221.     printf("\n");
  222.     printf("(3) Daten korrigieren:\n");
  223.     printf("----------------------\n");
  224.  
  225.     int index;
  226.     do {
  227.         index = LeseIntZahl("Welchen Punkt wollen Sie korrigieren (0 für Ende): ");
  228.  
  229.         if (index == 0) {
  230.             printf("Korrekturen beendet.\n");
  231.             break;
  232.         }
  233.  
  234.         if (index < 1 || index > *pFeldLen) {
  235.             printf("Ungültiger Punkt. Bitte geben Sie einen gültigen Punkt ein. (1 bis %d)\n", MAXPUNKTE);
  236.             continue;
  237.         }
  238.  
  239.         printf("Alter x-Wert = %.2lf\n", feldX[index - 1]);
  240.         double neuerX = LeseDoubleZahl("Neuer x-Wert : ");
  241.  
  242.         printf("Alter y-Wert = %.2lf\n", feldY[index - 1]);
  243.         double neuerY = LeseDoubleZahl("Neuer y-Wert : ");
  244.  
  245.         feldX[index - 1] = neuerX;
  246.         feldY[index - 1] = neuerY;
  247.  
  248.     } while (index != 0);
  249. }
  250.  
  251. void DatenSpeichern(double *feldX, double *feldY, int *pFeldLen) {
  252.     printf("\n");
  253.     printf("(4) Daten speichern:\n");
  254.     printf("--------------------\n");
  255.     printf("Pfadname (Default: koord.txt):");
  256.  
  257.     char dateipfad[PATH_MAX];
  258.     LeseStringWert(dateipfad, PATH_MAX);
  259.  
  260.     if (dateipfad[0] == '\0') {
  261.         strcpy(dateipfad, "koord.txt");
  262.     }
  263.  
  264.     FILE *datei = fopen(dateipfad, "w");
  265.  
  266.     if (datei == NULL) {
  267.         printf("FEHLER: Die Datei %s konnte nicht zum Schreiben geöffnet werden.\n", dateipfad);
  268.         return;
  269.     }
  270.  
  271.     for (int i = 0; i < *pFeldLen; i++) {
  272.         fprintf(datei, "%.2lf %.2lf\n", feldX[i], feldY[i]);
  273.     }
  274.  
  275.     fclose(datei);
  276.     printf("Es wurden %d Wertepaare in %s gespeichert.\n", *pFeldLen, dateipfad);
  277. }
  278.  
  279. void DatenLaden(double *feldX, double *feldY, int *pFeldLen) {
  280.     printf("\n");
  281.     printf("(5) Daten laden:\n");
  282.     printf("--------------------\n");
  283.     printf("Pfadname (Default: koord.txt):");
  284.  
  285.     char dateipfad[PATH_MAX];
  286.     LeseStringWert(dateipfad, PATH_MAX);
  287.  
  288.     if (dateipfad[0] == '\0') {
  289.         strcpy(dateipfad, "koord.txt");
  290.     }
  291.  
  292.     FILE *datei = fopen(dateipfad, "r");
  293.  
  294.     if (datei == NULL) {
  295.         printf("FEHLER: Die Datei %s konnte nicht zum Lesen geöffnet werden.\n", dateipfad);
  296.         return;
  297.     }
  298.  
  299.     int c = 0;
  300.     while (fscanf(datei, "%lf %lf", &feldX[c], &feldY[c]) == 2) {
  301.         c++;
  302.         if (c >= MAXPUNKTE) {
  303.             printf("WARNUNG: Das Array ist voll. Die Daten werden nur bis zum Maximum von %d gelesen.\n", MAXPUNKTE);
  304.             break;
  305.         }
  306.     }
  307.  
  308.     *pFeldLen = c;
  309.     fclose(datei);
  310.  
  311.     printf("Es wurden %d Wertepaare aus %s geladen.\n", *pFeldLen, dateipfad);
  312. }
  313.  
  314. void DatenBerechnen(double *feldX, double *feldY, int *pFeldLen) {
  315.     double summeXiYiPlus1 = 0.0;
  316.     double summeXiPlus1Yi = 0.0;
  317.  
  318.     for (int i = 0; i < *pFeldLen; i++) {
  319.         int naechsterIndex = (i + 1) % *pFeldLen;  // Berücksichtige den Spezialfall für den letzten Punkt
  320.  
  321.         summeXiYiPlus1 += feldX[naechsterIndex] * feldY[i];
  322.         summeXiPlus1Yi += feldX[i] * feldY[naechsterIndex];
  323.     }
  324.  
  325.     double flaecheninhalt = (summeXiYiPlus1 - summeXiPlus1Yi) / 2.0;
  326.     printf("Flächeninhalt: %.2lf\n", flaecheninhalt);
  327. }
  328.  
  329. // 2do: DEBUG-Only, remove later
  330. void DatenGenerieren(double *feldX, double *feldY, int *pFeldLen) {
  331.     if (MAXPUNKTE >= 4)
  332.     {
  333.         // 2do: DB löschen-Abfrage
  334.         feldX[0] = 2;
  335.         feldY[0] = 1;
  336.         feldX[1] = 3;
  337.         feldY[1] = 8;
  338.         feldX[2] = 5;
  339.         feldY[2] = 7;
  340.         feldX[3] = 6;
  341.         feldY[3] = 4;
  342.         *pFeldLen = 4;
  343.         printf("Info: Es wurden %d Testdaten generiert. Der Flächeninhalt sollte 15 sein.\n", *pFeldLen);
  344.     }
  345. }
  346.  
  347.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement