Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Repeat...Until

Sivun loppuun

Triton [24.02.2008 11:58:44]

#

Eli tiedättekö te ohjelmointikielijä, joissa toisto silmukka olisi muotoa Repeat...Until. Itse tiedän vain Pascalin ja Basicin, mutta muista en sitten tiedä. Siis onhan noi toistorakenteet tietty kaikissa kielissä, mutta se on yleensä joku for ja while. Musta tuntuu, että toi Repeat ei ole ainakaan enään mikä kovin käytetty rakenne.

hunajavohveli [24.02.2008 12:13:09]

#

Repeat...Until kuulostaa rakenteelta, joka toimii samoin kuin Do...While, eli tehdään jotain, kunnes tietty ehto on tosi, ja suoritetaan toistettava asia ainakin kerran ennen ehdon tarkistamista. Tällainen rakenne löytyy lukemattomista kielistä, esimerkkeinä nyt vaikka C, C++, Java ym. näiden sukulaiskielet.

Antti Laaksonen [24.02.2008 12:13:32]

#

C:n do-while-rakenne on melko samanlainen:

a = 0;
do {
   a++;
   printf("%i\n", a);
} while (!(a == 10));

Tosin lopussa lukee while (niin kauan kuin) eikä until (kunnes), mutta ehdon voi muuttaa käänteiseksi niin kuin yllä olevassa koodissa.

Meitzi [24.02.2008 12:23:38]

#

On sellaisia eroja, että esim Javassa tuo while lausekkeen ehto voi olla alussa. Eli sitä ei vältämättä suoriteta kertaakaan.

Triton [24.02.2008 12:31:51]

#

No toi for -rakennekkin tietty on aikasamanlainen jos verrataan repeatiin:

Repeat

     i=i+1;
     Print "Hello, World!";

Until i = 10;
for (i=0;i<10;i++) {

    Print "Hello, World";

}

Tuo for menee huomattavasti pienempään tilaan... Itse vaan tykkään for -silmukasta enämmän Pascal tai Basic tyylillä For i = 0 To 10 (Step)

Harmi, että C++ for -rakenne ei ole toi...

Megant [24.02.2008 12:41:59]

#

Minusta tuo C++:n for-rakenne on paljon monipuolisempi.
Voi alustaa monta muuttujaa, ehto voi olla laajempi ja voi vaihtaa muuttujien arvoja kivemmin.

hunajavohveli [24.02.2008 12:44:04]

#

C:n tyylinen for-rakenne soveltuu itse asiassa useampaan tapaukseen kuin pelkkään lukujen läpikäyntiin, koska alkutila, ehto ja toisto voidaan valita vapaasti. Esimerkiksi linkitetyn listan voi käydä läpi näin:

for(a = head; a != null; a = a->next) { }

Basicin for ei sovellu vastaavaan. Lisäksi Basicissa on se ikävä piirre, että for-silmukalle täytyy kertoa nimenomaan viimeinen luku, joka käydään läpi. Jos taulukossa on kymmenen alkiota ja ne haluaa käydä läpi, joutuu käymään läpi alkiot nollasta yhdeksään. Jos siis alkioiden lukumäärä on tiedossa, siitä joutuu aina vähentämään yhden, toisin kuin C:n tyylissä. Yksi ratkaisu on tietysti aloittaa indeksointi ykkösestä, jolloin voi käydä läpi luvut yhdestä kymmeneen, mutta ykkösestä aloittaminen aiheuttaa taas usein paljon muita ongelmia.

Kray [24.02.2008 12:50:11]

#

Meitzi: onnistuu se c:ssäkin.

jlaire [24.02.2008 13:51:46]

#

Triton kirjoitti:

Siis onhan noi toistorakenteet tietty kaikissa kielissä,

Ei ole kaikissa.

Triton [24.02.2008 13:52:50]

#

No sanoppas missä ei ole...

Päärynämies [24.02.2008 14:29:08]

#

Nyt tulee vastaus vähän mutu-tuntumalla, mutta monista funktionaalisista kielistä (ellei kaikista) puuttuu tuollaiset for ja while tyyppiset toistorakenteet. Niissä sen sijaan käytetään rekursiota. Itse vain vähän Haskellia vasta osaan, niin paha mennä yleisesti sanomaan, mutta noin muista lukeneeni. Joku tietävämpi vielä varmistakoon tai korjatkoon.

