Pojęcie funkcji (metody) w C#

Funkcje są metodami zagnieżdżonymi w innym elemencie- najczęściej klasie. Mogą mieć zasięg lokalny lub globalny. Mogą zwracać typ lub nie, czyli są nieokreślonego typu (słowo kluczowe void). Mogą być bezargumentowe lub argumentowe. Ich przeznaczeniem jest tworzenie bloków kodu, który w innym przypadku byłby wielokrotnie pisany. Ułatwiają pracę z większym kodem jak i pracę zespołową nad projektem

Cel: Utwórz aplikację, która wykorzysta funkcję nieokreślonego typu bezargumentową, argumentową, określonego typu argumentową do wykonania podstawowych działań matematycznych

funkcje void Visual studio C#

Krok 1. Układ komponentów

Krok 2. Deklarujemy zmienne

Potrzebujemy dwie zmienne lokalne na przykład typu float do przechowywania danych wprowadzonych z klawiatury oraz jedną zmienną dla wyniku (nie we wszystkich rozwiązaniach będzie wykorzystana)

Wskazówka:


public partial class Form1 : Form
{
	float a = 0, b = 0, wynik = 0;

Krok 3. Przykład deklaracji i wykorzystania funkcji bezargumentowej i niezwracającej typu

Deklarujemy funkcję i jej ciało w głównej klasie formatki

Wskazówka:


void sumaBezArgumentowa()
{
	//metoda nie zwraca wyniku
	//lecz przypisuje do istniejącej zmiennej
	wynik = a + b;
}

Jej wykonanie podepniemy do zdarzenia Click klawisza button1

Wskazówka:


private void button1_Click(object sender, EventArgs e)
{
	//wykonanie metody bezargumentowej i niezwracjącej typu
	a = (float)Convert.ToDouble(textBox1.Text);
	b = (float)Convert.ToDouble(textBox2.Text);
	sumaBezArgumentowa();
	string s = a.ToString() + "+" + b.ToString() + "=" + wynik.ToString();
	MessageBox.Show(s, "Wynik wykonania sumaBezArgumentowa",
	                    MessageBoxButtons.OK,
						MessageBoxIcon.Information);
}

Skompiluj i uruchom program. Sprawdź efekt działania. Prawidłowo działającą aplikację przedstawia poniższa ilustracja

void button1_Click(object sender, EventArgs e)

Krok4. Przykład deklaracji i wykorzystania funkcji argumentowej i niezwracającej typu

Deklarujemy funkcję i jej ciało w głównej klasie formatki

Wskazówka:


void sumaArgumentowa(float arg1, float arg2)
{
	//metoda nie zwraca wyniku,
	//pracuje na argumentach zewnętrznych
	//i przypisuje wynik do istniejącej zmiennej
	wynik= arg1 + arg2;
}

Jej wykonanie podepniemy do zdarzenia Click klawisza button2

Wskazówka:


private void button2_Click(object sender, EventArgs e)
{
	//wykonanie metody argumentowej i niezwracjącej typu
	a = (float)Convert.ToDouble(textBox1.Text);
	b = (float)Convert.ToDouble(textBox2.Text);
	sumaArgumentowa(a,b);
	string s = a.ToString() + "+" + b.ToString() + "=" + wynik.ToString();
	MessageBox.Show(s, "Wynik wykonania sumaArgumentowa niezwracającej typu"
	                 , MessageBoxButtons.OK,
					 MessageBoxIcon.Information);
}

Skompiluj i uruchom program. Sprawdź efekt działania. Prawidłowo działającą aplikację przedstawia poniższa ilustracja

wykonanie metody argumentowej i niezwracjącej typu

Krok 5. Przykład deklaracji i wykorzystania funkcji argumentowej i zwracającą typ

Deklarujemy funkcję i jej ciało w głównej klasie formatki

Wskazówka:


float suma(float arg1, float arg2)
{
	//metoda zwraca wynik, pracuje na argumentach zewnętrznych
	return arg1 + arg2;
}

Jej wykonanie podepniemy do zdarzenia Click klawisza button3

Wskazówka:


private void button3_Click(object sender, EventArgs e)
{
	//wykonanie metody argumentowej i zwracjącej typ
	a = (float)Convert.ToDouble(textBox1.Text);
	b = (float)Convert.ToDouble(textBox2.Text);
	wynik = suma(a, b);
	string s = a.ToString() + "+" + b.ToString() + "=" + wynik.ToString();
	MessageBox.Show(s, "Wynik wykonania suma zwracającej typ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

Skompiluj i uruchom program. Sprawdź efekt działania. Prawidłowo działającą aplikację przedstawia poniższa ilustracja

wykonanie metody argumentowej i zwracjącej typ

Krok 6. Tworzymy uniwersalną funkcję zwracającą typ string dla wyniku

Rozpoznanie użytego klawisza wykonamy poprzez rzutowanie typu obiektu klawisza i funkcji wielokrotnego wyboru switch. Wzorcem będzie nazwa przypisana do właściwości Tag kontrolki Button

Przypisujemy unikatową nazwę Tag-u dla wybranych klawiszy

Przypisujemy unikatową nazwę Tag-u

Deklarujemy uniwersalną funkcję. Przykład proponowanego kodu przedstawiam poniżej

Wskazówka:


string uniwersalna(object sender ,float arg1, float arg2)
{
	Button bt =sender as Button;
	string s="";
	switch (bt.Tag)
	{
		case "+" : s = arg1.ToString() + "+"
		             + arg2.ToString() + "="
					 + (arg1 + arg2).ToString(); break;
		case "-" : s = arg1.ToString() + "-"
		             + arg2.ToString() + "="
					 + (arg1 - arg2).ToString(); break;
		default: s = "";break;
	}
	return s;
}

Wybranym klawiszom podpinamy wspólne zdarzenie Click. Zauważ, że nasza uniwersalna funkcja staje się pierwszym argumentem metody Show klasy MessageBox

Wskazówka:


private void button4_Click(object sender, EventArgs e)
{
	MessageBox.Show(uniwersalna(sender,
	                            (float)Convert.ToDouble(textBox1.Text),
								(float)Convert.ToDouble(textBox2.Text)
								),
					"Komunikat",
					MessageBoxButtons.OK,
					MessageBoxIcon.Information);
}

Skompiluj i uruchom program. Sprawdź efekt działania. Prawidłowo działającą aplikację przedstawia poniższa ilustracja

MessageBox.Show

Ćwiczenie sprawdzające: Wzbogać uniwersalną funkcję o możliwość wykonania mnożenia i dzielenia z zabezpieczeniem przed dzieleniem przez zero.

Pełny kod programu

Wskazówka:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace _22pojecieFunkcji
{
    public partial class Form1 : Form
    {
        float a = 0, b = 0, wynik = 0;

        void sumaBezArgumentowa()
        {
            //metoda nie zwraca wyniku, a przypisuje do istnejącej zmiennej
            wynik = a + b;
        }

        void sumaArgumentowa(float arg1, float arg2)
        {
            //metoda nie zwraca wyniku, pracuje na argumentach 
			//zewnętrznych i przypisuje wynik do istniejącej zmiennej
            wynik= arg1 + arg2;
        }

        float suma(float arg1, float arg2)
        {
            //metoda zwraca wynik, pracuje na argumentach zewnętrznych
            return arg1 + arg2;
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //wykonanie metody bezargumentowej i niezwracjącej typu
            a = (float)Convert.ToDouble(textBox1.Text);
            b = (float)Convert.ToDouble(textBox2.Text);
            sumaBezArgumentowa();
            string s = a.ToString() + "+" + b.ToString() + "=" + wynik.ToString();
            MessageBox.Show(s, "Wynik wykonania sumaBezArgumentowa",
			                    MessageBoxButtons.OK,
								MessageBoxIcon.Information);
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 8 || e.KeyChar==',') return;//wyskocz na BackSpace
            if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //wykonanie metody argumentowej i niezwracjącej typu
            a = (float)Convert.ToDouble(textBox1.Text);
            b = (float)Convert.ToDouble(textBox2.Text);
            sumaArgumentowa(a,b);
            string s = a.ToString() + "+" + b.ToString() + "=" + wynik.ToString();
            MessageBox.Show(s, "Wynik wykonania sumaArgumentowa niezwracającej typu",
			                   MessageBoxButtons.OK,
							   MessageBoxIcon.Information);
        }

        string uniwersalna(object sender ,float arg1, float arg2)
        {
            Button bt =sender as Button;
            string s="";
            switch (bt.Tag)
            {
                case "+" : s = arg1.ToString() + "+"
				           + arg2.ToString() + "="
						   + (arg1 + arg2).ToString(); break;
                case "-" : s = arg1.ToString() + "-"
				           + arg2.ToString() + "="
						   + (arg1 - arg2).ToString(); break;
                default: s = "";break;
            }
            return s;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            MessageBox.Show(uniwersalna(sender, (float)Convert.ToDouble(textBox1.Text),
			                (float)Convert.ToDouble(textBox2.Text)),
                            "Komunikat",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //wykonanie metody argumentowej i zwracjącej typ
            a = (float)Convert.ToDouble(textBox1.Text);
            b = (float)Convert.ToDouble(textBox2.Text);
            wynik = suma(a, b);
            string s = a.ToString() + "+" + b.ToString() + "=" + wynik.ToString();
            MessageBox.Show(s, "Wynik wykonania suma zwracającej typ",
			                   MessageBoxButtons.OK,
							   MessageBoxIcon.Information);
        }


        public Form1()
        {
            InitializeComponent();
        }
    }
}