Kretanje "robota" u koordinatnom sistemu

Kretanje "robota" u koordinatnom sistemu

offline
  • Pridružio: 26 Feb 2012
  • Poruke: 113

Tek sam poceo da se bavim programiranjem i naisao sam na jedan zadatak koji uopste ne mogu da resim.

Treba da se ukuca broj koraka, x i y koordinate "robota" i naredbe. Postoje 3 naredbe: n ("robot" se pomeri napred, tj. ako su mu koordinate x=1 y=1 nakon naredbe napred bice x=2 y=1, u slucaju da pre toga nije rotiran nekom naredbom), d ("robot" se
rotira za 90stepeni u smeru kretanja kazaljke na satu) i L (robot se rotira za 90stepeni u obrnutom smeru kretanja kazaljke na satu). Nakon klika na dugme button1 u labeli treba da se ispisu trenutne koordinate robota.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14819
  • Gde živiš: Niš

Potrebna ti je jedna promenljiva koja određuje smer kretanja. Neka bude tipa int, i recimo usvoji da je 0 - gore, 1 - levo, 2 - dole, 3 - desno. Poret toga, potreban ti je niz karaktera u koji upisuješ vrednost TextBox-a sa naredbom. Za svaki karakter tog niza vršiš određenu radnju (switch):
- Ukoliko je trenutno posmatrani karakter 'N', u zavisnosti od smera menjaš odgovarajuću koordinatu (switch). Ako je okrenut na gore (smer je 0), uvećavaš y za 1, itd.
- Ukoliko je trenutno posmatrani karakter 'L', inkrementiraš smer po modulu 4. Ako je bio okrenut na gore (0), okrećeš ga na levo ((0 + 1)%4 = 1), itd.
- Ukoliko je trenutno posmatrani karakter 'D', umanjuješ smer za jedan, i ukoliko je umanjeni smer manji od 0 resetuješ ga na 3. Ako je bio okrenut na gore (0), okrećeš ga na desno (0 - 1 = -1 -> smer postaje 3), itd.



offline
  • Pridružio: 26 Feb 2012
  • Poruke: 113

