Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » dynamische Datenstruktur

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.05.2006, 23:30 Uhr
~TOK-IT
Gast


Gegeben sei folgende Datenstruktur:

struct digit {
float f;
digit * pNext;
};

Aus Elementen der Datenstrukur digit soll eine einfach verkettete Liste aufgebaut werden, deren f-Instanzen (Datenwerte f) jeweils Meßwerte einer Testreihe repräsentieren sollen.

Aufbau:

int generate(digit *&pA);

Die Funktion generate soll eine Liste aufbauen.

Wenn der Parameter pA gleich NULL ist, so soll eine neue Liste aufgebaut werden, sonst sollen Elemente an eine existierende Meßwertliste angehängt werden.

Wie gehe ich da ran? Ich verstehe nicht, wie ich das mit dieser generate Funktion machen soll. Was bedeuten dieser *&.

Danke für die Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.05.2006, 23:39 Uhr
mike
Pinguinhüpfer
(Operator)


Das ist eine Referenz auf einen Pointer.
Hast du schon einen Einsatz oder so?
--

Dieser Post wurde am 19.05.2006 um 23:42 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.05.2006, 23:45 Uhr
~TOK-IT
Gast


Wie meinst du Einsatz?

Es soll wohl einfach nur beispielsweis 10 Messwerte vom user eingegeben werden und dann in eine Liste gespeichert werden, woraus dann wieder Element entfernt und ausgelesen werden können.

Also müsste man doch die Liste irgendwie erstellen und dann die Daten darin aufnehmen, aber wie mach ich das mit diesen Vorgaben?
Hab leider mit Pointern und Referenzen noch keine allzu große Erfahrungen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.05.2006, 23:52 Uhr
mike
Pinguinhüpfer
(Operator)


Ähm Sorry - Ansatz
Najo. In C++ würdest qahrscheinlich eine STL ques nehmen.

Ansonsten ist eine Liste was ganz dynamisches. new und delete anwenden und niemals die Pointer verlieren. Du musst anscheinend ne einfach verkette Liste machen:
www.pronix.de/pronix-827.html

Allerdings solltest du (wenn C++) kein malloc und free sondern new und delete verwenden.

lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.05.2006, 23:58 Uhr
TOK_IT




C++:
struct digit {float f;       //?  
digit *pNeu;};          //?

