Авторський освітній сайт - C#. Підпрограми. Процедури та функції

C#

Тема 10: «Підпрограми. Процедури та функції»

Функції і процедури в C#
View more presentations or Upload your own.

Були такі поняття ("функції", "процедури" і "підпрограми") в більш ранніх мовах програмування.

У С# те, що я назвала процедурами і функціями є методами. Робити ООП процедурним ми не будемо, але познайомимося із даними поняттям і розглянемо деякі задачі.

Процедура - це підпрограма, яка може викликатися в коді основної програми і виробляти будь-які дії з переданими в неї змінними. Функція - це така ж процедура, тільки їй властиве явне повернення результату її роботи.

У мові C # немає спеціальних ключових слів - procedure і function, але присутні самі ці поняття. Синтаксис оголошення методу дозволяє однозначно визначити, чим є метод - процедурою або функцією.

Зазвичай метод воліють реалізувати у вигляді функції тоді, коли він має один вихідний аргумент, що розглядається як результат обчислення значення функції. Можливість виклику функцій у виразах також впливає на вибір на користь реалізації методу у вигляді функції. В інших випадках метод реалізують у вигляді процедури.  

static <тип, що повертається в основну програму> <Ім’я функції>(аргумент і його тип)

{ …

return <змінна, значення якої повертається в основну програму>

}

Запам'ятайте процедура завжди починається зі слова void, а функція з назви класу або типу, який вона повертає (наприклад string).

Процедури

<модифікатор доступу> Void <назва> (параметри)

