using System; public class index{ public static void Main(){ Console.WriteLine("Hei, anna luku 1 ja 30 valilta: "); int z = Console.ReadLine(); for(int i=0; i==z; i++){ if(z <= 30 && z >= 1){ Console.WriteLine("Hello World!"); } else{ Console.WriteLine("ERROR!"); break; Main(); } } } }
Ja ongelma: 5 rivillä "Error CS0029: Cannot implicitly convert type 'string' to 'int'"
Elikkä mitenkäs saan poimittua sen numeron?
string strEarn = "150"; string strTax = "23.0"; double dblEarn = Convert.ToInt32(strEarn);
Nyt sain käännettyä ja se muuten toimii, paitsi että tuo toisto ei toimi... Ja mitenkäs saan käännettyä tuon ohjelman takas alkuun tuolta else lauseesta, tuo Main(); ei selvästikkään toimi...
Kirjoitit näin?
int z = Convert.ToInt32(Console.ReadLine());
Toiminnasta sen verran että sulla ei muuta toistoa ole kun tuo for. Jos haluat että ohjelma pyörii ikuisesti niin tarviit while silmukan alkamaan ennen tätä (ja loppumaan tuon for- jälkeen):
Console.WriteLine("Hei, anna luku 1 ja 30 valilta: ");
Käytännössä jos syöttäisit luvun 32 niin tuon pitäisi printata:
ERROR!
Hello World! <- 30 kertaa
ERROR!
ERROR!
Komento break hyppää ulos silmukasta, joten riviä Main() ei koskaan suoriteta. Joka tapauksessa tuo on väärä tapa pyrkiä toistoon, oikea tapa on esimerkiksi while-silmukka. Lisäksi ohjelmasi toiminta ei taida olla lähelläkään sitä, mitä olet ajatellut, joten suosittelen perinteistä menetelmää: mieti kynän ja paperin kanssa, miten ohjelma etenee eli mitä tietokone tekee missäkin vaiheessa ja mitä eri muuttujat sisältävät.
Elikkäs nyt sain sen tähän malliin
using System; public class index{ public static void Main(){ Console.Write("Hei, anna luku 1 ja 30 valilta: "); int z = Convert.ToInt32(Console.ReadLine()); if(z <= 30 && z >= 1){ int i = 1; do{ Console.WriteLine(z+" HELLO WORLD! "+i+". kerta."); i++; } while(i==z); }else{ Console.WriteLine("Virhe!"); Main(); } } }
Elikkä tarkotuksena ois että ohjelma kysyy käyttäjältä numeron int z ja jos numero on 1 ja 30 väliltä niin tulostetaan hello world z kertaa, muuten tulostetaan virhe ja kysytään numeroa uudestaan...
Nyt muuten toimii paitsi että tuo toisto silmukka tulostaa hello worldin maksimissaan 2 kertaa, jos syöttää numeron esim. 20 niin ei tulosta kuin kerran.
Ei tuossa nyt auta kuin ihan rauhassa miettiä, mitä tuo silmukka oikeastaan tekee. Lue koodi suomeksi ääneen ja mieti, onko siinä mitään järkeä. Sitten sanele suomeksi (hieman pidemmin), mitä ohjelman pitäisi tehdä, ja kirjoita sitä vastaava koodi.
Hups, en kattonukaan tarkasti tuota else osaa. Näkyy siinäkin het 1 ajatusvirhe :)
No nyt sain sen toimimaan niinkuin halusinkin. Elikkäs int i = 0 ja while(i!=z),
jos olisitte itse tehnyt jotenkin paremmin niin kertokaahan toki, opettelemassahan tässä ollaan...
Kuten Metabolix sanoikin, ei toistoon kannata pyrkiä (ainakaan tässä tapauksessa) kutsumalla pääfunktiota uudelleen. Parempi ajatus on käyttää while-silmukkaa, jolloin Main-funktion kutsumista ei tarvita. Tämän lisäksi itse tulostuksessa on mukavaa käyttää for-silmukkaa:
using System; public class index { public static void Main() { Console.Write("Hei, anna luku 1 ja 30 valilta: "); int z = Convert.ToInt32(Console.ReadLine()); while(z < 1 || z > 30) { Console.WriteLine("Virhe! Anna uusi luku."); z = Convert.ToInt32(Console.ReadLine()); } for(int i = 1; i <= z; ++i) { Console.WriteLine(z+" HELLO WORLD! "+i+". kerta."); } } }
Periaatteessa näin kirjoitettu koodi ei ole yhtään sen parempi kuin itse kirjoittamasi. On kuitenkin hyvä opetella kirjoittamaan koodia, josta näkee yhdellä vilkaisulla, mitä sen on suurinpiirtein tarkoitus tehdä. Tästä syystä yksinkertaisten silmukoiden käyttäminen on tässä tapauksessa suositeltavaa, sillä silmukat ovat useimmille ohjelmoijille hyvin tuttuja.
Main-funktion toistuva kutsuminen on virhe, joka lopulta (satojen tai tuhansien kutsujen jälkeen) voi johtaa muistin täyttymiseen ja ohjelman kaatumiseen.
(Siirsin myös aiheen oikeaan paikkaan: C# ei ole C eikä C++, joten se kuuluu muihin kieliin.)
Aihe on jo aika vanha, joten et voi enää vastata siihen.