Programm wird nicht richtig ausgeführt --- C++ ----



  • Du hast die Aufgabe aber nicht erfüllt.
    Der Benutzer soll entscheiden wieviel Werte er eingibt. Kann auch weniger als 10 sein.
    Sonst macht Aufgabe 4 ja keinen Sinn. (Und wenn schon alle Elemente belegt sind, darf kein neues eingelesen werden).

    Daraus folgt, das deine Funktionen mit einer variablen Anzahl von Elementen umgehen müssen.

    Bei Array_spiegeln musst du dir mal das Muster der Zahlen ansehen.
    Hast du wahrscheinlich schon bei Copy&Paste so geändert. Die eine Zahl rauf, die andere Zahl runter. Das geht auch so in einer Schleife.

    Und dann noch Element_einlesen 😮 🙄
    Eine eigenen Funktion nur zum verschieben (ohne Eingabe) wäre angebracht.

    Das verschieben so wie du es machst geht auch ohne Hilfsvariable.
    Überleg mal wie das an einer Kasse funktioniert, wenn der erste bezahlt hat und der Platz frei wird.
    Und dann weißt du auch, wie man das in einer Schleife machen kann.

    Wenn du limit vor arr definierst, kannst du dann

    const int limit = 10;
    int arr[limit];
    

    machen. Und das dann bitte in main und nicht global.
    Wenn du dann die aktuelle Anzahl bzw. limit mit an die Funktionen übergibst, hast du nur an einer Stelle die 10 stehen.
    Dann kannst du die jederzeit ändern und das Programm funktioniert immer noch richtig.



  • Wir haben es fast geschafft 🙂

    Hab das mit den globalen Elementen geändert. Habe jetzt aber das Problem, dass er bei void anzeigen nicht das n nimmt was ich eingegeben habe, sondern das initialisierte in der main... wie ändere ich das?

    Das mit den Schleifen bekomme ich nicht hin...

    #include <iostream>
    
    using namespace std;
    
    void Array_einlesen(int const limit, int n, int arr[])
    {
    cout << " Wie viele Elemente wollen Sie einlesen ( maximal "<< 10 <<" ) ? " << endl;
    cin >> n;
    cout << "" << endl;
    
    	if ( n > limit)
    	{
    	cout << " Es koennen nur maximal 10 Elemente eingelesen werden." << endl; 
    	}
    	else
    	{
    for(int x = 0 ; x < n ; x++)
    		{
            cout << " Bitte geben Sie die Zahl Nummer "  << x+1 << " ein." << endl;
            cin >> arr[x];
    		}
    	}
    }
    void Array_spiegeln( int arr[])
    {
    int temp;
    
    temp = arr[9];
    arr[9] = arr[0]; // Element 9 wird mit Element 0 vertauscht.
    arr[0] = temp;
    
    temp = arr[8];
    arr[8] = arr[1]; // Element 8 wird mit Element 1 vertauscht.
    arr[1] = temp;
    
    temp = arr[7];
    arr[7] = arr[2]; // Element 7 wird mit Element 2 vertauscht.
    arr[2] = temp;
    
    temp = arr[6];
    arr[6] = arr[3]; // Element 6 wird mit Element 3 vertauscht.
    arr[3] = temp;
    
    temp = arr[5];
    arr[5] = arr[4]; // Element 5 wird mit Element 4 vertauscht.
    arr[4] = temp;
    
    }			
    void Array_anzeigen(int n, int arr[])
    {
      for(int x = 0; x <= n; x++) 
        {      
            cout << arr[x] << " ";
        }
      cout << endl;
    }
    void Element_einlesen(int limit, int n, int arr[])
    {
    	if ( n >= limit)
    	{
    	cout << " Das Array ist schon voll. Bei Bedarf weniger Zahlen einlesen, dann erneut versuchen."<<endl;
    	}
    		else
    		{
    		arr[9] = arr[8];
    		arr[8] = arr[7];
    		arr[7] = arr[6];
    		arr[6] = arr[5];
    		arr[5] = arr[4];	
    		arr[4] = arr[3];
    		arr[3] = arr[2];
    		arr[2] = arr[1];
    		arr[1] = arr[0];
    
    		cin >> arr[0];	
    		}					
    }
    
    int main()
    {
    	const int limit = 10;
    	int n = 0;
    	int arr[limit];
    
    	char op;
    
    	cout << "Bitte waehlen sie aus folgenden Aktionen:" << endl;
    	cout << "1: Array einlesen (maximal "<< limit <<") Elemente"<< endl;
    	cout << "2: Array spiegeln" << endl;
    	cout << "3: Array ausgeben" << endl;
    	cout << "4: Element dem Array an Index 0 hinzufuegen" << endl;
    	cout << "5: Das Programm beenden" << endl;
    
    do
    {
    	cin >> op;
    
    	switch (op)
    	{
    
    		case '1':
    			cout << " Array einlesen: \n"<< endl;
    			Array_einlesen(limit, n, arr);
    
    			break;
    
    		case '2':
    			Array_spiegeln(arr);
    			cout << " Array wurde gespiegelt. \n" << endl;
    			break;
    
    		case '3':
    
    			cout << " Array ausgeben: \n" << endl;
    			Array_anzeigen(n, arr);
    
    			break;
    
    		case '4':
    			cout << " Element einlesen: \n" << endl;
    			Element_einlesen(limit, n, arr);
    
    			break;
    
    		case '5':
    
    			cout << " Das Programm wird  beendet. \n" << endl;
    
    			break;
    
    		default:
    
    			cout << " Unzulaessige Wahl. Bitte erst den Array einlesen. " << endl;
    
    			break;
    
    	}
    }
    while (op != '5');
    
    system ("pause");
    return 0;
    }
    


  • Du lässt n von ei.geben zurückgeben oder übergibst das als Referenz.



  • DirkB schrieb:

    - Nutze den Rückgabewert von Funktionen wo es sinnvoll ist.

    Aber bei beiden Einlese-Funktionen.

    Bei Array_anzeigen läuft deine Schleife zu weit.



  • Wie lasse ich n zurückgeben?

    Habe es mit int Array_einlesen und dann am Ende der Funktion mit return n verusucht. Es wird aber weiterhin nur das in der main initialisierte n verwendet. Ich soll die Aufgabe ohne Referenzen/Zeigern lösen.



  • Du entverwendst den Parameter n aus dem Funktionskopf, da du ihn nicht mehr brauchst.
    Stattdessen machst du eine lokale Variable in der Funktion, die gibst du zurück.
    Und das Ergebnis weißt du in deinem n in main zu.



  • Wie weise ich das Ergebnis in der main n zu? Sorry für die blöden Fragen.... Warte noch drauf dass es klick macht...



  • foo = func(param) !?



  • Könntest du die Zuweisung so schreiben wie ich sie hier brauchen würde?



  • Wenn du einer Variablen einen Wert zuweisen willst, dann schreibst du sie auf der linken Seite hin, gefolgt von einem =

    Auf der rechten Seite steht dann ein Ausdruck.

    Das kann eine Zahl sein, eine andere Variable, ein Funktionsaufruf oder auch eine Kombination daraus.



  • Mr. Bit schrieb:

    Könntest du die Zuweisung so schreiben wie ich sie hier brauchen würde?

    Du ersetzt einfach die Namen, durch deine eigenen.... 🙄
    Du musst dir dringend ein gutes Grundlagenbuch besorgen; Empfehlungen gibts hier im Forum.



  • Kannst du das bitte mal so schrieben wie ich es hier brauchen würde... komme so nicht weiter. Hab alles mögliche ausprobiert und immer hat es nicht geklappt.



  • Weise deiner Variablen n mal den Wert 5 zu und zeig uns den Code.



  • #include <iostream>
    
    using namespace std;
    
    int Array_einlesen(int const limit, int n, int arr[])
    {
    cout << " Wie viele Elemente wollen Sie einlesen ( maximal "<< 10 <<" ) ? " << endl;
    cin >> n;
    cout << "" << endl;
    
    	if ( n > limit)
    	{
    	cout << " Es koennen nur maximal 10 Elemente eingelesen werden." << endl; 
    	}
    	else
    	{
    for(int x = 0 ; x < n ; x++)
    		{
            cout << " Bitte geben Sie die Zahl Nummer "  << x+1 << " ein." << endl;
            cin >> arr[x];
    		}
    	}
    return n;
    }
    void Array_spiegeln( int arr[])
    {
    int temp;
    
    temp = arr[9];
    arr[9] = arr[0]; // Element 9 wird mit Element 0 vertauscht.
    arr[0] = temp;
    
    temp = arr[8];
    arr[8] = arr[1]; // Element 8 wird mit Element 1 vertauscht.
    arr[1] = temp;
    
    temp = arr[7];
    arr[7] = arr[2]; // Element 7 wird mit Element 2 vertauscht.
    arr[2] = temp;
    
    temp = arr[6];
    arr[6] = arr[3]; // Element 6 wird mit Element 3 vertauscht.
    arr[3] = temp;
    
    temp = arr[5];
    arr[5] = arr[4]; // Element 5 wird mit Element 4 vertauscht.
    arr[4] = temp;
    
    }			
    void Array_anzeigen(int n, int arr[])
    {
      for(int x = 0; x < n; x++) 
        {      
            cout << arr[x] << " ";
        }
      cout << endl;
    }
    void Element_einlesen(int limit, int n, int arr[])
    {
    	if ( n >= limit)
    	{
    	cout << " Das Array ist schon voll. Bei Bedarf weniger Zahlen einlesen, dann erneut versuchen."<<endl;
    	}
    		else
    		{
    		arr[9] = arr[8];
    		arr[8] = arr[7];
    		arr[7] = arr[6];
    		arr[6] = arr[5];
    		arr[5] = arr[4];	
    		arr[4] = arr[3];
    		arr[3] = arr[2];
    		arr[2] = arr[1];
    		arr[1] = arr[0];
    
    		cin >> arr[0];	
    		}					
    }
    
    int main()
    {
    	const int limit = 10;
    	int n = 5;
    	int arr[limit];
    
    	char op;
    
    	cout << "Bitte waehlen sie aus folgenden Aktionen:" << endl;
    	cout << "1: Array einlesen (maximal "<< limit <<") Elemente"<< endl;
    	cout << "2: Array spiegeln" << endl;
    	cout << "3: Array ausgeben" << endl;
    	cout << "4: Element dem Array an Index 0 hinzufuegen" << endl;
    	cout << "5: Das Programm beenden" << endl;
    
    do
    {
    	cin >> op;
    
    	switch (op)
    	{
    
    		case '1':
    			cout << " Array einlesen: \n"<< endl;
    			Array_einlesen(limit, n, arr);
    
    			break;
    
    		case '2':
    			Array_spiegeln(arr);
    			cout << " Array wurde gespiegelt. \n" << endl;
    			break;
    
    		case '3':
    
    			cout << " Array ausgeben: \n" << endl;
    			Array_anzeigen(n, arr);
    
    			break;
    
    		case '4':
    			cout << " Element einlesen: \n" << endl;
    			Element_einlesen(limit, n, arr);
    
    			break;
    
    		case '5':
    
    			cout << " Das Programm wird  beendet. \n" << endl;
    
    			break;
    
    		default:
    
    			cout << " Unzulaessige Wahl. Bitte erst den Array einlesen. " << endl;
    
    			break;
    
    	}
    }
    while (op != '5');
    
    system ("pause");
    return 0;
    }
    


  • Was ist daran so schwierig, den Variablennamen hinzuschreiben, deren Wert du ändern willst. Dann ein Gelichheitszeichen als Zuweisung und dann den Funktionsaufruf.

    Die Funktionen hast du ja schon mehrmals aufgrufen. Das kannst du.
    Deinen Variablen hast du auch schon mehrmals neue Werte zugewiesen. Sowohl konstante Werte als auch von Variablen. Das kannst du also auch.
    Nachdenken und verknüpfen.

    Nathan schrieb:

    foo = func(param) !?

    Dein_Variablenname_hier = Dein_Funktionsname_hier(Deine_Funktionsparameter);
    


  • Schreib es doch einfach bitte hin...

    Habe es jetzt so versucht aber es klappt nicht...

    #include <iostream>
    
    using namespace std;
    
    int Array_einlesen(int const limit, int n, int arr[])
    {
    cout << " Wie viele Elemente wollen Sie einlesen ( maximal "<< 10 <<" ) ? " << endl;
    cin >> n;
    cout << "" << endl;
    
    	if ( n > limit)
    	{
    	cout << " Es koennen nur maximal 10 Elemente eingelesen werden." << endl; 
    	}
    	else
    	{
    for(int x = 0 ; x < n ; x++)
    		{
            cout << " Bitte geben Sie die Zahl Nummer "  << x+1 << " ein." << endl;
            cin >> arr[x];
    		}
    	}
    return n;
    }
    void Array_spiegeln( int arr[])
    {
    int temp;
    
    temp = arr[9];
    arr[9] = arr[0]; // Element 9 wird mit Element 0 vertauscht.
    arr[0] = temp;
    
    temp = arr[8];
    arr[8] = arr[1]; // Element 8 wird mit Element 1 vertauscht.
    arr[1] = temp;
    
    temp = arr[7];
    arr[7] = arr[2]; // Element 7 wird mit Element 2 vertauscht.
    arr[2] = temp;
    
    temp = arr[6];
    arr[6] = arr[3]; // Element 6 wird mit Element 3 vertauscht.
    arr[3] = temp;
    
    temp = arr[5];
    arr[5] = arr[4]; // Element 5 wird mit Element 4 vertauscht.
    arr[4] = temp;
    
    }			
    void Array_anzeigen(int m, int arr[])
    {
      for(int x = 0; x < m; x++) 
        {      
            cout << arr[x] << " ";
        }
      cout << endl;
    }
    void Element_einlesen(int limit, int n, int arr[])
    {
    	if ( n >= limit)
    	{
    	cout << " Das Array ist schon voll. Bei Bedarf weniger Zahlen einlesen, dann erneut versuchen."<<endl;
    	}
    		else
    		{
    		arr[9] = arr[8];
    		arr[8] = arr[7];
    		arr[7] = arr[6];
    		arr[6] = arr[5];
    		arr[5] = arr[4];	
    		arr[4] = arr[3];
    		arr[3] = arr[2];
    		arr[2] = arr[1];
    		arr[1] = arr[0];
    
    		cin >> arr[0];	
    		}					
    }
    
    int main()
    {
    	const int limit = 10;
    	int arr[limit];
    	int n = 5;
    	int m = Array_einlesen(limit, n, arr);
    
    	char op;
    
    	cout << "Bitte waehlen sie aus folgenden Aktionen:" << endl;
    	cout << "1: Array einlesen (maximal "<< limit <<") Elemente"<< endl;
    	cout << "2: Array spiegeln" << endl;
    	cout << "3: Array ausgeben" << endl;
    	cout << "4: Element dem Array an Index 0 hinzufuegen" << endl;
    	cout << "5: Das Programm beenden" << endl;
    
    do
    {
    	cin >> op;
    
    	switch (op)
    	{
    
    		case '1':
    			cout << " Array einlesen: \n"<< endl;
    			Array_einlesen(limit, n, arr);
    
    			break;
    
    		case '2':
    			Array_spiegeln(arr);
    			cout << " Array wurde gespiegelt. \n" << endl;
    			break;
    
    		case '3':
    
    			cout << " Array ausgeben: \n" << endl;
    			Array_anzeigen(n, arr);
    
    			break;
    
    		case '4':
    			cout << " Element einlesen: \n" << endl;
    			Element_einlesen(limit, n, arr);
    
    			break;
    
    		case '5':
    
    			cout << " Das Programm wird  beendet. \n" << endl;
    
    			break;
    
    		default:
    
    			cout << " Unzulaessige Wahl. Bitte erst den Array einlesen. " << endl;
    
    			break;
    
    	}
    }
    while (op != '5');
    
    system ("pause");
    return 0;
    }
    


  • Rumraten gibt es nicht.
    klappt nicht... ist die schlechteste aller Fehlerbeschreibungen.

    Hast du dich nicht gewundert, dass jetzt zuerst die Eingabe kommt und dann das Menü?
    Das liegt daran, dass du es in der Reihenfolge programmiert hast.

    Du willst n (aus main) ändern (und nicht m)*
    Du willst dass der Wert von Array_einlesen kommt.
    Du willst dass das bei Option 1 passiert.

    DANN SCHREIB DAS DA AUCH HIN und nicht irgenwo im Code.

    *Die Variablen müssen nicht den selben Namen haben, du hast es nur so gewählt.



  • So ich habe das mit dem Rückgabewert jetzt gemacht. 👍

    Eine andere Frage ist warum die Schleife hier nicht funktioniert bzw. wenn ich für n 6 eingebe sie mir nur die Elemente bis 6 ausgibt also das letzte Element fällt raus. Das ändert sich auch nicht wenn ich for (int i = 0; i < n+1; i++) eingebe. Wieso ist das so?

    void Element_einlesen(int limit, int n, int arr[])
    {
    	if ( n >= limit)
    	{
    	cout << " Das Array ist schon voll. Bei Bedarf weniger Zahlen einlesen, dann erneut versuchen."<<endl;
    	}
    		else
    		{
    		for (int i = 0; i < n; i++) 
    		{ 
    		int temp = arr[n-1];
    		arr[n-1] = arr[i];
    		arr[i] = temp;
    
            }
    		cin >> arr[0]; 
    		}					
    }
    


  • Du hast in der Schleife mit dem n und i durcheinander gekommen.
    Du brauchst hier keine Hilfsvariable temp. Wenn du die Richtung geschickt wählst.

    Da du mit dieser Funktion die Anzahl der Elemente änderst, solltest du das auch main mitteilen.

    ^Ich denke ja auch, dass die Funktion [c]Array_spiegeln[/c] nur die Elemente Spiegeln soll, die auch vorhanden sind.^



  • Klappen tut das so leider nicht.

    for (int i = n; i < n; i--) 
    		{ 
    		arr[i] = arr[i-1];
    
            }
    		cin >> arr[0];
    

    Was ist denn falsch daran? Jetzt überschriebt er nur Index 0.


Anmelden zum Antworten