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.