int generate(digit *&pA) //?
{
    digit *pNeu;
    digit *pWert;

    if (pA==NULL) //neue Liste aufbauen
    {
       pNew = new digit;
       pWert->f = '0.2'; // Hier sollen eigentlich die vom User eingegenen werte hin

}


int main()
{
    digit d;

    // Wie übergebe ich die Werte??
    cout << "Bitte geben Sie den "<< i <<". Messwert ein: "; cin >> messw;
           generate (&d); //?? falsch, aber wie dann?
}



wie mach ich das?

Bearbeitung:
CPP Tags

Dieser Post wurde am 20.05.2006 um 00:13 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.05.2006, 00:12 Uhr
mike
Pinguinhüpfer
(Operator)


Das musste du so machen:

C++:
#include <iostream>

void myFunc(int *&ptr)
{
  std::cout << *ptr << std::endl;
}

int main (int argc, char * const argv[]) {
  int *myPtr = new int;
  *myPtr = 3;
  
  myFunc(myPtr);
  
  delete myPtr;
    
  return 0;
}


--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.05.2006, 00:24 Uhr
TOK_IT



Hmm, dankeschön, ich probiers mal so, wie du's hier hast. Mal kurz die gesamte Aufgabe:


Gegeben sei folgende Datenstruktur:

struct digit {
float f;
digit * pNext;
};

Aus Elementen der Datenstrukur digit soll eine einfach verkettete Liste aufgebaut werden, deren f-Instanzen (Datenwerte f) jeweils Meßwerte einer Testreihe repräsentieren sollen. Die Meßwerte sollen vom Nutzer eingegeben werden.
Beispiel: Der Meßwertreihe -2 -3.4 8.1 0.4 10.7 soll aus 5 Elementen vom Typ digit bestehen:
anchor -> -2 -> -3.4 -> 8.1 -> 0.4 -> 10.7 NULL

Entwerfen Sie über eine solche Datenstruktur ein C++-Programm mit folgendem Aufbau:

int generate(digit *&pA);

Die Funktion generate soll eine Liste aufbauen. Der Inhalt der f-Instanzen (Strukturelemente f eines Listenelements) ist vom Nutzer festzulegen. Die Anzahl der einzugebenden Elemente wird entweder

* vom Programmierer festgelegt oder
* dadurch bestimmt, dass ein bestimmter Abbruchwert festgelegt wird, dessen Eingabe zum Abbruch des Aufbaus der Liste führt.

Die Funktion generate gibt den Wert 1 zurück, wenn der Aufbau vollständig geglückt ist, den Wert 0 sonst.
Wenn der Parameter pA gleich NULL ist, so soll eine neue Liste aufgebaut werden, sonst sollen Elemente an eine existierende Meßwertliste angehängt werden. Die korrekte Parameterübergabe ist geeignet in der Funktion main zu realisieren.

float get_mean(digit * pA);

Die Funktion get_mean soll den arithmetischen Mittelwert der f-Instanzen der Elemente der einfach verketteten Liste bestimmen, die durch den Zeiger pA adressiert wird. Der ermittelte Mittelwert ist der rufenden Funktion zu übergeben.
Wenn eine leere Liste übergeben wurde, soll der Wert 0 als Ergebnis geliefert werden.

int delete_elements(digit * & pA, float mean, float divergency);

Die Funktion delete_elements soll alle Elemente aus der einfach verketteten Liste löschen, die durch den Zeiger pA adressiert wird, deren f-Instanz um mehr als divergency (Angabe in Prozent) vom Mittelwert mean abweichen. Zurückgegeben werden soll die Anzahl der gelöschten Elemente.
Hinweis: Beachten Sie, daß auch das Element gelöscht werden kann, welches am Anfang der einfach verketteten Liste steht
In der Funktion main() sollen die beschriebenen Funktionen menuegesteuert (auch mehrfach) aufgerufen werden. Als Mittelwert für die Funktion delete_elements ist das Ergebnis der Funktion get_mean zu nutzen, die prozentuale Abweichung divergency ist von Nutzer des Programmes einzugeben.

Recht umfangreich, ich brauch erstmal den Ansatz, dann klappt hoffentlich der Rest auch.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.05.2006, 00:41 Uhr
mike
Pinguinhüpfer
(Operator)


Jo - hört sich auch nach Hausaufgabe an Zumindest hast du das oben falsch angewandt. Hier noch ein kleines Sample wo du den Unterschied siehst:

C++:
#include <iostream>

void myFuncRef(int *&ptr)
{
  std::cout << "IN FUNC REF: " << &ptr << std::endl;
}

void myFuncPtr(int *ptr)
{
  std::cout << "IN FUNC PTR: " << &ptr << std::endl;
}

int main (int argc, char * const argv[]) {
  int *myPtr = new int;
  *myPtr = 3;
  
  std::cout << "IN MAIN: " << &myPtr << std::endl;

  myFuncPtr(myPtr);
  myFuncRef(myPtr);

  delete myPtr;
    
  return 0;
}



Ansonsten musst du schon konkrete Fragen stellen.
www.igpm.rwth-aachen.de/lehre/C++/2006ss/Download/folienALL.pdf
Seite 114 ff

lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.05.2006, 00:47 Uhr
TOK_IT



JA, großes DANKE erstmal für die schnelle Hilfe, war schon am verzweifeln.
Ich geh erstma ins Bett und probier morgen weiter....

Gute N8 *&LG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.05.2006, 12:29 Uhr
TOK_IT




C++:
struct digit {float f;          
digit *pNext;};                

int generate(digit *&pA)
{
    int i=0;
    char ch;
    digit* pAkt;                   // Zeiger auf das gerade aktuelle digit
    float eingabe;
    
    pA = new digit;              // Speicher für das erste digit reservieren
    pA->f=0;                      // vorhandener Zeiger auf 0 setzten
    pAkt = pA;                    // Startknoten
    

    if (pA == 0) // leere Liste wurde übergeben, neue Liste aufbauen
    {
       cout << "\n=NULLL\n";
    }

    do {
       i++;
       cout << "Bitte geben Sie den "<< i <<". Messwert ein: "; cin >> eingabe;
       pA->pNext = new digit;              // neues Listenelement erstellen
       pA->pNext->f = eingabe;             // dem Element einen Wert zuordnen
       pA = pAkt->pNext;                   // das neue Element wird zum aktuellen

      
       cout << "\nNoch einen Messwert eingeben? (j/n) "; cin >> ch;
    } while (tolower(ch)=='j');
    pAkt->pNext = 0;                         // das letzte Element zeigt auf 0,  Ende der Liste

}

// rekursive Funktion zur Ausgabe
void ausgabe(digit *&pStart)
{
     if (pStart == 0) return;
     cout << pStart->f << endl;
     ausgabe(pStart->pNext);

     return;
}

int main()
{
    int i=0;
    char ch;
    digit *pStartGloList;
    pStartGloList->f=0;                            

    do {
       cout << "1 - neue Messwerte eingeben\n"
              << "2 - Elemente löschen\n"
               << "3 - Mittelwert ausrechnen\n"
               << "4 - Liste ausgeben\n";
               << "0 - Programm beenden\n\n\n\nAuswahl: "; cin >> ch;
        switch (ch) {
           case '0':
              break;
           case '1':
              generate(pStartGloList);
              break;
           case '2': //DEL
              break;
           case '3': // MW
              break;
           case '4': // Liste ausgeben
              ausgabe(pStartGloList); system("pause");
              break;
           default: cout << "\nfalsche Eingabe!\n";
        }
    } while (ch != '0');





Aber bei der Ausgabe bricht er immer mit Fehler ab, was stimmt denn nicht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: