Использование делегатов в качестве параметров — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Использование делегатов в качестве параметров

2019-09-26 811
Использование делегатов в качестве параметров 0.00 из 5.00 0 оценок
Заказать работу

Если в метод требуется передать в качестве парметра ссылку на друглй метод, то для этой цели испльзуется соответствующий делегат метода.

Описание делегата задает сигнатуру методов, которые могут быть вызваны с его помощью:

[ атрибуты ] [ спецификаторы ] delegate тип имя_делегата ([ параметры ])

Допускаются спецификаторы new, public, protected, internal и private. Тип описывает возвращаемое значение методов, вызываемых с помощью делегата, а необязательными параметрами делегата являются параметры этих методов. Делегат может хранить ссылки на несколько методов и вызывать их поочередно; естественно, что сигнатуры всех методов должны совпадать.

Пример описания делегата:

public delegate void D (int i);

Делегаты применяются в основном для следующих целей:

· получения возможности определять вызываемый метод не при компиляции, а во время выполнения программы;

· обеспечения связи между объектами по типу "источник — наблюдатель";

· создания универсальных методов, в которые можно передавать другие методы;

· поддержки механизма обратных вызовов.

Пример.

using System;

namespace ConsoleApplication1

{

delegate  void  Del (ref string s);          // объявление делегата

class Class1

{

   public static void C00l (ref string s)             // метод 1

   {

       string temp = "";

       for (int i = 0; i < s.Length; ++i)

       {

           if (s[i] == 'o' || s[i] == 'O') temp += '0';

           else if (s[i] == 'l')          temp += '1';

           else                             temp += s[i];

       }

       s = temp;

   }

   public static void Hack (ref string s)             // метод 2

   {

       string temp = "";

       for (int i = 0; i < s.Length; ++i)

           if (i / 2 * 2 == i) temp += char.ToUpper(s[i]);

           else             temp += s[i];

       s = temp;

   }

   static void Main()

   {

       string s = "cool abcd";

       Del d;                                // экземпляр делегата

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

       {

           d = new Del(C00l);         // инициализация методом 1

           if (i == 1) d = new Del(Hack); // инициализация методом 2

           d(ref s); // использование делегата для вызова методов

           Console.WriteLine(s);

       }

    }

}

}

Результат работы программы:

c001 abcd

C001 aBcD

 

Перегрузка методов

Иногда бывает удобно, чтобы методы, реализующие один и тот же алгоритм для различных типов данных, имели одно и то же имя. Использование нескольких методов с одним и тем же именем, но различными типами и количеством параметров называется перегрузкой методов. Компилятор определяет, какой именно метод требуется вызвать, по типу и количеству фактических параметров.

Пример:

class Program

{

static int max(int a) //первая версия метода max

{

    int b = 0;

    while (a > 0)

    {

       if (a % 10 > b) b = a % 10;

       a /= 10;

     }

    return b;

}

static int max(int a, int b) //вторая версия метода max

  {

    if (a > b) return a;

    else return b;

  }

static int max(int a, int b, int c) //третья версия метода max

{

    if (a > b && a > c) return a;

    else if (b > c) return b;

    else return c;

}

static void Main()

{

    int a = 1283, b = 45, c = 35740;

    Console.WriteLine(max(a));

    Console.WriteLine(max(a, b));

    Console.WriteLine(max(a, b, c));

}

}

При вызове метода max компилятор выбирает вариант, соответствующий типу и количеству передаваемых в метод аргументов. Если точного соответствия не найдено, выполняются неявные преобразования типов в соответствии с общими правилами. Если преобразование невозможно, выдается сообщение об ошибке. Если выбор перегруженного метода возможен более чем одним способом, то выбирается "лучший" из вариантов (вариант, содержащий меньшие количество и длину преобразований в соответствии с правилами преобразования типов). Если существует несколько вариантов, из которых невозможно выбрать лучший, выдается сообщение об ошибке.