{

тіло процедури

Функції

<модифікатор доступу> <тип> <назва> (параметри)

{

Тіло функції Return <тип>;

<модифікатор доступу>: дозволяє бачити або приховувати процедури для їх виклику, може бути: public private. Так само існує модифікатор static.  

Статичні процедури і функції (зі словом статик) постійно знаходяться в пам'яті комп'ютера і створюються при запуску програми, в той час як не статичні створюються лише під час створення екземпляра класу, до якого вони належать.

Процедури і функції потрібні для того, щоб оптимізувати код програми. Процедури дозволяють виділити повторюваний код в підпрограму і викликати її на вимогу, що дозволяє уникнути багаторазового написання повторюваного коду, а так само зменшити місце займане програмою.

Також функції і процедури дозволяють виділяти ділянки коду в логічні блоки, що допомагає, потім її швидше розбирати і розуміти, ніж читати однотипний код програми. А також в разі якщо ви виявили помилку в коді процедури (функції) її виправлення призведе до виправлення у всій програмі і не доведеться переглядати весь написаний талмуд повторюваних шаблонів.

Повернення значень

static double getVal()

{

double checkVal;

// присвоєння checkVal значення,  

// отриманого в результаті обчислень.

if (checkVal < 5)

return 4.7;

return 3.2;

}

Неправильно! А якщо умова не справджується, що вертається?!

static double getVal()

{ double checkVal;

// присвоєння checkVal значення,

// отриманого в результаті обчислень.

if (checkVal < 5)

return 4.7;

}

Звертання до підпрограми

static <Тип> <ім’яфункції>( < n1ім’я> ,.., params <тип>[] <ім’я>)

{

. . .

return <значення, що вертається>;

}

// звертання до підпрограми

<ім’яфункції> (, . . . , <значення1>, <значення2>, . . .) ;

Приклад 1

Дано два різні лінійні масиви. Знайти максимальний елемент першого з них та мінімальний елемент другого, використовуючи підпрограми.

class Program
{
static int MaxValue(int[] intArray)
{
int max = intArray[0];
for (int i = 1; i < intArray.Length; i++)
if (intArray[i] > max) max = intArray[i];
return max;
}
static int MinValue(int[] intArray)
{
int min = intArray[0];
for (int i = 1; i < intArray.Length; i++)
if (intArray[i] < min) min = intArray[i];
return min;
}
static void Main(string[] args)
{
int[] a = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2};
int max = MaxValue(a);
Console.WriteLine("Максимальний елемент = {0}", max);
int[] b = { 14, 8, 12, 6, 2, 15, 9, 17, 10, 12,3 };
int min = MinValue(b);
Console.WriteLine("Мiнiмальний елемент = {0}", min);

}
 

Приклад 2

У двох різних цілих лінійних масивах знайти 1-суму, 2 - добуток елементів масивів (1-перший масив, 2- другий масив).

class Program
{
static int suma(int[] intArray)
{
int s=0;
for (int i = 0; i < intArray.Length; i++)
s=s+intArray[i];
return s;
}
static int dobutok(int[] intArray)
{
int d = 1;
for (int i = 0; i < intArray.Length; i++)
d=d*intArray[i];
return d;
}
static void Main(string[] args)
{
int[] a = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2};
int s = suma(a);
Console.WriteLine("Сума елементiв масиву А = {0}", s);
int[] b = { 1, 8, 12, 6, 2, 1, 9 };
int d = dobutok(b);
Console.WriteLine("Добуток елементiв масиву В = {0}", d);

}

Приклад 3

Дано три цілочисельні масиви різної розмірності. Знайти суму елементів трьох масивів з використанням підпрограми.

class Program
{
static int suma(int[] intArray)
{
int s=0;
for (int i = 0; i < intArray.Length; i++)  s=s+intArray[i];
return s;
}

static void Main(string[] args)
{
int[] a = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2};
int[] b = { 11, 8, 12, 6, 2, 10, 9 };
int[] c = { 4, 8, 5, 6, 0, 8, 11,15 };
int zs = 0;
int s1 = suma(a); Console.WriteLine("Сума елементiв масиву А = {0}", s1);

zs = zs + s1;
int s2 = suma(b); Console.WriteLine("Сума елементiв масиву В = {0}", s2);

zs = zs + s2;
int s3 = suma(c); Console.WriteLine("Сума елементiв масиву C = {0}", s3);

zs = zs + s3;
Console.WriteLine("Сума елементiв даних масивiв = {0}", zs);
}
}

Приклад 4

class Program

{

static void showDouble(int val)

{

val *= 2; Console.WriteLine("подвоєне = {0}" , val );

}

static void Main(string[] args)

{

int myNumber = 5;

Console.WriteLine("мiй номер = {0}", myNumber);

showDouble(myNumber);

Console.WriteLine("мiй номер = {0}", myNumber);


 Приклад 5 

class Program

{

static void showDouble(ref int val)

{

val *= val;

Console.WriteLine("квадрат номера = {0}", val);

}

static void Main()

{

int myNumber = 5; Console.WriteLine("мiй номер = {0}", myNumber);  

showDouble(ref myNumber); Console.WriteLine("мiй новий номер = {0}", myNumber);  

} }  

Приклад 6

class Program

{

static int maxValue(int[] intArray, out int maxlndex)

{

int maxVal = intArray[0]; maxlndex = 0;  

for (int i = 1; i < intArray.Length; i++)

{

if (intArray[i] > maxVal)

{

maxVal = intArray[i]; maxlndex = i;

} }

return maxVal;

}

static void Main()

{

int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };

int maxlndex; Console.WriteLine("В даному масивi: ");

for (int i = 0; i < 10; i++) Console.Write(myArray[i]+" ");

maxValue(myArray, out maxlndex); Console.WriteLine();

Console.WriteLine("Максимальний eлемент масиву {0}", myArray[maxlndex]);

Console.WriteLine("Його iндекс {0}", maxlndex + 1);

} } 

Приклад 7

class Program

{

static int maxValue(int[] intArray, out int maxlndex)

{

int maxVal = intArray[0]; maxlndex = 0; for (int i = 1; i < intArray.Length; i++)  

{

if (intArray[i] > maxVal)

{

maxVal = intArray[i]; maxlndex = i;

} }

return maxVal;

}

static void Main()

{

int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 }; int[] Array1 = { 0, 5, 3, 12, 2, 7, 9, 3, 9, -4 };

int maxlndex; Console.WriteLine("В даному масивi A: ");

for (int i = 0; i < 10; i++) Console.Write(myArray[i] + " ");

maxValue(myArray, out maxlndex); Console.WriteLine();

Console.WriteLine("Максимальний eлемент масиву {0}", myArray[maxlndex]);

Console.WriteLine("Його iндекс {0}", maxlndex + 1); Console.WriteLine();

Console.WriteLine("В даному масивi B : "); for (int i = 0; i < 10; i++) Console.Write(Array1[i] + " ");

maxValue(Array1, out maxlndex); Console.WriteLine();

Console.WriteLine("Максимальний eлемент масиву {0}", Array1[maxlndex]);

Console.WriteLine("Його iндекс {0}", maxlndex + 1);

} } 

Приклад 8. Обчислення факторіала числа n 

class Program

{

static long F(int n)

{

if (n==0 || n==1) return 1; else return n*F(n-1);

}

static void Main()

{

Console.Write("Введи довiльне невiдємне цiле число n=");

int n =int.Parse( Console.ReadLine()); long f = F(n);

Console.WriteLine("{0}!={1}",n, f);

}

Приклад 9. Пошук найменшого спільного кратного

class Program

{

static int NCD(int x, int y)

{

if (x != 0) return NCD((y % x), x); else return y;

}

static int NCK(int x, int y)

{

return (x / NCD(x, y)) * y;

}

static void Main(string[] args)

{

int a, b; Console.WriteLine("Знайдемо найменше спiльне кратне для двох натуральних чисел");

Console.WriteLine("Введiть числа a i b:");

a = Int32.Parse(Console.ReadLine()); b = Int32.Parse(Console.ReadLine());

Console.WriteLine("НСК чисел {0}, i {1} дорiвнює {2} ", a, b, NCK(a, b));

Console.Write("Вiдповiдь: "); Console.WriteLine("НСК ({0};{1}) = {2}", a, b, NCK(a, b));

} }

Приклад 10. Пошук найбільшого спільного дільника 

class Program

{

private static int NOD(int a, int b)

{

while (a != b) if (a > b) a -= b; else b -= a; return a;

}

static void Main(string[] args)

{

int a, b, c, d; Console.WriteLine("Знайдемо НСД 4 чисел");

Console.WriteLine("Введiть a, b, c ,d:");

a = int.Parse(Console.ReadLine()); b = int.Parse(Console.ReadLine());

c = int.Parse(Console.ReadLine());  d = int.Parse(Console.ReadLine());  

Console.WriteLine(string.Format(" NDO = {0}", NOD(NOD(a, b), NOD(c, d))));

} }

Приклад 11

Написати програму, яка обчислює середнє арифметичне елементів одномірного масиву наперед не відомого типу, використавши підпрограми

class Program

{

public static void Srednee(int[] mas)

{

double s = 0, sr = 0; for (int i = 0; i < mas.Length; i++)

{

s += mas[i]; } sr = s / mas.Length; Console.WriteLine(" Середнє арифметичне масиву = " + sr);

}

public static void Srednee(float[] mas)

{

Console.WriteLine(); float s = 0, sr = 0; for (int i = 0; i < mas.Length; i++)

{

s += mas[i]; } sr = s / mas.Length; Console.WriteLine("Середнє арифметичне масиву = " + sr);

}

static void Main(string[] args)

{

Random rnd = new Random(); Console.Write("Виберiть тип масиву(1 - int; 2 - float): ");

string s = Console.ReadLine(); switch (s)

{

case "1": Console.WriteLine("Вибраний тип масиву int!");

int[] mas = new int[10]; for (int i = 0; i < 10; i++)

{

mas[i] = rnd.Next(1, 10); Console.Write(mas[i] + " ");

}

Srednee(mas); break;

case "2": Console.WriteLine("Вибраний тип масиву float!");

float[] mas1 = new float[10];

for (int i = 0; i < 10; i++)

{

mas1[i] = rnd.Next(1, 10); Console.Write(mas1[i] + " ");

}

Srednee(mas1); break;

} } }

Приклад 12

class Program  

{

static void Main(string[] args)

{

double k = 0.5; // тут задаємо крок зміни змінної, у вигляді k - крок ітеррації

double m = -1;  // тут задаємо нижню межу значення змінної

double n = 4;  // тут задаємо верхню межу значення змінної

double f = 0; // Ініціалізуємо значення функції . Наприклад, задана функція виду f(x) = (x^2 + 4) / sin (x) в межах від -1 до 4 знайти її значення з кроком х рівним 0.5

{

for (double i = m; i <= n; i += k)

{

f = 0; f = (Math.Pow(i, 2) + 4) / Math.Sin(i); // Сюда записуємо функцію

// Тепер записуємо недопустимі вирази, як ділення на нуль - їх може бути кілька; тоді їх слід обєднати знаком логічного «АБО», тобто "||”

if (Math.Sin(i) == 0)

{

continue;

}

Console.Title = "Обчислення значення функцii на промiжку"; // вводимо заголовок вікна

// При необхідності виводимо значення змінної, якщо це за умовою не потрібно, то наступний рядок не пишемо

Console.WriteLine("x= {0:F1}", i);

// для х досить 1 знак після коми - це залежить від значення кроку 0,5

// А це значення функції. Цей рядок пишемо обов’язково

Console.WriteLine("f(x)= {0:F13}", f);

Console.WriteLine(); } } } } }

Приклад 13

Дано чотири точки: (a1,a2),(b1,b2),(c1,c2),(d1,d2). Знайти відстані між точками, використавши підпрограму

class Program

{

static void f(double x1, double x2, double y1, double y2, int i)

{

double n; Console.Write("{0}. d= ", i);

n = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2));

Console.WriteLine("{0:F4}",n);

}

