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.
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.
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.
On sellaisia eroja, että esim Javassa tuo while lausekkeen ehto voi olla alussa. Eli sitä ei vältämättä suoriteta kertaakaan.
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...
Minusta tuo C++:n for-rakenne on paljon monipuolisempi.
Voi alustaa monta muuttujaa, ehto voi olla laajempi ja voi vaihtaa muuttujien arvoja kivemmin.
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.
Meitzi: onnistuu se c:ssäkin.
Triton kirjoitti:
Siis onhan noi toistorakenteet tietty kaikissa kielissä,
Ei ole kaikissa.
No sanoppas missä ei ole...
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.
No mutta vaikka niistä puuttuisikin virallinen toisto silmukka, niin rekursio vastaa hyvin sitä...
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.
No eikö ole aika puuduttavaa ohjelmoida jollain kielellä jossa voi määritellä vain vakioita... Eihän sellaisella pysty tekemään kunnon ohjelmaa...
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...
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}
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.
.net C# menee
do
{
// mitä sitte teetkään
}
while(jotain on true);
Aihe on jo aika vanha, joten et voi enää vastata siihen.