Aufgabe Verwaltung eines dynamischen Arrays



  • Das folgende Menü wird Wiederholt ausgeben, bis der Benutzer mit der Eingabe 0 beendet.


    1 Array anlegen
    2 Array-Groesse aendern
    3 Wert eingeben
    4 Feld ausgeben
    0 Programm beenden
    Eingabe :


    Die Eingaben werden mit einer switch-case-Anweisung ausgewertet. Alle
    Aktionen incl. der Menüausgabe finden in einer Funktion statt, die in den
    case-Anweisungen aufgerufen wird. Es werden keine globalen Variablen
    benötigt.

    Array anlegen
    Die Funktion arrayAnIegen prüft zunächst ob das Array schon angelegt
    wurde. In diesem Fall erscheint eine Fehlermeldung und die Funktion liefert als
    Rückgabewert die Adresse des schon bestehenden Felds.
    Dann wird die gewünschte Anzahl von Datenelementen abgefragt. Ist
    diese ungültig, erscheint eine Fehlermeldung und die Funktion liefert
    den Rückgabewert NULL.
    Ansonsten wird ein Array mit der gewünschten Länge angelegt, die
    Datenelemente mit -1 initialisiert und als Rückgabewert zurück geliefert.

    Array Groesse ändern
    Die Funktion arrayGroesseAendern prüft zunächst ob das Array schon
    angelegt wurde. Im Fehlerfall erscheint eine entsprechende Fehlermeldung
    und die Funktion liefert den Rückgabewert NULL.
    Anschließend wird die gewünschte Anzahl von Datenelementen
    abgefragt. Ist diese ungültig, erscheint eine Fehlermeldung und die
    Funktion liefert das ursprüngliche Array als Rückgabewert.
    Nun kann der Benutzer auswählen ob er die Inhalte des ursprünglichen
    Arrays übernehmen will oder nicht. Rückgabewert der Funktion ist das neu
    angelegte Array.

    Wert eingeben
    In der Funktion wertAendern wird zunächst geprüft ob das Array schon
    angelegt wurde. Dann wird der Index des zu ändernden Datenelements abgefragt und auf
    Gültigkeit geprüft.
    Anschließend gibt der Benutzer den Wert ein.

    Array ausgeben
    Die Funktion arrayAusgeben prüft ob das Array schon angelegt ist und gibt
    ggf. die Inhalte der Datenelemente im folgenden Format aus. | 0 | 1 | 2 | 3 | 4 |



  • Und jetzt?



  • @nobrainer Soll das wirklich mit C++ gelöst werden?

    Für mich klingt da C (Array, NULL) durch.



  • @DirkB @Cardiac
    Ja, die Aufgabe soll in C++ gelöst werden.

    Ich bekomme es nicht hin ein dynamisches Array in einer Funktion mit einer gewünschte Größe zu erzeugen und zurückzugeben. Auch nicht nach schauen von YouTube Videos.

    Im main sage ich:

    int* arr = NULL;
    

    Ich habe die Funktion arrayAnlegen so geschrieben:

    int* arrayAnlegen(int len) 
    {
    int neu;
    cout << "Gewuenschte Anzahl der Datenelemente: ";
    cin >> neu;
    int* arr = new int [neu];
    len = neu;
    return arr;
    }
    

    So langsam steige ich nicht mehr durch bei diesen Aufgaben.
    Leider stellt der Lehrer keine Musterlösung zum anschauen und nachvollziehen bereit.



  • @nobrainer sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    Ja, die Aufgabe soll in C++ gelöst werden.

    Dann nimm std::vector

    len = neu;

    len ist bei dir eine lokale Variable in arrayAnlegen.
    Wenn du die änderst hat das keine Auswirkung nach außen.

    arr ist auch eine lokale Variable (das ist gut). Da du deren Wert aber als Rückgabewert der Funktion nimmst, musst du dann beim Aufruf in main den Rückgabewert auch dem arr in main zuweisen

    (vielleicht wären unterschiedliche Variablennamen hilfreicher)



  • @DirkB sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    Dann nimm std::vector

    Ich denke, wenn ein Lehrer von "Array" redet, dann meint er schon C-Arrays. Es geht ja auch darum die Grundlagen zu lernen und nicht zwingend darum, modernes C++.

    @nobrainer Dir ist klar, dass der Parameter len überflüssig ist? Damit machst du ja nicht wirklich etwas, da du über die Konsole die Größe festlegst.



  • @Steffo sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    Ich denke, wenn ein Lehrer von "Array" redet, dann meint er schon C-Arrays. Es geht ja auch darum die Grundlagen zu lernen und nicht zwingend darum, modernes C++.

    Wenn C++ gelehrt wird ist die Grundlage aber std::vector und nicht eigenständige dynamische Speicherverwaltung. Die gehört auch dazu, aber bestimmt nicht als Grundlage.

    Die Rückgabe von NULL spricht auch für einen Lehrer, der die letzten 10 Jahre in der Entwicklung von C++ verschlafen hat.

    Wenn man sowas schon selber schreiben soll / will, sollte man zumindest die Speicherverwaltung in eine eigene Klasse auslagern, damit klar ist, wo speicher angefordert wird und an welcher Stelle der wieder freigegeben wird. Und, überhaupt, wenn man C++ Grundlagen lehrt sollte ja wohl RAII absolute Grundlage sein.

    Aber, mit Google sollte man einige Beispielimplementierungen finden, an denen man sich orientieren kann.
    Z.B. hier: https://algorithmtutor.com/Data-Structures/Basic/Dynamic-Arrays/



  • @Schlangenmensch Das sieht der Lehrer garantiert anders. Zumal C praktisch eine Teilmenge von C++ ist. Also gehört das allein aus Legacy-Gründen mit dazu. Wer mit C++ zu tun hat, hat aus Legacy-Gründen auch immer mit C zu tun. Wer kommt bspw. nicht in die Verlegenheit eine C-Lib einzubinden? Man muss also immer beide Welten verstehen. Somit ist ein natives Array für Lehrzwecke vollkommen legitim.


  • Mod

    Ja, wir haben in der Grundschule auch erst einmal mit Altgermanisch angefangen und römische Zahlen in Stein gemeißelt, bevor wir Lesen, Schreiben und Rechnen gelernt haben.



  • @nobrainer sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    int* arr = NULL;

    Wenn die dein Lehrer:in das so beigebracht hat, dann verweise bitte auf:
    https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-nullptr

    int* arr = new int [neu];

    Wenn die dein Lehrer:in das so beigebracht hat, dann verweise bitte auf: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#r11-avoid-calling-new-and-delete-explicitly

    Du wirst das jetzt wahrscheinlich trotzdem so machen müssen und schlechtes C++ lernen...

    Eine andere Anmerkung: die Eingabe und die Funktion, etwas zu machen, sollten immer getrennt sein. Daher solltest du in der Funktion arrayAnlegen kein cout/cin verwenden. Die gewünschte Länge bekommst du doch schon als Parameter übergeben.



  • @SeppJ Schlechter Vergleich. Wo kommt bei dir Altgermanisch bei der Arbeit vor?
    Wenn man bei dem Vergleich mal tatsächlich bleiben will: Wenn der Lehrer Altgermanisch fordert und alle rufen: "Hey, nimm Deutsch. Das ist viel besser und moderner", dann ist das Thema wohl verfehlt. Gut gemeint ist noch lange nicht erfolgreich geholfen.



  • @nobrainer Packe die Array-Adresse und die Länge in eine struct,
    so hast du die immer zusammen.

    Achte immer auf die Länge vom Array - das ist das Hauptproblem bei C

    Andere Fehlerquellen:
    Speicher holen kann auch mal schief gehen.
    Der Benutzer kann falsche Eingaben machen.


  • Mod

    @Steffo sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    @SeppJ Schlechter Vergleich. Wo kommt bei dir Altgermanisch bei der Arbeit vor?
    Wenn man bei dem Vergleich mal tatsächlich bleiben will: Wenn der Lehrer Altgermanisch fordert und alle rufen: "Hey, nimm Deutsch. Das ist viel besser und moderner", dann ist das Thema wohl verfehlt. Gut gemeint ist noch lange nicht erfolgreich geholfen.

    Wann hast du jemals in C++ selber dynamisch Speicher gemacht? Wenn du's jemals gemacht hast, machst du es katastrophal falsch! Deshalb regen sich hier alle (außer dir) auch so über diese Aufgabenstellung auf.



  • Hi @SeppJ,
    ich tendiere auch zu @Steffo 's Einwand.
    Z.B. habe ich nach dem Buchstaben malen noch Druck und Schreibschrift gelernt.
    Meines Wissens lernen heutige Schüler und Schülerinnen immer noch mit der Hand manuell schreiben, obwohl die meisten schon auf ihrem Smartphone 'wischen', 'klicken' und 'tippen' können und evtl. niemals mehr mit einem Stift schreiben werden. 🙂



  • @SeppJ sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    Wann hast du jemals in C++ selber dynamisch Speicher gemacht? Wenn du's jemals gemacht hast, machst du es katastrophal falsch! Deshalb regen sich hier alle (außer dir) auch so über diese Aufgabenstellung auf.

    Mache ich nicht, aber wie gesagt hat fast jeder C++ Entwickler ebenfalls mit C oder Legacy C++ zu tun. Und Smartpointer und std::vector wird man nie richtig verstehen lernen, wenn man nicht C++ 98 kennt.



  • @Steffo sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    @Schlangenmensch Das sieht der Lehrer garantiert anders. Zumal C praktisch eine Teilmenge von C++ ist. Also gehört das allein aus Legacy-Gründen mit dazu. Wer mit C++ zu tun hat, hat aus Legacy-Gründen auch immer mit C zu tun. Wer kommt bspw. nicht in die Verlegenheit eine C-Lib einzubinden? Man muss also immer beide Welten verstehen. Somit ist ein natives Array für Lehrzwecke vollkommen legitim.

    Wenn der Lehrer das ander sieht, hat er keine Ahnung. Ich weiß, dass das dem TE nicht hilft, ist aber so.

    Ich habe auch nie gesagt, dass das für Lehrzwecke nicht legitim ist, auch mal einen vector selber nachzubauen. Aber damit anzufangen, bevor man die stl Sachen verwenden kann und was von Klassen gehört hat usw. ist einfach schlechter Lehrstiel und sorgt für schlechte C++ Programmierer die hinterher mühselig umlernen müssen.

    @Steffo sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    @SeppJ Schlechter Vergleich. Wo kommt bei dir Altgermanisch bei der Arbeit vor?
    Wenn man bei dem Vergleich mal tatsächlich bleiben will: Wenn der Lehrer Altgermanisch fordert und alle rufen: "Hey, nimm Deutsch. Das ist viel besser und moderner", dann ist das Thema wohl verfehlt. Gut gemeint ist noch lange nicht erfolgreich geholfen.

    Naja, der Lehrer hier sagt, wir machen C++, unterrichtet aber C. Und das mit der berüchtigten Teilmenge stimmt ja auch nur so halb.

    Der passendere Vergleich ist, dass man in der Grundschule erstmal einfache Arithmetik lernt (aka 2+2 = 4 / Nutzung von std::vector) und nicht erstmal, dass die ganzen Zahlen mit der Addition eine Gruppe bilden mit neutralem und inversen Element und was noch dazu gehört.
    Es macht einfach vom didaktischen Aufbau keinen Sinn so anzufangen.



  • @Helmut-Jakoby Das hast du danach gelernt und nicht als Grundlage.

    Der C-Teil (jenseits von C-Strings) bei C++ gehört in den Fortgeschrittenen Teil, nicht in die Grundlagen.
    Wäre es der Fortgeschrittene Teil, wäre die Frage vom TO anders und ich hoffe auch die Aufgabe.



  • @Schlangenmensch sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    Wenn der Lehrer das ander sieht, hat er keine Ahnung

    Aber der Lehrer hat doch erst 1983 sein Skript mühsam mit halbwissen von C nach C++ portiert. Soll er das schon wieder aktualisieren!?
    Vielleicht tun wir ihm auch alle unrecht und der Kurs heißt "Theoretische Informatik am Beispiel von C++".
    Naja, die Aufgabenstellung sieht nicht danach aus.



  • @Helmut-Jakoby sagte in Aufgabe Verwaltung eines dynamischen Arrays:

    Z.B. habe ich nach dem Buchstaben malen noch Druck und Schreibschrift gelernt.

    Ich habe noch nie ein Java oder C#-Buch gesehen, wo man Zeichenketten erstmal in char-Arrays ablegen soll, damit man die Sprache gründlich lernt. Worum gibt es diesen Ansatz in C++ sooo oft!? Das verstehe ich wirklich nicht.



  • @Jockelx
    Du, und die anderen, habt natürlich recht. Es wär wirklich sinnvoll, wenn C++ beigebracht wird, sich nicht mehr auf C zu beziehen. Das funktioniert leider nicht immer in der Ausbildung, weil die etwas 'müden' Ausbilder u.a. schon an der Objektorientierung scheitern.
    Ggf. wäre C++ erfolgreicher, wenn altes C nicht mehr nutzbar wäre.


Anmelden zum Antworten