Triton [24.02.2008 14:32:34]

#

No mutta vaikka niistä puuttuisikin virallinen toisto silmukka, niin rekursio vastaa hyvin sitä...

jlaire [24.02.2008 15:18:00]

#

Jep, ainakaan Haskellissa ei ole toistorakenteita (kun ei ole muuttujiakaan, vain vakioita).

Triton kirjoitti:

No mutta vaikka niistä puuttuisikin virallinen toisto silmukka, niin rekursio vastaa hyvin sitä...

Vaikka eri kielillä pystyykin tekemään samat asiat (Turing-täydellisyys), ne voivat olla todella erilaisia. Tässä yksi mielenkiintoinen artikkeli: What's Wrong with the For Loop.

Triton [24.02.2008 15:27:09]

#

No eikö ole aika puuduttavaa ohjelmoida jollain kielellä jossa voi määritellä vain vakioita... Eihän sellaisella pysty tekemään kunnon ohjelmaa...

Päärynämies [24.02.2008 15:40:55]

#

Itse ainakin näen Haskell kovin mielenkiintoisena kielenä opetella, juurikin sen funktionaalisuuden takia. Alkuun tietty on hankala muuttaa ajattelutapaansa, kun aiemmin on tottunut ohjelmoimaan C:tä ja C++:aa enimmäkseen käyttäen.

Kyllä Haskellilla saa ihan oikeita ohjelmia aikaiseksi, vaikka se äkkiseltään kuulostaisi mahdottomalta. Esimerkkinä käyköön nyt Darcs(http://darcs.net/). Versionhallintaohjelma, joka on kirjoitettu Haskellia käyttäen. Ihan kunnon ohjelmalta vaikuttaa...

Metabolix [24.02.2008 18:14:00]

#

hunajavohveli kirjoitti:

Lisäksi Basicissa on se ikävä piirre, että for-silmukalle täytyy kertoa nimenomaan viimeinen luku, joka käydään läpi.

Näin on Pascalissakin, mutta ratkaisuna ovat erilaiset taulukot, joissa alkioiden numerointi ei alakaan nollasta:

program Tauluohjelma;

const
  Koko = 10;

var
  Taulu: Array [1..Koko] of Integer;
  i: Integer;

begin
  Writeln('Syötä ', Koko, ' lukua omilla riveillään.');
  for i := 1 to Koko do Readln(Taulu[i]);
  Writeln('Syötit näin:');
  for i := 1 to Koko do Writeln(Taulu[i]);
end.

Tosiaan C:n ja sen sukulaisten do..while on käytännössä aivan vastaava rakenne. Sen sijaan suora while-silmukka ei sovi tarkoitukseen suoraan, koska sisältöä ei välttämättä suoriteta kertaakaan.

Toiminnallisesti repeat..until löytyy kaikista hyppyjä ja ehtolauseita tukevista kielistä:

alku:
  koodia;
  if not ehto then goto alku;
{loppu}

Pekka Karjalainen [24.02.2008 19:44:52]

#

Luassa sattuu olemaan repeat ... until myös.

http://www.lua.org/manual/5.1/manual.html#2.4.4

Lisäksi eräissä kielissä on C-kielen mallista systeemiä paljon laajempi makrosysteemi, jolla kieleen voi mm. lisätä kaikki haluamansa toistorakenteet. Luaankin saa sellaisen, tosin Metalua on vasta versionumerossa 0.4 tällä hetkellä. Sen demosta näkee, että kieleen on helppo itse väsätä vaikkapa ML-tyylinen hahmonsovitus ... pienellä nokkeluudella. :)

Saattaa kuitenkin olla viisaampaa tyytyä toisen huolella tekemään syntaksiin kuin virittää ihan oma. Makunsa kullakin.

groovyb [24.02.2008 21:10:25]

#

.net C# menee

do
{
// mitä sitte teetkään
}
while(jotain on true);


Sivun alkuun

Vastaus

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

Tietoa sivustosta