Перегрузка методов является проявлением полиморфизма, одного из основных свойств ООП. Программисту гораздо удобнее помнить одно имя метода и использовать его для работы с различными типами данных, а решение о том, какой вариант метода вызвать, возложить на компилятор. Этот принцип широко используется в классах библиотеки.NET. Например, в стандартном классе Console метод WriteLine перегружен 19 раз для вывода величин разных типов.

Задания на лабораторную работу.

1. Разработать метод для нахождения минимального из двух чисел. Вычислить с помощью него значение выражения .

Пример.

using System;

namespace Hello

{

 class Program

 {

static double min(double a, double b)

{

return (a < b)? a: b;

}

static void Main(string[] args)

{

Console.Write("x=");

double x = double.Parse(Console.ReadLine());

Console.Write("y=");

double y = double.Parse(Console.ReadLine());

double z = min(3 * x, 2 * y) + min(x - y, x + y);

Console.WriteLine("z=" + z);

}

 }

}

2. Разработать метод для нахождения минимального из двух чисел. Вычислить с помощью него минимальное значение из четырех чисел , , , .

3. Разработать метод для нахождения максимального из двух чисел. Вычислить с помощью него значение выражения .

4. Разработать метод , который вычисляет значение по следующей формуле: . Определить, в какой из точек или , функция принимает наибольшее значение.

5. Разработать метод , который вычисляет значение по следующей формуле: . Определить, в какой из точек а или b, функция принимает наименьшее значение.

6. Разработать метод , который возвращает младшую цифру натурального числа . Вычислить с помощью него значение выражения .

7. Разработать метод , который возвращает вторую справа цифру натурального числа . Вычислить с помощью него значение выражения .

8. Разработать метод , который для заданного натурального числа n находит значение . Вычислить с помощью него значение выражения .

9. Разработать метод , который для заданного натурального числа n и вещественного х находит значение выражения . Вычислить с помощью данного метода значение выражения .

10. Разработать метод , который нечетное число заменяет на , а четное число уменьшает в два раза. Продемонстрировать работу данного метода на примере.

11. Разработать метод , который число, кратное , уменьшает в раз, а остальные числа увеличивает на . Продемонстрировать работу данного метода на примере.

12. Разработать метод , который в двузначном числе меняет цифры местами, а остальные числа оставляет без изменения. Продемонстрировать работу данного метода на примере.

13. Разработать метод , который в трехзначном числе меняет местами первую с последней цифрой, а остальные числа оставляет без изменения. Продемонстрировать работу данного метода на примере.

14.

Разработать метод , который по катетам и вычисляет гипотенузу. С помощью данного метода найти периметр фигуры ABCD по заданным сторонам AB, AC и DC.  

15.

Разработать метод , который по длинам сторон треугольника , , вычисляет его площадь. С помощью данного метода по заданным вещественным числам , , , , , , найти площадь пятиугольника, изображенного на рисунке.  

16. Разработать метод , который вычисляет длину отрезка по координатам вершин и , и метод , который вычисляет периметр треугольника по длинам сторон , , . С помощью данных методов найти периметр треугольника, заданного координатами своих вершин.

17. Разработать метод , который вычисляет длину отрезка по координатам вершин (x_{1}, y_{1}) и , и метод , который вычисляет максимальное из чисел , . С помощью данных методов определить, какая из трех точек на плоскости наиболее удалена от начала координат.

18. Разработать метод , который вычисляет длину отрезка по координатам вершин и , и метод , который вычисляет минимальное из чисел , . С помощью данных методов найти две из трех заданных точек на плоскости, расстояние между которыми минимально.

19. Разработать метод , который вычисляет длину отрезка по координатам вершин и , и метод t(a, b, c), который проверяет, существует ли треугольник с длинами сторон , , . С помощью данных методов проверить, можно ли построить треугольник по трем заданным точкам на плоскости.

20. Разработать метод , который вычисляет длину отрезка по координатам вершин и , и метод , который проверяет, существует ли треугольник с длинами сторон . С помощью данных методов проверить, сколько различных треугольников можно построить по четырем заданным точкам на плоскости.

