Liczba dni między 2 podanymi datami

0

Witam mam do napisania program który pokaże ilość dni między 2 podanymi przez użytkownika przedziałami czasowymi,niestety pogubiłem się w momencie przeliczania konkretnych dat na sekundy i wynik mi się nie zgadza przy wprowadzeniu danych

1
1997 12 31 0 0 0  
1998 1 1 0 0 0

Powinno mi wypluć wynik 1 ponieważ tyle pełnych dni jest między podanym zakresem.

Pierwszy wiersz określa ile zestawów przedziałów czasowych chce podać użytkownik.
W tym przypadku 1 oznacza 1 zestaw po 2 daty,wiec 3 oznaczała by 3 zestawy po 2 daty itp.

#include <iostream>
using namespace std;
main()
{
    int D, r, m, d, g, min, s;

    cin >> D;
    unsigned long long int daty[D * 2][7];
    for (int i = 0; i < D * 2; i += 2) {

        for (int j = 0; j < 2; j++) {

            cin >> r >> m >> d >> g >> min >> s;

            if ((r >= 1600 && r <= 2500 && m >= 1 && m <= 12 && d >= 1 && d <= 31 && g >= 0 && g <= 23 && min >= 0 && min <= 59 && s >= 0 && s <= 59)) {

                daty[i + j][0] = r;
                daty[i + j][1] = m;
                daty[i + j][2] = d;
                daty[i + j][3] = g;
                daty[i + j][4] = min;
                daty[i + j][5] = s;
                daty[i + j][6] = 1;
            }
            else

                return 0;
        }
    }

    for (int i = 0; i < D * 2; i++) {

        daty[i][6] = daty[i][0] * 365 * 31 * 24 * 60 * 60 + daty[i][1] * 31 * 24 * 60 * 60 + daty[i][2] * 24 * 60 * 60 + daty[i][3] * 60 * 60 + daty[i][4] * 60 + daty[i][5];
    }
    for (int i = 0; i < D * 2; i += 2) {
        cout << (daty[i][6] - daty[i + 1][6]) / 31556926;
    }
}
3

Czytałeś kiedyś co nieco o strukturach (struct) w C++?

0

Nie miałem jeszcze okazji

1

Twój kod nie powinien się nawet kompilować. Opakuj to w funkcje i struktury/klasy, bo tego spagetti nikomu się nie chce czytać.

2

Pytanie: nie wolno ci używać bibliotek standardowych? Jeśli ci nikt nie zabronił, to tam jest to prawie zrobione i małym kosztem zrobisz to poprawnie. Naucz się wertować dokumentację.
Rada: wszystko w main to kłopoty w ogarnięciu problemu. Pisz funkcje, by podzielić duży problem na mniejsze. Używaj struktur/klas by opanować bałagan w zmiennych.

0

Idę dobrym tropem ?

#include<iostream>
using namespace std;

struct data{
	int rok;
	int miesiac;
	int dzien;
	int godzina;
	int minuta;
	int sekunda;
};

int * dodaj_date(int D)
{
int r,m,d,g,min,s,tab[D*2];	
int * wsk;
for(int i=0;i<D*2;i++)	{

cin>>r>>m>>d>>g>>min>>s;	
	if(r>=1600 && r<=2500 && m>=1 && m<=12 && d>=1 && d<=31 && g>=0 && g<=23 && min>=1 && min<=60 && s>=1 && s<=59)
	{
		data tab[i];
		tab[i].rok=r;
		tab[i].miesiac=m;
		tab[i].dzien=d;
		tab[i].minuta=min;
		tab[i].sekunda=s;
		
	}

	else return 0;
}	
	    wsk=&tab[0];
		return 	wsk;
};


main()
{
	int D;
	int *wsk;
	cin>>D;
	if(D>=1 && D<=2000)
	{
	wsk=dodaj_date(D);
    }
else return 0;	
	
}
0

Nie używasz przypadkiem Bloodshed Dev-C++ jako swojego IDE prawda? TUTAJ masz rezultat kompilacji Twojego kodu obecnym toolsetem.

