Biorythmus berechnen



  • DirkB schrieb:

    Es reicht nicht t, m und j als Zeiger zu definieren. Die müssen auch Speicherplatz verweisen.

    Das verstehe ich jetzt nicht so ganz ...
    ich habe hier:

    int main()
    {
        int *t=0,*m=0,*j=0;
    

    3 Variablen über ihren Speicherplatz festgesetzt
    und hier:

    int leseDatum(int *t, int *m, int *j)
    {
        return scanf("%d.%d.%d",t,m,j);
    
    }
    

    will ich sieh beschreiben ... müsste doch passen oder?



  • Nein, das reicht nicht. Das sind Zeiger. Die nehmen Adressen von einem Speicherbereich auf, an dem dann der eigentliche Wert steht.

    Bei *int t ist t die Adresse und *t wäre der Inhalt an der Adresse als int.

    Du hast nur den Zeiger (als Behälter für die Adresse).

    int main()
    {
        int t=0,m=0,j=0;	      // Variablen mit Speicherplatz
        int *pt=&t,*pm=&m,*pj=&j; // Zeiger, die jetzt auf die Variablen zeigen
    

    Natürlich verbrauchen die Zeiger auch Speicher. Sie müssen ja schließlich die Adresse aufnehmen. Daher haben (alle) Zeiger die gleiche größe, egal auf was (int, char, double, structs, ...) sie zeigen.



  • Bei leseDatum() ist das richtig.
    In main musst du den Speicherplatz bereitstellen.



  • okey das habe ich jetzt gemacht doch jetzt kommt sogar bei einem gültigen datum raus das es falsch ist warum?



  • Dann zeig doch mal deinen aktuelle Code.



  • DirkB schrieb:

    Dann zeig doch mal deinen aktuelle Code.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    int pruefeDatum(int tag, int monat, int jahr);
    int leseDatum(int *t, int *m, int *j);
    int tage(int t1, int m1, int j1, int t2, int m2, int j2);
    void bio(int tage, double *physisch, double *emotionell, double *geistig);
    int schaltjahr(int jahr);
    void systemDatum(int *t, int *m, int *j);
    void inkrementDatum(int *t, int *m, int *j);
    
    int main()
    {
        int t=0,m=0,j=0;
        int *pt=&t,*pm=&m,*pj=&j;
        char line[] = "-------------";
    
        printf("Geben sie ihr Geburtsdatum (tt.mm.jjjj) ein --> ");
        leseDatum(pt,pm,pj);
        if(pruefeDatum(*pt,*pm,*pj)){
            printf("Tage\t  physisch\t  koerperlich\t    geistig\n");
            printf("%s%s%s%s\n",line,line,line,line);
        }
        else
            printf("Datum -.-");
        return 0;
    }
    
    int pruefeDatum(int tag, int monat, int jahr)
    {
        int tpm[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(schaltjahr(jahr))
            tpm[12]= 31,29,31,30,31,30,31,31,30,31,30,31;
        if(tag<=1&&tag<=tpm[monat - 1])
            return 1;
        else
            return 0;
    }
    int leseDatum(int *t, int *m, int *j)
    {
        return scanf("%d.%d.%d",t,m,j);
    
    }
    int tage(int t1, int m1, int j1, int t2, int m2, int j2);
    void bio(int tage, double *physisch, double *emotionell, double *geistig);
    /**void systemDatum(int *t, int *m, int *j)
    {
        int aktTag()
    {
        time_t sec;
        struct tm *sys;
        time(&sec);
        sys = localtime(&sec);
        return sys->tm_mday;
    }
    int aktMonat()
    {
        time_t sec;
        struct tm *sys;
        time(&sec);
        sys = localtime(&sec);
        return sys->tm_mon + 1;
    }
    void inkrementDatum(int *t, int *m, int *j);*/
    int schaltjahr(int jahr)
    {
        return ((jahr%4==0) && (jahr%100!=0)) || (jahr%400==0);
    }
    


  • Vergiss das mal das mit den *px. Die sind hier völlig unnötig.
    in main():

    int t=0,m=0,j=0;
    //    int *pt=&t,*pm=&m,*pj=&j;
        char line[] = "-------------";
    
        printf("Geben sie ihr Geburtsdatum (tt.mm.jjjj) ein --> ");
        leseDatum(&t,&m,&j);
        if(pruefeDatum(tpm,j)){
    

    Und in pruefeDatum() bewirkt die Zeile

    tpm[12]= 31,29,31,30,31,30,31,31,30,31,30,31;
    

    das dem Element 12 (das gar nicht existiert) der Wert 31 (der ganz rechte) zugewiesen wird.
    Du kannst einem Array nur bei der Deklaration Werte zuweisen.
    Ändere darum einfach den Februar:

    if(schaltjahr(jahr))
            tpm[1]= 29;
    

    Und dein Vergleich Funktioniert nur am 1. des Monats (oder auch beinegativen Tagen).

    if(tag<=1&&tag<=tpm[monat - 1])
    

    Den Fehler findest du jetzt selber. 🙂



  • Das versteh ich jetzt nicht so ganz ...



  • Hello World schrieb:

    int tpm[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(schaltjahr(jahr))
            tpm[12]= 31,29,31,30,31,30,31,31,30,31,30,31;
        if(tag<=1&&tag<=tpm[monat - 1])
            return 1;
        else
            return 0;
    

    Dieser Code ist absoluter Müll und nebenbei auch undefiniertes Verhalten weil du auf Speicher ausserhalb des definierten Bereiches zugreifst.
    Weißt du, was ein Array ist?
    Weißt du, wie man mit Arrays korrekt arbeitet?
    Ich bezweifle dies.



  • interessanterweise war der Code im Eröffnungspost schon richtig, zumindest im Beug auf diese Array-Verarbeitung.

    @Hello: Du solltest dir mal ansehen, welche Werte die Bedingung if( tag<=1 && tag<=tpm[monat - 1] ) tatsächlich erfüllen.



  • @Wutz bezüglich Arrays bin ich gerade im lernen ... haben dies gerade in der Schule begonnen, ein Array ist ein Feld das mehrere Werte speichern kann!
    @CSoll & all other .... verdammt hab nie gedacht das ich den Fehler in der if-Anweisung gemacht habe, danke für den Tipp CSoll 🙂
    Habe es nun hingebracht 🙂

    int tpm[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(schaltjahr(jahr))
            tpm[1]= 29;
        if(tag>=1&&tag<=tpm[monat - 1]&& monat<=12 && monat >= 1)
            return 1;
        else
            return 0;
    

    Nun habe ich noch eine letzte Frage .... wie berechnet man die Tage die man schon lebt ... hab da mal so angefangen .... leider kommen bei mir zu wenig Tage raus:

    int tage(int t1/*geb.T*/, int m1/*geb.M*/, int j1/*Geb.J*/, int t2/*akt. T*/, int m2/*akt. M*/, int j2/*akt. J*/)
    {
        int tage=1;
        systemDatum(&t2,&m2,&j2);
        for(;j1<j2-1;j1++)
        {
            if(schaltjahr(j1))
                tage+=366;
            else
                tage+=365;
        }
        if(m1>1 && m2>1 && m1<3 && m2<3)
            tage+=31;
        if(m1>2 && (m2<2 && schaltjahr(j2))&& m1<4 && m2<4)
            tage+=60;
            else if(m1>2 && (m2<2 && m1<4 && m2<4))
                    tage+=59;
        if(m1>3 && (m2<3 && schaltjahr(j2))&& m1<5 && m2<5)
            tage+=91;
            else if(m1>3 && (m2<3 && m1<5 && m2<5))
                    tage+=90;
        if(m1>4 && (m2<4 && schaltjahr(j2))&& m1<6 && m2<6)
            tage+=121;
            else if(m1>4 && (m2<4 && m1<6 && m2<6))
                tage+=120;
        if(m1>5 && (m2<5 && schaltjahr(j2))&& m1<7 && m2<7)
            tage+=152;
            else if(m1>5 && (m2<4 && m1<7 && m2<7))
                tage+=151;
        if(m1>6 && (m2<6 && schaltjahr(j2))&& m1<8 && m2<8)
            tage+=182;
            else if(m1>6 && (m2<6 && m1<8 && m2<8))
                tage+=181;
        if(m1>7 && (m2<7 && schaltjahr(j2))&& m1<9 && m2<9)
            tage+=213;
            else if(m1>7 && (m2<7 && m1<9 && m2<9))
                tage+=212;
        if(m1>8 && (m2<8 && schaltjahr(j2))&& m1<10 && m2<10)
            tage+=244;
            else if(m1>8 && (m2<8 && m1<10 && m2<10))
                tage+=243;
        if(m1>9 && (m2<9 && schaltjahr(j2))&& m1<11 && m2<11)
            tage+=274;
            else if(m1>9 && (m2<9 && m1<11 && m2<11))
                tage+=273;
        if(m1>10 && (m2<10 && schaltjahr(j2))&& m1<12 && m2<12)
            tage+=305;
            else if(m1>10 && (m2<10 && m1<12 && m2<12))
                tage+=304;
        if(m1>11 && (m2<8 && schaltjahr(j2))&& m1<=12 && m2<=12)
            tage+=335;
            else if(m1>11 && (m2<9 && m1<=12 && m2<=12))
                tage+=334;
        for(;t1<=t2;t1++)
        {
            tage+=1;
        }
        printf("%d",tage);
        return tage;
    
    }
    

    das aktuelle Datum ermittle ich so:

    void systemDatum(int *t, int *m, int *j)
    {
        time_t sec;
        struct tm *sys;
        time(&sec);
        sys = localtime(&sec);
        *t  = sys->tm_mday;
    
        time_t secm;
        struct tm *sysm;
        time(&secm);
        sysm = localtime(&secm);
        *m = sys->tm_mon + 1;
    
        time_t secj;
        struct tm *sysj;
        time(&secj);
        sysj = localtime(&secj);
        *j = sys->tm_year + 1900;
    }
    


  • Ich würde beide Daten in einen time_t umrechnen (mittels mktime()) und anschließend die Differenz per difftime() ermitteln - Umrechnung in Tage dürfte trivial sein.



  • Hello World schrieb:

    int tpm[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        if(schaltjahr(jahr))
            tpm[1]= 29;
        if(tag>=1&&tag<=tpm[monat - 1]&& monat<=12 && monat >= 1)
            return 1;
        else
            return 0;
    

    Du greifst für Monat > 12 immer noch undefiniert auf das Array zu.
    Nutze die Kurzschlussauswertung von &&:

    int tpm[]={31,28,31,30,31,30,31,31,30,31,30,31};
        if( schaltjahr(jahr) )
            tpm[1]= 29;
        return ( monat > 0 && monat <= 12 && tag > 0 && tag <= tpm[monat - 1]);
    


  • @CStoll ok Wie funktioniert das?
    @Wutz okey Danke 🙂



  • Hello World schrieb:

    @CStoll ok Wie funktioniert das?
    @Wutz okey Danke 🙂

    Schau mal hier http://www.cplusplus.com/reference/clibrary/ctime/mktime/
    Eine Erklärung zu difftime findest du ort auch.



  • hmmm mit dem haben wir uns noch nicht beschäftigt -.- das mit der aktSystemZeit war vorgegeben ... hab das Problem jetzt anders gelöst:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <math.h>
    #define schaltjahr( jahr ) (((jahr)%4 == 0 && (jahr) % 100 != 0 ) || (jahr) % 400 == 0)
    int pruefeDatum(int tag, int monat, int jahr);
    int leseDatum(int *t, int *m, int *j);
    int tage(int t1, int m1, int j1, int t2, int m2, int j2);
    void bio(int tage, double *physisch, double *emotionell, double *geistig);
    void systemDatum(int *t, int *m, int *j);
    void inkrementDatum(int *t, int *m, int *j);
    int mTage(int monat, int jahr);
    
    int main()
    {
        int t=0,m=0,j=0;
        int ta=0,ma=0,ja=0;
        int *pt=&t,*pm=&m,*pj=&j;
        char line[] = "-------------";
    
        printf("Geben sie ihr Geburtsdatum (tt.mm.jjjj) ein --> ");
        leseDatum(pt,pm,pj);
        if(pruefeDatum(*pt,*pm,*pj))
        {
            printf("\nTage\t  physisch\t  koerperlich\t    geistig\n");
            printf("%s%s%s%s\n",line,line,line,line);
            systemDatum(&ta,&ma,&ja);
            tage(*pt,*pm,*pj,ta,ma,ja);
        }
        else
            printf("Falsches Datum");
        return 0;
    }
    
    int pruefeDatum(int tag, int monat, int jahr)
    {
        int tpm[]={31,28,31,30,31,30,31,31,30,31,30,31};
        if( schaltjahr(jahr) )
            tpm[1]= 29;
        return ( monat > 0 && monat <= 12 && tag > 0 && tag <= tpm[monat - 1]);
    }
    int leseDatum(int *t, int *m, int *j)
    {
        return scanf("%d.%d.%d",t,m,j);
    
    }
    int tage(int t1, int m1, int j1, int t2, int m2, int j2)
    {
        int tage;
    
        tage=(j1==j2 && m1==m2)?t2-t1:(mTage(m1,j1)-t1)+t2;
    
        for(m1++; (j1==j2 && m1<m2) || (j1<j2 && m1<13); m1++)
        {
            tage += mTage(m1, j1);
        }
        for(m2--; j1<j2 && m2>0; m2--)
        {
            tage += mTage(m2, j2);
        }
        for(j1++; j1<j2; j1++)
        {
            tage += schaltjahr(j1) ? 366 : 365;
        }
        printf("%d",tage);
        return tage;
    }
    void bio(int tage, double *physisch, double *emotionell, double *geistig)
    {
    
    }
    void inkrementDatum(int *t, int *m, int *j);
    void systemDatum(int *t, int *m, int *j)
    {
        time_t sec;
        struct tm *sys;
        time(&sec);
        sys = localtime(&sec);
        *t  = sys->tm_mday;
    
        time_t secm;
        struct tm *sysm;
        time(&secm);
        sysm = localtime(&secm);
        *m = sys->tm_mon + 1;
    
        time_t secj;
        struct tm *sysj;
        time(&secj);
        sysj = localtime(&secj);
        *j = sys->tm_year + 1900;
    }
    int mTage(int monat, int jahr)
    {
        int tag;
        switch(monat)
        {
        case 1: //Jänner
        case 3: //März
        case 5: //Mai
        case 7: //Juli
        case 8: //August
        case 10: //Oktober
        case 12:
            tag = 31; //Dezember
            break;
        case 4: //April
        case 6: //Juni
        case 9: //September
        case 11:
            tag = 30; //November
            break;
        case 2:
            if(schaltjahr(jahr))
                tag=29;
            else
                tag=28;
        }
        return tag;
    }
    


  • Hello World schrieb:

    int leseDatum(int *t, int *m, int *j)
    {
        return scanf("%d.%d.%d",t,m,j);
    
    }
    

    Das ist so natürlich falsch.
    Hast du dich mal über den Rückgabewert von scanf informiert?
    Wenn du diesen benutzt, solltest du das aber wissen:

    int leseDatum(int *t, int *m, int *j)
    {
        return 3==scanf("%d.%d.%d",t,m,j);
    
    }
    


  • aha ... das wusste ich nicht!
    DAnke


Anmelden zum Antworten