Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# ongelma

Sivun loppuun

topi89 [23.06.2010 00:12:30]

#

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?

Jokotai [23.06.2010 00:34:34]

#

string strEarn = "150";
string strTax = "23.0";

double dblEarn = Convert.ToInt32(strEarn);

topi89 [23.06.2010 01:04:42]

#

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...

User137 [23.06.2010 07:35:51]

#

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!

Metabolix [23.06.2010 10:10:54]

#

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.

topi89 [23.06.2010 12:18:18]

#

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.

Metabolix [23.06.2010 12:19:55]

#

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.

User137 [23.06.2010 12:38:00]

#

Hups, en kattonukaan tarkasti tuota else osaa. Näkyy siinäkin het 1 ajatusvirhe :)

topi89 [23.06.2010 12:47:04]

#

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...

Laitinen [23.06.2010 13:40:15]

#

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.

Metabolix [23.06.2010 14:17:16]

#

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.)


Sivun alkuun

Vastaus

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

Tietoa sivustosta