Biorythmus programmieren



  • Hallo, ich muss für die Schule ein Programm schreiben, indem ich ein Geburtsdatum einlese und das heutige Datum ausgebe.Dazu muss ich für 29 Tage den Biorhythmus berechnen, nur hab ich ein Problem, ich bin noch unerfahren und kenne mich nicht so aus damit. Es wäre sehr nett wenn mir jemand helfen kann.
    Bedanke mich jetzt schon.

    Das ist mein Programm bis jetzt:

    #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;

    printf("Geben sie ihr Geburtsdatum (tt.mm.jjjj) ein --> ");
    leseDatum(pt,pm,pj);
    if(pruefeDatum(*pt,*pm,*pj))
    {

    systemDatum(&ta,&ma,&ja);
    tage(*pt,*pm,*pj,ta,ma,ja);
    printf("\nWert |physisch |koerperlich |geistig\n");
    printf("-------------------------------------------------------------\n");
    }
    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("Sie leben bereits %d Tage",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)
    {
    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;
    }
    int aktJahr()
    {
    time_t sec;
    struct tm *sys;
    time(&sec);
    sys = localtime(&sec);
    return 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;
    }



  • 1. Benutze Code Tags. (Code mit der Maus markieren und auf den C-Button unter dem 😡 klicken. - Dann ist der Code weiterhin formatiert.
    2. das geht als Mitglied auch noch nachträglich.
    3. Bechreibe dein Problem so gut es geht.
    4. Stelle (zumindest) eine Frage. (Die sind an ? erkennbar)
    5. Du benutzt doch schon Funktionen aus time.h. Dann bleib doch dabei. Das berücksichtigt schon Schaltjahre.
    6. wozu brauchst du *int *pt=&t,*pm=&m,pj=&j; in main?



  • #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;
    
        printf("Geben sie ihr Geburtsdatum (tt.mm.jjjj) ein --> ");
        leseDatum(pt,pm,pj);
        if(pruefeDatum(*pt,*pm,*pj))
        {
            systemDatum(&ta,&ma,&ja);
            tage(*pt,*pm,*pj,ta,ma,ja);
            printf("\nWert |physisch |koerperlich |geistig\n");
            printf("-------------------------------------------------------------\n");
        }
        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("Sie leben bereits %d Tage",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)
    {
        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;
        }
    
        int aktJahr()
        {
            time_t sec;
            struct tm *sys;
            time(&sec);
            sys = localtime(&sec);
            return 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;
    }
    

    Ich hab es mal formatiert 🙂

    Habt ihr die Dinge die du hier verwendest in der Schule auch schon durch genommen? Denn ohne es böse zu meinen aber mir scheint du hast viele Dingen in deinem Code selber noch nicht 100% verstanden.

    1. Die Verwendung von Pointer solltest du dir nocheinmal anschauen

    2. Ich finde es zwar super das du Funktionsprototypen und Funktionen verwendest, aber ein einzelnes scanf() in eine Funktion zu packen ist meiner Meinung unsinnig

    3. If + else mit dem ?-Operator zu lösen ist natürlich völlig in Ordnung, aber als Anfänger würde ich dir davon abraten da es meiner Meinung schwerer zu lesen ist.

    4. for(j1++; j1<j2; j1++) -> sieh dir nochmals an wie man eine for-Schleife schreibt

    5. Funktion systemDatum() ist mir ein kleines Rätsel. In die "unter Funktionen" geht dein Programm nie hinein. Was soll das bewirken bzw. was hast du dir dabei gedacht? Bei den 3 struct Variablen sehe ich den Nutzen auch nicht (abgesehen davon das dein Programm nie zu diesen Variablen kommt).

    6. Beim Switch am Ende: Bei den leeren case kommt da noch was oder warum schreibst du sie hin?

    Das sind die Sachen was mir ins Auge gefallen sind...
    Wäre schön wenn du Dinge kommentierst, damit ein anderer schneller versteht was du vor hast.


Anmelden zum Antworten