Biorythmus berechnen
-
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 hingebrachtint 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]);
-
-
Hello World schrieb:
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