static void Main(string[] args)

{

Console.Title = "Обчислення вiдстанi мiж точками"; Console.WriteLine("задаємо координати 1 точки");

double a1,a2; a1 = int.Parse(Console.ReadLine()); a2 = int.Parse(Console.ReadLine());

Console.WriteLine("задаємо координати 2 точки");

double b1, b2; b1 = int.Parse(Console.ReadLine()); b2 = int.Parse(Console.ReadLine());

Console.WriteLine("задаємо координати 3 точки");

double c1, c2; c1 = int.Parse(Console.ReadLine()); c2 = int.Parse(Console.ReadLine());

Console.WriteLine("задаємо координати 4 точки");

double d1, d2; d1 = int.Parse(Console.ReadLine()); d2 = int.Parse(Console.ReadLine());

// Шукаємо відстані між точками

f(a1, a2, b1, b2, 0); f(b1, b2, c1, c2, 1); f(c1, c2, d1, d2, 2); f(a1, a2, c1, c2, 3);

f(a1, a2, d1, d2, 4); f(b1, b2, d1, d2, 5); Console.WriteLine();  

} }

Приклад 14

class Program

{

static void f(double x1, double x2, double y1, double y2, int i)

{

double n; Console.Write("{0}. d= ", i);

n = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2));

Console.WriteLine("{0:F4}",n);

}

