Problem pri resavanju zadatka iz programiranja

1

Problem pri resavanju zadatka iz programiranja

offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1174

Napisano: 26 Feb 2018 18:15

Zadatak mi treba za skolu i radi se u C jeziku u programu Devccpp. Ja sam ga radio i ne znam zasto mi kod ne radi.

Ovako glasi zadatak.

Marija je objavila puno statusa na novoj drustvenoj mrezi koju su isprogramirali njeni skolski drugari, ali nikada nije objavila vise od jednog statusa u toku jednog dana. Ispostavilo se da je algoritam sortiranja koji su njeni drugari implementirali pogresan i statusi se ne prikazuju u redosledu njihovog objavljivanja. Mariju zanima koliko je navise statusa koji su prikazani jedan neposredno nakon drugog, a koji su objavljeni jedan nakon drugog (ne obavezno neposredno). Napisi program STATUSI koji sa standardnog ulaza ucitava broj prikazanih statusa n (prirodan broj manji od sto), a zatim n linija koje sadrze (ispravne) datume objavljivanja statusa (dan, mesec, godina razdvojene sa po jednim razmakom), date u redosledu njihovog prikazivanja (od prvog do poslednjeg). Program na standardni izlaz ispisuje broj koji predstavlja duzinu najduze rastuce serije ucitanih datuma.

Ukratko: Treba od unetih n datuma ispisati koliko datuma se veze jedan za drugim vremenski.

Evo ga moj kod pa mi kazite gde gresim posto ja ne vidim. Inace radio sam upis datuma preko matrica.

#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;    printf("Unesi broj statusa: ");    scanf("%i",&n);    unos(a,n,3);    printf("\n\n");    ispis(a,n,3);    printf("\n\n");    n=3;       for(i=0;i<3;i++)       {          //GOD1 < GOD2          if(a[i][n-1] < a[i+1][n-1])          br++;          //GOD1 > GOD2          else if(a[i][n-1] > a[i+1][n-1])          br=0;          //GOD1 = GOD2          else if(a[i][n-1] == a[i+1][n-1])          {             //MES1 < MES2             if(a[i][n-2] < a[i+1][n-2])             br++;             //MES1 > MES2             else if(a[i][n-2] > a[i+1][n-2])             br=0;             //MES1 = MES2             else if(a[i][n-2] == a[i+1][n-2])             {                //DAN1 < DAN2                if(a[i][n-3] < a[i+1][n-3])                br++;                //DAN1 >= DAN2                else if(a[i][n-3] >= a[i+1][n-3])                br=0;             }          }       }    printf("\n\n");    printf("%i",br);    scanf("%i"); }

Evo ih i test primeri. Unosi se broj n odnosno broj datuma i sami datumi (kod mene preko matrice).

Ulaz:
n=5
1 3 2016
1 5 2016
17 4 2016
18 12 2016
4 1 2017


Izlaz: 3

Ulaz:
n=6
11 4 2015
20 5 2015
11 7 2015

17 3 2015
11 2 2016
13 4 2015

Izlaz: 3

Ulaz:
n=4
1 1 2016
7 2 2016
3 5 2016
4 2 2017


Izlaz: 4

Dopuna: 27 Feb 2018 18:08

Imali neko ideju? Ja sam i danas nesto pokusavao, ali mi ne uspeva. Svo vreme se vrtim oko istog, a ne pada mi na pamet kako drugacije da pridjem problemu.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milos
  • Pridružio: 05 Dec 2010
  • Poruke: 716
  • Gde živiš: Beograd

Zasto brojac u for ciklusu ide do 3? Trebalo bi da prodje kroz sve datume (da ide do n).



offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1174

Napisano: 27 Feb 2018 20:56

Slazem se. Ne znam zasto sam promenio na 3. Svejedno, ako stavim n u for ciklus opet ne dobijam tacno resenje.

Dopuna: 27 Feb 2018 21:15

Evo ga moj sadasnji kod. Nije mnogo izmenjen. Ubacio sam da mi na kraju svakog dela for ciklusa stampa brojac, stavio da mi otstampa n na pocetku, izbrisao n=3 i ubacio n kao granicu u for ciklus.

