Problem pri resavanju zadatka iz programiranja

2

Problem pri resavanju zadatka iz programiranja

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14249
  • 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.
offline
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 838
  • Gde živiš: Srbija / Zajecar

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.



offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3546
  • 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.

offline
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 838
  • Gde živiš: Srbija / Zajecar

Veruj mi da ja nemam predstavu kako radi taj program Very Happy. Da li mozes da mi pomognes u prepravci mog koda? Da ne radim preko sekundi posto ne razumem uopste princip tog rada.

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3546
  • 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.

offline
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 838
  • Gde živiš: Srbija / Zajecar

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 Very Happy. 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.

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3546
  • 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.

offline
  • Milos Stojanovic
  • Programer u pokusaju
  • Pridružio: 31 Dec 2015
  • Poruke: 838
  • Gde živiš: Srbija / Zajecar

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.

offline
  • Programer
  • Pridružio: 23 Maj 2012
  • Poruke: 4458

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).

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3546
  • 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.

Ko je trenutno na forumu
 

Ukupno su 674 korisnika na forumu :: 36 registrovanih, 4 sakrivenih i 634 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 2413 - dana 03 Okt 2019 05:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., Arhiv, arsa, Bane san, bankulen, bojank2, Boris90, borko_marjanovic, brundo65, Cobi026, Cvijo_ue, debeli, Djurdevdan, flash12, FOX2, Gama, husky, ikan, kalens021, mercedesamg, mgaji21, nemkea71, NenadG, NoOneEver Dreams, Panonsky, plavii, powSrb, rovac, shmele2, Shufle, soonne, StepskiVuk, trajkoni018, uhogrlonos, VaRvArI 85, Wisdomseeker