C Sekunden in Zeit angeben

nasir

New member
Hallo, ich hab hier eine folgende aufgabe

Ein Programm soll einen eingelesenen ganzzahligen, nichtnegativen Sekundenbetrag in die Darstellung Wochen, Tage,
Stunden, Minuten, Sekunden umwandeln und ausgeben. Beispiel: 6574548 s = 10 Wochen, 6 Tage, 2:15:48 Stunden. Die
Ausgaben ?Woche? bzw. ?Wochen? und ?Tag? bzw. ?Tage? sollen sprachlich korrekt erfolgen, also z.B. ?1 Tag?, aber
?3 Tage?. In einem Programmlauf soll mehr als ein Sekundenwert umgewandelt werden können. Überlegen Sie sich dazu
ein geeignetes Abbruchkriterium!


Code:
#include <stdio.h>
#include <math.h> 
/*Kompiliert wird mit gcc -o NAME -lm NAME.c */

int main()
{
      //initialisieren
      int sek, min = 0, std = 0, tag = 0, woche = 0, i,j,k,l;

      printf("Sekunden in Zeit\n");
      printf("Geben sie die Sekdunden an: ");
      scanf("%d",&sek); 
      fflush(stdin); 
      
      //Berechnung in der Schleife
      for (i = 0; sek > 60; i++)
      {
	  sek = sek - 60;
	  min = min + 1;
	  for (j = 0; min > 60; i++)
	  {
		min = min - 60;
		std = std + 1;
		for (k = 0; std > 24; i++)
		{
		    std = std - 24;
		    tag = tag + 1;
		    for (l = 0; tag > 7; i++)
		    {
			tag = tag - 7;
			woche = woche + 1;
		    }
		}
	  }
      }

      if (woche = 1){printf("Wir haben %d Woche, ",woche);}
      else {printf("Wir haben %d Wochen, ",woche);}
      if (tag = 1){printf("%d Tag, ",tag);}
      else {printf("%d Tage, ",tag);}
      if (std = 1){printf("%d:%d:%d Stunde\n",std,min,sek);}
      else {printf("%d:%d:%d Stunden\n",std,min,sek);}
      printf("Programm zuende\n");

return 0;
}


Ich finde da einfach kein fehler, ich hab ganz genau mehrere male nach einem Fehler gesucht.
Am ende kommt da immer sowas heraus:

Wir haben 1 Woche, 1 Tag, 1:14:7 Stunde

was völlig falsch ist. Kann einer helfen?

Wäre sehr dankbar. =)
 

lookshe

Member of Honour
Du solltest dir mal den Modulo-Operator ansehen. Damit löst sich das ganze wesentlich geschickter und eleganter.
 

Cyberm@ster

New member
Code:
 if (woche = 1){printf("Wir haben %d Woche, ",woche);}
else {printf("Wir haben %d Wochen, ",woche);}
if (tag = 1){printf("%d Tag, ",tag);}
else {printf("%d Tage, ",tag);}
if (std = 1){printf("%d:%d:%d Stunde\n",std,min,sek);}
else {printf("%d:%d:%d Stunden\n",std,min,sek);}

Du musst die = durch == ersetzen da es sich um Tests und nicht um Zuweisungen handelt. Ausserdem solltest du dir lookshe's Rat zu Herzen nehmen. Ausserdem kannst du sek -= 60 anstatt von sek = sek - 60; und min++ anstatt von min = min + 1; schreiben.
 

xeno

Moderator
Mitarbeiter
und weil lookshe die infokanone ist :tongue::

tage = sekunden / 86400
stunden = rest / 3600
minuten = rest / 60
sekunden = rest

beispiel 123456:
123456 / 86400 = 1 rest 37056
37056 / 3600 = 10 rest 1056
1056 / 60 = 17 rest 36

also 1 tag, 10 stunden, 17 minuten und 36 sekunden.

und das macht man halt mit modulo.
 

nasir

New member
heyy danke, dass hat mir wirklich geholfen. Oh man bin ich blöd!

Ja mit dem Modulo wäre es natürlich geschickter, aber ich muss zurzeit Schleifen lernen. ;)
Deswegen habe ich mir dieses Konzept überlegt.

Aber danke vielmals!!
 

Shorty302

New member
Hallo Leute, bin neu hier im Forum und bin fleißig am Bücher lesen und coden

Da bin ich auf diesen Thread gestoßen und dachte ich veröffentliche mal grade meine Lösung(C++).

Code:
 // Zeitumrechnung.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include <stdafx.h>
#include <iostream>
#include <conio.h>

using namespace std;

class Zeitumrechnung
{
public:
void zeitrechner(int sekunden)
{
int wochen=0, tage=0, stunden=0, minuten=0;
//60 sek = 1 min; 3600 sek = 1 h; 86400 sek = 1Tag; 604800sek = 1 Woche
if(sekunden >= 604800)
{
wochen=sekunden/604800;
sekunden=sekunden%604800;
}
if(sekunden >= 86400)
{
tage=sekunden/86400;
sekunden=sekunden%86400;
}
if(sekunden >= 3600)
{
stunden=sekunden/3600;
sekunden=sekunden%3600;
}
if(sekunden >= 60)
{
minuten=sekunden/60;
sekunden=sekunden%60;
}
if(wochen == 1)
cout << wochen << " Woche ";
else
cout << wochen << " Wochen ";
if(tage == 1)
cout << tage << " Tag ";
else
cout << tage << " Tage ";
if(stunden == 1)
cout << stunden << " Stunde ";
else
cout << stunden << " Stunden ";
if(minuten == 1)
cout << minuten << " Minute ";
else
cout << minuten << " Minuten ";
if(sekunden == 1)
cout << sekunden << " Sekunde ";
else
cout << sekunden << " Sekunden ";

}
};

int main(void)
{
int sekunden=0,again;
cout << "Geben Sie eine Zeit in Sekunden ein: ";
cin >> sekunden;
Zeitumrechnung z1;
z1.zeitrechner(sekunden);
do
{
cout << "nNoch eine Berechnung?(ja=1,nein=0)";
cin >> again;
if(again == 1)
{
cout << "nGeben Sie eine Zeit in Sekunden ein: ";
cin >> sekunden;
Zeitumrechnung z1;
z1.zeitrechner(sekunden);
}
}
while(again!=0);
}
Ich hoffe ich konnte wem damit helfen.

MFG
Shorty
 

farhaven

New member
Code:
      //Berechnung in der Schleife
      for (i = 0; sek > 60; i++)
      {
	  sek = sek - 60;
	  min = min + 1;
	  for (j = 0; min > 60; i++)
	  {
		min = min - 60;
		std = std + 1;
		for (k = 0; std > 24; i++)
		{
		    std = std - 24;
		    tag = tag + 1;
		    for (l = 0; tag > 7; i++)
		    {
			tag = tag - 7;
			woche = woche + 1;
		    }
		}
	  }
      }
}

Was mir da so ins Auge sticht, ist zum Beispiel, dass du in jeder for-Schleife eine Zählervariable initialisierst und i erhöhst, aber keinen von den Zählern irgendwo verwendest. An deiner Stelle würde ich als Schleifenkopf also entweder
Code:
for(; std > 24;)
oder
Code:
while(str > 24)
benutzen, was aber im Endeffekt auf das Selbe hinausläuft.
 
Oben