Probleme mit dem Integer, If, Schleife oder doch nur Denkfehler???



  • int main(void)
    {
        double tpf, sp;
    	double sg, v1, s1, v2, s2;
    	double v1neu, v2neu;
    	double t1p, t2p;
    	double restfahrzeit1, restfahrzeit2;
    	double zeitbis, zeitdanach;
    	double passierpunkt, passierzeit;
    	int zeichen, start = 1;
    	int sekunde, minute, stunde;
    	char dummy[81];
    	char w [2];
    
    	do
    	{
        clrscr();
        printf("Programm zur Berechnung des Passierpunktes von"
    		   " zwei Zuegen       J.S. & J.W.\n"
    		   "----------------------------------------------"
    		   "------------\n"
    		   "Moegliche Passierpunkte bei 0.2, 0.4, 0.6, 0.8"
    		   " der Gesamtstrecke\n\n"
    		   "Gesamtstrecke sg in Kilometern               : ");
    	scanf ("%lf",&sg);
    	printf("Momentane Geschwindigkeit von Zug 1 [km/h]   : ");
    	scanf ("%lf",&v1);
    	printf("Momentane Position        von Zug 1 [0.n+Sg] : ");
    	scanf ("%lf",&s1);
    	printf("Momentane Geschwindigkeit von Zug 2 [km/h]   : ");
        scanf ("%lf",&v2);
    	printf("Momentane Position        von Zug 2 [0.n+Sg] : ");
    	scanf ("%lf",&s2);
    	gets  (dummy);
    tpf = (s2-s1) / (v2+v1); 
    	//Berechnung der Fahrzeit bis zu einem fiktiven Treffpunkt tpf
    	sp  = s1 + v1*tpf;
    	//Aus der Fahrzeit den Ort des fiktiven Treffpunkts spf berechnen
    	if( 0 < sp && sp < 0.3 ) sp = 0.2;
    	  else if( 0.3 <= sp && sp < 0.5  ) sp = 0.4;
    	    else if( 0.5 <= sp && sp < 0.7 ) sp = 0.6;
    		  else if( 0.7 <= sp && sp < 0.9) sp = 0.8;
    
        passierpunkt = sp * sg;
    	//Den nächstliegenden möglichen Treffpunkt sp der beiden Züge bestimmen
        t1p = (sp-s1)/v1; //Zug1
    	t2p = (s2-sp)/v2; //Zug2
    	//Bestimmen welcher der beiden Züge den gewählten Treffpunkt sp zuerst erreicht
    		 if( t1p < t2p ) 
    	  {
    		printf("\n\nZug 1 muss bis zum Passierpunkt langsamer fahren\n\n");
    		v2neu = v2;
    		passierzeit = ( (s2-sp)* sg *1000 ) / ( v2/3.6 );
            v1neu = (sp-s1)/t2p;
    		restfahrzeit2 = ( ( sg*s2 )*1000 ) / ( v2/3.6 );
    		zeitbis = ( (( sp-s1 )* sg)*1000 ) / ( v1neu/3.6 );
    	    zeitdanach = ( sg-( sg*sp ) *1000 ) / ( v1/3.6 );
    	    restfahrzeit1 = zeitbis + zeitdanach;
    
    	  }
    	  else if( t1p > t2p ) 
    	         {
    		       printf("\n\nZug 2 muss bis zum Passierpunkt langsamer fahren\n\n");
    			   v1neu = v1;
                   passierzeit = ( (sp - s1)*sg *1000) / ( v1/3.6 );
    			   v2neu = (s2-sp)/t1p;
    			   restfahrzeit1 = ( ( sg -( sg*s1 ) )*1000 ) / ( v1/3.6 );
    			   zeitbis = ( (( s2-sp )* sg)*1000 ) / ( v2neu/3.6 );
    	           zeitdanach = ( (sp*sg) *1000 ) / ( v2/3.6 );
    	           restfahrzeit2 = zeitbis + zeitdanach;
    
    	         }
    	         else if( t1p == t2p )
    			        {
    
    					  printf("\n\nPassierort zweigleisig, Zuggeschwindigkeiten unveraendert\n\n");
    					  v1neu = v1;
    					  passierzeit = ( (sp - s1)*sg *1000) / ( v1/3.6 );
    					  v2neu = v2;
    		              restfahrzeit1 = ( ( sg -( sg*s1 ) )*1000 ) / ( v1/3.6 );
    		              restfahrzeit2 = ( ( sg*s2 )*1000 ) / ( v2/3.6 );
    
    	                }
    	  if( start != 0 )
    	   {
    	  timeSplit( passierzeit, &stunde, &minute, &sekunde );
    	  printf("Passierpunkt der Zuege   : %4.1lf sg bei km%9.1lf\n"
    		     "Passierzeit in           :  %d:%d:%d       H:M:S          \n\n"
    			 "                            vor       bis      nach \n"
    			 "Geschwindigkeiten Zug 1  : %5.1lf  | %5.1lf  | %5.1lf  km/h\n"
    		     "Geschwindigkeiten Zug 1  : %5.1lf  | %5.1lf  | %5.1lf  km/h\n\n",
    	         sp, passierpunkt, stunde, minute, sekunde, v1, v1neu, v1, v2, 
    			 v2neu, v2);
    	  timeSplit( restfahrzeit1, &stunde, &minute, &sekunde );
          printf("Restfahrzeit Zug 1 (sg)  : %d:%d:%d  H:M:S          \n", 
    		      stunde, minute, sekunde);
    	  timeSplit( restfahrzeit2, &stunde, &minute, &sekunde );
    	  printf("Restfahrzeit Zug 2 ( 0)  : %d:%d:%d  H:M:S         ", 
    		      stunde, minute, sekunde);
    
    	  }
    			 }
    	printf("\n\nNeue Berechnung ? [j,n]  : ");
    	  scanf("%c", &w);
    }
    
    	while (( zeichen=getchar() ) == 'J' || ( zeichen=getchar() ) == 'j');
    
    	gets (dummy);
    	return 0;
    }
    
    void timeSplit( double t, int* pth, int* ptm, 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()
    

    ich brauche dringend eure Hilfe...
    Ich bin Anfänger und mache noch viele Denkfehler und mir fehlt es bei vielem an Wissen, was ich nicht direkt in Büchern finde, sondern Erfahrung benötige...

    1. wie funktioniert die Schleife richtig?
    Wenn ich j oder J drücke möche ich dass eine neue Berechnung stattfindet..
    was mache ich falsch muss ich "!=" schreiben?

    2.Bei der Bedingung if( t1p < t2p ) berechne ich die restfahrzeit1...die Formeln sind komplett richtig (ich habe es mit dem Taschenrechner per Hand nachgeprüft;) ), jedoch kommt ein falsches Ergebnis raus, wenn dieser Fall auftritt...woran kann das liegen, ich finde den Fehler wirklich nicht...

    3.Ich gebe ja die Uhrzeit in Stunden, Minuten und Sekunden aus, jedoch möchte ich, dass das Ziffernblatt wie digital aussieht, sprich:

    04:00:00 für genau vier Uhr morgens..natürlich steht bei mir nur 4: 0: 0

    4. Und noch eine letzte Frage 😃 wenn beispielsweise s1 = 0.4 und ich die Bedingung stelle:

    if( s1 != 0.2 || s1 != 0.4 || s1 != 0.6 )
    printf("Hallo");
    else printf("Tschüss");

    bei mir wird dann immer auf dem Editor Hallo ausgegeben, obwohl die Bedingung, das verhindern sollte...wo liegt mein Denkfehler???

    Ich wäre euch soo dankbar, wenn ihr mir sagen könntet, wo meine Denkfehler sind...wenn man selbst stundenlang davor sitzt sieht man irgendwann nichts mehr:D:D

    Vielen Dank im Vorraus!!!



  • printf("\n\nNeue Berechnung ? [j,n]  : ");
        zeichen = getchar(); while( zeichen!='\n' && getchar()!='\n' );
    }
        while ( zeichen=='J' || zeichen=='j' );
    
    printf(... %02d:%02d:%02d ...)
    

    - Bei der Rechnerei lass dir Zwischenergebnisse ausgeben oder mittels Debugger
    - bei 4. weiß ich nicht, was du erreichen willst



  • zu 4. eventuell folgendes:

    Wenn s1 == 0.2 dann ist es automatisch ungleich 0.4 ...
    Kann es eventuell sein, das anstatt || hier eher && angebracht ist?



  • vielen dank für die antworten, sie helfen mir schon ziemlich weiter:)

    s1 kann ja aber nur 0.2 oder 0.4 oder 0.6 sein nicht alles gleichzeitig, s1 wird ja nur einmal pro berechnung eingegeben...sonst würde die bedingung doch niemals erfüllt sein oder sehe ich das falsch?



  • lizzty schrieb:

    s1 kann ja aber nur 0.2 oder 0.4 oder 0.6 sein nicht alles gleichzeitig, s1 wird ja nur einmal pro berechnung eingegeben...sonst würde die bedingung doch niemals erfüllt sein oder sehe ich das falsch?

    Das siehst du falsch. Du prüfst ja nicht auf Gleichheit, sondern auf Ungleichheit. Und s1 kann sehr wohl gleichzeitig ungleich 0.2 und ungleich 0.4 und ungleich 0.6 sein.

    Deine Bedingung ist immer wahr. Jeder Wert ist ungleich 0.2 ODER ungleich 0.4. Für jeden Wert außer 0.2 ist der erste Teil der Bedingung wahr, und für 0.2 dann spätenstens der zweite. Du willst hier UND, nicht ODER.


Log in to reply