Metody a cyklus while v C#
Ahoj, řeším jeden problém ohledně metod a cyklů v C#. Mám dvě metody. Jednu na cyklus while a druhou Static Void Main(), ve které bych chtěl cyklus z první metody zavolat, ale nevím jak na to. Potřebuju aby tento cyklus: while(!int.TryParse(Console.ReadLine(), out cislo1))
Console.WriteLine("Neplatné číslo, zadejte prosím znova");
byl v první metodě uložen a abych ho mohl poté zavolat v druhé metodě Static void Main().
Console.WriteLine("Neplatné číslo, zadejte prosím znova");
byl v první metodě uložen a abych ho mohl poté zavolat v druhé metodě Static void Main().
Odpovědi
Diskuze
Nejlepší bude když sem (nebo někam ke stažení) dáš celý zdroják…
{
class Program
{
static void Main() ...... METODA 1
{
Console.WriteLine("Zadejte první číslo:");
float cislo1;
ZAVOLÁNÍ METODY 2
Console.WriteLine("Zadejte druhé číslo:");
float cislo2;
ZAVOLÁNÍ METODY 2
Console.ReadKey();
}
static .... () ....... METODA 2
{
while (!float.TryParse(Console.ReadLine(), out ...proměnná...))
Console.WriteLine("Neplatné číslo, zadejte prosím znovu:");
}
}
}
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
…
metodaSCyklem (); //volání
…
metodaSCyklem (); //volání
…
}
static void metodaSCyklem () // deklarace/definice metody 2
{
//tady je ten cyklus
}
}
}
Ten Main() sice formálně vzato je metoda třídy Program ale fakticky je to prostě tvůj hlavní program, ani bych tomu metoda neříkal. Tak se říká spíš funkcím, které slouží jako interface nějaké třídy. Main() je tak trochu netypický, má docela specifický význam…
{
class volani
{
static float cyklus(float x)
{
while (!float.TryParse(Console.ReadLine(), out x))
Console.WriteLine("Neplatné číslo, zadejte prosím znovu:");
return x;
}
static void Main()
{
Console.WriteLine("Zadej první číslo");
float i;
cyklus(i);
Console.WriteLine("Zadej druhé číslo");
float o;
cyklus(o);
Console.ReadKey();
}
}
}
píše mi to chybu: Error 1: Use of unassigned local variable 'i'
Error 2: Use of unassigned local variable 'o'
Ty chyby znamenají přesně to, co říkají: voláš funkci cyklus() a předáváš jí parametr, který jsi deklaroval, ale nepřiřadil mu žádnou hodnotu. To se v C# nesmí.
Buď musíš v deklaraci (nebo i později) něco přiřadit, nejspíš nulu: float i=0;
nebo bys mohl parametr funkce cyklus() deklarovat jako výstupní (s atributem out): static void cyklus (out float x). Pak můžeš použít neinicializovaný parametr, protože funkce cyklus musí garantovat, že tam výstupní hodnotu přiřadí sama. Pak ovšem musíš "out" použít i při volání: cyklus(out i);
Takže možností je víc:
static float cyklus() //parametr tady nemá žádný smysl, výsledek stačí uložit do lokální proměnné a vrátit příkazem return
{
float x; //inicializovat se nemusí, protože do TryParse jde jako out
while (!float.TryParse(Console.ReadLine(), out x))
...
return x;
}
volání z Main:
float i = cyklus();
float o = cyklus();
nebo (asi méně obvyklé, není-li k tomu nějaký důvod)
static void cyklus(out float x)
{
while (!float.TryParse(Console.ReadLine(), out x))
...
}
volání z Main:
float i, o; //inicializovat se nemusí, protože do cyklus jde jako out
cyklus(out i);
cyklus(out o);
nebo třeba
static void cyklus(ref float x)
{
while (!float.TryParse(Console.ReadLine(), out x))
...
}
volání z Main:
float i=0, o=0; //inicializovat se musí, protože do cyklus jde "jen" jako ref
cyklus(ref i);
cyklus(ref o);