Лабораторная работа. Лабораторная работа "Методы и функции, 2 часть"
Скачать 65.79 Kb.
|
Лабораторная работа “Методы и функции, 2 часть” Пример №1. В Стандарте C# для иллюстрации независимости аргумента от изменений параметра, передаваемого по значению, приведена следующая программа: Код программы: using System; class Program { static void F(int p) { p++; Console.WriteLine("p = {0}", p); } static void Main() { int a = 1; Console.WriteLine("pre: a = {0}", a); F(a); Console.WriteLine("post: a = {0}", a); } } Протокол выполнения: Пример №2. Написать функцию, возвращающую значение минимального из четырех аргументов. Программа может быть такой: Код программы: using System; class Program { static double min2(double z1, double z2) { return z1 < z2 ? z1 : z2; } static double min4(double x1, double x2, double x3, double x4) { return min2(min2(min2(x1,x2),x3),x4); } static void Main() { Console.WriteLine(min4(24, 8, 4, 0.3)); } } Протокол выполнения: Пример №3. Чтобы метод мог с помощью параметров изменять внешние по отношению к методу объекты, соответствующие им параметры должны иметь модификатор ref, т. е. передаваться по ссылке. Для иллюстрации этой возможности модифицируем программу 09_04. Код программы: using System; class Program { static void FR(ref int p) { p++; Console.WriteLine("p = {0}", p); } static void Main() { int a = 1; Console.WriteLine("pre: a = {0}", a); FR(ref a); Console.WriteLine("post: a = {0}", a); } } Протокол выполнения: Пример №4. Переменная real инициализирована, переменные iPart, dPart не имеют значений до обращения к методу. Код программы: using System; class Program { static void fun(double x, out int integer, out double fra) { integer = (int)x; fra = x - integer; } static void Main() { double real = 53.93; double dPart; int iPart; fun(real, out iPart, out dPart); Console.WriteLine("iPart={0}, dPart = {1}", iPart, dPart); } } Протокол выполнения: Пример №5. Если параметр с типом ссылки передается методу по значению, то в теле метода создается копия использованного аргумента (копия ссылки). Код программы: using System; class Program { static void sorting(int[] vector) { int t; for (int i = 0; i < vector.Length - 1; i++) for (int j = i + 1; j < vector.Length; j++) if (vector[i] > vector[j]) { t = vector[i]; vector[i] = vector[j]; vector[j] = t; } } static void arrayPrint(int[] a, string формат) { int i; for (i = 0; i < a.Length; i++) Console.Write(формат, a[i]); } static void Main() { int[] array = { 1, 4, 8, 2, 4, 9, 3 }; arrayPrint(array, "{0,6:d}"); Console.WriteLine(); sorting(array); Console.WriteLine("Измененный массив:"); arrayPrint(array, "{0,6:d}"); Console.WriteLine(); } } Протокол выполнения: Пример №6. Метод может вернуть ссылку на этот объект как значение, возвращаемое функцией в точку вызова. Код программы: using System; class Program { static int[] newAr(uint numb) { int[] temp = new int[numb]; for (int i = 0; i < numb; i++) temp[i] = (i + 1) * (i + 1); return temp; } static void Main() { int[] vector = newAr(6); foreach (int el in vector) Console.Write(el + " "); Console.WriteLine(); } } Протокол выполнения: Пример №7. В качестве примера объявления и использования метода с параметром приведем программу с методом для вычисления значений полинома: Код программы: using System; class Program { static double polynom(double x, params int[] coef) { double result = 0.0; for (int i = 0; i < coef.Length; i++) result = result * x + coef[i]; return result; } static void Main() { Console.WriteLine(polynom(3.0, 3, 1, 2)); } } Протокол выполнения: Пример №8. В том случае, когда требуется метод, принимающий произвольное число параметров любых разных типов, Дж. Рихтер предлагает Использовать параметр вида params object[]. Код программы: using System; class Program { static void DisplayTypes(params object[] objects) { foreach (object o in objects) Console.WriteLine(o.GetType()); } static void Main() { DisplayTypes("yes", 432, new object()); } } Протокол выполнения: Пример №9. Параметр, снабженный модификатором params, обеспечивает передачу аргументов по значению. Следующая программа иллюстрирует это правило. Код программы: using System; class Program { static void varParams(params int[] ar) { for (int i = 0; i < ar.Length; i++) { ar[i] *= 2; Console.Write("ar[{0}]={1} ", i, ar[i]); } } static void Main() { int a = 2, b = 3, c = 5; varParams(a, b, c); Console.WriteLine("\na={0}, b={1}, c={2}", a, b, c); } } Протокол выполнения: Пример №10. После каждой сортировки выводятся значения элементов на консольный экран. Текст программы и полученные результаты поясняют сказанное. Код программы: using System; class Program { static int even_odd(int x, int y) { if (x % 2 != 0 & y % 2 == 0) return 1; if (x == y) return 0; return -1; } static int drop(int x, int y) { if (x < y) return 1; if (x == y) return 0; return -1; } static void Main() { int[] ar = { 4, 5, 2, 7, 8, 1, 9, 3 }; Array.Sort(ar, even_odd); foreach (int memb in ar) Console.Write("{0} ", memb); Console.WriteLine(); Array.Sort(ar); foreach (int memb in ar) Console.Write("{0} ", memb); Console.WriteLine(); Array.Sort(ar, drop); foreach (int memb in ar) Console.Write("{0} ", memb); Console.WriteLine(); } } Протокол выполнения: Пример №11. Кортеж можно использовать в качестве параметра, аргумента и возвращаемого методом результата. Код программы: using System; class Program { static ref int F(int[] arr) { int index = 0, max = int.MinValue; for (int k = 0; k < arr.Length; k++) if (max < arr[k]) { index = k; max = arr[k]; } return ref arr[index]; } static void Main() { int[] massiv = { 1, 2, 3, 4, 0 }; Console.WriteLine("Max = " + F(massiv)); F(massiv) = 23; Console.WriteLine("Max = " + F(massiv)); } } Протокол выполнения: |