Programm wird nicht richtig ausgeführt --- C++ ----
-
Hab nur überflogen, aber bei dieser Funktion ist ziemlich viel falsch:
void Element_einlesen(int arr[], int i){ for (i = 1; i <= 1 ; i++){ cout << " Bitte geben Sie eine Zahl ein, die an Index 0 gesetzt werden soll." << endl; cin >> arr[i]; } }Wozu wird Parameter i übergeben? Er wird sowieso mit 1 überschrieben.
Wozu gibt es die for-Schleife? Sie wird immer genau 1 mal ausgeführt.
Der Text stimmt nicht mit dem Code überein. Da steht die Zahl wird an Index 0 gesetzt, tatsächlich aber an Index 1.
Außerdem geht das schief, wenn kein int eingegeben wird.Mir gefällt auch nicht wie du mit den Arrays und der Länge umgehst. Am besten du benutzt std::vector. Lass dich von dem Namen nicht verwirren, das hat mit Vektoren nichts zu tun, das ist nur ein Array mit dynamischer Länge.
#include <vector> void Element_einlesen(vector<int> &v){ int i; do{ cout << "Bitte geben Sie eine Zahl ein, die an das Array angehaengt werden soll." << endl; //Umlaute funktionieren in ASCII nicht gut. Entweder umgehen oder wchar_t's (Unicode) benutzen cin.clear(); //ignoriere aufgetretene Fehler beim Einlesen cin.ignore(cin.rdbuf()->in_avail()); //ignoriere eingelesene falsche Daten } while (!(cin >> i)); //wiederhole Eingabe bis der Nutzer das Richtige eingibt v.push_back(i); //hängt die Zahl ans Ende von v an //Sonstige nützliche vector-Funktionen: //v.size(); //gibt die Länge zurück //v[0]; //erstes Element genau wie bei normalen Arrays //for (size_t i = 0; i < v.size(); i++); //über alle Elemente iterieren //v.resize(größe); //um die Größe anzupassen wenn push_back nicht reicht //statt vector<int> kannst du natürlich auch vector<double>, // vector<string>, vector<vector<vector<int>>> oder so benutzen //weiterer Vorteil: Wenn du auf ein nicht-existentes Element zugreifst, // dann sagt dir das dein OS anstatt dass das Programm einfach abstürzt }Beim nochmaligen Draufkucken stelle ich fest, dass da ein Kommentar //Funktionen steht und darunter stehen Variablen o.0
Der Kommentar // Main ist auch drollig.
-
Also ich komme da nicht dahinter...
Könntet ihr mir noch konkretere Hinweise / Hilfen geben?
Hier mal die Aufgabe. Vielleicht gehe ich das ganze ja falsch an.
Vielen Dank euch schon Mal!
Ziel ist die Verwendung von Funktionen für Teilaufgaben eines
Programms und die Benutzung von Arrays.
1. Aufgabe
Es ist ein Programm zu erstellen, in welchem der Anwender einen
Array einlesen und aus einer Anzahl möglicher Aufgaben
Operationen mit dem Array eine auswählen kann.
Dazu soll das Programm ein Menü anzeigen, aus dem eine
Aufgabe durch Eingabe einer Zahl ausgewählt wird. Die Aufgaben
sollen wiederholt angeboten werden bis zur Beendigung des
Programms durch den Anwender. Jede Aufgabe soll in einer
eigenen Funktion bearbeitet werden. Die maximale Anzahl der
Elemente des Arrays sei 10.
Folgende Aktionen sollen zur Auswahl stehen und mittels switch
realisiert werden:
1. Aufgabe: Das Array mit der vorgegebenen Zahl der Elemente
soll (neu) eingelesen werden.
2. Aufgabe: Das Array soll gespiegelt werden (Reihenfolge
umkehren)
3. Aufgabe: Das Array soll am Bildschirm angezeigt werden.
4. Aufgabe: Ein zusätzliches Element ist einzulesen (falls
möglich) und an die erste Position (Index 0) zu setzen. Die
bisherigen Elemente sind um eine Position nach hinten zu
verschieben.
5. Aufgabe: Das Programm beenden.
Für jede der 5 Teilaufgaben sowie das Gesamtprogramm sind
Struktogramm und Testplan zu erstellen. Darüber hinaus sind im
Programm ausreichend Kommentare anzugeben, Abfragen und
Schleifen sind einzurücken und die Ausgabe ist unter Verwendung
von Manipulatoren gefällig zu gestalten.
Hinweis: Achten Sie bei der Erstellung des Testplans auf alle
Fehlerfälle und fangen Sie diese in Ihrem Programm ab.
Beispiel:
Bitte wählen Sie eine Aufgabe aus in dem Sie
die Nummer der Aufgabe eingeben:
1. Array einlesen (10 Zahlen)
2. Array spiegeln
3. Array anzeigen
4. Zusätzliches Element einlesen
5. Programm beenden
1
Bitte geben Sie Arrayelement 1 ein: 1
Bitte geben Sie Arrayelement 2 ein: 2
Bitte geben Sie Arrayelement 3 ein: 3
Bitte geben Sie Arrayelement 4 ein: 123
Bitte geben Sie Arrayelement 5 ein: 3
Bitte geben Sie Arrayelement 6 ein: 10
Bitte geben Sie Arrayelement 7 ein: 2
Bitte geben Sie Arrayelement 8 ein: 3
Bitte geben Sie Arrayelement 9 ein: 9
Bitte geben Sie Arrayelement 10 ein: 5
Bitte wählen Sie eine Aufgabe aus, indem Sie
die Nummer der Aufgabe eingeben:
1. Array einlesen (10 Zahlen)
2. Array spiegeln
3. Array anzeigen
4. Zusätzliches Element einlesen
5. Programm beendenHier der aktuelle Code:
#include <iostream> using namespace std; int arr[10]; int x; int i = 10; int laenge = 10; int start = 1; void Array_einlesen(int arr[], int x) { for(x = 1 ; x <= 10 ; x++) { cout << " Bitte geben Sie die Zahl Nummer " << x << " ein." << endl; cin >> arr[x]; } } void Array_spiegeln( int arr[], int laenge, int start) { if(laenge >= start) { int hinten = arr[laenge -1]; int vorne = arr[start]; arr[laenge -1] = vorne; arr[start] = hinten; } } void Array_anzeigen(int arr[], int x) { for(x = 1 ; x <= 10 ; x++) { cout << arr[x] << " "; } cout << endl; } void Element_einlesen(int arr[], int i){ i = 0; cout << " Bitte geben Sie eine Zahl ein, die an Index 0 gesetzt werden soll." << endl; cin >> arr[i]; } int main() { char op; cout << "Bitte waehlen sie aus folgenden Aktionen:" << endl; cout << "1: Array einlesen (maximal "<< 10 <<" ) 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(arr, x); break; case '2': Array_spiegeln(arr, laenge, start); cout << " Array wurde gespiegelt. \n" << endl; break; case '3': cout << " Array ausgeben: \n" << endl; Array_anzeigen(arr, x); break; case '4': cout << " Element einlesen: \n" << endl; Element_einlesen(arr, i); 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; }
-
Wieviel konkreter sollen wir denn noch werden?
HAben wir doch schon gesagt:
- Keine auf globale Variablen (die nachusing namespace)
- Der Index beim Array fängt bei 0 an.
zusätzlich:
- Nimm aussagekräftige Variablennamen
- Nutze den Rückgabewert von Funktionen wo es sinnvoll istBeispiel:
void Array_anzeigen(int arr[], int anzahl) { for(int i = 0; i < anzahl; i++) // Der Index fängt bei 0 an ! { cout << arr[i] << " "; } cout << endl; }Da musst du natürlich auch die richtige Anzahl mit übergeben.
(Bis auf das cout ist das aber C)
-
So,
dank eurer Hilfe ist es gelungen. Ist jetzt nicht gerade formschön oder clever aufgebaut, aber es funktioniert....

Danke euch!

#include <iostream> using namespace std; int arr[10]; const int limit = 10; void Array_einlesen(int arr[]) { for(int x = 0 ; x < limit ; 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 arr[]) { for(int x = 0; x < limit; x++) { cout << arr[x] << " "; } cout << endl; } void Element_einlesen(int arr[]) { int reserve, hilf; reserve = arr[1]; arr[1] = arr[0]; // Element 1 wird eine Position nach hinten geschoben. hilf = arr[2]; arr[2] = reserve; // Element 2 wird eine Position nach hinten geschoben. reserve = arr[3]; arr[3] = hilf; // Element 3 wird eine Position nach hinten geschoben. hilf = arr[4]; arr[4] = reserve; // Element 4 wird eine Position nach hinten geschoben. reserve = arr[5]; arr[5] = hilf; // Element 5 wird eine Position nach hinten geschoben. hilf = arr[6]; arr[6] = reserve; // Element 6 wird eine Position nach hinten geschoben. reserve = arr[7]; arr[7] = hilf; // Element 7 wird eine Position nach hinten geschoben. hilf = arr[8]; arr[8] = reserve; // Element 8 wird eine Position nach hinten geschoben. reserve = arr[9]; arr[9] = hilf; // Element 9 wird eine Position nach hinten geschoben. // Element 10 "fällt raus". cin >> arr[0]; // Element wird eingelesen und an Index 0 gesetzt. } int main() { char op; cout << "Bitte waehlen sie aus folgenden Aktionen:" << endl; cout << "1: Array einlesen (maximal "<< 10 <<" ) 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(arr); break; case '2': Array_spiegeln(arr); cout << " Array wurde gespiegelt. \n" << endl; break; case '3': cout << " Array ausgeben: \n" << endl; Array_anzeigen(arr); break; case '4': cout << " Element einlesen: \n" << endl; Element_einlesen(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 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_spiegelnmusst 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
limitvor arr definierst, kannst du dannconst int limit = 10; int arr[limit];machen. Und das dann bitte in
mainund 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; }