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
Krok 1. Układ komponentów
- Label- sztuk 2
- TextBox- sztuk 2
- Button- sztuk 5
- GroupBox- sztuk 1
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
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
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
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
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
Ć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();
}
}
}