Pomoc u vezi rjesavanja niza (C jezik)

Pomoc u vezi rjesavanja niza (C jezik)

offline
  • Pridružio: 19 Okt 2020
  • Poruke: 2

Napisano: 19 Okt 2020 15:00

Pozdrav svima, imam jedan zadatak koji nikako ne mogu da rijesim pa bi mi valjala vasa pomoc. On glasi ovako:

U niz se unose elementi, sve po tri clana, takozvane "trojke". Prvi clan jedne trojke je ID kosarkasa, drugi clan je broj broj minuta provedenih na parketu tog kosarkasa i treci clan jedne trojke je ukupan broj poena tog kosarkasa. Dakle ta jedna trojka sadrzi u stvari 3 elementa koja opisuju jednog igraca. Unos se vrsi sve dok se ne unese negativan broj na bilo kom od 3 mjesta u zadnjoj "trojci". (Na primjer ako zadnju trojku cine elementi 5 -1 23 unos se prekida tek posle 23, jer se mora obezbjediti unos citave trojke). Dalje, ukoliko se unesu 2 ista ID-a za 2 kosarkasa, treba obezbjediti ponovan unos za tog drugog jer svaki kosarkas treba da ima jedinstven ID koji ga opisuje. Na kraju treba pronaci koji je kosarkas dao najvise poena po minuti, ispisati taj rezultat i ID tog kosarkasa. Napomena da treba obezbjediti da se kod zadnje trojke ne racuna broj poena po minuti jer je ona ta koja je prekinula unos zbog negativnog broja pa nema smisla racunati.

Dakle, najveci problem mi predstavlja sam unos niza jer nikako ne mogu da uspijem da unesem sve potrebne podatke onako kako se trazi. Znam da treba da se unos radi preko do while petlje i tako sam i pokusavao, ali nazalost nisam daleko dogurao jer do sada sam se susretao sa nekim jednostavnijim uslovima unosa, kao sto je npr. unos samo pozitivnih, samo viseifrenih, samo trocifrenih brojeva i slicno.

Sve ovo treba uraditi u C jeziku bez koriscenja funkcija i pokazivaca jer to nismo ucili, sto jos vise otezava okolnosti.

Dopuna: 19 Okt 2020 15:05

Ovo je nesto najblize sto sam uspio uraditi.

#include <stdio.h>
int main ()
{
int i, j, n, m, niz[50], min, br=0, pom, k, u;
do
{
printf("Unesi element niza:\n");
scanf ("%d", &n);
if(n>=0)
{
niz[br]=n;
br++;
}
for(i=0; i<br; i+=3)
{
while(niz[i+3]==niz[i])
{
br--;
printf("Unesite ponovo broj:\n");
scanf("%d", &m);
niz[i+3]=m;
niz[br]=niz[i+3];
br++;
}
}
}
while(n>=0);
printf("Niz je:\n");
for(i=0; i<br; i++)
printf("%d ", niz[i]);
}



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 06 Feb 2012
  • Poruke: 1785

Unos, naravno, radiš petljom (onom koja ti je najlakša, svejedno je).

Podatke bi bilo najlakše čuvati u strukturi, ali nije nužno.

Možeš recimo u višedimenzionom nizu. Jer ti je olakšanje što sve tri osobine igrača mogu biti tipa int. (ukoliko ID ne bi bio duži od opsega inta, a i to povećaš unsigned int tipom na duplo više).

Ili još jedna ideja da imaš 3 jednodimenziona niza istog tipa i iste dužine, za svaku osobinu igrača (kojima bi za k-tog igrača unosio osobinu na k-to mjesto u odgovarajućem nizu).

Vjerovatno ima još nekoliko načina...



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

Ja recimo, ne bih cuvao unesene podatke nigde, osim ID-eva, jer realno nije potrebno. Neophodne su tri promenljive - niz sa ID-evima, poeni po minuti (max vrednost) i ID kosarkasa cija je ta vrednost.

Na samom pocetku definises IdSvi kao niz, IdMax = 0, PoeniMax = 0, i ucitavas vrednosti.

Cim korisnik unese ID, poene i minute, proveris da li u nizu IdSvi postoji ta vrednost, ako postoji, preskocis celu petlju (zapravo dve, zato continue 2) i pustis korisnika da unese ponovo vrednosti. Ako ne postoji, proveris da li je broj poena ili broj minuta manji od nule. Ako jeste, prekidas petlju. Ako su oba uslova prosla, sracunas PoeniMaxTmp kao kolicnik broja poena i minuta na terenu. Ako je taj kolicnik veci od PoeniMax, dodelis vrednost PoeniMaxTmp toj promenljivoj, upises ID trenutnog kosarkasa u IdMax i nastavljas petlju.