static void inputxy(int i, ref double x, double y)

{

Console.WriteLine("задаємо координати {0} точки",i);

x = int.Parse(Console.ReadLine()); y = int.Parse(Console.ReadLine());

}

static void Main(string[] args)

{

Console.Title = "Обчислення вiдстанi мiж точками";

double a1=0;double a2=0; double b1=0; double b2=0;

double c1 = 0; double c2=0; double d1=0; double d2=0;

// Перехід на процедуру вводу координат 4 точок

inputxy(1,ref a1,a2); inputxy(2, ref b1, b2); inputxy(3, ref c1, c2); inputxy(4, ref d1, d2);

// Перехід на процедуру пошуку відстані між точками

Console.WriteLine("Вiдстанi мiж точками");

f(a1, a2, b1, b2, 1); f(b1, b2, c1, c2, 2); f(c1, c2, d1, d2, 3); f(a1, a2, c1, c2, 4);

f(a1, a2, d1, d2, 5); f(b1, b2, d1, d2, 6); Console.WriteLine();

} } } 


Приклад 15

Поставлена задача визначення сумарного периметра кількох полів прямокутної форми. 

class Program
{
static int Perumetr(int a,int b)
{
int P=0; P=2*(a+b); return P; 
}
static void Main(string[] args) 
{
Console.WriteLine("Ввести кількість полів прямокутної форми");
int n =int.Parse( Console.ReadLine());
int sp = 0;
for (int i = 1; i <= n; i++)
{
Console.WriteLine("Ввести розміри {0} поля", i);
int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
int p1 = Perumetr(a, b);
sp = sp + p1;
}
Console.WriteLine("Сумаоний периметр полів = {0}", sp);
} }