Kao sto sam rekao tek sam poceo sa programiranjem i nesto sam uveliko zaje**o.. evo kod:
private void button1_Click(object sender, EventArgs e)         {             int x = Convert.ToInt32(textBox2.Text);             int y = Convert.ToInt32(textBox3.Text);             string na = Convert.ToString(textBox4.Text);             int smer = 0;                         if (na == "l")             {                 smer--;                 if (smer < 0)                     smer = 3;                 if (smer > 3)                     smer = 0;             }             if (na == "d")             {                 smer++;                 if (smer < 0)                     smer = 3;                 if (smer > 3)                     smer = 0;             }             if (na == "n")             {                 switch (smer)                 {                     case 0:                         x = x+1;                         break;                     case 1:                         y = y-1;                         break;                     case 2:                         x = x-1;                         break;                     case 3:                         y= y+1;                         break;                 }                                                 label5.Text = "Koordinate robota su: " +  "x: " + x.ToString() + "y: " + y.ToString();
Problem je u tome sto mi uvek izbaci x= nesto i y=nesto i kada opet unesem 'n' u textbox i kliknem na button on nista ne promeni. Znaci kada jednom ispise da je x=nesto i y= nesto uvek ce tako ostati. Btw u Naredbe textbox se pise samo 1 komanda a ne niz njih (tako je u zadatku)

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

Problem je u tome što na loš način porediš stringove. Koristi funkciju Equals.

Takođe, ja sam zadatak razumeo drugačije. Dakle, uneseš broj koraka, a zatim uneseš i toliko komandi. Npr. ako uneseš 3 kao broj koraka, u polju "Naredbe" kucaš tri karaktera (npr. "nnn" i robot se pomera tri puta unapred). Treba da koristiš indeksirane promenljive i da čitaš karakter po karakter iz polja Naredbe, a da u zavisnosti od pročitanog karaktera izvršavaš određenu radnju. Dakle, sve treba da se smesti u jednu for petlju koja ide od 0 do broja koraka umanjenog za jedan.

offline
  • Pridružio: 26 Feb 2012
  • Poruke: 113

Ne ide meni ovo programiranje... Uradio sam ovako, i sada kada ukucam npr x=1 y=1 i u naredbu stavim NNN on meni ispise da je x = 10 umesto 4, ili npr ako stavim ddn on ispise da je x=-2 umesto 0, znaci umesto da samo jedanput oduzme 1 on 3puta oduzme 1....
  private void button1_Click(object sender, EventArgs e)         {             int x = Convert.ToInt32(textBox2.Text);             int y = Convert.ToInt32(textBox3.Text);             string na = Convert.ToString(textBox4.Text);             int smer = 0;             int bkoraka = Convert.ToInt32(textBox1.Text);             int wordCount = na.Length;             for (int naIndex = 0; naIndex < wordCount; naIndex++)                             {                 char c = na[naIndex];                 for (bkoraka = 1; bkoraka <= wordCount; bkoraka++)                 {                     if (Convert.ToString(c) == "l")                     {                                             smer--;                         if (smer < 0)                             smer = 3;                         if (smer > 3)                             smer = 0;                     }                     if (Convert.ToString(c) == "d")                     {                         smer++;                         if (smer < 0)                             smer = 3;                         if (smer > 3)                             smer = 0;                     }                     if (Convert.ToString(c) == "n")                     {                         switch (smer)                         {                             case 0:                                  x= x+1;                                 break;                             case 1:                                  y = y - 1;                                 break;                             case 2:                                 x = x - 1;                                 break;                             case 3:                                  y = y + 1;                                 break;                         }                                             }                                                         }                 label5.Text = "Koordinate robota su: " + "x= " + x.ToString() + "y= " + y.ToString();

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

sloba2424 ::umesto da samo jedanput oduzme 1 on 3puta oduzme 1...Zbog toga sto imas nepotrebno ugnježdene petlje. Za svaki karakter naredbe vršiš samo jednu obradu.

offline
  • Pridružio: 26 Feb 2012
  • Poruke: 113

Pa napisao sam da preko if-ova prepozna koji je karakter upisan i na osnovu toga da vrsi radnju za taj karakter, ne razumem zasto to radi vise puta. Inace u skoli smo tek ucili naredbe grananja i ciklusa(delimicno) i ovo je zadatak koji ako uradimo kuci dobijamo 5....

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

Zbog ovoga ne valja:
            for (int naIndex = 0; naIndex < wordCount; naIndex++)                            {                 //...                 for (bkoraka = 1; bkoraka <= wordCount; bkoraka++)                 {                        //...                              }              }
Ako maš recimo tri naredbe (dakle, broj koraka je tri, i u polju Naredbe stoje tri karaktera), za svaku iteraciju spoljne petlje (3 iteracije), ti imaš po 3 iteracije unutrašnje petlje, a to je ukupno 3 * 3 = 9 iteracija.

Sve u svemu, zadatak se može tumačiti na više različitih načina. Broj koraka može da se tumači kao broj naredbi, a može i da se tumači tako da 'D' i 'L' nisu koraci (što praktično i nisu), već da se u korake računa samo kada robot menja poziciju.

Svakako, ako samo izvršavaš naredbe onako kako su zadate (tj. onda kada broj koraka predstavlja broj naredbi), kod bi bio nešto ovako:
privatevoidbutton1_Click(objectsender,EventArgse) {    int x = Convert.ToInt32(textBox2.Text);    int y = Convert.ToInt32(textBox3.Text);    string na = Convert.ToString(textBox4.Text);    int smer = 0;    int bkoraka = Convert.ToInt32(textBox1.Text);    int wordCount = na.Length;    for(int naIndex = 0; naIndex < wordCount; naIndex++)    {       if(Convert.ToString(c)=="l")       {          smer--;          if(smer<0)          smer=3;       }       if(Convert.ToString(c)=="d")       {          smer = (smer++)%4;       }       if(Convert.ToString(c)=="n")       {          switch(smer)          {             case0: x=x+1;                break;             case1: y=y-1;                break;             case2: x=x-1;                break;             case3: y=y+1;                break;          }       }    }       label5.Text="Koordinate robota su:"+"x="+x.ToString()+"y="+y.ToString(); }

offline
  • Pridružio: 26 Feb 2012
  • Poruke: 113

Skontao sam gresku 5min pre polaska u skolu i dobio peticu, hvala na pomoci Smile

Ko je trenutno na forumu
 

Ukupno su 421 korisnika na forumu :: 9 registrovanih, 0 sakrivenih i 412 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: Bahuss, dragoljub11987, Krusarac, marsovac 2, milenko crazy north, moldway, Panter, zlaya011, šumar bk2