Logik Countdown

Defenz0r

BIOS-Overclocker(in)
Hallo,

Ich komme gerade nicht darauf was falsch ist...
Es sollte so sein das wenn h= 0 ist er auf 00:59:59 springt, weiter runterzählt und nicht mit den Stunden ins Minus geht.
Warscheinlich ist es sehr Simpel, wäre trotzdem froh wenn mir jemand den Fehler zeigt und evtl. korrigiert.

s ist vom Typ int und wird vorher mit cin eingelesen.

Code:
for (s; s > -1; s--)
	{
		Sleep(100);
		system("cls");
		cout << setw(2) << h << " : " << setw(2) << m << " : " << setw(2) << s;

		if (h==0)
		{
			cout << "COUNTDOWN ENDE";
			Sleep(1000);
		}
		if (m == 0)
		{
			h--;
			m = 59;
		}

		if (s == 0)
		{
			m--;
			s = 60;
		}
	}
}



Grüße
 
hmm, s müsstest du auch auf 59 "resetten" und nicht auf 60. sonst hast du meinetwegen 5:01 5:00 4:60... ^^ und bei h = 0 ist der countdown nich vorbei, erst wenn alles 0 is ;P und dann solltest du die schleife mit break zum bsp verlassen. weil so wie es jetzt ist, hast du ne endlosschleife, da s bei erreichen von 0 ja immer resettet wird, ergo die abbruchbedingung der schleife nie erfüllt wird. also entweder checken, ob alles 0 is, um die schleife zu beenden und die ganze restlogik im else teil verbauen (dann brauchst du kein break und kannst das so lassen) oder eben mittels break aus der schleife raus gehn.

also was bei dir mommentan passiert: er zählt solange runter, bis h = 0 is, dann gibt er das ende bekannt, wartet ne sekunde und macht einfach weiter ^^
 
Noch kleiner Tipp:
Sleep sieht zwar schön aus, aber geh nicht davon aus, dass es genau ist. Teilweise Abweichungen von 1% oder mehr. Hat mit Thread schedulern usw. zu tun, also kompliziertes Gedöns. Für Runterzählen ab 20 Sekunden ist das kein Problem, aber wenn du das genauer brauchst, solltest du was besseres suchen. Wie z.B. in C++11
Code:
#include <chrono>
#include <thread>

std::this_thread::sleep_for(std::chrono::milliseconds(23))

Ich garantiere aber auch nicht, dass diese Funktion präzise ist ;) Da müsstest du dann mal gucken.

Grüße
 
Danke euch beiden :)

Code:
	for (s; s > -1; s--)
	{
		Sleep(1000);
		system("cls");
		cout << setw(2) << h << " : " << setw(2) << m << " : " << setw(2) << s;

		if (h==0 && m==0 && s==0)
		{
			cout << "COUNTDOWN ENDE";
			Sleep(1000);
			break;
		}
		if (m == 0)
		{
			[B]h--;[/B]
			m = 59;
		}

		if (s == 0)
		{
			m--;
			s = 59;
		}
	}

Ist problematisch denn ich lese s, m, h ein.
Wenn ich nur 60 Sekunden warten würde, wäre weil m=0 && h=0 ist würde daraus folgen:

-01:59:59

Warum?
 
Code:
#include<iostream>
#include<windows.h>
#include<iomanip>

using namespace std;
int m = 0;
int h = 0;
int s = 0;
bool q = false;
void varUhr()
{
	cout.fill('0');

	cout << "Eingabe Stunden : ";
	cin >> h;
	cout << "\n";

	cout << "Eingabe Minuten : ";
	cin >> m;
	cout << "\n";

	cout << "Eingabe Sekunden : ";
	cin >> s;

	for (s; s<60; s++)
	{
		Sleep(1000);
		system("cls");
		cout << setw(2) << h << " : " << setw(2) << m << " : " << setw(2) << s;

		if (s == 60)
		{
			m += 1;
			s = 0;

			if (m == 60)
			{
				m = 0;
				h += 1;

				if (h == 24)
				{
					s = 0;
					m = 0;
					h = 0;
				}
			}
		}
	}

}
void varCountdown()
{
	cout.fill('0');

	cout << "Eingabe Stunden : ";
	cin >> h;
	cout << "\n";

	cout << "Eingabe Minuten : ";
	cin >> m;
	cout << "\n";

	cout << "Eingabe Sekunden : ";
	cin >> s;

	for (s; s > -1; s--)
	{
		Sleep(1000);
		system("cls");
		cout << setw(2) << h << " : " << setw(2) << m << " : " << setw(2) << s;

		if (h==0 && m==0 && s==0)
		{
			cout << "COUNTDOWN ENDE";
			Sleep(1000);
			break;
		}
		if (m == 0)
		{
			h--;
			m = 59;
		}

		if (s == 0)
		{
			m--;
			s = 59;
		}
	}
}
int main()
{
	cout << "Wollen Sie die Variable Uhr starten? 0 = JA 1 = NEIN ";
	cin >> q;
	if (q == 0)
	{
		varUhr();
	}
	else
	{
		cout << "Wollen Sie einen Countdown starten? 0 = JA 1 = NEIN ";
			cin >> q;
		if (q == 0)
		{
			varCountdown();

		}


	}








}
 
