positionermittlung



  • Hallo ich hoffe jemand kann mir weiter helfen ich verzweifle noch:

    ich brauche eine Algorithmusidee zu folgender Spezifikation:

    Eingabe ganzzahliger Werte, und eine Folge von Positionen(gleiche Anzahl wie Werte)

    und nun soll eine neue folge ausgegeben werden, bei der jeder wert an der Stelle eingetragen wird, die Unter dem selben Index in positionen steht.

    Beispiel: Werte: 5,7,9,3,1
    Positionen: 3,5,2,1,4

    Ausgabe: 3,9,5,1,7

    Wie krieg ich das bitte hin? Ich bin über jeden Hinweis dankbar!



  • becki005 schrieb:

    Wie krieg ich das bitte hin? Ich bin über jeden Hinweis dankbar!

    So, wie du es beschrieben hast.²

    Du musst nur bedenken, das in C der Index immer bei 0 anfängt.

    ²Du hast zwei Arrays Wert und Position.
    Jetzt nimmst du Position als Index für Wert.

    Ungefähr so:

    Zähle i von 0 bis kleiner n
      Ausgabe( Wert[Position[i]])
    


  • ok und wie schreib ich des jetzt ungefähr als Funktion auf? brauch ich dafür nur 2 for-schleifen?



  • Wenn es nur um die Ausgabe geht, dann so, wie ich es als Pseudocode geschrieben habe.

    (Da ist nur eine Schleife)



  • DirkB schrieb:

    Wenn es nur um die Ausgabe geht, dann so, wie ich es als Pseudocode geschrieben habe.

    (Da ist nur eine Schleife)

    Wie ich das sehe, kommt dann aber

    9 1 7 5 3
    

    heraus.

    Zwei for-Schleifen, die erste zum Füllen eines dritten Arrays, die zweite Schleife zur Ausgabe.

    Pseudo
    int Ausgabe[n];
    Zähle i von 0 bis kleiner n
    {
      hier noch validieren, dass der Index gültig ist
      Ausgabe[Positionen[i]-1] = Werte[i];
    }
    // und noch ausgeben
    


  • Danke ihr habt mir sehr geholfen. Hätte nicht gedacht dass das so einfach ist. Fuck 😃



  • ok ich brauch doch noch mal Hilfe:/

    Also jetzt mal angenommen das ist meine Funktion:

    int Funktion(int anzahl, int werte[], int positionen[])
    {
    for(i=0; i < anzahl; i++)
    {
    positionen[i]=werte[i];
    }
    
    for(b=0; b < Anzahl; b++)
    {
    printf("%d", werte[i]);
    

    Ich weiss das ist falsch, aber was muss ich ändern?



  • fasf hat es doch im Pseudocode hingeschrieben.
    Du brauchst ein drittes Array.



  • Zitat: Du brauchst ein drittes Array.[/quote]
    Eigentlich noch ein viertes, da man normalerweise nicht die Urwerte manipulieren sollte. Auch nicht in der Reihenfolge. Der mögliche Lösungsansatz besteht darin,
    die Positionen der Reihe nach zu ordnen, aber das darüber liegende Array gleich mit.

    Mögliche Lösung:

    #include <stdio.h>
    #include <stdlib.h>
    
    void Sortiere(int (*psort)[5], int (*wsort)[5])
    {
     int slei, sleib, da, db, dc;
    
     for (slei = 0; slei < 5; slei++)
       for (sleib = slei; sleib < 5; sleib++)
        if ((*psort)[slei] > (*psort)[sleib])
         {
          /** Ersatz fuer: swap((*psort)[slei], (*psort)[sleib]);  */
          da = (*psort)[slei];
          db = (*psort)[sleib];
          dc = da;
          da = db;
          db = dc;
          (*psort)[slei] = da;
          (*psort)[sleib] = db;
    
          /** Ersatz für swap((*wsort)[slei], (*wsort)[sleib]);  */
          da = (*wsort)[slei];
          db = (*wsort)[sleib];
          dc = da;
          da = db;
          db = dc;
          (*wsort)[slei] = da;
          (*wsort)[sleib] = db;
         }
    
    }
    
    int main()
    {
    int werte[5] = { 5,7,9,3,1};
    int positions[5] = { 3,5,2,1,4 };
    int wsort[5], psort[5];
    int i;
    
    printf("Positionstest\n");
    
    printf("Werte unsortiert:\n");
     for (i = 0; i < 5; i++)  printf("Nr %d = %d\n", i,  werte[i]);
    
    for (i = 0; i < 5; i++) {
      wsort[i] = werte[i];
      psort[i] = positions[i];
     }
    printf("Positionen unsortiert:\n");
     for (i = 0; i < 5; i++)  printf("Nr %d = %d\n", i,  psort[i]);
    
    Sortiere(&psort, &wsort);
    
    printf("Positionen sortiert:\n");
     for (i = 0; i < 5; i++)  printf("Nr %d = %d\n", i,  psort[i]);
    
    printf("Werte sortiert:\n");
     for (i = 0; i < 5; i++)  printf("Nr %d = %d\n", i,  wsort[i]);
    
      return EXIT_SUCCESS;
    }
    


  • Ich würde sagen, die Alternative zum dritten Array ist die direkte Ausgabe.

    int* func(const int* values, const int* pos, int cnt)
    {
        int* ptr = malloc(cnt*sizeof(int));
        for(int i=0;i<cnt;++i)
        {
            if(pos[i] >= 1 && pos[i] <= cnt)
                ptr[pos[i]-1] = values[i];
        }
        return ptr;
    }
    
    int main()
    {
        const int values[] =    {5,7,9,3,1};
        const int positions[] = {3,5,2,1,4};
    
        const int num = sizeof(values)/sizeof(*values);
    
        // 1. Drittes Array
        int* p = func(values, positions, num);
        for(int i=0;i<num;++i)
        {
            printf("%d ", p[i]);
        }
        free(p);
    
        putchar('\n');
    
        // 2. Direkt ausgeben
        for(int i=0;i<num;++i)
        {
            for(int k=0;k<num;++k)
            {
                if(positions[k]-1==i)
                {
                    printf("%d ", values[k]);
                    break;
                }
            }
        }
    }
    

Log in to reply