comparison between pointer and integer



  • Hallo ich bin C Neuling,

    haben gerade heute in der Hochschule ein kleines C Programm zum programmieren aufbekommen. Nun habe ich damit ein kleines Problem, und zwar gibt der Compiler immer eine Warnung und das Programm funktioniert an entsprechender Stelle auch nicht so wie ich mir das gedacht hatt.
    Und zwar hab ich in einer Struktur diverse Variablen deklariert. Nun möchte ich in einer if Abfrage auf eine Variable vom Typ Char dieser Struktur zugreifen und den Inhalt dieser mit dem Buchstaben "d" bzw in einer zweiten if Abfrage "g" vergleichen. Aber irgendwas läuft da noch falsch. Denke mal bei der Syntax stimmt etwas nicht! Wäre nett wenn mal jemand drüber gucken könnte und mir einen Hinweis geben würde! Anbei der vollständige Code:

    #include <stdio.h>
    #include <stdlib.h>
    #define KONTANZ 8
    #define KONTONR 10000
    #define DARLEHENSZINS 0,05
    #define GUTHABENSZINS 0,03
    
    int main(int argc, char *argv[])
    {
        printf("\n\t2tes 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 = 0;                           /* index */
        struct konto
        {
               unsigned int kontoNr;         /* unsigned beschränkt den Wertebereich von int auf den positiven Bereich */
               float kontoStd;
               char art;                     /* Guthaben mit 'g', Darlehen mit 'd' */
               float zinSz;
               float annuitaet;
               unsigned int laufzeit;
        }; 
        struct konto konten[KONTANZ];        /* legt ein Array konten vom Typ 'sruct konto' mit 'KONTANZ' Slots an */ 
    
        for(i; i < KONTANZ; i++)
        {
               printf("\t\tGuthabenskonto anlegen mit 'g'");
               printf("\n\t\tDarlehenskonto anlegen mit 'd' = \a");       scanf("%c",&konten[i].art);
    //           printf("\n\t\tGewaehlter Kontotyp = %c",konten[i].art);
    
               if (konten[i].art == "d")
               {
                     printf("\n\n\t\tDarlehenshoehe = \a");                scanf("%f",&konten[i].kontoStd);
                     printf("\n\t\tjaehrliche Zahlungen = \a");            scanf("%f",&konten[i].annuitaet);
               }else if (konten[i].art == "g")
               {
                     printf("\n\n\t\tGuthabenhoehe = \a");                 scanf("%f",&konten[i].kontoStd);
                     printf("\n\t\tAnlagedauer = \a");                     scanf("%i",&konten[i].laufzeit);
               }else
               {
                     printf("\n\n\t\tBad entry!\n\n");
                     system("PAUSE");	
                     return 1;
               }
       }
      return 0;
    }
    

    Danke schonmal im Voraus



  • Doppelte Anführungszeichen "d" stehen für Zeichenketten (d.h. const char*), einzelne Zeichen schreibst du mit einfachen Anführungszeichen 'd'.



  • Vergiss float, nimm stattdessen double.
    Alle internen Berechnungen werden sowieso in double gemacht.

    Fließkommazahlen werden in C mit . geschrieben. (Deine Zinssätze hast du mit ,)

    Bei Finanzsachen rechnest du besser mit Integern (oder long long) in Cent.



  • ahhh ok danke für die schnelle Hilfe! Aber an sochen Sachen verzweifelt man manchmal wenn man eine Programmiersprache neu lernt ^^
    Die Variablentypen haben wir so vergegeben bekommen! Muss also so bleiben. Aber trotzdem danke für den Tipp werde ich mir merken.



  • Lies dir unbedingt das Kapitel über Strings durch.

    Vor allem den Unterschied zwischen Zeichen und Zeichenketten (Strings).
    Das sind wichtige Grundlagen ohne die du mit C nicht weit kommst.



  • Ja ich hab mir auch ein Buch gekauft:
    C: Programmieren von Anfang an
    von Helmut Erlenkötter

    das werde ich mir am We nochmal ein bissl zu Gemüte führen.
    Hab nochmal eine kurze Frage, habe jetzt das Problem das beim ersten Durchlauf der Schleife alles so funktioniert wie es sein sollte, beim zweiten durchlauf jedoch kann ich gar kein Kontotyp mehr angeben. Er springt also direkt in den if Zweig mit Bad entry! Woran könnte das liegen?

    MFG



  • Evtl. ist noch ein Zeilenvorschub im Tastaturpuffer. Der wird von scanf nicht mit eingelesen
    Lösung findest du hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39349

    Und:

    ...
               unsigned int laufzeit;
    ...
      scanf("%i",&konten[i].laufzeit); // :warning: falsches Format
    

    %i ist für integer.
    %u ist für unsigned



  • Hallo,

    sollen das alte Programm nun erweitern und zwar sollen die Namen der Kontoinhaber und die Kontostände in einer externen Textdatei speichern. Habe mich diesbezüglich auch schon belesen, allerdings hapert es ein wenig an der Ausführung! Bekomme beim Aufruf der Funktion namSpei immer eine Fehlermeldung:

    81: conflicting types for 'namSpei'
    81: an argument type that has a default promotion can't match an empty parameter name list declaration
    21: previous declaration of 'namSpei' was here

    ich vermute mal das der Pointer nicht richtig an die Funktion übergeben wird? Kann das sein und wenn ja wie mache ich das richtig?

    Danke schon mal im Voraus!

    #include <stdio.h>
    #include <stdlib.h>
    
    #define KONTANZ 4
    #define KONTONR 10000
    #define DARZ 0.05
    #define GUTZ 0.03
    
    struct konto
    {
           unsigned int kontoNr;         /* unsigned beschränkt den Wertebereich von int auf den positiven Bereich */
           float kontoStd;
           char art;                     /* Guthaben mit 'g', Darlehen mit 'd' */
           float zinSz;
           float annuitaet;
           unsigned int laufzeit;
           char *namptr;
    }; 
    
    void namSpei(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\t2tes 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 */ 
        char *namTab[] = {"Christopher ","Lisa ","Michael ","Benjamin "};
    
        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 */
               konten[i].namptr = namTab[i];
               fflush (stdin);                     /* leert Zeichenpuffer */
    
               if(konten[i].art == 'd')
               {
                     konten[i].zinSz = DARZ;
                     konten[i].kontoNr = KONTONR + i;
                     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);
                     printf("\n\t\tjaehrliche Zahlungen = \a");            
                     scanf("%f",&konten[i].annuitaet);
                     fflush(stdin);        /* leert Zeichenpuffer */
    
                     while(konten[i].kontoStd *(DARZ + 0.01) >= konten[i].annuitaet)
                     {
                            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')
               {
                     konten[i].zinSz = GUTZ;
                     konten[i].kontoNr = KONTONR + i;
                     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);
                     printf("\n\t\tAnlagedauer = \a");                      
                     scanf("%u",&konten[i].laufzeit);
                     fflush(stdin);        /* leert Zeichenpuffer */
               }else
               {
                     printf("\n\n\t\tBad entry!\n\n");
                     system("PAUSE");
               }
               void namSpei(konten[i].kontoStd, konten[i].namptr);
       }
    
       for(i = 0; i < KONTANZ; i++)         /* Schleife zum Berechnen der Konten */  
       {
              if(konten[i].art == 'd')
              {
                     printf("\n\n\n\n\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
                     printf("\n\tName: %s\n", konten[i].namptr);
                     annSchl(konten[i].zinSz, konten[i].kontoStd, konten[i].annuitaet);
                     system("PAUSE");
              }else if(konten[i].art == 'g')	
              {
                     printf("\n\n\n\n\tKontonummer: %u\tKontoart: %c\n",konten[i].kontoNr, konten[i].art);
                     printf("\n\tName: %s\n", konten[i].namptr);
                     zinsSchl(konten[i].zinSz, konten[i].kontoStd, konten[i].laufzeit);
                     system("PAUSE");
              }
       }
    }
    
    /* Speichert den Namen und den zugehoerigen Kontostand in name.txt */
    void namSpei(float kontoStd, char *namptr)
    {
         FILE *myFile;
         myFile = fopen("name.txt", "a");
         if (myFile == NULL)
            {
                     printf ("\n\t**** Datei konnte nicht geoeffnet werden ****\n");
                     exit (EXIT_FAILURE);
            }
            fprintf (myFile, "%s\t %f\n", namptr, kontoStd);
            fclose (myFile);
            system ("pause");
    }
    
    /* 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;
              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;
              printf("\n\tJahr %i: angel. Zinsen = %.2f, Guthabenhoehe = %.2f\n", i, zinsAng, kontoStd);
        }
        printf("\n\a");
    }
    


  • Schau dir doch mal die Zeile 81 an.

    christopher_gies schrieb:

    void namSpei(konten[i].kontoStd, konten[i].namptr);
    

    das versucht der Compiler als eine Funktionsdeklaration zu interpretieren - und scheitert dabei. Wenn du das "void" dort weglässt, sollte es passen.



  • Entschuldigung... manchmal fragt man sich wirklich ob man dämlich ist... 😃
    Hatte mich jetzt so auf die Übergabe des Pointers versteift, da ich damit gerade das erste mal arbeite, dass ich das garnicht gesehen habe! 🙂
    Aber vielen Dank!


Anmelden zum Antworten