Poslao: 28 Feb 2018 15:28
|
offline
- vasa.93
- Moderator foruma
- Pridružio: 17 Dec 2007
- Poruke: 14809
- Gde živiš: Niš
|
Grešiš u pretpostavci da svaka godina ima 365 dana i svaki mesec 30 dana...
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 28 Feb 2018 15:32
|
online
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1179
|
Pa kako onda to da uradim? Jel mozes da mi napises kod, jer mi treba za sutra za skolu pa kasnije ja to mogu sve da pohvatam kako treba.
|
|
|
|
Poslao: 28 Feb 2018 15:54
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3745
- Gde živiš: 127.0.0.1
|
Ovako nekako:
#include<stdio.h>
int * unesi(int v)
{
static int t[20];
int a[3], i,j;
for(i=0;i<v;i++)
{
for(j=0;j<3;j++)
{
scanf("%i",&a[j]);
}
t[i] = sekunde(&a);
}
qsort(t, v, sizeof(int), uporedi);
return t;
}
time_t sekunde(int a[3])
{
struct tm tmdate = {0};
tmdate.tm_year = atoi(&a[2]) - 1900;
tmdate.tm_mon = atoi(&a[1]) - 1;
tmdate.tm_mday = atoi(&a[0]);
time_t t = mktime( &tmdate );
return t;
}
int uporedi(const void *a, const void *b) {
if( *(int*)a == *(int*)b )
{
return 0;
}
return *(int*)a < *(int*)b ? -1 : 1;
}
main()
{
int n, a[20], i, max;
max = 1;
printf("Unesi broj statusa: ");
scanf("%i",&n);
a = unesi(&n);
for (i=0; i<n-1;i++)
{
if (a[i+1] > a[i] + 86400)
{
max = 0;
}
max++;
}
printf("Max broj vezanih statusa: %i", max);
}
Napomena: ovo je moj prvi ikada kod napisan u C-u.
|
|
|
|
Poslao: 28 Feb 2018 15:59
|
online
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1179
|
Veruj mi da ja nemam predstavu kako radi taj program . Da li mozes da mi pomognes u prepravci mog koda? Da ne radim preko sekundi posto ne razumem uopste princip tog rada.
|
|
|
|
Poslao: 28 Feb 2018 17:18
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3745
- Gde živiš: 127.0.0.1
|
Najbitnije pitanje je da li radi, jer nemam nacina da ga proverim, niti uopste imam iskustva u C-u. U nekim drugim jezicima da, poprilicno, ali C mi je potpuno nepoznat.
Funkcija sekunde() pretvara niz od tri elementa (dan, mesec, godina) u unix timestamp, odnosno u broj sekundi od 01.01.1970. (tzv. Unix epoch), sto je vrlo cest pristup kada se radi neka manipulacija sa datumima.
Funkcija uporedi() poredi dva broja, i vraca 0 (ako su isti), -1 ako je prvi manji i 1 ako je prvi veci. To je pomocna funkcija za sortiranje niza u rastucem redosledu. Da ti treba opadajuci redosled, samo bi < u zadnjem redu funkcije zamenio sa >.
Funkcija unesi() uzima unete vrednosti i jedan po jedan datum pomocu funkcije sekunde() pretvara u unix timestamp. Nakon sto se unos zavrsi, sortira niz timestamp-ova u rastuci redosled uz pomoc funkcije uporedi() i tako sortiran niz vraca nazad na obradu.
I onda dolazimo do main() funkcije. Promenljivu max inicijalno setujem na 1 (posto je to najmanji moguci broj povezanih statusa) i uz pomoc funkcije unesi() iscitavam unete datume u sortiran niz timestamp-ova.
Tako dolazimo do najbitnijeg dela: za sve elemente niza, osim poslednjeg, proveravas da li je sledeci element veci od trenutnog za vise od 86400 (toliko sekundi ima u jednom danu). Ako jeste - znaci da postoji bar jedan dan razmaka izmedju ta dva datuma i resetujes promenljivu max na 0. Nakon te provere, samo uvecas max za 1 i nastavis petlju.
Zasto uvek uvecavam max za 1? Ako datumi nisu jedan za drugim, resetuje se max na 0, pa ga uvecanje vraca na inicijalnu vrednost 1. Ako datumi jesu vezani, onda svakako treba da uvecas promenljivu. Mogao sam to da zapisem i ovako:
if (a[i+1] > a[i] + 86400)
{
max = 1;
}
else
{
max++;
}
sa potpuno istim rezultatom, ali ja licno ne volim visak nepotrebnog koda.
|
|
|
|
Poslao: 28 Feb 2018 17:53
|
online
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1179
|
Evo kako sam ga ja uradio i nisam mogao da nadjem primer za koji ne radi. Ja sam ga radio na onaj moj pocetni nacin, jer mi je on imao logike . Evo ga kod:
#include<stdio.h>
void unos(int a[20][20],int v,int k)
{
int i,j;
for(i=0;i<v;i++)
for(j=0;j<k;j++)
scanf("%i",&a[i][j]);
}
void ispis(int a[20][20],int v,int k)
{
int i,j;
for(i=0;i<v;i++)
{
for(j=0;j<k;j++)
printf("%i",a[i][j]);
printf("\n");
}
}
main()
{
int n, a[20][20], i, j, br = 0, max;
printf("Unesi broj statusa: ");
scanf("%i",&n);
printf("%i",n);
printf("\n\n");
unos(a,n,3);
printf("\n\n");
ispis(a,n,3);
printf("\n\n");
for(i=0;i<n-1;i++)
{
if(a[i][2] < a[i+1][2]) //GOD1 < GOD2
br++;
else if(a[i][2] > a[i+1][2]) //GOD1 > GOD2
br=0;
else if(a[i][2] == a[i+1][2]) //GOD1 = GOD2
{
if(a[i][1] < a[i+1][1]) //MES1 < MES2
br++;
else if(a[i][1] > a[i+1][1]) //MES1 > MES2
br=0;
else if(a[i][1] == a[i+1][1]) //MES1 = MES2
{
if(a[i][0] < a[i+1][0]) //DAN1 < DAN2
br++;
else if(a[i][0] > a[i+1][0]) //DAN1 > DAN2
br=0;
else if(a[i][0] == a[i+1][0]) //DAN1 = DAN2
br=0;
}
}
if (max<br)
max=br;
}
printf("\n\n");
printf("%i",max+1);
scanf("%i");
}
Hvala na objasnjenju. Probao sam tvoj kod u Devcpp programu u kome radim, ali mi je prijavljivao brdo gresaka i nisam znao ni sta kako radi, a pogotovu gde su greske pa sam morao da predjem na ono staro posto mi je hitno potrebno. Hvala jos jednom.
|
|
|
|
Poslao: 28 Feb 2018 19:40
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3745
- Gde živiš: 127.0.0.1
|
Zar nije Devcpp za C++, a ne za C?
Mozda @vasa.93 moze da se ukljuci i vidi sta ne valja kod mene? Logika je ispravna, to sam siguran 100% - za zapisivanje i ne bas.
|
|
|
|
Poslao: 28 Feb 2018 20:13
|
online
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1179
|
Znas kako, meni su u skoli rekli da ucimo programski jezik C. Kodove na tom jeziku smo pisali i kompajlovali u Devcpp programu. Ja sam vidjao jos i jezike C++ i C#, a nemam pojma u cemu je razlika izmedju svih njih. Znam samo da je C++ objektno orjentisan jezik (ne znam sta to znaci) a da C nije.
|
|
|
|
Poslao: 28 Feb 2018 20:21
|
offline
- E.L.I.T.E.
- Legendarni građanin
- Pridružio: 23 Maj 2012
- Poruke: 4575
|
U DevCPP može se pisati i C i C++. Ne razumem zašto i dalje dosađuju sa tim matorim razvojnim okruženjem.
Što se tiče koda, koliko sam video kad sam provukao kod kroz XCode, uglavnom imaš par grešaka vezanih za prosleđivanje pokazivača, pozivanje funkcije pre no što je definisana i treba ubaciti biblioteku za vreme (ovo je već platform-specific).
|
|
|
|
Poslao: 28 Feb 2018 20:27
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3745
- Gde živiš: 127.0.0.1
|
Ajd E.L.I.T.E. budi dobar pa ispravi ovaj moj kod gore, zivo me interesuje da li radi.
|
|
|
|