C# eljárások

11. osztály 11.évf_c# C# programozás Programozás

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.

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();
        }
    }
}

Ö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();

        }
    }
}