Ich will dir nix vermiesen, aber erstmal:
"varUhr" und "varCountdown" sind keineswegs Variablen, sondern Funktionen.
Außerdem: Bitte nutz endl anstelle von "\n".
Also cout << endl; anstatt cout << "\n";
1. Ist es plattformunabhängiger und 2. wird stdout bei endl auch geflushed, was bei "\n" (glaub ich) nicht der Fall ist.

Was die eigentliche Funktionalität angeht:
Du solltest if(s==0) vor if(m==0) abfragen. Dann sollte es erstmal klappen. Außerdem: Da du hier eh break; verwendest um aus der Schleife rauszuspringen, macht die for Schleife nicht wirklich einen Sinn.. Zumindest der Vergleich nicht.
Aber probier erstmal die beiden ifs zu tauschen.
 
Ich sagte nicht das das Variablen sind.
Sie sind variabel und eine Funktion, also eine variable Funktion!

Die ifs zu tauschen bringt nichts.
Schon mal versucht bloß 60 Sekunden einzugeben?
Wenn der Stand bei 60 Sekunden steht wird h = -1 und m= 59 s = 59
 
"Wollen Sie die Variable Uhr starten?"
Will ja nich klugscheißern, aber "Variable" großgeschrieben bezieht sich auf das Nomen, "variable" klein geschrieben bezeichnet etwas, was varriiert :D
Sry :ugly:

Ich hatte übrigens Langeweile:
Code:
#include <thread>
#include <chrono>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
  int h, m, s;
  cout << "Sekunden eingeben: ";
  cin >> s;
  cout << "Minuten eingeben: ";
  cin >> m;
  cout << "Stunden eingebe: ";
  cin >> h;


  cout << setfill('0') << endl;

  while (true) {
    cout << "\r" 
         << setw(2) << h << ":" 
         << setw(2) << m << ":" 
         << setw(2) << s << flush;

    if (s == 0 && m == 0 && h == 0)
      break;

    this_thread::sleep_for(chrono::milliseconds(1000));

    s--;
    if (s == -1) {
      s = 59;
      m--;

      if (m == -1) {
        m = 59;
        h--;
      }
    }
  }

  cout << endl << "BAMM!" << endl;
}
 
nicht aufgeben, wir alle fingen mal klein an. und gegen die anderen bin ich ja selber noch ein kleines lichtlein ^^
 
Ja, ich meinte die Eigenschaft, sorry!
Danke, dein Code funktioniert, ich schau mir mal die Unterschiede an und lern draus :)

Super Einstellung! Lernen is besser als copy&paste. Eigentlich gehört es sich von mir auch nicht, einfach so fertigen Code zu schreiben... Tipps geben wäre besser für dich ;)
Worin programmierst du? Visual Studio 2012 oder so?
 
Nein VS 2013.
Eigentlich würde ich ja eine Ausbildung als SAE absolvieren, aber dann hätte ich wohl Burn-Out gekriegt.
Das war bei uns echt heftig.
Beispiel: 3 Referate pro Woche, Arbeiten bzw Tests im voraus, immer mehr Tempo, irgendwann konnte ich gelerntes nicht mehr umsetzen,
da einfach zu viel zu merken war, bzw. es war zu unverständlich.
Nun mache ich Elektroniker für festgelegte Tätigkeiten, natürlich mit ELO Fachkraft Prüfung, das ich Sie machen darf war schon schwer genug...

Das ganze nennt man bei uns Fachpraktiker.
Cisco Zertifikate mach ich so viel ich schaff, bin glaube ich mit 2 Leuten von 9 in der Klasse der einzigste der die überhaupt schafft.
Da die Klasse so schwach ist, muss ich immer nebenher was machen :)

Software Anwendung / Entwicklung habe ich daher ne 1.0, was mir auch nicht schwer fällt.

Ich denke mir fehlt geistige Reife bzw. Verständnis zum Programmieren.

In SAE hatte ich ein schlechteres Zeugnis (andere Ausbildungsklasse), nun in FPIT habe ich anscheinend sehr herausragende Noten.
 
Zurück