Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Outo For-If vika

ezuli [06.03.2004 15:03:58]

#

Eli kun minulla on tällainen koodi joka tarkistaa onko ristinollassa rivejä. kohta-taulukko kertoo mikä merkki on missäkin.

for i := 1 to 3 do begin
   if (kohta[i,1] = kohta[i,2]) and (kohta[i,1] = kohta[i,3]) then
      voittaja := kohta[i,1] else
   if (kohta[1,i] = kohta[2,i]) and (kohta[1,i] = kohta[3,i]) then
      voittaja := kohta[1,i]
   else
end;
if (kohta[1,1] = kohta[2,2]) and (kohta[1,1] = kohta[3,3]) then
   voittaja := kohta[1,1] else
if (kohta[3,1] = kohta[2,2]) and (kohta[3,1] = kohta[1,3]) then
   voittaja := kohta[3,1];

Mutta jostain syystä se vaatii, että merkkejä on vähintään yksi joka rivillä ja sarakkeella. Mikä vikana?

sqwiik [06.03.2004 18:12:24]

#

...Outoa. Kirjoitin saman itse hieman eri muotoon, toimiiko tämä? Tuota viimeistä else-sanaa ei tarvita.

for i := 1 to 3 do begin
  {Onko vaakarivillä voittoa?}
  if (kohta[i,1] = kohta[i,2]) and (kohta[i,1] = kohta[i,3]) then begin
    voittaja := kohta[i,1];
  {Jos ei tuolla, niin entäs sitten pystyrivillä?}
  end else if (kohta[1,i] = kohta[2,i]) and (kohta[1,i] = kohta[3,i]) then begin
    voittaja := kohta[1,i];
  end;
end;
if (kohta[1,1] = kohta[2,2]) and (kohta[1,1] = kohta[3,3]) then begin
   voittaja := kohta[1,1];
end else if (kohta[3,1] = kohta[2,2]) and (kohta[3,1] = kohta[1,3]) then begin
   voittaja := kohta[3,1];
end;

sqwiik [06.03.2004 19:09:37]

#

Eikun ahaa... Löysin vian, kun mietin vähän. Voitto tulee tuolla koodilla myös, jos on rivi tyhjiä...
Eli tarkista myös, että jokaisessa tarkistettavassa kohdassa on merkki.

ezuli [06.03.2004 19:57:47]

#

lainaus:

Eikun ahaa... Löysin vian, kun mietin vähän. Voitto tulee tuolla koodilla myös, jos on rivi tyhjiä...
Eli tarkista myös, että jokaisessa tarkistettavassa kohdassa on merkki.

Siis kyllä minulla löytyy tämmönenkin.
Loogisesti ajatellen kaiken pitäisi olla kunnossa, ja ainoa mahdollinen vika on tuossa tarkistus koodissa.

if voittaja = 1 then begin
   {nolla voittaa}
end else
if voittaja = 2 then begin
   {risti voittaa}
end else begin
end;

Niin ja olisi varmaan pitänyt mainita heti alussa, että
ohjelma toimi ihan hyvin sisäkkäisillä if-lauseilla. Se oli kuitenkin niin sekavan näköistä koodia, joten ajattelin muokata sen tämmöiseen muotoon. Eli ongelmaa ei periaatteessa ole, mutta ihmetyttää miksi se ei toimi tuolla lailla.

sqwiik [07.03.2004 10:29:11]

#

Ei vaan katsos - jos jollain rivillä/sarakkella on voitto, niin myöhemmin tulevat mahdolliset tyhjät rivit nollaavat voittajan. Laita siis tarkistuskoodiin noiden voitta := ... - rivien perään komento break;, joka keskeyttää tarkastuksen (silmukan suorituksen, siis)

ezuli [07.03.2004 15:55:42]

#

Kiitos!
En ollut kyllä ikinä kuullutkaan silmukan katkasemisesta (johtuen siitä, että en ole varsinaisesti opiskellut ohjelmointia, vaan opetellut ne asiat mitä olen tarvinnut)

Se alkoi heti toimia kun lisäsin tämän viimeiseksi silmukkaan:

if voittaja <> 0 then
   break;

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta