Vektorimplementierung



  • Ich habe hier eine Hausaufgabe die ich leider nicht verstehe könnte mir jemand bitte helfen

    das hier ist die Aufgabe:

    Schreiben Sie ein Programm, das einen dynamisch großen Speicher für mehrere Fließkommazahlen bereit stellt.
    Das Programm soll dazu ein Array von floats, mit dynamischer Länge implementieren. Nutzen Sie zur Umsetzung
    dynamische Speicherverwaltung, also Heap-Speicher.
    Nutzen Sie die globale Variable float *storage. Der float *storage ist ein Pointer auf einen Speicherbereich
    (ein Array), an dem beliebig viele floats liegen. Nutzen Sie in den zu implementierenden Funktionen
    die im Tutorium kennen gelernten Funktionen zur Allokierung von dynamischem Speicher.
    Nutzen Sie weiterhin die globale Variable capacity vom Typ unsigned short, die die Kapazität (also die
    Zahl an floats, die in storage aufgenommen werden können) speichert.
    Nun sollen folgende Funktionen implementiert werden:
    • void vector(unsigned short size): Wird zum initialisieren benutzt.
    Legt Platz für size floats an und initialisert capacity. Alle size floats sollen initial den Wert NAN
    beinhalten, um das Arraylement als leer zu markieren. NAN ist Teil der Bibliothek math.h und steht für
    Not A Number.
    • void push(float elem): Fügt am ersten unbenutzten Platz im storage den Wert float elem hinzu.
    Benutzen Sie die Funktion isnan(float value), um zu testen, ob ein Element von storage den
    Wert NAN hat. Existiert kein freier Platz mehr, soll ein neuer storage mit doppelter Kapazität angelegt
    werden.
    – Verdoppeln Sie capacity und allokieren Sie neuen Speicher
    – Kopieren Sie alle Elemente des alten Arrays in das neue Array
    – Fügen Sie den neuen Wert float elem hinzu, für den bis eben noch kein Platz war
    – Stellen Sie sicher, dass die neuen leeren Felder des Arrays den Wert NAN beinhalten
    – Geben Sie den Speicher des alten Arrays frei
    – Speichern Sie das neue Array wieder in storage
    • float at(unsigned short index): Liefert den float-Wert am Index i zurück. Falls der Index
    außerhalb des Arrays liegt, soll NAN zurückgegeben werden.
    • void set(unsigned short index, float elem): Setzt den float-Wert am Index i auf elem.
    Falls der Index außerhalb der Grenzen liegt, soll nichts passieren.
    • unsigned short size(void): Gibt die Anzahl der float-Elemente in dem Array zurück. Einträge,
    die aus NAN bestehen, sollen nicht mitgezählt werden.
    War es zu einem beliebigen Zeitpunkt nicht möglich, genügend Speicher zu allokieren, soll ein aussagefähiger
    Text auf der Konsole ausgegeben werden. Außerdem soll in diesem Fall das Programm mit dem Aufruf
    exit(−1) beendet werden.
    Nutzen Sie die Vorgabe:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    float *storage;
    unsigned short capacity;

    void vector(unsigned short size)
    {
    // ... Hier Ihr Code ...
    }

    void push(float elem)
    {
    // ... Hier Ihr Code ...
    }

    float at(unsigned short index)
    {
    // ... Hier Ihr Code ...
    }

    void set(unsigned short index, float elem)
    {
    // ... Hier Ihr Code ...
    }

    unsigned short size(void)
    {
    // ... Hier Ihr Code ...
    }

    int main(void)
    {
    // Erzeuge Test-Vector
    vector(3);

    // Fuege 4 floats hinten an
    push(4.8f);
    push(5.1f);
    push(1.6f);
    push(9.9f);

    // setze erste 3 Elemente
    set(0, 5.5f);
    set(1, 6.6f);
    set(2, 7.7f);

    // setze ein ungueltiges Element
    set(100, 0.5f);

    // setze zweites und viertes Element
    set(2, 0.0f);
    set(4, 0.0f);

    // speichere neue Elemente
    push(7.1f);
    push(8.3f);
    push(4.6f);
    push(2.8f);
    push(9.4f);

    // Gebe Test-Vektor aus
    for (int i = 0; i < capacity; ++i){
    printf("%2.4f ", at(i));
    }
    printf("\nInsgesamt %hu Eintraege.\n", size());
    }


  • Mod

    Und deine Frage lautet? Ob dir jemand die Hausaufgaben machen will?



  • also was ich jetzt schritt für schritt machen muss
    wäre halt sehr nett



  • Legt Platz für size floats an und initialisert capacity. Alle size floats sollen initial den Wert NAN
    beinhalten, um das Arraylement als leer zu markieren. NAN ist Teil der Bibliothek math.h und steht für
    Not A Number.

    unsigned short capacity;
    unsigned *size = calloc(capacity, sizeof(float));

    ist das hier soweit richtig?


  • Mod

    Eine Schritt für Schritt Anleitung liegt dir bereits vor. Wie soll man

    Legt Platz für size floats an und initialisert capacity.

    noch unterteilen? Das sind zwei Codezeilen.

    Ich versuche es mal:
    1. Lesen Sie alle ihre Unterrichtsmaterialien
    2. Lösen Sie alle bisherigen Hausaufgaben *selbstständig*
    3. Denken Sie nun darüber nach, ob Sie eine Funktion kennen gelernt haben, die Platz für Daten anlegt, und eine, die diese initialisiert.
    4. Wenn Sie 3. nicht lösen konnten, dann gucken Sie in einer Referenz zu C nach der Lösung.
    5. Wenn Sie 4. nicht lösen konnten, dann versuchen Sie es mal mit Google.
    6. Wenn Sie 5. nicht lösen konnten, dann ist dieser Kurs nichts für Sie.
    7. Tippen Sie nun dort, wo "// ... Hier Ihr Code ..." steht in

    void vector(unsigned short size)
    {
    // ... Hier Ihr Code ...
    }
    

    den Aufruf einer Funktion ein, die Platz für Daten anlegt und den einer, die diese initialisiert.

    Detailliert genug?



  • Nein.

    Mit welchen Unteraufgaben hast du denn Probleme?



  • aus dem Tut habe ich diese Funktion:
    int *p = calloc(num, sizeof(int)); // Reserviere num integers (0 initialisiert)
    oder
    void *calloc(size_t num, size_t size); // Res. & initial. num*size Bytes mit 0

    jedoch muss ich die Funktion auf die Aufgabe anpassen



  • Ralf859 schrieb:

    jedoch muss ich die Funktion auf die Aufgabe anpassen

    Ja dann mach doch? Wenn du deiner Mikrowelle sagen musst, wie lange sie auf welcher Frequenz arbeiten soll, dann kriegst du das ja auch hin?
    Calloc ist hier aber nicht mal sinnvoll, da du deinen Kram ja mit NaN und nicht 0 initialisieren willst.



  • Ralf859 schrieb:

    aus dem Tut habe ich diese Funktion:
    int *p = calloc(num, sizeof(int)); // Reserviere num integers (0 initialisiert)
    oder
    void *calloc(size_t num, size_t size); // Res. & initial. num*size Bytes mit 0

    jedoch muss ich die Funktion auf die Aufgabe anpassen

    Ja.
    Das erste ist die Anwendung der Funktion, bei gleichzeitiger Definition und Initialisierung eines Zeigers auf int.
    Das zweite ist der Prototyp der Funktion.



  • muss es so aussehen?

    capacity = size;
    storage = (float*)malloc(size * sizeof(float*));

    for(int i=0; i<capacity; i++)
    {
    storage[i]=NAN;
    }



  • Ralf859 schrieb:

    muss es so aussehen?

    Nein, so muss es nicht aussehen.
    Der cast beim malloc kann weg. der ist bei C nicht nötig.
    (wenn du aber den Compiler auf C++ eingestellt hast, möchte er das doch haben)

    Aber ja, das funktioniert so, wenn du es an der richtigen Stelle einbaust.

    Allerdings fehlt da noch der Teil von "War es zu einem beliebigen Zeitpunkt ...."


Log in to reply