0 Daumen
331 Aufrufe

Frage:

C-Programmierung:

Mein Code liest Daten aus einer Datei in einer Struktur. Die Daten enthalten x- und y-Koordinaten eines Autos, also den gefahrenen Weg. Der gefahrene weg wird in der Konsole ausgegebn mittels ASCII Zeichen, linkes Bild. Der Startpunkt des Pfades des Autos ist mit dem ASCII-Zeichen > markiert. Das funktioniert auch alles gut, aber ich möchte nun so einen rechteckigen Rahmen um den Plot zeichnen. Das wäre das rechte Bild. Aber wegen des rechteckigen Rahmens sind einige Daten abgeschnitten worden. Siehe das linke Bild ohne Rahmen, dort ist der Startpunkt mit > sichtbar. Im rechten Bild nicht. Ich habe versucht die Datenpunkte so zu ändern dass Sie in das Rechteck reinpassen, aber es werden immer einige Daten abgeschnitten. Hat jemand einen Tipp bzw. kann mir jemand helfen den Code so anzupassen dass alle Datenpunkte im rechteckigen Rahmen sind? Ich komme leider aktuell nicht weiter. Vielen Dank.

https://onlinegdb.com/aXnQmUs-y


Code:

#include <stdio.h>

#define MAX_DATA_POINTS 200

typedef struct {
int x;
int y;
} Point;

int main() {
FILE *file = fopen("data.txt", "r");
if (file == NULL) {
    printf("Error opening file.\n");
    return 1;
}

FILE *fpp = fopen("output.txt", "w");
if (fpp == NULL) {
    printf("Error opening file.\n");
    return 1;
}

Point data[MAX_DATA_POINTS];
int numPoints = 0;

int x, y;
while (fscanf(file, "%d,%d", &x, &y) == 2) {
    data[numPoints].x = x;
    data[numPoints].y = y;
    numPoints++;
}

fclose(file);

// Find the maximum x and y values
int maxX = data[0].x;
int maxY = data[0].y;

for (int i = 1; i < numPoints; i++) {
    if (data[i].x > maxX) {
        maxX = data[i].x;
    }
    if (data[i].y < maxY) {
        maxY = data[i].y;
    }
}

// Scale the values to fit the console window
const int consoleWidth = 50;
const int consoleHeight = 20;
double scaleX = (float)consoleWidth / maxX;
double scaleY = (float)consoleHeight / maxY;

// Create a 2D array to represent the console window
char plot[consoleHeight][consoleWidth];

// Initialize the plot array with spaces
for (int i = 0; i < consoleHeight; i++) {
    for (int j = 0; j < consoleWidth; j++) {
        plot[i][j] = ' ';
    }
}
// Plot the data points on the array
for (int i = 0; i < numPoints; i++) {
  int xIndex = (int)(data[i].x * scaleX);
  int yIndex = (int)(data[i].y * scaleY);
  if (i == 0) {
      plot[yIndex][xIndex] = '>';
  } else {
      plot[yIndex][xIndex] = '.';
  }
}

// Add the rectangular border
for (int i = 0; i < consoleWidth; i++) {
  plot[0][i] = '-';
  plot[consoleHeight - 1][i] = '-';
}
for (int i = 0; i < consoleHeight; i++) {
  plot[i][0] = '|';
  plot[i][consoleWidth - 1] = '|';
}



// Print the plot array
for (int i = 0; i < consoleHeight; i++) {
    for (int j = 0; j < consoleWidth; j++) {
        printf("%c", plot[i][j]);
        fprintf(fpp, "%c", plot[i][j]);
    }
    printf("\n");
    fprintf(fpp, "\n");
}

fclose(fpp);

return 0;
}

Unbenannt.png

Avatar von

1 Antwort

0 Daumen

Rechne mit eine Konsolenbreite und einer Konsolenhöhe, die um zwei kleiner als die jetzt verwendete ist.

Verschiebe die Punkte, die du in das Array mit den Ausgabedaten einträgst, um eins nach rechts und eins nach unten.

Avatar von 5,6 k

Danke für die Hilfestellung. Ich habe dies umgesetzt und ich glaube ich habe es hinbekommen:

https://onlinegdb.com/pa3KHamLL


Es ist für mich einfach schwierig auf solche Lösungen zu kommen. Daher danke für den Tipp

Soweit ich das sehe hast du um 2 nach rechts und um 2 nach unten verschoben.

Ja genau, eins war mir zu wenig. Ich habe 2 genommen :-)

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community