Задания повышенной сложности

1. Постройте таблицу значений функции для с шагом .

Для решения задачи использовать вспомогательный метод.

Пример:

using System;

namespace Hello

{

 class Program

 {

static double f (double x)

{

double y;

if (x >= 0.9) y = 1 / Math.Pow(1 + x, 2);

else if (x >= 0) y = 0.2 * x + 0.1;

else y = x * x + 0.2;

return y;

 }

 static void Main(string[] args)

{

Console.Write("a=");

double a = double.Parse(Console.ReadLine());

Console.Write("b=");

double b = double.Parse(Console.ReadLine());

Console.Write("h=");

double h = double.Parse(Console.ReadLine());

for (double i = a; i <= b; i += h)

Console.WriteLine("f({0:f2})={1:f4}", i, f(i));

}

 }

}

  2.
3. 4.
5. 6.
7. 8.
9. 10.
11. 12.
13. 14.
15. 16.
17. 18.
19. 20.

2. Перегрузите метод из предыдущего раздела так, чтобы его сигнатура (заголовок) соответствовала виду static void f (double x, out double y).

Контрольные вопросы.

1. Задан метод Func

class Program
{
static double Func(double x) //дополнительный метод
{
  return 1 / x; //Возвращаемое значение
}
static void Main() //точка входа в программу
{
  Console.Write("a=");
  double a=double.Parse(Console.ReadLine());
    Console.Write("b=");
  double b=double.Parse(Console.ReadLine());
  for (double x = a; x <= b; x += 0.5)
   {
      double y = Func(x); //вызов метода Func
      Console.WriteLine("y({0:f1})={1:f2}", x, y);
   }
}

Преобразуйте программу так, чтобы метод Func возвращал значение выражения:

2. Преобразуйте программу п. 1 так, чтобы метод Func возвращал значение выражения:

3. Задана программа

class Program
{
   static int Func(int x, int y) //строка 1
   {
       return (x>y)? x:y;
   }