0

Wszystko z tym kodem jest nie tak.

Tzn sprawa pierwsza: dlaczego data pozwala na przechowywanie czegokolwiek poniżej dnia?

Sprawa druga:

dlaczego pragniesz trzymać tablicę elementów typu data w tablicy elementów typu int? Jeśli już, nagłówek powinien wyglądać tak: data* dodaj_date(int D). Błędów jest więcej, ale jak naprawisz te, to będziemy mogli przejść do reszty.

1
MarekR22 napisał(a):

Pytanie: nie wolno ci używać bibliotek standardowych? Jeśli ci nikt nie zabronił, to tam jest to prawie zrobione i małym kosztem zrobisz to poprawnie. Naucz się wertować dokumentację.

https://wandbox.org/permlink/vEFHC08WlB4VJ87m

#include <iostream>
#include <ctime>
#include <iomanip>
 
int main()
{
    std::tm a {}, b {};
    char dateFormat[] { "%d.%m.%Y" };
    while (std::cin >> std::get_time(&a, dateFormat) >> std::get_time(&b, dateFormat))
    {
        auto secDiff = std::difftime(std::mktime(&b), std::mktime(&a));
        auto dayDiff = secDiff / 60 / 60 / 24;
        std::cout << std::put_time(&b, dateFormat) << " - " << std::put_time(&a, dateFormat) << " = " << dayDiff << '\n';
    }
    return 0;
}
0

Teraz zrobiłem to takim sposobem lecz nwm czmu dla niektórych dat funkcja sekundy() zwraca -1 czyli nie może zamienić na sekundy tak jak by podana liczba była zbyt wielka i podany typ time_t nie obejmował tego zakresu.

#include<iostream>
#include <time.h>
using namespace std;
int sekundy(int r,int m,int d,int g,int min,int s )
{
tm czas;
czas.tm_year=r;
czas.tm_mon=m;	
czas.tm_mday=d;	
czas.tm_hour=g;
czas.tm_min=min;	
czas.tm_sec=s;
time_t sekundy=mktime(&czas);
return sekundy;		
}

int * dodaj_dzien()
{   int *wsk;
	int r,m,d,g,min,s,T[6];
	cin>>r>>m>>d>>g>>min>>s;
	T[0]=r;
	T[1]=m;
	T[2]=d;
	T[3]=g;
	T[4]=min;
	T[5]=s;
	wsk=T;
	return wsk;
}


main()
{
int D;
int *T1,*T2;
cin>>D;
	for(int i=0;i<D;i++)
	{
		T1=dodaj_dzien();
		T2=dodaj_dzien();
		cout<<sekundy(*T2,*T2+1,*T2+2,*T2+3,*T2+4,*T2+5)<<endl<<sekundy(*T1,*T1+1,*T1+2,*T1+3,*T1+4,*T1+5) ;
		
	}


}
0

Masz UB w dodaj_dzien, zwracasz wskaźnik zaalokowany na stosie.

1

Poza tym, mktime nie musi zwracać ilości sekund. Na większości systemów tak będzie, ale nie ma takiego obowiązku i mogą trafić się niespodzianki.
Poza tym po co tak kombinujesz z tą tablicą? Nie lepiej zrobic tak:

std::tm wczytajDate()
{
   ...
}

albo tak jak ja ci napisałem wcześniej (trzeba tylko zmienić string formatujący)?

0

Mam wytyczne do tego zadania że zmienne konkretnie muszą się nazywać oraz muszą być do nich obwarowania itp.Więc nie może być sposobem zaprezentowanym wcześniej.

0

a czy te wytyczne nie powstały na zasadzie: prowadzący nie wie, że da się lepiej, a nie chce żebyście zrobili gorzej?

0

Wolę nie ryzykować ,wiem że ma być sprawdzana szybkość obliczeń oraz potem krótka rozmowa w kantorku czy jest się twórcą programu itp

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