Kad se zavrsi petlja sa unosom podataka, samo isprintas IdMax i PoeniMax, jer si sve vec sracunao prilikom unosa. Ili u kodu, ovako otprilike:

#include <stdio.h> int main () {     int IdSvi[INT_MAX], PoeniMax = 0, IdMax = 0, PoeniMaxTmp, Kosarkas[3], i;     while (true) {         printf("Unesite ID kosarkasa:\n");         scanf("%d", &Kosarkas[0]);         printf("Unesite broj minuta:\n");         scanf("%d", &Kosarkas[1]);         printf("Unesite broj poena:\n");         scanf("%d", &Kosarkas[2]);         for(i = 0; i < sizeof(IdSvi); i++) {             if(IdSvi[i] == Kosarkas[0]) {                 printf("Vec ste uneli kosarkasa sa ID-em %d\n", Kosarkas[0]);                 continue 2;             }         }         if (Kosarkas[1] < 0 || Kosarkas[2] < 0) {             break;         }         IdSvi(sizeOf(IdSvi)] = Kosarkas[0];         PoeniMaxTmp = round((Kosarkas[2] / Kosarkas[1]) * 100) / 100;         if (PoeniMaxTmp > PoeniMax) {             PoeniMax = PoeniMaxTmp;             IdMax = Kosarkas[0];         }     }     printf("Najveci broj poena po minutu (%d) ima kosarkas sa ID-em %d\n", PoeniMax, IdMax); }

offline
  • Pridružio: 06 Feb 2012
  • Poruke: 1785

Rastafarii :: IdSvi(sizeOf(IdSvi)] = Kosarkas[0];
Jesi siguran da ti ova linija radi kako treba?
I da for petlja u 12 liniji ima dobre granice?

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

Nisam siguran, C nije moj "majcin jezik". Trebalo je mozda da napisem to.

Ispravi me ako gresim, ali ako IdSvi ima 3 elementa, poslednji ima indeks 2, pa ce da linija 21 da doda novi element sa indeksom 3.

Istom logikom, ako IdSvi ima 3 elementa, petlja iz linije 12 se poziva 3 puta - za indeks 0, 1 i 2. Svi elementi su definisani.

offline
  • Pridružio: 06 Feb 2012
  • Poruke: 1785

Ne radi rako u C-u, nazalost. Ali odlicna ideja za neki napredniji jezik.
U C-u sizeof vraca velicinu niza u memoriji u bajtima.
sifeof(niz)/sizeof(niz[0]) je broj svih elemenata. A trenutni indeks ne mozes dobiti pomocu operatora sizeof, jer u C-u ne postoji prazan niz. Svaki niz ima neke vrijednosti, tvoje ili slucajne vrijednosti u memoriji.

offline
  • Pridružio: 19 Okt 2020
  • Poruke: 2

Nazalost zabranjeno nam je da koristimo naredbe break, continue i goto posto nas kao tome jos uvijek nisu ucili. Znam da je apsurdno i meni je, ali nazalost tako je i zbog toga mi i jeste komplikovan ovaj zadatak jer se sve mora odraditi "pjeske" koristeci samo osnovne petlje i funkcije.
Takodje nam je receno da se zadatak mora uraditi kao jednodimenzionalni niz, nikako drugacije.
Ukoliko imate neke prijedloge kako da na ovakav nacin uradim, dobro bi mi dosli. Hvala u naprijed! Very Happy

Ko je trenutno na forumu
 

Ukupno su 997 korisnika na forumu :: 43 registrovanih, 8 sakrivenih i 946 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _commandos_, aerofreak, amstel2, Apok, Arhiv, Bane san, bankulen, bojank, Boris90, brundo65, darcaud, djukapfc, Doca, Dubara, garfildmiki, goxin, GreenMan, helen1, ivran064, JOntra, Kraus, Levi, liman, Markoni29, mercedesamg, minmatar34957, mnn2, mushroom, obozo, pedja63, pera12345, Profica, r77adder, rovac, sabros, Skijavoneska, Snorks, ss10, tmanda323, Vlad000, Yellow Pinky, yrraf, Zerajic