   static void Main()
   {
       Console.Write("a=");
       int a = int.Parse(Console.ReadLine());
       Console.Write("b=");
       int b = int.Parse(Console.ReadLine());
       Console.Write("c=");
       int c = int.Parse(Console.ReadLine());
       int max = Func(Func(a, b), c); //строка 2 - вызовы метода Func
       Console.WriteLine("max({0}, {1}, {2})={3}", a, b, c, max);
   }
}

 

Преобразуйте программу так, чтобы с помощью метода Func можно было найти наибольшее значение из четырех чисел: a, b, c, d. Метод Func при этом не изменять.

4. Что означает передача параметра по значению

5. Что означает передача параметра по ссылке

6. Как использовать выходной параметр

7. Что означает перегрузка метода



Лабораторная работа 6.
C#. Рекурсия

Теоретические сведения.

Рекурсивным называют метод, если он вызывает сам себя в качестве вспомогательного. В основе рекурсивного метода лежит так называемое "рекурсивное определение " какого-либо понятия. Классическим примером рекурсивного метода является метод, вычисляющий факториал.

Из курса математики известно, что 0!=1!=1, n!=1*2*3…*n. С другой стороны n!=(n-1)!*n. Таким образом, известны два частных случая параметра n, а именно n= 0 и n=1, при которых мы без каких-либо дополнительных вычислений можем определить значение факториала. Во всех остальных случаях, то есть для n>1, значение факториала может быть вычислено через значение факториала для параметра n-1. Таким образом, рекурсивный метод будет иметь вид:

{

static long F(int n) //рекурсивный метод

{

if (n==0 || n==1)

  return 1; //нерекурсивная ветвь

else return n*F(n-1); //шаг рекурсии - повторный вызов метода с другим

//параметром

}

static void Main()

{

Console.Write("n=");

  int n =int.Parse(Console.ReadLine());

  long f=F(n); //нерекурсивный вызов метода F

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

}

}

Рассмотрим работу описанного выше рекурсивного метода для n=3.

Первый вызов метода осуществляется из метода Main, в нашем случае командой f=F(3). Этап вхождения в рекурсию обозначим жирными стрелками. Он продолжается до тех пор, пока значение переменной n не становится равной 1. После этого начинается выход из рекурсии (тонкие стрелки). В результате вычислений получается, что F(3)=3*2*1.

Рассмотренный вид рекурсии называют прямой. Метод с прямой рекурсией обычно содержит следующую структуру:

if (<условие>) 

<оператор>;

else <вызов данного метода с другими параметрами>;

В качестве <условия> обычно записываются некоторые граничные случаи параметров, передаваемых рекурсивному методу, при которых результат его работы заранее известен, поэтому далее следует простой оператор или блок, а в ветви else происходит рекурсивный вызов данного метода с другими параметрами.

Со входом в рекурсию осуществляется вызов метода, а для выхода необходимо помнить точку возврата, т.е. то место программы откуда пришли и куда нужно будет возвратиться после завершения метода. Место хранения точек возврата называется стеком вызовов и для него выделяется определенная область оперативной памяти. В этом стеке запоминаются не только адреса точек возврата, но и копии значений всех параметров. По этим копиям восстанавливается при возврате вызывающий метод. При развертывании рекурсии за счет создания копий параметров возможно переполнение стека. Это является основным недостатком рекурсивного метода. С другой стороны, рекурсивные методы позволяют перейти к более компактной записи алгоритма.

Любой рекурсивный метод можно преобразовать в обычный метод. И практически любой метод можно преобразовать в рекурсивный, если выявить рекуррентное соотношение между вычисляемыми в методе значениями.

Далее для сравнения каждую задачу будем решать с использованием обычного и рекурсивного методов:

Пример 1. Найти сумму цифр числа А.

Известно, что любое натуральное число A=an an-1... a1 a0, где an an-1... a1 a0 - цифры числа, можно представить следующим образом:

A=an an-1... a1 a0 = A=an*10n + an-1*10n-1 +... a1*101 + a0*100 = ((...((an*10 + an-1)*10+ an-2)*10...)*10 + a1)*10 + a0

Например, число 1234 можно представить как:

1234 = 1*103 + 2*102 + 3*101 + 4*100 = ((1*10 + 2)*10 + 3)*10 + 4

Из данного представления видно, что получить последнюю цифру можно, если найти остаток от деления числа на 10. В связи с этим для разложения числа на составляющие его цифры можно использовать следующий алгоритм:

1. Получить остаток при делении числа А на 10, т.е. получаем крайнюю правую цифру числа.

2. Получить целую часть числа при делении A на 10, т.е. отбрасываем от числа A крайнюю правую цифру.

3. Если преобразованное A > 0, то переход на пункт 1. Иначе число равно нулю и отделять от него больше нечего.

Данный алгоритм будет использоваться при разработке нерекурсивного метода.

С другой стороны, сумму цифр числа 1234 можно представить следующим образом sum(1234)=sum(123)+4=(sum(12)+3)+4=(((sum(1)+2)+3)+4)=(((sum(0)+1)+2)+3)+4. Таким образом, если А=0, то сумма цифр числа также равна нулю, т.е. sum=0. В противном случае сумму цифр числа A можно представить рекуррентным соотношением sum(A)=sum(A/10)+A%10. Полученное рекуррентное соотношение будем использовать при разработке рекурсивного метода.

class Program

{

static long Sum(long a) //нерекурсивный метод

{

long sum=0;

while (a>0) //пока a больше нуля

{

   sum+=a%10; //добавляем к сумме последнюю цифру числа а

   a/=10; //отбрасываем от числа а последнюю цифру

}

return sum; //возвращаем в качестве результата сумму цифр числа a

}

static long SumR(long a) //рекурсивный метод

{

if (a==0) //если a =0, то

            return 0; // возвращаем 0

else return SumR(a/10)+ a%10; //иначе обращаемся к рекуррентному

// соотношению

}

static void Main()

{

Console.Write("n=");

long n=long.Parse(Console.ReadLine());

Console.WriteLine("Нерекурсивный метод: "+Sum(n));

Console.WriteLine("Рекурсивный метод: "+SumR(n));

}

}

Рассмотренные выше рекурсивные методы возвращали некоторое значение, заданное рекуррентным соотношением. Однако  не все методы возвращают значение. Кроме того, рассмотренные выше методы определяют простой вариант рекурсивного метода. В общем случае рекурсивный метод включает в себя некоторое множество операторов и один или несколько операторов рекурсивного вызова. Действия могут выполняться после рекурсивного вызова, до рекурсивного вызова, а также и до, и после рекурсивного вызова. Рассмотрим примеры "сложных" рекурсивных методов, не возвращающих значение.

Пример 2. Для заданного значения n вывести на экран n строк, в каждой из которых содержится n звездочек. Например, для n=5 на экран нужно вывести следующую таблицу:

*

**

***

****

*****

class Program

{

static void Stroka(int n) //выводит на экран строку из n звездочек

{

for (int i=1; i<=n; ++i)

{

   Console.Write('*');

}

Console.WriteLine();

}

static void Star(int n) //нерекурсивный метод

{

for (int i=1; i<=n;++i) //выводит n строк по i звездочек в каждой

   Stroka(i);

}

//рекурсивный метод, где i – номер текущей строки, n – номер последней строк

static void StarR(int i,int n)

{

if (i<=n) //если номер текущей строки не больше номера последней строки, то

{

   Stroka(i); //выводим i звездочек в текущей строке и

   StarR(i+1,n); //переходим к формированию следующей строки

}

}

static void Main()

{

Console.Write("n=");

int n=int.Parse(Console.ReadLine());

Console.WriteLine("Нерекурсивный метод: ");

Star(n);

Console.WriteLine("Рекурсивный метод: ");

StarR(1,n); // параметр 1 – это номер первой строки, n – номер последней строки

}

 

Все примеры, рассмотренные ранее, относились к прямой рекурсии. Однако существует еще и косвенная рекурсия, в которой метод вызывает себя в качестве вспомогательного не непосредственно, а через другой вспомогательный метод. Косвенную рекурсию демонстрирует следующая программа, которая для заданного значения n выводит на экран следующее за ним простое число.

Данная программа содержит метод Prim, который возвращает true, если его параметр является простым числом, false – в противном случае. Чтобы установить, является ли число j простым, нужно проверить делимость числа j на все простые числа, не превышающие квадратный корень из j. Перебор таких простых чисел можно организовать так: рассмотреть первое простое число – 2, а затем, используя метод NextPrim, возвращающий следующее за значением ее параметра простое число, получить все простые числа, не превышающие квадрата числа j. В свою очередь метод NextPrim обращается к методу Prim для того, чтобы определить является ли заданное число простым.

Таким образом методы Prim и NextPrim перекрестно вызывают друг друга. В этом и проявляется косвенная рекурсия.

class Program

{

static bool Prim (int j)

{

       int k=2; //первое простое число

       //значение k "пробегает" последовательность простых чисел, начиная с 2 до корня из j, при

       //этом проверяется делится ли j на одно из таких простых чисел

       while (k*k<=j && j%k!=0)

         k=NextPrim(k); //вызов метода NextPrim

       return (j%k==0)?false:true;

}

static int NextPrim(int i)

{

       int p=i+1;

       while (!Prim(p)) //вызов метода Prim

         ++p;

       return p;

}

static void Main()

{

       Console.Write("n=");

       int n=int.Parse(Console.ReadLine());

       Console.WriteLine("Следующее за {0} простое число равно {1}.", n, NextPrim(n));

}

Рекурсия является средством решения многих задач: сортировки числовых массивов, обхода таких структур данных как деревья и графы.

С другой стороны, применение рекурсивных методов в ряде случаев оказывается нерациональным.

Например, рекурсивный метод подсчета n-ного члена последовательности Фибоначчи. Данный метод будет работать неэффективно. FbR(17) вычисляется в ней как FbR(16)+ FbR(15). В свою очередь FbR(16) вычисляется в ней как FbR(15)+ FbR(14). Таким образом, FbR(15) будет вычисляться 2 раза, FbR(14) – 3 раза, FbR(13) – 5 раз и т.д. Всего для вычисления FbR(17) потребуется выполнить более тысячи операций сложения. Для сравнения при вычислении Fb(17), т.е. используя не рекурсивный метод, потребуется всего лишь 15 операций сложения.

Задания на лабораторную работу.

1. Разработать рекурсивный метод (возвращающий значение):

1) для вычисления -го члена следующей последовательности .

2) для вычисления -го члена следующей последовательности

3) для нахождения наибольшего общего делителя методом Евклида:

4) для вычисления значения функции Аккермана для неотрицательных чисел и . Функция Аккермана определяется следующим образом:

5) для вычисления числа сочетаний где , используя следующие свойства

при .

6) вычисляющий число а, для которого выполняется неравенство , где – натуральное число. Для подсчета числа а использовать формулу:

7) для вычисления ( –вещественное, , а –целое) по формуле:

.

Вычислить значение для различных и .

8) для вычисления , где – натуральное число. Для заданных натуральных чисел и вычислить с помощью разработанного метода значение выражения .

9) для вычисления значения функции

.

Найти ее значение при заданном натуральном .

10) для вычисления цепной дроби:

.

Найти значение данной дроби при заданном натуральном .

2. Разработка рекурсивных методов (не возвращающих значений):

1) Даны первый член и разность арифметической прогрессии. Написать рекурсивный метод для нахождения -го члена и суммы первых членов прогрессии.

2) Даны первый член и знаменатель геометрической прогрессии. Написать рекурсивный метод для нахождения n-го члена и суммы первых членов прогрессии.

3) Разработать рекурсивный метод, который по заданному натуральному числу () выведет на экран все натуральные числа не больше в порядке возрастания. Например, для , на экран выводится .

4) Разработать рекурсивный метод, который по заданному натуральному числу () выведет на экран все натуральные числа не больше в порядке убывания. Например, для , на экран выводится .

