Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Help

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 <
000
13.06.2006, 15:23 Uhr
~Stephi_
Gast


Mein Programm soll beliebig viele Zahlen vom Benutzer einlesen, ohne dass die Anzahl vorher bekannt ist. Mein Programm liest aber bisher nur eine Zahl ein und macht dann einfach gar nichts mehr. Hat vielleicht jemand eine Ahnung, woran das liegt?


Code:

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


typedef struct LISTENELEMENT {   //Struktur für ein Listenelement; Struktur braucht Name, damit Zeiger auf sich selbst def werden kann
    float fZahl;                 //Nutzdaten
    struct LISTENELEMENT *pNext; //Struktur braucht Name, damit Zeiger auf sich selbst def werden kann
}ZAHL_ELEMENT;


typedef struct {  
    ZAHL_ELEMENT* pFirst;//Erzeugung einer Liste; enth Zeiger auf Listenelement, welches das
    int iAnzahl;         // erste Element sein soll
}ZAHL_LISTE;


void deleteFirst(ZAHL_LISTE *pEineZahlenListe)
{
    ZAHL_ELEMENT *pTempZahlenElement; //Zeiger auf Listenelement
    if(pEineZahlenListe->pFirst==NULL) //überprüfen, ob leere Liste übergeben wird
        return;
    else
    {
        pTempZahlenElement=pEineZahlenListe->pFirst->pNext; //temp. Zeiger initialisieren auf 2.Element

        free (pEineZahlenListe->pFirst);//freigeben des dyn.angeforderten Speichers für das 1.Listenelement
        pEineZahlenListe->pFirst=pTempZahlenElement;//einhängen des ehem. 2. als neues 1. Listenelement
        pEineZahlenListe->iAnzahl--; //dekrementieren der Anzahl
    }
}

void deleteList(ZAHL_LISTE *pEineZahlenListe)
{
    while (pEineZahlenListe->pFirst!=NULL)//überprüfen, ob leere Liste übergeben wurde
        deleteFirst(pEineZahlenListe);
}

ZAHL_ELEMENT *newElement(ZAHL_ELEMENT Zahl)
{
    ZAHL_ELEMENT *temp; //Zeiger auf ZAHL_ELEMENT
    
    temp=(ZAHL_ELEMENT*) malloc (sizeof(ZAHL_ELEMENT));
        
    temp->fZahl=Zahl; //eingegebene Zahl wird in ZAHL_ELEMENT als fZahl gespeichert
    return temp;
}

void initListe(ZAHL_ELEMENT *Liste)
{
    Liste->pNext = NULL; //initialisiert leere Liste
}


void insertLast(ZAHL_ELEMENT *pEineZahlenListe, ZAHL_ELEMENT *ElementZahl)//Zeiger auf Kopf, Zeiger auf Zahl
{
    while (pEineZahlenListe->pNext==NULL); //bis bei NULL angelangt, was dem Ende der Liste entspricht
    pEineZahlenListe=pEineZahlenListe->pNext; //Ende gefunden, pNext auf ZAHL_ELEMENT
    pEineZahlenListe->pNext=ElementZahl; //Eingegebene Zahl wird "übergeben"
}ElementZahl->pNext=NULL;//Ende gesetzt

int main()
{
    int i=1;
    float d=1;
    
    ZAHL_ELEMENT kopf;    //Listenelement mit Namen "kopf"
    ZAHL_ELEMENT *iTemp; //Zeiger auf Listenelement
    
    initListe(&kopf);//leere Liste soll initialisiert werden
    
    while (d!=0)
    {
        printf("Geben sie eine Zahl ein (0 fuer Ende):");
            scanf("%lf",&d);
            insertLast(&kopf, newElement(d));
    }
    
    iTemp=kopf.pNext;//Zeiger auf Listenelement kopf
    
    while(iTemp)
    {
        printf("%d.Zahl: %lf\n",iTemp->fZahl);
        iTemp=iTemp->pNext; //Zeiger auf das nächste Listenelement
        i++;
    }
    deleteList(&kopf);//Listenelement löschen
    return 0;

}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.06.2006, 15:54 Uhr
ao

(Operator)


scanf ("%lf") ist für double-Variablen. Für float verwende scanf("%f").

while(d!=0): Mach mit Fließkomma-Werten keine scharfen Tests auf Gleichheit oder Ungleichheit, dabei können überraschende Dinge entstehen. Besser sind Tests, ob d innerhalb oder außerhalb eines kleinen Intervalls um 0 liegt. Bei float (6 Stellen Genauigkeit) ist ein passender Intervallradius 1E-5, bei double (15 Stellen) 1E-14.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.06.2006, 16:01 Uhr
~Stephi_
Gast


Hmm. Die main()-Fkt. war so in etwa schon vorgegeben. Jetzt weiß ich wenigstens, worum es sich bei scanf ("%lf") handelt. Habs jetzt zu (%f) gemacht. Allerdings macht das Programm immer noch nicht mehr als eine einzige Zahl ein zu lesen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.06.2006, 17:15 Uhr
Tommix



Hallo,
Du verwendest float und ZAHL_ELEMENT kreuz und quer, ich krieg das gar nicht kompiliert. Vermutlich stürzt das Programm bei

C++:
insertLast(&kopf, newElement(d));


ab, da newElement so deklariert ist

C++:
ZAHL_ELEMENT *newElement(ZAHL_ELEMENT Zahl)


Du aber nur ein float (d) übergibst.
Die Eingabeschleife ohne insertLast ist ok. Ich würde auch die Prüfung auf 0 direkt nach einer Eingabe bei float durchgehen lassen.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.06.2006, 17:37 Uhr
~Stephi_
Gast


Meinst du, ich solle es einfach so schreiben?:


Code:


ZAHL_ELEMENT *newElement(float Zahl)
{
    ZAHL_ELEMENT *temp;
    temp=(ZAHL_ELEMENT*) malloc (sizeof(ZAHL_ELEMENT));
    temp->fZahl=Zahl;
    return temp;
}




Ich dachte wenn ich es so schreibe

Code:
ZAHL_ELEMENT *newElement(ZAHL_ELEMENT Zahl)


dass dann die nach oben zu newElement geschickte Eingabe d auch gleich als ein Element von ZAHL_ELEMENT gemacht wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.06.2006, 23:38 Uhr
Bruder Leif
dances with systems
(Operator)


Mir stößt noch die Zeile hier sauer auf:

Code:
while (pEineZahlenListe->pNext==NULL); //bis bei NULL angelangt, was dem Ende


Weg mit dem Semikolon!
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: