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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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:
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 |
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.
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
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’.
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 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 |
//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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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!
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 48 49 50 51 52 53 |
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(); } } } |