5) Дано натуральное число . Разработать рекурсивный метод для вывода на экран следующей последовательности чисел:

1        
2 2      
3 3 3    
       
n n n n

6) Дано натуральное число . Разработать рекурсивный метод для вывода на экран следующей последовательности чисел:

1        
2 1      
3 2 1    
       
n n-1 n-2 1

7) Разработать рекурсивный метод для вывода на экран цифр натурального числа в прямом порядке. Применить эту процедуру ко всем числам из интервала от до .

8) Разработать рекурсивный метод для перевода числа из десятичной системы счисления в двоичную.

9) Разработать рекурсивный метод для перевода числа из двоичной системы счисления в десятичную.

10) Разработать рекурсивный метод для вывода на экран всех делителей заданного натурального числа .

11) Дано натуральное четное число . Разработать рекурсивный метод для вывода на экран следующей картинки:

********* (0 пробелов, n звездочек)
******** (1 пробел, n-1 звездочка)
******* (2 пробела, n-2 звездочки)
 
* (n-1 пробел, 1 звездочка)

12) Дано натуральное четное число . Разработать рекурсивный метод для вывода на экран следующей картинки:

* * (n пробелов между звездочками)
** ** (n-2 пробела)
*** *** (n-4 пробела)
***** ***** (2 пробела)
********** (0 пробелов)
***** ***** (2 пробела)
*** *** (n-4 пробела)
** ** (n-2 пробела)
* * (n пробелов

13) Дано натуральное число . Разработать рекурсивный метод для вывода на экран следующей картинки:

