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: 14825
  • 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:

  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             int x = Convert.ToInt32(textBox2.Text);
  4.             int y = Convert.ToInt32(textBox3.Text);
  5.             string na = Convert.ToString(textBox4.Text);
  6.             int smer = 0;
  7.            
  8.             if (na == "l")
  9.             {
  10.                 smer--;
  11.                 if (smer < 0)
  12.                     smer = 3;
  13.                 if (smer > 3)
  14.                     smer = 0;
  15.             }
  16.             if (na == "d")
  17.             {
  18.                 smer++;
  19.                 if (smer < 0)
  20.                     smer = 3;
  21.                 if (smer > 3)
  22.                     smer = 0;
  23.  
  24.             }
  25.             if (na == "n")
  26.             {
  27.                 switch (smer)
  28.                 {
  29.                     case 0:
  30.                         x = x+1;
  31.                         break;
  32.                     case 1:
  33.                         y = y-1;
  34.                         break;
  35.                     case 2:
  36.                         x = x-1;
  37.                         break;
  38.                     case 3:
  39.                         y= y+1;
  40.                         break;
  41.                 }
  42.                
  43.                
  44.                 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: 14825
  • 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....

  1. private void button1_Click(object sender, EventArgs e)
  2.       {
  3.           int x = Convert.ToInt32(textBox2.Text);
  4.           int y = Convert.ToInt32(textBox3.Text);
  5.           string na = Convert.ToString(textBox4.Text);
  6.           int smer = 0;
  7.           int bkoraka = Convert.ToInt32(textBox1.Text);
  8.           int wordCount = na.Length;
  9.           for (int naIndex = 0; naIndex < wordCount; naIndex++)
  10.              
  11.           {
  12.               char c = na[naIndex];
  13.               for (bkoraka = 1; bkoraka <= wordCount; bkoraka++)
  14.               {
  15.                   if (Convert.ToString(c) == "l")
  16.                   {
  17.                  
  18.                       smer--;
  19.                       if (smer < 0)
  20.                           smer = 3;
  21.                       if (smer > 3)
  22.                           smer = 0;
  23.                   }
  24.                   if (Convert.ToString(c) == "d")
  25.                   {
  26.                       smer++;
  27.                       if (smer < 0)
  28.                           smer = 3;
  29.                       if (smer > 3)
  30.                           smer = 0;
  31.  
  32.                   }
  33.                   if (Convert.ToString(c) == "n")
  34.                   {
  35.                       switch (smer)
  36.                       {
  37.                           case 0:
  38.                                x= x+1;
  39.                               break;
  40.                           case 1:
  41.                                y = y - 1;
  42.                               break;
  43.                           case 2:
  44.                               x = x - 1;
  45.                               break;
  46.                           case 3:
  47.                                y = y + 1;
  48.                               break;
  49.                       }
  50.  
  51.  
  52.                      
  53.                   }
  54.                  
  55.                  
  56.               }
  57.               label5.Text = "Koordinate robota su: " + "x= " + x.ToString() + "y= " + y.ToString();

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14825
  • 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: 14825
  • Gde živiš: Niš

Zbog ovoga ne valja:

  1. for (int naIndex = 0; naIndex < wordCount; naIndex++)               
  2. {
  3.     //...
  4.     for (bkoraka = 1; bkoraka <= wordCount; bkoraka++)
  5.     {
  6.            //...             
  7.     } 
  8. }

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:
  1. privatevoidbutton1_Click(objectsender,EventArgse)
  2. {
  3.    int x = Convert.ToInt32(textBox2.Text);
  4.    int y = Convert.ToInt32(textBox3.Text);
  5.    string na = Convert.ToString(textBox4.Text);
  6.    int smer = 0;
  7.    int bkoraka = Convert.ToInt32(textBox1.Text);
  8.    int wordCount = na.Length;
  9.    for(int naIndex = 0; naIndex < wordCount; naIndex++)
  10.    {
  11.       if(Convert.ToString(c)=="l")
  12.       {
  13.          smer--;
  14.          if(smer<0)
  15.          smer=3;
  16.       }
  17.       if(Convert.ToString(c)=="d")
  18.       {
  19.          smer = (smer++)%4;
  20.       }
  21.       if(Convert.ToString(c)=="n")
  22.       {
  23.          switch(smer)
  24.          {
  25.             case0: x=x+1;
  26.                break;
  27.             case1: y=y-1;
  28.                break;
  29.             case2: x=x-1;
  30.                break;
  31.             case3: y=y+1;
  32.                break;
  33.          }
  34.       }
  35.    }   
  36.    label5.Text="Koordinate robota su:"+"x="+x.ToString()+"y="+y.ToString();
  37. }

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 1116 korisnika na forumu :: 65 registrovanih, 7 sakrivenih i 1044 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: 4thFlavian, AF-1, Bacac, Black Luster Soldier, bobomicek, Boris90, Bubimir, C-Gun, crnogorac, darkangel, DJUNTA, Dolinc, dozorni, Dzoni2412, feanor, FOX, Georgius, ikan, Ivan001, Jakonjveliki, jalos, Jaz, Jovan1983, Konda, ljuba.b, LostInSpaceandTime, Makeitdrip, Manjane, mercedesamg, Mi lao shu, mikrimaus, miljannis, Milos1389, milutin134, Mićko, mm1811, nebidrag, nekdo, nelezele, nenad81, neutrino, niksa517, nobutado, Nomica, operniki, Papadubi, pceklic, peradetlić, pobeda, Prečanin30, PrincipL, radovanstojkov023, RajkoB, repac, Shinobi, sistem22, Srki98, Stod, Tila Painen, Timočka Divizija, tmanda323, Velizar Laro, Vlada1389, Zoca, Zorge