Poslao: 27 Feb 2018 18:08
|
offline
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1272
|
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.
|
|
Poslao: 27 Feb 2018 19:57
|
offline
- milos97
- Počasni građanin
- 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).
|
|
|
|
Poslao: 27 Feb 2018 21:15
|
offline
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1272
|
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");
}
|
|
|
|
Poslao: 27 Feb 2018 22:28
|
offline
- milos97
- Počasni građanin
- 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).
|
|
|
|
Poslao: 27 Feb 2018 22:53
|
offline
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1272
|
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;
|
|
|
|
Poslao: 27 Feb 2018 23:31
|
offline
- milos97
- Počasni građanin
- 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.
|
|
|
|
Poslao: 28 Feb 2018 07:32
|
offline
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1272
|
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.
|
|
|
|
|
Poslao: 28 Feb 2018 10:15
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3760
- 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.
|
|
|
|
Poslao: 28 Feb 2018 14:43
|
offline
- Milos ZA
- Super građanin
- Pridružio: 31 Dec 2015
- Poruke: 1272
|
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)
|
|
|
|