Berechnung des Trefpunktes zweier Züge
-
Hallo ich habe ein Programm für die Schule geschrieben was den Treffpunkt zweier Züge berechnet.Das Programm funktioniert soweit ganz gut. Aber ein Manko hat es
und ich weiß nicht warum.Also: Wenn man die Werte 1000, 100, 0,5 und anschließend 180 eingibt, bekomme ich eine Fehlermeldung???Dann wäre da noch etwas anderes.Ich wollte anstatt if else lieber einen switch einbauen aber habe es nicht hinbekommen, kann mir da jemand einen Tipp geben.:-))
/* verwendete C-Bibliotheken */ /*****************************/ #include <stdio.h> /* C Standard-Bibliothek fuer Ein-/Ausgabe */ /* scanf();, printf(), gets() */ #include <conio.h> /* Borland-Bibliothek fuer direkte Ein-/Ausgabe */ /* clrscr(), clreol(), wherex(), gotoxy() */ /* Deklaration von Unterprogramm-Prototypen */ /********************************************/ /* neue Zuggeschwindigkeiten berechnen */ void vneu (double s1, double tp1, double tp2, double v2, double v1, double sg, double sp, double *v1neu, double *v2neu, int zug); /* Passierzeit bis zum Treffpunkt berechnen */ void passierzeit (double *passzeit, double tp1, double tp2, int zug) ; /* Aufteilung dezimale Sekundenzeit in hh:mm:ss */ void timesplit (double t, long int* pth, long int* ptm, long int* pts); /****************************************************************************/ /* Hauptfunktion main */ /****************************************************************************/ int main (void) { /* Hauptfunktion immer Funktion main */ int progende = 0; /* Steuerung Hauptprogramm-Schleife */ char dummy[81]; /* Programmstop u. Eingabepuffer leeren */ double sg; /* Gesamtstrecke wird vom Benutzer eingegeben */ double v1; /* Momentane Geschwindigkeit von Zug 1 wird eingegeben */ double v2; /* Momentane Geschwindigkeit von Zug 2 wird eingegeben */ double s1; /* Momentante Position von Zug 1 wird eingegeben */ double slf; /* Fuer die berechnung des fiktiven Treffpunktes */ double tpf; /* Fuer die berechnung der fiktiven Passierzeit */ double sp; /* Nächstliegenden möglichen Passierpunkt berechnen */ double tp1; /* Mögliche Passierzeit vom Zug 1 bis sp berechnen */ double tp2; /* Mögliche Passierzeit vom Zug 2 bis sp berechnen */ double t1rest; /* Restfahrzeit von Zug 1 bis sg berechnen */ double t2rest; /* Restfahrzeit von Zug 2 bis sg berechnen */ int zug; /* Hilfs-Laufvariable fuer Zug langsamer */ long int stunde, minute, sekunde; /* fuer Zeitangabe in h:m:s */ double v1neu; /* Neue Geschwindigkeit von Zug 1 berechnen */ double v2neu; /* Neue Geschwindigkeit von Zug 2 berechnen */ double passzeit; /* Passierzeit bis zum Treffpunkt berechnen */ do { /* Hauptprogramm-Schleife */ printf(" Programm zur Berechnung des Passierpunktes von zwei Zuegen " "Oezcan Islemecioglu\n"); printf(" ----------------------------------------------------------\n"); printf(" Zug 2 Einfahrt in die Strecke, Zug 1 auf der Strecke \n"); printf(" Moegliche Passierpunkte bei 0.2, 0.4, 0.6, 0.8 der " "Gesamtstrecke"); printf("\n\n"); printf(" Gesamtstrecke sg in Kilometern : "); scanf ("%lf", &sg); printf(" Momentane Geschwindigkeit Zug 1 [km/h] : "); scanf ("%lf", &v1); printf(" Momentane Position Zug 1 [0.n*Sg] : "); scanf ("%lf", &s1); printf(" Momentane Geschwindigkeit Zug 2 [km/h] : "); scanf ("%lf", &v2); gets (dummy); /* Eingabepuffer leeren */ printf("\n\n"); sg = sg * 1000; /* Umrechnung km in m */ v1 = v1 / 3.6; /* Umrechnung km/h in m/s */ v2 = v2 / 3.6; /* Umrechnung km/h in m/s */ /* fiktiven Treffpunkt berechnen (Zeit unf Ort) */ /************************************************/ tpf=s1/(v2-v1); slf =s1+v1*tpf; /* passpunkt : nächstliegenden möglichen Passierpunkt bestimmen */ /****************************************************************/ if (slf < 0.2) sp = 0.2; else if (slf < 0.4) sp = 0.4; else if (slf < 0.8) sp = 0.6; else if (slf < 1.0) sp = 0.8; else /*leer*/; /* Mögliche Passierzeit der Zuege bis sp berechnen */ /***************************************************/ tp1=(sp-s1)*sg/v1; tp2=(sp*sg)/v2; if (tp1 < tp2) zug = 1; /* Bestimmung, welcher Zug langsamer */ else if (tp1 > tp2) zug = 2; /* fahren muss */ else /*leer*/; /* neue Zuggeschwindigkeiten berechnen */ /****************************************/ vneu (s1, tp1, tp2, v2, v1, sg, sp, &v1neu, &v2neu, zug); if (slf < 1) { if((tp1/tp2>0.999999) && (tp1/tp2<1.1111111)) printf(" Passierort zweigleisig, Zuggeschwindigkeiten " "unveraendert\n\n"); else { printf(" Zug %d muss bis zum Passierpunkt langsamer " "fahren\n\n", zug); if (zug ==1) printf(" Neue Geschwindigkeit Zug %d : %2.1lf km/h \n\n", zug, v1neu); else printf(" Neue Geschwindigkeit Zug %d : %2.1lf km/h" " \n\n", zug, v2neu); } /* erster else-Zweig */ printf(" Passierpunkt der Zuege : %2.1lf sg bei km %4.1lf\n\n", sp,sp*sg/1000); passierzeit (&passzeit, tp1, tp2, zug); timesplit (passzeit, &stunde, &minute, &sekunde); printf(" Passierzeit in : %02ld:%02ld:%02ld H:M:S\n", stunde, minute, sekunde); /* Restfahrzeit der Zuege bis sg berechnen */ /*******************************************/ t1rest = ((sg - (sp * sg)) / v1) + passzeit; t2rest = ((sg - (sp * sg)) / v2) + passzeit; }/* */ else { printf(" Keine Vorbeifahrt notwendig, Zug 1 vorher am Ziel " "sg \n\n"); /* Restfahrzeit der Zuege bis sg berechnen */ /*******************************************/ t1rest = (s1*sg) / v1; t2rest = (sg) / v2; } /* Ausgabe Restfahrzeit Zug 1*/ /*****************************/ timesplit (t1rest, &stunde, &minute, &sekunde);/* Umrechnung in h:m:s */ printf(" Restfahrzeit bis sg Zug 1 : %02ld:%02ld:%02ld H:M:S\n", stunde, minute, sekunde); /* Ausgabe Restfahrzeit Zug 2*/ /*****************************/ timesplit (t2rest, &stunde, &minute, &sekunde);/* Umrechnung in h:m:s */ printf(" Restfahrzeit bis sg Zug 2 : %02ld:%02ld:%02ld H:M:S\n\n" ,stunde, minute, sekunde); /* Abfrage nach Wiederholung */ /*****************************/ printf(" Neue Berechnung ? [j,n] : "); scanf (" %c", &progende); gets(dummy); /* Eingabepuffer leeren */ if (progende == 'n') progende = 1; /* Eingabe n setzt progende auf 1 */ else /*leer*/ clrscr(); /* Bildschirm löschen */ } while (progende != 1); /* Ende der Hauptprogramm-Schleife */ return 0; /* 0 (alles ok) an das Betriebssystem zurückgeben */ } /* Hauptfunktion main */ /***************************************************************************/ /* vneu : neue Zuggeschwindigkeiten berechnen */ /****************************************************************************/ void vneu (double s1, double tp1, double tp2,double v2, double v1, double sg, double sp, double *v1neu, double *v2neu, int zug) { if (zug == 1) { *v1neu=(((sp-s1)*sg)/tp2)*3.6; *v2neu=v2; } else if ( zug == 2) { *v2neu=((sp*sg)/ tp1)*3.6; *v1neu = v1; } else /*leer*/; } /* vneu */ /****************************************************************************/ /* passierzeit : Passierzeit bis zum Treffpunkt */ /****************************************************************************/ void passierzeit (double *passzeit, double tp1, double tp2, int zug) { if (zug ==1) *passzeit = tp2; else if (zug ==2) *passzeit = tp1 ; else /*leer*/; } /* passierzeit */ /****************************************************************************/ /* timesplit : Aufteilung dezimale Sekundenzeit in hh:mm:ss */ /****************************************************************************/ void timesplit (double t, long int* pth, long int* ptm, long int* pts) { long int th, tm, ts; /* fuer interne Berechnung */ ts = t + 0.5; /* double-Sekundenzeit mit Rundung in Integer casten */ th = ts / 3600; ts = ts - th * 3600; /* Stunden abspalten */ tm = ts / 60; ts = ts - tm * 60; /* Minuten abspalten */ *pth = th; *ptm = tm; *pts = ts; /* Ergebnisse uebergeben */ } /* timesplit */ /****************************************************************************/ /* Ende Datei: zugpassi.cpp */ /****************************************************************************/
-
Hab mir deinen Code nicht durchgelesen, aber wenn du 0,5 eingibst, wird 0 eingelesen (der richtige Separator wäre ".") und du hast sicher einige Berechnungen, die mit 0 nicht gehen.
-
Switch funktioniert nur, wenn der Selektor (die Auswahlgrösse, mit der verglichen wird) ein Integer (inkl. char) ist! Geht also nie mit reellen Zahlen wie bei dir. Es bleibt dir nichts erspart.
Gruss Jerry
