Bestimmen des nächsten Nachbarn in C



  • Was soll das mit C zutun haben?
    Das ist Mathematik. Frag Deinen Dozenten oder suche Literatur dazu.
    Ihr hab Doch gewiss eine Bibliothek?



  • ja ich weiß das das mit mathe zu tun hat aber ich weiß nun nicht wie ich das umsetzen soll.
    hier die aufgaben stellung:
    "Für ein Navigationssystem soll eine Menge von maximal N Orientierungspunkten,
    die Raumkoordinaten beinhalten, in einem Vektor gespeichert werden. Jedes Vektorelement soll durch eine Struktur mit den x-, y- und z-Koordinaten als Komponenten dargestellt werden. Die Koordinaten der Orientierungspunkte sind in einer Textdatei zeilenweise gespeichert. Entwickeln Sie ein Programm, das zu manuell eingegebenen Koordinaten den als nächster Nachbar vorhandenen Orientierungspunkt ermittelt.Bestimmung des nächsten Nachbarn zu eingegebenen Koordinaten: Parameter sind die Koordinaten eines Punktes und der Vektor der Orientierungspunkte. Der Rückgabewert sind die Koordinaten des nächsten Nachbarn."



  • Und womit hast du jetzt Probleme?

    Anlegen des arrays (muss es dynamisch sein?), Einlesen der Koordinaten oder dem Satz des Pythagoras?

    Zeig doch mal, was du bisher hast, eine komplette Lösung kannst du nicht verlangen. Sie bringt dir auch nichts (auch wenn ich mir vorstellen könnte, dass eine komplette Lösung noch kommt).



  • Also ich hab alles soweit mit dem speichern auslesen und dem anderen zeugs was in den anderen unteraufgaben sthet jetzt fehlt mir bloß das bestimmen des nächsten nachbarn und dort liegt mein problem wie ich das in den Quelltext bringe.
    Hier ist der Quellcode den ich geschrieben habe:

    #include <stdio.h>
    #include <math.h>
    #define MAX 10
    
    struct Punkt
    {
        float x, y, z;
    };
    
    float euklidisch( struct Punkt koo, struct Punkt koo1)
    {
        float d;
    
        d=sqrt(pow(koo.x - koo1.x,2) + pow(koo.y - koo1.y,2) + pow(koo.z - koo1.z,2));
    
        return d;
    
    }
    
    int Einlesen( char *dateiName, struct Punkt liste[MAX])
    {
        FILE *datei;
        float xkoo, ykoo, zkoo;
        int i=0;
        datei = fopen (dateiName, "r");
    
        if (datei != NULL)
        {
    
            while(fscanf (datei, "%f,%f,%f", &xkoo, &ykoo, &zkoo)==3)
            {
    
                liste[i].x = xkoo;
                liste[i].y = ykoo;
                liste[i].z = zkoo;
    
                i++;
            }
    
            fclose (datei);
        }
        else
        {
            printf("!!!Datei konnte nicht geoeffnet werden!!!\n\n");
            return 0;
        }
        return i;
    }
    
    int Speichern(char *dateiName, struct Punkt p[MAX], int Anzahlkoo)
    {
            FILE *datei;
            int i;
            datei = fopen (dateiName, "w");
    
            i=0;
            while (i < Anzahlkoo)
            {
                fprintf(datei, "%6.2f,", p[i].x);
                fprintf(datei, "%6.2f,", p[i].y);
                fprintf(datei, "%6.2f\n", p[i].z);
                i++;
            }
    
            fclose (datei);
    
        return i;
    
    }
    
    int main (int argc, char*argv[] )
    {
        if (argc == 2)
        {
            printf("ok");
        }
        else
        {
            printf("error");
    
            return -1;
        }
    
        char *dateiName = argv[1];
    
        int Auswahl, Anzahlkoo, i;
    
        struct Punkt p[MAX];
    
        printf("Bitte waehlen sie eine Operation!\n");
        printf("----------------------------------------------------------------------\n");
        printf("1. x-,y- und z-Koordinaten eingeben und speichern\n");
        printf("2. Auslesen der gespeicherten Daten\n");
        printf("3. Berechnung des euklidischen Abstandes zwischen zwei Punkten\n");
        printf("4. Bestimmung des naechsten Nachbarn der Koordinaten\n");
        printf("5. Programm beendenm\n");
        printf("----------------------------------------------------------------------\n");
        printf("Geben Sie bitte Ihre Auswahl hier ein:  \n\n");
        scanf("%d", &Auswahl);
        printf("----------------------------------------------------------------------\n");
    
        if(Auswahl==1)
        {
    
            int Anzahlkoo, i;
                printf("Wieviele moechten sie eingeben\n\n");
                scanf("%d", &Anzahlkoo);
                printf("----------------------------------------------------------------------\n\n");
    
            i=0;
            while (i < Anzahlkoo)
            {
                printf("x-Koordinate:  ");
                scanf("%f", &p[i].x);
                printf("\n");
                printf("y-Koordinate:  ");
                scanf("%f", &p[i].y);
                printf("\n");
                printf("z-Koordinate:  ");
                scanf("%f", &p[i].z);
                printf("\n");
                i=i+1;
            }
    
            Speichern(dateiName, p, Anzahlkoo);
        }
    
        if(Auswahl==2)
        {
            i=0;
            Anzahlkoo = Einlesen(dateiName, p);
            printf("%6.2f\n%6.2f\n%6.2f\n", p[i].x, p[i].y, p[i].z);
        }
    
        if(Auswahl==3)
        {
    
            float erg;
            struct Punkt eins;
            struct Punkt zwei;
    
            printf ("Geben sie Ihre aktuelle Position ein!\n");
            printf("----------------------------------------------------------------------\n\n");
            printf ("x-Koordinate:  ");
            scanf ("%f", &zwei.x);
            printf ("y-Koordinate:  ");
            scanf ("%f", &zwei.y);
            printf ("z-Koordinate:  ");
            scanf ("%f", &zwei.z);
            printf ("\n\n");
    
            FILE *datei;
    
            datei = fopen ("test.txt", "r");
    
            i=0;
            while (fscanf (datei, "%f,%f,%f", &eins.x, &eins.y, &eins.z)==3)
            {
    
                printf ("x-Koordinate:%3.0f\n", eins.x);
                printf ("y-Koordinate:%3.0f\n", eins.y);
                printf ("z-Koordinate:%3.0f\n", eins.z);
                i=i+1;
    
            }
    
            erg = euklidisch(eins, zwei);
            printf ("\n\n");
            printf("Der euklidische Abstand:%8.4f\n",erg);
    
            fclose (datei);
    
        }
        if(Auswahl==4)
        {
    
        }
    
        if(Auswahl==5)
        {
            return 1;
        }
    
        return 0;
    }
    


  • Warum liest du bei Auswahl==3 die Daten nochmal ein?
    Die sollen doch in struct Punkt p[MAX]; stehen.

    Ausserdem ermittelst du da den Abstand zum letzten eingelesenen Punkt



  • Das sieht für einen ersten Versuch schon mal gut aus, aber
    - wo ist die geforderte Funktion abgeblieben
    - wozu die "Speichern" Funktion, die ist doch gar nicht gefordert
    - du verwendest ohne Not C99, womit du unnötig auf Portabilität verzichtest



  • DirkB schrieb:

    Warum liest du bei Auswahl==3 die Daten nochmal ein?
    Die sollen doch in struct Punkt p[MAX]; stehen.

    Ausserdem ermittelst du da den Abstand zum letzten eingelesenen Punkt

    Weil diese Funktion den euklidischen abstand berechnet. Das ist in einem anderen teil der aufgabe verankert.

    Wutz schrieb:

    Das sieht für einen ersten Versuch schon mal gut aus, aber
    - wo ist die geforderte Funktion abgeblieben
    - wozu die "Speichern" Funktion, die ist doch gar nicht gefordert
    - du verwendest ohne Not C99, womit du unnötig auf Portabilität verzichtest

    Welche Funktion?
    Das speichern ist auch in einer anderen aufgabe verankert.
    Und was ist Not C99? Kenn ich nicht


  • Mod

    sebl11 schrieb:

    Und was ist Not C99? Kenn ich nicht

    Lies noch einmal genau:

    du verwendest ohne Not C99



  • ja ich verwende ohne not c99



  • Ja toll. Deutsch kannst du auch nicht.
    "Parameter sind die Koordinaten eines Punktes und der Vektor der Orientierungspunkte. Der Rückgabewert sind die Koordinaten des nächsten Nachbarn."
    Wo ist diese Funktion? Steht doch alles da, was verlangt ist. Du hast die Aufgabenstellung nicht verinnerlicht, und was implementiert, was nicht gefordert ist.



  • wie gesagt der andere teil der dort im quelltext steht gehört nicht zu meiner frage sondern zu einer anderen teilaufgabe, dass problem ist ich weiß nicht wie ich das umsetzen muss das der nächste nachbar bestimmt wird.



  • Wenn du ein Array int p[MAX]; hast und du sollst rausfinden, welche der Zahlen in dem Array am nächsten an einer gegebenen Zahl z ist.
    Wie würdest du das machen?



  • ich würde das so machen:

    int nachbar[]={};
                int i;
                printf("die koordinaten:\n");
                for (i=0; i<SIZE; i++)
                    printf("%i", nachbar[i]);
    


  • Wieviel Elemente hat das Array nachbar?

    Da berechnest du doch keine Differenz/Abstand.

    Noch mal konkret:

    #define MAX 10
    int p[MAX] = { 18, 20, 2, 0, 4, 7, 4711, 0715, 6, 49};
    

    Welche der Zahlen liegt am nächsten an 345? und wie groß ist der Abstand.



  • Also das Array soll so groß sein wie die Koordinaten in einer Datei und diese sollen mit den eingegebenen Koordinaten verglichen werden um die kurzeste Distanz zu finden.
    Unser Dozent sagt immer zu der Aufgabe:"nehmen wir an wir wären im Weltall und wir bekämen jetzt Hunger und wollten zum nächsten McDonalds auf einem Planeten der am nächsten bei den Koordinaten ist die wir eingeben haben" und das verstehe ich nicht wie ich das umsetzen soll. 😕



  • Wo ist mein Beispiel jetzt anders?

    Nehmen wir an du hast eine Liste mit Hausnummern, wo es den nächsten Burger King gibt.
    Du bist gerade bei Hausnummer 345. Zu welcher Hausnummer ist es der kürzeste Weg.

    Anders, ach ja, bei mir gibt es nur eine Dimension. :xmas1:



  • Also ich hab jetzt die folge sortiert hinbekommen, wie geb ich den kleinsten unmittelbaren nachbar nun aus, da komm ich eben jetzt nicht mehr weiter.
    😕



  • Wonach hast du die Liste sortiert?
    Und warum hast du sie überhaupt sortiert?



  • ich hab sie nach der größe erstmal sortiert



  • Das ist doch gar nicht nötig.

    Du bestimmst den Abstand von deinem Punkt zum ersten Eintrag und merkst dir '1. Eintrag'.
    Dann bestimmst den Abstand von deinem Punkt zum nächsten Punkt. Ist dieser kleiner mkerkst du dir '2. Eintrag' sonst bleibt es beim 1.
    So gehst du die ganze Liste durch. Am Ende hast du den Punkt mit dem kleinsten Abstand.


Anmelden zum Antworten