1 (1 раз)
222 (3 раза)
33333 (5 раз)
(n раз)
33333 (5 раз)
222 (3 раза)
1 (1 раз)

14) Разработать рекурсивный метод для вывода на экран следующей картинки:

AAAAAAAAAA…AAAAAAAAAA (80 раз)
BBBBBBBBB…BBBBBBBB (78 раз)
СССССССС …СССССССС (76 раз)
YYY…YYY (32 раза)
ZZ...ZZ (30 раз)
YYY…YYY (32 раза)
СССССССС …СССССССС (76 раз)
BBBBBBBBB…BBBBBBBB (78 раз)
AAAAAAAAAA…AAAAAAAAAA (80 раз)

 

Контрольные вопросы.

1. Задана программа

class Program

{

//нерекурсивный метод------------------------------

static long Sum(long a)

{

long sum=0;

while (a>0) //пока a больше нуля

{

   sum+=a%10; //добавляем к сумме последнюю цифру числа а

   a/=10; //отбрасываем от числа а последнюю цифру

}

return sum; //возвращаем в качестве результата сумму цифр числа a

}

//рекурсивный метод----------------------------------

static long SumR(long a) //рекурсивный метод

{

if (a==0) //если a =0, то

            return 0; // возвращаем 0

else return SumR(a/10)+ a%10; //иначе обращаемся к рекуррентному

// соотношению

}

static void Main()

{

Console.Write("n=");

long n=long.Parse(Console.ReadLine());

Console.WriteLine("Нерекурсивный метод: "+Sum(n));

Console.WriteLine("Рекурсивный метод: "+SumR(n));

}

}

Изменить методы так, чтобы на экран выводилось количество цифр в числе n.

2. Задана программа

class Program

{

static int Fb(int n) //нерекурсивный алгоритм

{

int a, a1=1, a2=1;

if (n==1||n==2) return 1;

else

{

   for (int i=2; i<=n; ++i)

   {

     a=a1+a2;

     a1=a2;

     a2=a;

   }

   return a1;

}

}

static int FbR(int n) //рекурсивный алгоритм

{

if (n==1 || n==2)return 1;

   else return FbR(n-1)+FbR(n-2);

}

static void Main()

{

Console.Write("n=");

int n=int.Parse(Console.ReadLine());

Console.WriteLine("Нерекурсивный метод: "+Fb(n));

Console.WriteLine("Рекурсивный метод: "+FbR(n));

}   

}

Изменить методы так, чтобы на экран выводилась сумма n элементов последовательности Фибоначчи.

3. Для заданного значения n вывести на экран n строк, в каждой из которых содержится n звездочек. Например, для n=5 на экран нужно вывести следующую таблицу:

*****

****

***

**

*

4. Для заданного значения n (например для n=7) вывести на экран следующую таблицу:

* * * * * * *

* * * * *

* * *

*

*

* * *

* * * * *

* * * * * * *

5. Для заданного значения n (в нашем случае для n=7) разработать рекурсивный метод, чтобы на экран выводилась следующая таблица:

*

* * *

* * * * *

* * * * * * *

* * * * * * *

* * * * *

* * *

*

6. Для заданного значения N разработать рекурсивный метод, чтобы на экран выводились все простые числа меньшие N.


 


Лабораторная работа 7.
Обработка исключений

Теоретические сведения.

Язык С#, как и многие другие объектно-ориентированные языки, реагирует на ошибки и ненормальные ситуации с помощью механизма обработки исключений. Исключение - это объект, генерирующий информацию о "необычном программном происшествии". При этом важно проводить различие между ошибкой в программе, ошибочной ситуацией и исключительной ситуацией.

Ошибка в программе допускается программистом при ее разработке. Например, вместо операции сравнения (==) используется операция присваивания (=). Программист должен исправить подобные ошибки до передачи кода программы заказчику. Использование механизма обработки исключений не является защитой от ошибок в программе.

Ошибочная ситуация вызвана действиями пользователя. <


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.343 с.