#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;    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;i++)       {                    if(a[i][n-1] < a[i+1][n-1]) //GOD1 < GOD2          br++;                    else if(a[i][n-1] > a[i+1][n-1]) //GOD1 > GOD2          br=0;                    else if(a[i][n-1] == a[i+1][n-1]) //GOD1 = GOD2          {                          if(a[i][n-2] < a[i+1][n-2]) //MES1 < MES2             br++;                          else if(a[i][n-2] > a[i+1][n-2]) //MES1 > MES2             br=0;                          else if(a[i][n-2] == a[i+1][n-2]) //MES1 = MES2             {                                if(a[i][n-3] < a[i+1][n-3]) //DAN1 < DAN2                br++;                                else if(a[i][n-3] > a[i+1][n-3]) //DAN1 > DAN2                br=0;                                else if(a[i][n-3] == a[i+1][n-3]) //DAN1 = DAN2                br=0;             }          }          printf("%i",br);       }    printf("\n\n");    printf("%i",br);    scanf("%i"); }

offline
  • Milos
  • Pridružio: 05 Dec 2010
  • Poruke: 716
  • Gde živiš: Beograd

Sada kada si obrisao n=3 u uglastim zagradama [n-3], [n-2] , [n-1] napisi samo 2, 1, 0 posto su konstantne vrednosti. Takodje bi trebao da imas max promenjivu koja pamti najduzi niz uzastopnih datuma tako da ako na primer imas 4 uzastopna datuma i 5. nije da ostane sacuvana vrednost 4 a ne da ispisuje br koje ce biti 0. Max+1 bi na kraju trebao da se ispisuje umesto br (+1 da bi uracunao i poslednji datum).

offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1174

Jel mozes da mi kazes gde da ubacim max posto na mnogo mesta mi se resetuje brojac pa ne znam na kom treba da ubacim max. Takodje, kako da je ubacim? Jel treba ovako?
if (max<br)
max=br;

offline
  • Milos
  • Pridružio: 05 Dec 2010
  • Poruke: 716
  • Gde živiš: Beograd

Ubaci ga na kraju for petlje, tamo gde si stavio printf("%i",br);
Dobro je to sto si napisao.

offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1174

Evo, odradio sam to i sad je delimicno sve u redu.

#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;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("Broj je sad: %i",br);          printf("\n");          printf("Max je sad: %i",max);          printf("\n");       }    printf("\n\n");    printf("%i",max+1);    scanf("%i"); }

Problem je to sto on u zadnjem loop-u kod for ciklusa on proverava poslednji datum sa datumom koji ne postoji. Ne znam kako to da resim. Kada bih to resio ne bi moralo da stoji max+1 na kraju.

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14809
  • Gde živiš: Niš

Pa skrati petlju za jedan ciklus.

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3745
  • Gde živiš: 127.0.0.1

Ja bih probao nesto drugo: prebaci sve datume u unixtime, sortiraj niz, pogledaj koliko se vezanih elemenata razlikuje za manje od 86400 i to je to. Bez milion if-elseif-elseif-else uslova.

I da, skrati petlju za jedan ciklus.

offline
  • Pridružio: 31 Dec 2015
  • Poruke: 1174

Napisano: 28 Feb 2018 14:41

Evo rastafarri probao sam tako. Ne znam gde gresim.

#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, b[20];    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;i++)       {          b[i] = a[i][2]*86400 + a[i][1]*30*86400 + a[i][0]*365*86400;       }       for(i=0;i<n-1;i++)       {          if(b[i+1] > b[i])          {             br=0;          }          else          {             br++;          }          if (max<br)          max=br;          printf("Broj je sad: %i",br);          printf("\n");          printf("Max je sad: %i",max);          printf("\n");       }    printf("\n\n");    printf("%i",max);    scanf("%i"); }

Sto se tice onog proslog koda ne radi kako treba ako sam stavim da for ne ide do n nego do n-1, odnosno ako smanjim for za jedan ciklus.

Dopuna: 28 Feb 2018 14:43

Sta treba da bude uslov u if? Ne radi mi ni sa

if(b[i+1] > b[i])
if(b[i+1] - b[i] < 86400)

Ko je trenutno na forumu
 

Ukupno su 600 korisnika na forumu :: 8 registrovanih, 1 sakriven i 591 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Ageofloneliness, AMCXXL, Japidson, Koridor, M1los, mrav pesadinac, Ognjen D., zlaya011