Eljárásokat akkor használunk, ha egy hosszabb programot kell írnunk, és növelni akarjuk az átláthatóságát. Így nem kell mindent a main alá betenni, szét lehet tagolni. Egy eljárást többször is meg lehet hívni, viszont elég ha csak 1 helyen programozzuk le! Milyen takarékos 🙂 Egy eljárás tulajdonképpen egy részfeladatot lát el. Az eljárásra a nevével hivatkozunk. Egy eljárás állhat a main előtt, vagy után is!
Az eljárásnak van neve, visszatérési értéke, törzse amely tulajdonképpen a program és lehetnek paraméterei is.
Alapvető felépítése:
static void eljarasneve()
{ utasítások }
Az eljárások ugyanabba az osztályba kerüljenek! Egy eljárásnak is lehetnek további eljárásai! A változókra viszont vigyázni kell, mert alapvetően a saját változóikat képesek használni! Természetesen ha az adott osztálynak adunk változót, akkor azt látják. Ilyenkor használjuk a static-ot.
pl: class Program
{
static int valtozo=0;
Első példa: saját eljárás, amivel elválasztó vonalakat írhatunk ki. Az eljárásunk neve: elvalaszto(), amit a főprogramban kétszer hívunk meg.
namespace eljarasok1
{
class Program
{
static void elvalaszto()
{
for (int i = 1; i <= 80; i++)
Console.Write('-');
Console.WriteLine();
}
static void Main(string[] args)
{
elvalaszto();
elvalaszto();
Console.ReadLine();
}
}
}
Második példa: téglalap területe, kerülete szétbontva adatbekérésre és kiírásra:
using System;
namespace eljaras2
{
class Program
{
static int a, b, terulet, kerulet;
static void adatbekeres()
{
Console.Write("Add meg a téglalap egyik oldalát: ");
a = byte.Parse(Console.ReadLine());
Console.Write("Add meg a téglalap másik oldalát: ");
b = byte.Parse(Console.ReadLine());
}
static void kiiratas()
{
Console.WriteLine("A téglalap kerülete " + kerulet + " cm, területe " + terulet
+ " cm2");
Console.ReadKey();
}
static void szamitas()
{
kerulet = 2 * (a + b);
terulet = a * b;
}
static void Main(string[] args)
{
adatbekeres();
szamitas();
kiiratas();
}
}
}
2.példa kiegészítve: Téglalap kerülete és területe szétbontva eljárásokra, while ciklus, adatbekérésnél csak pozitív számokat fogad el a program. Adatok kiírása megadott kurzor pozícióba.
using System;
namespace nov04eljaras
{
class Program
{
static int a;
static int b;
static int k;
static int t;
static string ki;
static void vonal()//eljárás, neve: vonal
{
for (int i = 0; i < 20; i++)
{ Console.Write("-"); }
Console.WriteLine();
}
static void design()
{ Console.SetCursorPosition(0, 1);//bal felső saroktól mérve: 0.oszlop, 1.sor
vonal();
Console.SetCursorPosition(0, 10);
vonal();
}
static void adatbeker()
{
a = 0; b = 0;
while ((a <= 0) || (b <= 0))
{
Console.Clear();
design();
Console.SetCursorPosition(0, 2);
Console.WriteLine("a oldal?");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("b oldal?");
b = Convert.ToInt32(Console.ReadLine());
}
}
static void szamit()
{
k = (a + b) * 2;
t = a * b;
}
static void kiir()
{
design();
Console.SetCursorPosition(0, 6);
Console.WriteLine("kerület: {0}, terület: {1}",k,t);
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
while (ki != "n")
{
adatbeker();
szamit();
kiir();
Console.WriteLine("Új? (i/n)");
ki=Console.ReadLine();
Console.Clear();
}
}
}
}
3. példa: kérjünk be egy szót, és írassuk ki ‘fordítva’.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Visszafeleszoveg
{
class Program
{
static void visszafele(string szo)
{
string seged;
seged = "";
for (int i = szo.Length - 1; i >= 0; i--)
seged += szo[i];
szo = seged;
Console.Write(szo);
}
static void Main(string[] args)
{
string beker;
Console.Write("Kerek egy szot: ");
beker = Console.ReadLine();
visszafele(beker);
Console.ReadLine();
}
}
}
4. példa: az elálasztó vonal hosszát is paraméterrel adjuk meg. Ha a fel nevű változó hamis akkor 80 karakter hosszú lesz a vonal, ha fel igaz, akkor csak 40 karakternyi.
//az elvalaszto nevű eljárásunk 2db paramétert vár
//egy stringet és egy logikai értéket
static void elvalaszto(string feladat, bool fel)
{
int n = 79;
if (fel) n /= 2;
for (int i = 1; i <= n; i++)
Console.Write('-');
Console.WriteLine("{0}. részfeladat\n",feladat);
}
//a fő programból így hívjuk meg:
elvalaszto("1. feladat szövege",false);
Függvények
A függvények olyan eljárások, amelyek egyetlen értéket adnak vissza a főprogramnak. A függvénynek tehát van visszatérési értéke. (return)
A főprogramnak ezzel a visszatérési értékkel valamit csinálnia kell, lehet ez egy egyszerű kiíratás, számítás, felhasználás egy másik eljárásban…
Példa: Faktoriális számítása.
using System;
namespace faktorialis
{
class Program
{
static int faktor(int n)
{
int sz = 1;
for (int i = 1; i <= n; i++)
sz *= i;
return sz;
}
static void Main(string[] args)
{
Console.WriteLine(faktor(4));
Console.ReadLine();
}
}
}
Függvény: mi van akkor, ha nem tudjuk mennyi paramétert fogunk használni? Készítek egy kerulet nevű függvényt. Ennek lehe 0,1,2,3.. esetleg több paramétere. Ebben az esetben egy tömbbe fognak kerülni a paraméterek. A tömb mérete lekérdezhető, és elemeire a tömbnél szokásos indexeléssel hivatkozhatunk.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using System; class Program { static void Main() { // Függvény hívása különböző számú paraméterrel Console.WriteLine($"Négyzet kerülete: {kerulet(4)}"); Console.WriteLine($"Téglalap kerülete: {kerulet(5, 10)}"); Console.WriteLine($"Háromszög kerülete: {kerulet(3, 4, 5)}"); Console.WriteLine($"Sokszög kerülete: {kerulet(8, 6, 4, 7)}"); Console.ReadLine(); } // Függvény a síkidom kerületének kiszámolására static double kerulet(params double[] oldalak) { int oldalSzam = oldalak.Length; if (oldalSzam == 1) { // Négyzet return 4 * oldalak[0]; } else if (oldalSzam == 2) { // Téglalap return 2 * (oldalak[0] + oldalak[1]); } else if (oldalSzam == 3) { // Háromszög return oldalak[0] + oldalak[1] + oldalak[2]; } else { // Sokszög double kerulet = 0; foreach (double oldal in oldalak) { kerulet += oldal; } return kerulet; } } } |
Összetett feladat, több részfeladattal.
1.részfeladat: Van egy biciklis futár, aki a távolságtól függően kap fizetést. 1-2km/500Ft, 3-5km/700Ft, 6-10km/1000Ft. Készítsünk függvényt, ami kiszámolja a megadott távolság alapján, mennyit keres a futár!
2.Szerkeszthető-e háromszög a bekért oldalhosszal? Használjunk függvényt a megoldáshoz!
3.Az adott szám prímszám-e? Használjunk függvényt a megoldáshoz!
4. A részfeladatokat válasszuk el a korábbi elvalaszto eljárás segítségével!
using System;
namespace futar
{
class Program
{
static int fizet(int tavolsag)
{
int fizetes=0;
if (tavolsag < 3) fizetes = 500;
else
{ if (tavolsag < 6) fizetes = 700;
else
if (tavolsag < 11) fizetes = 1000;
}
return fizetes;
}
static bool haromszog(float a, float b, float c)
{
return (a+b>c && a+c>b && b+c>a);
}
static bool prim(int n)
{
int i = 2;
while (i * i <= n && n % i != 0)
i++;
return (i * i > n);
}
//ELJÁRÁS!
static void elvalaszto(string feladat, bool fel)
{
Console.WriteLine();
Console.Write("{0}. feladat\n", feladat);
int n = 59;
if (fel) n /= 2;
for (int i = 1; i <= n; i++)
Console.Write('-');
Console.WriteLine();
}
static void Main(string[] args)
{
int km;
Console.WriteLine("Távolság?");
km = Convert.ToInt32(Console.ReadLine());
elvalaszto("1. pizza", true);
Console.WriteLine("Díjazása: {0} Ft",fizet(km));
elvalaszto("2. háromszög", false);
Console.WriteLine(haromszog(3,4,50));
elvalaszto("3.primszám", true);
Console.WriteLine(prim(7));
Console.ReadLine();
}
}
}
