Warum funktioniert der Befehl "scanf" nicht richtig?
-
Hallo Leute!
Ich sitze seit gestern abend an dem Programm und bin langsam am verzweifeln. Guckt euch das mal bitte an. Hatte eigentlcih vor, dass eine Eingabe erfolgt aber irgendwie funktioniert das ganze nicht richtig. Zur Information: Mein System ist ein Macintosh-System also auf Unixbasis.
Nach der letzen "scanf"-Eingabe wird das Hauptprogramm nicht mehr weiter ausgeführt. Vielleicht wisst ihr ja Rat! Danke
#include <stdio.h> #include <time.h> float zeit = 0; // INDEX DER ZEIT => WIRD IM LAUFE DES PROGRAMM IMMER WEITER ERHÖHT WAS ZU GESAMTDAUER DER FAHRT FÜHRT float weg = 0; // GIBT DEN MOMENTAN ABGEFAHRENDEN WEG IN "m" ZURÜCK float amin = 0; // MINIMALE BESCHLEUNIGUNG DES FAHRZEUGES IN m/s'2 float amax = 0; // MAXIMALE BESCHLEUNIGUNG DES FAHRZEUGES IN m/s'2 float v = 0; // AKTUELLE GESCHWINGKEIT IN KM/h float vmax = 0; // AKTUELLE GESCHWINGKEIT IN KM/h float weggesamt = 0; // DER GESAMTE WEG DEN DAS AUTO BIS JETZT ZURÜCKGELEGT HAT float abbremsmin = -5; // MINIMALE BREMSBESCHLEUNIGUNG float aaktuell = -5; // BREMSBESCHLEUNIGUNG IN ABHÄNGIGKEIT int abrems = -8; // MAXIMALE BREMSBESCHLEUNIGUNG IN M/S*S int momentane_ampel = 1; // START AMPEL WELCHE IM LAUFE DES PROGRAMMS ERHÖHT WIRD float umschaltungs_zeit_tmp; /* AMPELVARIABLEN */ int position_ampel[] = { 200, 400, 500, 700, 750, 900, 1300 }; int dauer_rest_ampel[] = { 0, 0, 0, 0, 0, 0, 0 }; // RESTDAUER DER AMPELN BIS ZUM NÄCHSTENUMSCHALTEN int status_ampel[7]; // ZUSTAND DER JEWEILIGEN AMPEL grün=2; gelb=1; rot=0; float umschaltung_ampel[7]; // ZEIT DER JEWEILIGEN AMPEL WANN SIE BEI DER GRÜNEN WELLE AUF GRÜN SCHALTEN SOLL int dauer_phase_gelb = 50; int dauer_phase_rot = 100; int dauer_phase_gruen = 150; // --------------------------------------------------------------------------------------------------------------- void ampel_umschalten(int ampelnummer) { status_ampel[ampelnummer] = 2; } // --------------------------------------------------------------------------------------------------------------- float gruenewelle(float amin, int i) // SCHALTET DIE AMPEL ZU DER JEWEILIGEN ZEIT AUF GRÜN !!! { umschaltungs_zeit_tmp = ((v/3.6)/amin) + ((v/3.6)*(position_ampel[i] - (((v/3.6)*(v/3.6))/(2*amin)))); // ZEIT ZUM UNSCHALTEN DER AMPEL return umschaltungs_zeit_tmp; } // --------------------------------------------------------------------------------------------------------------- int main() { /* HIER LÄUFT DIE HAUPTSCHLEIFE AB INHALT: - GRÜNE WELLE - EINGABE */ cin >> vmax; do { printf("Bitte geben Sie die Maximale Geschwindigkeit des Wagens an (km/h): "); scanf("%f", &vmax); } while (amax != 0); printf("HALLO"); // ES WIRD BERECHNET, WIE LANGE DAS AUTO vmax-GESCHWINDIGKEIT BIS ZUR n-ten AMPEL BRAUCHEN WÜRDE for(int i=1; i<=7; i++) { printf("%d", i); umschaltung_ampel[i] = gruenewelle(amin, i); printf("%f", umschaltung_ampel[i]); } while(weg <= 1300) // SOLANGE DAS AUTO NOCH NICHT AM ZIEL IST, SOLL ES FAHREN! { for(int i=1; i<=7; i++) // ES WIRD NACHGEGUCKT, OB DER WAGEN AN DER STELLE DES VOR DER AMPEL N IST => WENN JA, DANN WIRD DIE AMPEL UMGESCHALTET (GRÜNE WELLE) { if(umschaltung_ampel[i] == zeit) // WENN DAS AUTO GENAU DEN WEG-BREMSWEG-2m IST, DANN SOLL DIE AMPEL UMSCHALTEN { if(status_ampel[i] != 2) // WENN DIE AMPEL NICHT AUF GRÜN STEHT, DANN SOLL SIE UMGESCHALTEN WERDEN { ampel_umschalten(i); } } } zeit++; } }
-
1. cin/cout und printf/scanf bitte nicht mischen.
2. Globale variablen vermeiden.
3. Nicht vmax einlesen und dann amax prüfen.
4. In den Kommentaren nicht so schreien
-
Ja ok ich habe jetzt die Variablen richtig hingestellt nur das Problem ist weiterhin, wenn er die letze Eingabe verarbeitet hat wird die darauffolgednde Schleife nicht mehr ausgeführt.
int main() { /* HIER LÄUFT DIE HAUPTSCHLEIFE AB INHALT: - GRÜNE WELLE - EINGABE */ do { printf("Bitte geben Sie die Maximale Geschwindigkeit des Wagens an (km/h): "); scanf("%f", &vmax); } while (vmax == 0); // PROGRAMM WIRD HIER NICHT MEHR WEITER AUSGEFÜHRT...!!!!! printf("HALLO"); // ES WIRD BERECHNET, WIE LANGE DAS AUTO vmax-GESCHWINDIGKEIT BIS ZUR n-ten AMPEL BRAUCHEN WÜRDE for(int i=1; i<=7; i++) { printf("%d", i); umschaltung_ampel[i] = gruenewelle(amin, i); printf("%f", umschaltung_ampel[i]); } while(weg <= 1300) // SOLANGE DAS AUTO NOCH NICHT AM ZIEL IST, SOLL ES FAHREN! { for(int i=1; i<=7; i++) // ES WIRD NACHGEGUCKT, OB DER WAGEN AN DER STELLE DES VOR DER AMPEL N IST => WENN JA, DANN WIRD DIE AMPEL UMGESCHALTET (GRÜNE WELLE) { if(umschaltung_ampel[i] == zeit) // WENN DAS AUTO GENAU DEN WEG-BREMSWEG-2m IST, DANN SOLL DIE AMPEL UMSCHALTEN { if(status_ampel[i] != 2) // WENN DIE AMPEL NICHT AUF GRÜN STEHT, DANN SOLL SIE UMGESCHALTEN WERDEN { ampel_umschalten(i); } } } zeit++; } }
-
DaftNox schrieb:
Ja ok ich habe jetzt die Variablen richtig hingestellt nur das Problem ist weiterhin, wenn er die letze Eingabe verarbeitet hat wird die darauffolgednde Schleife nicht mehr ausgeführt.
Welche "letzte" Eingabe? Ich sehe da überhaupt nur ein scanf.
Übrigens:
Bei einem Array mit 7 Elementen gehen die gültigen Indices von 0 bis 6, nicht 1 bis 7.
-
Also:
ich habe in diesem Beispiel ja auch nur scanf aber nach dieser Eingabe führt er das Programm garnicht mehr weiter aus. Ich hatte auch vorhin 4-5 eingaben nur ich habe immer bemerkt, dass nach der letzten Eingabe das programm aufhört zu arbeiten. Weiss nicht, aber vielleicht weisst du ja Rat.
bis dann danke
-
umschaltungs_zeit_tmp = ((v/3.6)/amin) + ((v/3.6)*(position_ampel[i] - (((v/3.6)*(v/3.6))/(2*amin))));
Division durch 0, da amin = 0.
Und die Indizes - wie gesagt - von 0 bis 6!
-
Also:
Es geht mir doch vorerst garnicht umd ie Arrays...! Es wird nichtmal mehr printf("HALLO"); im Hauptprogramm ausführt!
das ist mein problem.... die anderen sachen habe ich mittlerweile doch schon behoben...!
danke!
-
Dann mach daraus mal printf("HALLO\n") dann wird IMHO HALLO ausgegeben und er bleibt danach hängen...
while(weg <= 1300) ergibt, wenn ich das richtig sehe, eine Endlosschleife, da weg nicht verändert wird.