Pointer und Doppelt verkettete Listen



  • Hallo ich habe von der FH wieder mal eine Aufgabe auf mein Programm, das ich auch schon früher hier gepostet habe (leider finde ich den Threat nicht mehr ^^) um einige Funktionalitäten zu erweitern.
    Und zwar sollen angelegte Konten die bereits in einem Array abgelegt wurden. In eine doppelt verlinkte Liste gespeichert werden.
    Da ich mich mit Pointern noch nicht so sehr auskenne haut mir der Compiler einige Fehlermeldungen raus mit denen ich nichts anfangen kann!
    Vlt. könnte ja mal jemand der mehr Erfahrung auf dem Gebiet hat mir einige Tipps geben was ich noch falsch mache!
    Ich poste nun mal meinen Code inklusive meiner Compiler Fehlermeldungen.

    Compiler Fehlermeldungen:

    In function `newlist':
    167 [Warning] assignment from incompatible pointer type
    168 [Warning] assignment from incompatible pointer type

    In function `inList':
    177 initializer element is not constant
    185 [Warning] comparison of distinct pointer types lacks a cast
    187 [Warning] assignment from incompatible pointer type
    191 [Warning] assignment from incompatible pointer type
    194 dereferencing pointer to incomplete type
    197 [Warning] comparison of distinct pointer types lacks a cast

    Also wie ihr schon seht geht es hauptsächlich um 2 Funktionen, der Rest des Programms funktioniert ja schon. Wurde vom Prof auch schon abgenommen.
    zu dem Fehler in Zeile 177 ist zu sagen, das diese Pointer als statisch in der Funktion abgelegt werden sollen. D.h. wir sollen keine globalen Variablen definieren.
    Bei den restlichen Fehlermeldungen bin ich ehrlichgesagt selber noch ein bissl ratlos. Ich weiß zwar worum es geht, kenn mich aber mit der Syntax von Pointern etc. noch nicht so gut aus!

    Danke schon mal im Voraus!

    /* Programm zur Kontoführung in einer Bank mit Zins- bzw. Annuitätsberechnung "Prototyp" */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define KONTANZ 2
    #define KONTONR 10000
    #define DARZ 0.05
    #define GUTZ 0.03
    
    #define TEST
    #define USEFILE
    #define VALUE_DEVELOPING
    
    struct konto
    {
           unsigned int kontoNr;         /* Kontonummer, unsigned beschränkt den Wertebereich von int auf den positiven Bereich */
           float kontoStd;               /* Kontostand */
           char art;                     /* Kontoart, Guthaben mit 'g', Darlehen mit 'd' */
           float zinSz;                  /* Zinssatz */
           float annuitaet;              /* Annuitaet bei Darlehenskonten */
           unsigned int laufzeit;        /* Laufzeit bei Guthabenskonten */
           char *namptr;                 /* Kontoinhaber */
    }; 
    
    struct node{
           struct Node *prev;
           struct Node *next;
           struct konto *kont;
           };
    
    struct node * newlist();  
    void inList(struct konto * kontoptr);
    void namRead();
    void namWrite(float kontoStd, char *namptr);
    void annSchl(float zinSz, float kontoStd, float annuitaet);
    void zinsSchl(float zinSz, float kontoStd, unsigned int laufzeit);
    
    int main(int argc, char *argv[])
    {
        printf("\n\t5tes Programm im SS 2011. Kontodaten");
        printf(" von C. Gies");
        printf("\n\tuebersetzt am %s",__DATE__);
        printf(" um %s Uhr",__TIME__);
        printf("\n\n");
    
        int i;                                  /* Index */
        struct konto konten[KONTANZ];           /* legt ein Array konten vom Typ 'sruct konto' mit 'KONTANZ' Slots an */ 
    
    #ifdef TEST
        char *namTab[] = {"Christopher","Lisa","Michael","Benjamin"}; /* Namensarray für Vorbesetzung Kontoinhaber */
    #else
        char buffer[200];                       /* Char Puffer für Eingabe des Kontoinhabers */
    #endif
    
        for(i = 0; i < KONTANZ; i++)            /* Schleife zum Einrichten der Konten */
        {
               printf("\n\n\n\t\tGuthabenskonto anlegen mit 'g'");
               printf("\n\t\tDarlehenskonto anlegen mit 'd' = \a");        
               konten[i].art = getchar();          /* Liest einen einzelnen char von der Tastatur */
    
               #ifdef TEST
               konten[i].namptr = namTab[i];
               #else
               printf("\n\t\tKontoinhaber: \a");
               scanf("%s",&buffer);
               konten[i].namptr = malloc(strlen(buffer)+1+1); //strlen zählt die chars im buffer, malloc reserviert entsprechend viel Speicher +1 +1 und weißt diesen dem Pointer zu.
               strcpy(konten[i].namptr, buffer); //kopiert die ersten 4 +1 +1 zeichen für z.B. Lisa in den Pointer, +1 +1 für ein ' ' und ein '\o' --> steht für String-Ende
               #endif
    
               konten[i].kontoNr = KONTONR + i;
               fflush(stdin);                     /* leert Zeichenpuffer */
    
               while(konten[i].art != 'g' && konten[i].art != 'd') /* Überprüfung Eingabe Kontoart */
               {
                     printf("\n\t**** keine zulaessige Kontoart ****\n");
                     printf("\t\tGuthabenskonto anlegen mit 'g'");
                     printf("\n\t\tDarlehenskonto anlegen mit 'd' = \a");        
                     konten[i].art = getchar();          /* Liest einen einzelnen char von der Tastatur */
                     fflush(stdin);                     /* leert Zeichenpuffer */
               }
    
               if(konten[i].art == 'd') /* Darlehenskonten initialisieren */
               {
                     konten[i].zinSz = DARZ;
                     printf("\n\n\n\t\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
                     printf("\n\t\tDarlehenshoehe = \a");                  
                     scanf("%f",&konten[i].kontoStd);
    
                     while (konten[i].kontoStd <= 0) /* Überprüfung Eingabe Darlehenhöhe */
                     {
                           printf("\n\t**** Darlehen muss groesser 0 sein ****\n");
                           printf("\n\t\tDarlehenshoehe = \a");                  
                           scanf("%f",&konten[i].kontoStd);
                     }
    
                     printf("\n\t\tjaehrliche Zahlungen = \a");            
                     scanf("%f",&konten[i].annuitaet);
    
                     while(konten[i].kontoStd *(DARZ + 0.01) >= konten[i].annuitaet) /* Überprüfung Eingabe Annuität */
                     {
                            printf("\n\t**** Jaehrliche Zahlung zu gering ****\n");
                            printf("\n\t\tjaehrliche Zahlungen = \a");            
                            scanf("%f",&konten[i].annuitaet);
                            fflush(stdin);        /* leert Zeichenpuffer */
                     }
    
               }else if(konten[i].art == 'g') /* Guthabenskonten initialisieren */
               {
                     konten[i].zinSz = GUTZ;
                     printf("\n\n\n\t\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
                     printf("\n\t\tGuthabenhoehe = \a");                    
                     scanf("%f",&konten[i].kontoStd);
    
                     while (konten[i].kontoStd <= 0) /* Überprüfung Eingabe Guthabenhöhe */
                     {
                           printf("\n\t**** Guthaben muss groesser 0 sein ****\n");
                           printf("\n\t\tGuthabenhoehe = \a");                  
                           scanf("%f",&konten[i].kontoStd);
                     }
    
                     printf("\n\t\tAnlagedauer = \a");                      
                     scanf("%u",&konten[i].laufzeit);
                     fflush(stdin);        /* leert Zeichenpuffer */
               }
               #ifdef USEFILE
               namWrite(konten[i].kontoStd, konten[i].namptr);
               #endif
       }
    
       for(i = 0; i < KONTANZ; i++)         /* Schleife zum Berechnen der Konten */  
       {
              printf("\n\n\n\n\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
              printf("\n\tKontoinhaber: %s\n", konten[i].namptr);
    
              if(konten[i].art == 'd') /* Darlehenskonten berechnen */
              {
                     annSchl(konten[i].zinSz, konten[i].kontoStd, konten[i].annuitaet);
              }else if(konten[i].art == 'g') /* Guthabenskonten berechnen */
              {
                     zinsSchl(konten[i].zinSz, konten[i].kontoStd, konten[i].laufzeit);
              }
              system("PAUSE");
    
              /* Pointer auf Array mit Konten */
              struct konto * kontoptr = &konten[i];
    
       }
       #ifdef USEFILE
       namRead();
       #endif
    }
    
    /* Erzeuge eine neue Doppelt verlinkte Liste */
    struct node * newlist()
    {
        /* Erzeuge ersten Knoten und ringverzeigere ihm mit sich selbst */
    	struct node *new = (struct node*) malloc(sizeof(struct node));
    	new->kont  = NULL;
    	new->prev  = new;
    	new->next  = new;
    	return new;
    }
    
    /* speichere Elemente in eine Doppelt verlinkte Liste */
    void inList(struct konto * kontoptr)
    {
        /* initialisiere head mit static, sodass head nur beim ersten Schleifendurchlauf initialisiert wird */
        static struct node *head = newlist();
    	struct node *current     = head;
    
        /* Erzeuge neuen Knoten und weise ihm ein Konto zu */
    	struct node *new = (struct node *) malloc(sizeof(struct node));
        new->kont        = kontoptr;
    
        /* suche Einzeigerstelle */
    	while((strcmp(current->kont->namptr, new->kont->namptr) < 0) && (head != (current->next)))
    	{
                current = current->next;
        }
    
    	/* neuen Knoten Einzeigern */
    	new->prev        = current;
    	new->next        = current->next;
    	current->next    = new;
    	new->next->prev  = new;
    
    	/* wenn Knoten am Anfang eingefügt, aktualisiere head */
    	if(new->next == head)
    	{
                head = new;
        }
    }
    
    /* Liest die Namen und den zugehoerigen Kontostand aus name.txt aus */
    void namRead()
    {
         FILE *myFile ;
         char buffer[100];
         myFile = fopen("name.txt ", "r");
         printf("\n\n");
         if(myFile == NULL)
         {
              printf("\n\t**** Datei konnte nicht geoeffnet werden ****\n");
              system("pause");
              exit(EXIT_FAILURE);
         }
         while(fscanf(myFile ,"%s" ,buffer) != -1)
         {
               printf("\t%s\n", buffer);
         }
         fclose(myFile);
         printf("\n\n");
         system("pause");
    }
    
    /* Speichert den Namen und den zugehoerigen Kontostand in name.txt */
    void namWrite(float kontoStd, char *namptr)
    {
         FILE *myFile;
         myFile = fopen("name.txt", "a");
         if(myFile == NULL)
            {
                     printf("\n\t**** Datei konnte nicht geoeffnet werden ****\n");
                     system("pause");
                     exit(EXIT_FAILURE);
            }else
            {
                     fprintf(myFile, "%s %.2f\n", namptr, kontoStd);
                     fclose(myFile);
            }
    }
    
    /* Berechnet die Tilgungsdauer des Darlehens darhoe mit Zinssats zinSz bei jährlicher Zahlung von jahrZlg */
    void annSchl(float zinSz, float kontoStd, float annuitaet)
    {
        float zinsBez = 0;       /* Höhe der bis dahin bezahlten Zinsen */
        int i;                 /* zählt die Tilgungsjahre */
    
        for(i = 1; kontoStd > annuitaet; i++)
        {
              zinsBez = zinsBez + kontoStd * zinSz;
              kontoStd = kontoStd * (1 + zinSz) - annuitaet;
    
              #ifdef VALUE_DEVELOPING
              printf("\n\tJahr %i Restdarlehen = %.2f, bez.Zinsen = %.2f\n", i, kontoStd, zinsBez);
              #endif
        }
        printf("\n\tJahr %i Restdarlehen = %.2f, bez.Zinsen = %.2f\n", i, kontoStd, zinsBez);
        printf("\nTilgung im %i ten Jahr.",i);
        printf("\n\n\a");
    }
    
    /* Berechnet die angelaufenen Zinsen und den Endwert einer Kapitalanlage nach x Jahren. */
    void zinsSchl(float zinSz, float kontoStd, unsigned int laufzeit)
    {
        float zinsAng;           /* Höhe der angelaufenen Zinsen des Jahres */
        int i;
    
        for(i = 1; i <= laufzeit; i++)
        {
              zinsAng = kontoStd * zinSz;
              kontoStd = kontoStd + zinsAng;
    
              #ifdef VALUE_DEVELOPING
              printf("\n\tJahr %i: angel. Zinsen = %.2f, Guthabenhoehe = %.2f\n", i, zinsAng, kontoStd);
              #else
              if(laufzeit == i)
                          printf("\n\tJahr %i: angel. Zinsen = %.2f, Guthabenhoehe = %.2f\n", i, zinsAng, kontoStd);
              #endif
        }
        printf("\n\a");
    }
    


  • Erstmal hast du in Zeile 27 und 28 die Schreibweise durcheinandergebracht (für C sind "node" und "Node" zwei unterschiedliche Bezeichner.

    Und zweitens sagt die Meldung zu Zeile 177 doch klar, wo das Problem ist - statische Variablen können nur mit (zur Compilezeit) konstanten Ausdrücken initialisiert werden.
    Außerdem ist es imho eine schlechte Idee, die verarbeitete Liste statisch IN der Einfüge-Funktion unterzubringen - spätestens wenn du dazu kommst, in der Liste zu suchen oder Elemente zu löschen, fällst du damit auf die Nase. Bessere Lösung ist es, die Liste als lokale Variable im Hauptprogramm zu definieren und als Parameter an die Verarbeitungsfunktionen zu übergeben.



  • CStoll wie immer wieder vielen Danke für deine schnelle hilfreiche Antwort!
    Da oben hätte ich nie nach dem Fehler gesucht! ^^ Habe den Namen der Struktur nachträglich gemäß der Konvention in kleinschreibung geändert und dabei vergessen die restlichen Variablen zu ändern!
    Danke für deinen Tipp bzgl. dem unterbringen der Liste, jetzt wo ich nochmal drüber nachdenke macht das schon Sinn! ^^



  • Hallo ich habe mal wieder ein Problem bzgl. des oben genannten Prgramms, habe dieses jedoch schon ein bissl erweitert. Dazu poste ich unten mal den aktuellen Quelltext.

    Und zwar liegt der Fehler in dem Unterprogramm inList, dort will ich in Zeile 214 in einer while Schleife die Speicherstelle für ein Element in einer doppelt verketteten Liste finden.

    Die Elemente sollen nach Namen der Kontoinhaber gespeichert werden, d.h. Christopher vor Lisa und Alfred vor Christpoher.
    Zum test dieser Schleife habe ich mir schonmal eine Probeausgabe erstellt die mir die Speicheradresse des Element zurückgeben soll auf den der Pointer current z.Z. zeigt.

    Dabei ist mir aufgefallen, das diese Schleife nie durchlaufen wird. Aber ich verstehe nicht warum!

    Ich vergleiche mit strcmp die Namen der Elemente die sich aktuell in der Liste befinden mit dem Namen des einzufügenden Elements.

    Ist der aktuelle Name in der Liste kleiner als der Einzufügende Name, soll das nächste Element untersucht werden, solange bis der aktuelle Name größer oder gleich dem einzufügenden Namen ist oder das Ende der Schleife erreicht wurde.

    /* Programm zur Kontoführung in einer Bank mit Zins- bzw. Annuitätsberechnung "Prototyp" */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define KONTANZ 2
    #define KONTONR 10000
    #define DARZ 0.05
    #define GUTZ 0.03
    
    #define TEST
    //#define USEFILE
    #define VALUE_DEVELOPING
    
    struct konto
    {
           unsigned int kontoNr;         /* Kontonummer, unsigned beschränkt den Wertebereich von int auf den positiven Bereich */
           float kontoStd;               /* Kontostand */
           char art;                     /* Kontoart, Guthaben mit 'g', Darlehen mit 'd' */
           float zinSz;                  /* Zinssatz */
           float annuitaet;              /* Annuitaet bei Darlehenskonten */
           unsigned int laufzeit;        /* Laufzeit bei Guthabenskonten */
           char *namptr;                 /* Kontoinhaber */
    }; 
    
    struct node{
           struct node *prev;
           struct node *next;
           struct konto *kont;
           };
    
    struct node * newlist();  
    void inList(struct node *head, struct node *current, struct konto * kontoptr);
    void gibAus(struct node *head, struct node *current);
    void namRead();
    void namWrite(float kontoStd, char *namptr);
    void annSchl(float zinSz, float kontoStd, float annuitaet);
    void zinsSchl(float zinSz, float kontoStd, unsigned int laufzeit);
    
    int main(int argc, char *argv[])
    {
        printf("\n\t5tes Programm im SS 2011. Kontodaten");
        printf(" von C. Gies");
        printf("\n\tuebersetzt am %s",__DATE__);
        printf(" um %s Uhr",__TIME__);
        printf("\n\n");
    
        int i;                                  /* Index */
        struct konto konten[KONTANZ];           /* legt ein Array konten vom Typ 'sruct konto' mit 'KONTANZ' Slots an */ 
        struct node *head = newlist();          /* Erstelle Pointer auf Doppelt verlinkte Liste */
    	struct node *current = head;            /* Erstelle Pointer auf das aktuelle Element der DvL | VOR diesem Element wird eingefügt */
    
    #ifdef TEST
        char *namTab[] = {"Lisa","Christopher","Michael","Benjamin"}; /* Namensarray für Vorbesetzung Kontoinhaber */
    #else
        char buffer[200];                       /* Char Puffer für Eingabe des Kontoinhabers */
    #endif
    
        for(i = 0; i < KONTANZ; i++)            /* Schleife zum Einrichten der Konten */
        {
               printf("\n\n\n\t\tGuthabenskonto anlegen mit 'g'");
               printf("\n\t\tDarlehenskonto anlegen mit 'd' = \a");        
               konten[i].art = getchar();          /* Liest einen einzelnen char von der Tastatur */
    
               #ifdef TEST
               konten[i].namptr = namTab[i];
               #else
               printf("\n\t\tKontoinhaber: \a");
               scanf("%s",&buffer);
               konten[i].namptr = malloc(strlen(buffer)+1+1); //strlen zählt die chars im buffer, malloc reserviert entsprechend viel Speicher +1 +1 und weißt diesen dem Pointer zu.
               strcpy(konten[i].namptr, buffer); //kopiert die ersten 4 +1 +1 zeichen für z.B. Lisa in den Pointer, +1 +1 für ein ' ' und ein '\o' --> steht für String-Ende
               #endif
    
               konten[i].kontoNr = KONTONR + i;
               fflush(stdin);                     /* leert Zeichenpuffer */
    
               while(konten[i].art != 'g' && konten[i].art != 'd') /* Überprüfung Eingabe Kontoart */
               {
                     printf("\n\t**** keine zulaessige Kontoart ****\n");
                     printf("\t\tGuthabenskonto anlegen mit 'g'");
                     printf("\n\t\tDarlehenskonto anlegen mit 'd' = \a");        
                     konten[i].art = getchar();          /* Liest einen einzelnen char von der Tastatur */
                     fflush(stdin);                     /* leert Zeichenpuffer */
               }
    
               if(konten[i].art == 'd') /* Darlehenskonten initialisieren */
               {
                     konten[i].zinSz = DARZ;
                     printf("\n\n\n\t\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
                     printf("\n\t\tDarlehenshoehe = \a");                  
                     scanf("%f",&konten[i].kontoStd);
    
                     while (konten[i].kontoStd <= 0) /* Überprüfung Eingabe Darlehenhöhe */
                     {
                           printf("\n\t**** Darlehen muss groesser 0 sein ****\n");
                           printf("\n\t\tDarlehenshoehe = \a");                  
                           scanf("%f",&konten[i].kontoStd);
                     }
    
                     printf("\n\t\tjaehrliche Zahlungen = \a");            
                     scanf("%f",&konten[i].annuitaet);
    
                     while(konten[i].kontoStd *(DARZ + 0.01) >= konten[i].annuitaet) /* Überprüfung Eingabe Annuität */
                     {
                            printf("\n\t**** Jaehrliche Zahlung zu gering ****\n");
                            printf("\n\t\tjaehrliche Zahlungen = \a");            
                            scanf("%f",&konten[i].annuitaet);
                            fflush(stdin);        /* leert Zeichenpuffer */
                     }
    
               }else if(konten[i].art == 'g') /* Guthabenskonten initialisieren */
               {
                     konten[i].zinSz = GUTZ;
                     printf("\n\n\n\t\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
                     printf("\n\t\tGuthabenhoehe = \a");                    
                     scanf("%f",&konten[i].kontoStd);
    
                     while (konten[i].kontoStd <= 0) /* Überprüfung Eingabe Guthabenhöhe */
                     {
                           printf("\n\t**** Guthaben muss groesser 0 sein ****\n");
                           printf("\n\t\tGuthabenhoehe = \a");                  
                           scanf("%f",&konten[i].kontoStd);
                     }
    
                     printf("\n\t\tAnlagedauer = \a");                      
                     scanf("%u",&konten[i].laufzeit);
                     fflush(stdin);        /* leert Zeichenpuffer */
               }
               #ifdef USEFILE
               namWrite(konten[i].kontoStd, konten[i].namptr);
               #endif
       }
    
       for(i = 0; i < KONTANZ; i++)         /* Schleife zum Berechnen der Konten */  
       {
              printf("\n\n\n\n\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
              printf("\n\tKontoinhaber: %s\n", konten[i].namptr);
    
              if(konten[i].art == 'd') /* Darlehenskonten berechnen */
              {
                     annSchl(konten[i].zinSz, konten[i].kontoStd, konten[i].annuitaet);
              }else if(konten[i].art == 'g') /* Guthabenskonten berechnen */
              {
                     zinsSchl(konten[i].zinSz, konten[i].kontoStd, konten[i].laufzeit);
              }
              system("PAUSE");
    
              /* Pointer auf auf aktuelles Konto im Array Konten */
              struct konto * kontoptr = &konten[i];
              inList(head, current, kontoptr);
              gibAus(head, current);
       }
       #ifdef USEFILE
       namRead();
       #endif
    }
    
    /*******************************************************************************
     *                                                                             *
     *                        U N T E R P R O G R A M M E                          *
     *                                                                             *
     ******************************************************************************/
    
    /* Erzeuge eine neue Doppelt verlinkte Liste */
    struct node * newlist()
    {
        /* Erzeuge ersten Knoten und ringverzeigere ihm mit sich selbst */
    	struct node *new = (struct node*) malloc(sizeof(struct node));
    	new->kont  = NULL;
    	new->prev  = new;
    	new->next  = new;
    	return new;
    }
    
    /* speichere Elemente in eine Doppelt verlinkte Liste */
    void inList(struct node *head, struct node *current, struct konto * kontoptr)
    {
         static int counter = 0; /* COUNTER ZUR FEHLERSUCHE */
         counter++; /* FEHLERSUCHE */
    
        /* setze current auf Listenanfang */ 
        current = head;
    
        /* Erzeuge neuen Knoten und weise ihm ein Konto zu */
    	struct node *new = (struct node *) malloc(sizeof(struct node));
        new->kont        = kontoptr;
    
        /* Wenn Liste nur ein Element hat füge neues Element entsprechend ein */
        if(current->next == current)
        {
                 new->prev        = current;
    	         new->next        = current;
    	         current->next    = new;
    	         current->prev    = new;
                 printf("\n%i. Name: %s\t %u", counter, kontoptr->namptr, new); /* AUSGABE ZUR FEHLERSUCHE */    
        }else
        {          
                 /* setzt current auf zweites Element, da erstes Element = NULL */
                 current = head->next;
    
                 /* suche Einzeigerstelle */
    	         while((strcmp(current->kont->namptr, new->kont->namptr) < 0) && (head != (current->next)))
    	         {   
                           current = current->next;
                           printf("%u", current); /* AUSGABE ZUR FEHLERSUCHE */
                 }
    
    	         /* neuen Knoten Einzeigern */
    	         new->prev              = current->prev;
    	         new->next              = current;
    	         (current->prev)->next  = new;
    	         current->prev          = new;
                 printf("\n%i. Name: %s\t %u\n", counter, kontoptr->namptr, new); /* AUSGABE ZUR FEHLERSUCHE */ 
                 system("pause");
        }
    }
    
    /* Gesamte Liste ausgeben */
    void gibAus(struct node *head, struct node *current)
    {
         current = head->next;
    
         while(head != (current->next))
         {
                 printf("\n\tName: %s \tKontostand: %.2f \n", current->kont->namptr, current->kont->kontoStd);
                 system("pause");
                 current = current->next;
         }
    }
    
    /* Liest die Namen und den zugehoerigen Kontostand aus name.txt aus */
    void namRead()
    {
         FILE *myFile ;
         char buffer[100];
         myFile = fopen("name.txt ", "r");
         printf("\n\n");
         if(myFile == NULL)
         {
              printf("\n\t**** Datei konnte nicht geoeffnet werden ****\n");
              system("pause");
              exit(EXIT_FAILURE);
         }
         while(fscanf(myFile ,"%s" ,buffer) != -1)
         {
               printf("\t%s\n", buffer);
         }
         fclose(myFile);
         printf("\n\n");
         system("pause");
    }
    
    /* Speichert den Namen und den zugehoerigen Kontostand in name.txt */
    void namWrite(float kontoStd, char *namptr)
    {
         FILE *myFile;
         myFile = fopen("name.txt", "a");
         if(myFile == NULL)
            {
                     printf("\n\t**** Datei konnte nicht geoeffnet werden ****\n");
                     system("pause");
                     exit(EXIT_FAILURE);
            }else
            {
                     fprintf(myFile, "%s %.2f\n", namptr, kontoStd);
                     fclose(myFile);
            }
    }
    
    /* Berechnet die Tilgungsdauer des Darlehens darhoe mit Zinssats zinSz bei jährlicher Zahlung von jahrZlg */
    void annSchl(float zinSz, float kontoStd, float annuitaet)
    {
        float zinsBez = 0;       /* Höhe der bis dahin bezahlten Zinsen */
        int i;                 /* zählt die Tilgungsjahre */
    
        for(i = 1; kontoStd > annuitaet; i++)
        {
              zinsBez = zinsBez + kontoStd * zinSz;
              kontoStd = kontoStd * (1 + zinSz) - annuitaet;
    
              #ifdef VALUE_DEVELOPING
              printf("\n\tJahr %i Restdarlehen = %.2f, bez.Zinsen = %.2f\n", i, kontoStd, zinsBez);
              #endif
        }
        printf("\n\tJahr %i Restdarlehen = %.2f, bez.Zinsen = %.2f\n", i, kontoStd, zinsBez);
        printf("\nTilgung im %i ten Jahr.",i);
        printf("\n\n\a");
    }
    
    /* Berechnet die angelaufenen Zinsen und den Endwert einer Kapitalanlage nach x Jahren. */
    void zinsSchl(float zinSz, float kontoStd, unsigned int laufzeit)
    {
        float zinsAng;           /* Höhe der angelaufenen Zinsen des Jahres */
        int i;
    
        for(i = 1; i <= laufzeit; i++)
        {
              zinsAng = kontoStd * zinSz;
              kontoStd = kontoStd + zinsAng;
    
              #ifdef VALUE_DEVELOPING
              printf("\n\tJahr %i: angel. Zinsen = %.2f, Guthabenhoehe = %.2f\n", i, zinsAng, kontoStd);
              #else
              if(laufzeit == i)
                          printf("\n\tJahr %i: angel. Zinsen = %.2f, Guthabenhoehe = %.2f\n", i, zinsAng, kontoStd);
              #endif
        }
        printf("\n\a");
    }
    


  • Hier im C Forum gibt es C/C++ Tags, schon mal gesehen? Scheinbar nicht.
    Stringgleichheit mit strcmp ermittelt man mit !strcmp und nicht wie du mit strcmp()<0.
    fflush(stdin) ist undefiniert.
    system("pause") ist unportabel.
    fscanf ist, wenn man nicht den vollen Durchblick hat, also insbesondere für Anfänger wie dich, fehlerträchtig und schon gar nicht sollte man auf -1 testen, dafür gibt es EOF.



  • hab das problem gefunden die while Schleife arbeitet doch korrekt, Problem lag am "umbiegen" der Zeiger!
    @Wutz danke für deine Tipps, werde ich mir mal durchlesen die Tags, wollte die Strings jedoch nicht auf gleichheit prüfen sondern darauf welcher als int Zahl dargestellt größer ist, also nach dem ASCII Alphabet!


Anmelden zum Antworten