Funktion mittels Rekursion erstellen



  • Mr. Bit schrieb:

    Also nur als Ausgabe 1 2 3 4 5 oder was??? Tolle Aufgabe...

    Formatiet kann auch

    0 |   30
     1 |  110
    ..
    24 |    3
    

    oder

    Das  1. Elemnet ist:   30
    Das  2. Elemnet ist:  110
    ..
    Das 25. Elemnet ist:    3
    

    bedeuten.
    (Achte auf die Ausrichtung der Zahlen)



  • Naja da würde ich sagen lasse ich es beim Leerzeichen...

    So bis jetzt regelkonform?

    void output(int n, int arr[])
    {
    cout << " Die Zahlen formatiert: \n" << endl;
    for(int x = 0; x < n; x++)
        {
            cout <<"" << arr[x] << " ";	
        }
    cout << "\n" << endl;
    
    }
    void copy(int quelle[],int quelle_laenge, int anfang, int anzahl, int ziel1[], int ziel_anfang, int ziel_laenge)
    {
    	for (int i = anfang-1, j = ziel_anfang-1; i < anzahl, j < (ziel_anfang-1+anzahl); i++, j++)
    	{
    		ziel1[j] = quelle[i];
    	}
    }
    


  • Mr. Bit schrieb:

    So bis jetzt regelkonform?

    Ich nehme an, Du menutzt den Microsoft-Compiler?

    Dann Drücke Alt+A (alles markieren) und dann Alt+F8 (alles automatisch einrücken) vor dem Posten.



  • Nein.

    Du weißt nicht, was i < anzahl, j < (ziel_anfang-1+anzahl) macht.

    Außerdem läßt du vollkommen quelle_laenge und ziel_laenge außer acht.
    Und bist du dir bei den -1 sicher?

    Da in C der Index bei Arrays bei 0 anfängt, würde ich auch eine 0 für anfang angeben, wenn die Quelleu und /oder das Ziel ganz am Anfang ist.
    Aber das ist Definitionssache, die du aber dokumentiern musst.



  • Wie soll ich denn hier die längen verwenden? Die werden doch in der main bestimmt. Wozu brauche ich die in der Funktion?

    Würdest du das kopieren in einer oder mehreren Schleifen machen?

    Bei meinem geposteten Code hat die Ausgabe gestimmt.



  • Mr. Bit schrieb:

    Wie soll ich denn hier die längen verwenden? Die werden doch in der main bestimmt. Wozu brauche ich die in der Funktion?

    Würdest du das kopieren in einer oder mehreren Schleifen machen?

    Bei meinem geposteten Code hat die Ausgabe gestimmt.

    Ja, für dein spezielles Beispiel.
    Dann setze anzahl mal auf 6 und ziel_anfang auf 10.
    Und dann noch anfang auf 4.
    (Bei den Angaben beziehe ich mich auf dein Eröffnungspost)



  • Wie soll ich denn hier die längen verwenden? Die werden doch in der main bestimmt. Wozu brauche ich die in der Funktion?

    Würdest du das kopieren in einer oder mehreren Schleifen machen?



  • Damit du nicht über die Grenzen des Arrays schreibst/liest.*

    War mein Beispiel nicht deutlich?

    Wieviel Schleifen willst du denn nehmen? Und warum?

    *Die Funktion kann aus den Array allein nicht mehr die Größe bestimmen.
    Und du greifst auf die Arrays in der Funktion zu. Da nützt es nichts wenn die Größen in der main bekannt sind.



  • Also ich weiß nicht wie ich das ohne anzahl -1 machen soll...

    Das cout ist nur zur kontrolle Deklariert...

    void copy(int quelle[],int quelle_laenge, int anfang, int anzahl, int ziel1[], int ziel_anfang, int ziel_laenge)
    {
    	if( anfang+anzahl > quelle_laenge)
    	{
    		cout << " Die zu kopierenden Elemente ueberschreiten die Array Groesse.\n" << endl;
    	}
    	else 
    	{
    		if(anzahl+ziel_anfang > ziel_laenge)
    		{
    			cout << " Die zu einfuegenden Elemente ueberschreiten die Array Groesse.\n" << endl;
    		}
    		else
    		{
    			for (int i = anfang-1, j = ziel_anfang-1; i < anfang-1+anzahl, j < ziel_anfang-1+anzahl; i++, j++)
    			{
    				ziel1[j] = quelle[i];
    			}
    
    			for(int x = 0; x < ziel_laenge; x++)
    			{
    				cout <<"" << ziel1[x] << " ";	
    			}
    			cout << "\n" << endl;
    
    		}
    	}	
    }
    

    Könnte noch schreiben, dass wenn "anfang" als 0 initialisiert wird, Datenverlust droht...?



  • Mr. Bit schrieb:

    Also ich weiß nicht wie ich das ohne anzahl -1 machen soll...

    Welchen Wert gibst du für anfang an, wenn du vom Anfang des Arrays kopieren willst.
    Du würdest wohl 1 nehmen, weil es das erste Element ist. Das ist aber nicht C-Style.

    DirkB schrieb:

    Da in C der Index bei Arrays bei 0 anfängt, würde ich auch eine 0 für anfang angeben, wenn die Quelleu und /oder das Ziel ganz am Anfang ist.

    DirkB schrieb:

    Aber das ist Definitionssache, die du aber dokumentiern musst.

    Das ist deine Funktion. Wenn du sagst 1 ist der Anfang, ist das auch in Ordnung.

    Mr. Bit schrieb:

    Das cout ist nur zur kontrolle Deklariert...

    Warum nimmst du dafür nicht deine Funktion output? (Dafür ist sie da)



  • Ich hatte den Anfang als 3 festgesetzt. Wollte aber gucken was passiert wenn man 0 eingibt. Klar werden dann nicht wenn anzahl = 3 auch 3 Elemente eingelesen. Wenn ich Anfang nicht -1 machen ist der Anfang imm um eins versetzt...

    Die Funktion output ist doch nur für die erste Aufgabe, denke ich!?

    Wie würdest du die Funktion mischen angehen? Mit Mergesort?



  • Mr. Bit schrieb:

    Ich hatte den Anfang als 3 festgesetzt. Wollte aber gucken was passiert wenn man 0 eingibt. Klar werden dann nicht wenn anzahl = 3 auch 3 Elemente eingelesen. Wenn ich Anfang nicht -1 machen ist der Anfang imm um eins versetzt...

    Wie wäre der Funktionsaufruf, wenn du das ganze Array kopieren möchtest?

    Mr. Bit schrieb:

    Die Funktion output ist doch nur für die erste Aufgabe, denke ich!?

    Nein. Die hast du schon geschrieben, also nutze sie auch.
    Außerdem läuft das doch untere Funktion2

    Mr. Bit schrieb:

    Wie würdest du die Funktion mischen angehen? Mit Mergesort?

    Schau dir das Video mal an das volkard (auf der ersten Seite) vorgeschlagen hat.
    Da ist das doch am Anfang sehr gut erklärt was du machen musst (zwei vorsortierte Arrays)



  • Beim ganzen Array wäre es:

    for (int i = 0, j = 0; i < quelle_laenge, j < quelle_laenge; i++, j++)
    			{
    				ziel1[j] = quelle[i];
    			}
    

    Ja das läuft unter Funktion 2 ist aber da um die Funktion 1 auszulesen.



  • Mr. Bit schrieb:

    Beim ganzen Array wäre es:

    for (int i = 0, j = 0; i < quelle_laenge, j < quelle_laenge; i++, j++)
    			{
    				ziel1[j] = quelle[i];
    			}
    

    Falsche Antwort. Das ist die Antwort auf "Wie würdest du die Schleife machen, wenn du das ganze Array kopieren musst.
    Zudem ist da immer noch die Schleifenbedingung mit dem Kommaoperator, den du nicht verstehst. (Wenn du diese Aussage nicht verstehst, informiere dich darüber)

    Darum nochmal anders: "Mit welchen Parametern rufst du deine Funktion copy auf, damit das ganze Array kopiert wird?"
    Anwort: copy(quelle, (Deine Angaben hier einfügen)

    Mr. Bit schrieb:

    Ja das läuft unter Funktion 2 ist aber da um die Funktion1 auszulesen.

    Zu kurz gedacht.
    Mit input und output kannst du auch copy und mischen testen.



  • Nur der Funktionskopf:

    copy(quelle,quelle_laenge,ziel1)
    

    oder?



  • 😃



  • Ich hoffe das heißt es stimmt.....





  • dann sei doch so nett und verrate mir die richtige Antwort..



  • Egal.

    Was macht das Rekursive mischen?


Anmelden zum Antworten