Która będzie/była godzina za X godzin?

0

Hej,
Która będzie/była godzina za X godzin? Dość opornie mi idzie pisanie... Jakieś sugestie jak to bardziej poprawnie napisać?

struct Time
{
       int h, min;
};

Time scan()
{
     Time time;
     cout << "Podaj godzine i minute" << endl;
     cin >> time.h >> time.min;
     return time;
}
Time scan2()
{
     Time interwal;
     cout << "Podaj interwal czasowy" << endl;
     cin >> interwal.h >> interwal.min;
     return interwal;   
}
/*funkcję valid przyjmującą strukturę typu Time i zwracającą prawdę, jeśli reprezentuje ona godzinę
lub fałsz w przeciwnym razie. Godziny liczymy od 00 : 00 do 23 : 59.*/

int valid(Time time)
{
     if(time.h<24)
     {
                  if(time.min<60)
                  return true;
                  else
                  return false;
     }
     else
     return false;
}
/*funkcję advance obliczającą godzinę, która nastąpi po upływie danego czasu od danej godziny.
Przykładowo, po upływie czterdziestu ośmiu godzin i pięciu minut od dwunastej trzydzieści będzie
dwunasta trzydzieści pięć. Funkcja przyjmuje dwie struktury typu Time, pierwszą traktuje jako
godzinę, a drugą jako interwał, i zwraca struktuę typu Time zawierającą wynik.*/

int advance(Time time, Time interwal)
{
    Time time;
    int godzina = (time.h * 60) + time.min;
    int inter = (interwal.h * 60) + interwal.min;
    int wynik = godzina - inter;
    float w = wynik/60;
    
    return w;
}

int main()
{
    Time time = scan();
    Time interwal = scan2();
    bool sprawdz = valid(time);
    int godzina = advance(time, interwal);
    cout << endl << "Godzina: " << godzina << endl;
    system("pause");
    return 0;
}
1
struct Time
{
       int h, min;
};

Albo h/m, albo hours/minutes, ale bez mieszania.


Time scan() // -> readTime()

/* ... */

Time scan2() // -> readInterval()

3.Czas nie jest tym samym, co przedział czasu - stwórz dwie osobne struktury.

Dzięki temu metoda valid będzie nareszcie miała sens, ponieważ zauważ, że time.h == 0 może być prawidłowe dla przedziału czasowego, lecz z całą pewnością nie dla godziny.


bool isTimeValid(Time time) {
    if (time.h < 1 || time.h > 24) {
        return false;
    }

    if (time.m < 1 || time.m >= 60) {
        return false;
    }

    return true;
}

4.Zamiast metody advance, spróbuj podejść do tego bardziej obiektowo:

class TimeInterval {
	
protected:
	// zakładamy dokładność co do sekundy
	uint64_t seconds;
	
public:
	TimeInterval(uint64_t seconds) : seconds(seconds) {
		// nottin' here
	}
	
	void setSeconds(/* ... */) {
		/* ... */
	}
	
	uint64_t getSeconds() {
		/* ... */
	}
	
}

class FormattedTime {
	
protected:
	uint16_t year;
	uint8_t month;
	uint8_t day;
	
	uint8_t hour;
	uint8_t minute;
	uint8_t second;
	
public:
	FormattedTime(/* ... */) : /* ... */ {
		// nottin' here
	}
	
	// gettery + settery
	
}

class Time {
	
protected:
	uint64_t timestamp;
	
public:
	Time(uint64_t timestamp) : timestamp(timestamp) {
		// nottin' here
	}
	
	void add(TimeInterval interval) {
		/* ... */
	}
	
	void sub(TimeInterval interval) {
		/* ... */
	}
	
	void setTimestamp(/* ... */) {
		/* ... */
	}
	
	uint64_t getTimestamp() {
		/* ... */
	}
	
	FormattedTime getFormattedTime() {
		/* ... */
	}
	
}
0

Ja bym tą godzinę co ci z dodawania wyjdzie dał %24, bo inaczej np 20:00 + 5 godzin wyjdzie 25:00 a nie 1:00

0

Programowania obiektowego jeszcze nie miałem, więc nawet nie wiem co to są klasy.
Stworzyłem coś takiego. Wydaje mi się, że jest wszystko prawidłowo napisane. Co o tym sądzicie?
#EDIT: Oczywiscie zaraz poprawie nazwy funkcji.

struct Time
{
       int h, m;
};

Time scan()
{
     Time time;
     cout << "Podaj godzine i minute" << endl;
     cin >> time.h >> time.m;
     return time;
}
Time scan2()
{
     Time interwal;
     cout << "Podaj interwal czasowy" << endl;
     cin >> interwal.h >> interwal.m;
     return interwal;   
}
/*funkcję valid przyjmującą strukturę typu Time i zwracającą prawdę, jeśli reprezentuje ona godzinę
lub fałsz w przeciwnym razie. Godziny liczymy od 00 : 00 do 23 : 59.*/

int valid(Time time)
{
     if(time.h<24)
     {
                  if(time.m<60)
                  return true;
                  else
                  return false;
     }
     else
     return false;
}
/*funkcję advance obliczającą godzinę, która nastąpi po upływie danego czasu od danej godziny.
Przykładowo, po upływie czterdziestu ośmiu godzin i pięciu minut od dwunastej trzydzieści będzie
dwunasta trzydzieści pięć. Funkcja przyjmuje dwie struktury typu Time, pierwszą traktuje jako
godzinę, a drugą jako interwał, i zwraca struktuę typu Time zawierającą wynik.*/

Time advance(Time time, Time interwal)
{
    for(int i=0; i<interwal.h; i++)
    {
        time.h++;      
        if(time.h<0)
        time.h*(-1);    
        if(time.h>23)
        time.h=0;
    }
    
    for(int i=0; i<interwal.m; i++)
    {
            time.m++;
            if(time.m>59)
            {
                time.m=0;
                time.h++;
            }
    }
      
    cout << time.h << " : " << time.m << endl;
    return time;
}

int main()
{
    Time time = scan();
    Time interwal = scan2();
    bool sprawdz = valid(time);
    Time godzina = advance(time, interwal);
    
    system("pause");
    return 0;
}

1
  1. przelicz godziny:minuty na same minuty godzina * 60 + minuta
  2. dodaj/odejmij minuty
  3. jeśli wynik jest mniejszy od zera to dodaj 1440, jeśli większy lub równy 1440 to odejmij 1440.
  4. godzina = wynik div 60, minuta = wynik mod 60.

1 użytkowników online, w tym zalogowanych: 0, gości: 1