На этом шаге мы рассмотрим несколько примеров решения задач с использованием статических методов.
Здесь мы рассмотрим несколько программ, в которых используются статические методы.
Задание 1. Напишите программу со статическим методом, аргументом которому передается целочисленный массив, а результатом возвращается среднее значение для элементов массива (сумма значений элементов, деленная на количество элементов в массиве).
Раскрыть/скрыть решение и комментарии.
Прежде всего приведем текст программы и затем прокомментируем его.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr76_1 { class Program { // Метод для вычисления среднего арифметического элементов в массиве: static double avgMas(int[] nums) { // Начальное значение суммы: int s = 0; // Вычисление суииы элементов: for (int k = 0; k < nums.Length; k++) { s += nums[k]; } // Результат метода. // Возврат среднего арифметического: return (double)s / nums.Length; } // Метод для отображения одномерного // целочисленного массива: static void showArray(int[] nums) { // Перебор элементов массива: for (int k = 0; k < nums.Length; k++) { // Отображение значения элемента: Console.Write("| {0} ", nums[k]); } Console.WriteLine("|"); } static void Main() { // Одномерные массивы: int[] A = { 1, 3, 5, 7, 9 }; int[] B = { 1, 2, 4 }; Console.WriteLine("Одномерный массив А:"); // Отображается массив А: showArray(A); Console.WriteLine("Его среднее арифметическое: {0}", avgMas(A)); Console.WriteLine("Одномерный массив В:"); // Отображается массив В: showArray(B); Console.WriteLine("Его среднее арифметическое: {0}", avgMas(B)); // Задержка: Console.ReadLine(); } } }
Дадим еще несколько комментариев к приведенной программе.
Большинство функций были разобраны ранее на предыдущих шагах. Остановимся на функции avgMas(), котрая используется для вычисления среднего арифметического элементов массива. Для его вычисления нужно, прежде всего, вычислить сумму элементов. Она накапливается в переменной s. Количество элементов массива определяется конструкцией nums.Length. Остается вроде бы совсем чуть-чуть: поделить значение переменной s на nums.Length. Однако нужно учесть тот факт, что при делении целого значения на целое получится тоже целое число, а в общем случае это даст нам неверный результат. Он будет таким, когда вычисленная сумма не делится без остатка на количество элементов (смотри рисунок 1, второй массив). Таким образом, прежде чем выполнять деление, мы значение переменной s приводим к типу double, чтобы результат также получился вещественным.
Результат работы приложения изображен на рисунке 1.
Рис.1. Результат работы приложения
Раскрыть/скрыть решение и комментарии.
Вот программа, решающая указанную задачу:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr76_2 { class Program { // Версия статического метода для символов // (аргументы метода): static char[] rez(char St, char En) { // Определяем массив требуемой размерности char[] Mas = new char[(int)En - (int)St + 1]; // Заполняем его заданными значениями for (char c = St; c <= En; c++) Mas[(int)(c - St)] = c; return Mas; } // Версия статического метода для чисел // (аргументы метода): static int[] rez(int St, int En) { // Определяем массив требуемой размерности int[] Mas = new int[En - St + 1]; // Заполняем его заданными значениями for (int c = St; c <= En; c++) Mas[c - St] = c; return Mas; } // Метод для отображения одномерного // целочисленного массива: static void showArray(int[] nums) { // Перебор элементов массива: for (int k = 0; k < nums.Length; k++) { // Отображение значения элемента: Console.Write("| {0} ", nums[k]); } Console.WriteLine("|"); } // Метод для отображения одномерного // символьного массива: static void showArray(char[] nums) { // Перебор элементов массива: for (int k = 0; k < nums.Length; k++) { // Отображение значения элемента: Console.Write("| {0} ", nums[k]); } Console.WriteLine("|"); } static void Main() { int x = 7, y = 12; Console.WriteLine("Для числового массива заданы числа 7 и 12"); int[] A = rez(x, y); Console.WriteLine("Одномерный числовой массив А:"); // Отображается массив А: showArray(A); char P = 'E', Q = 'T'; Console.WriteLine("Для символьного массива заданы символы 'E' и 'T'"); char[] B = rez(P, Q); Console.WriteLine("Одномерный символьный массив B:"); // Отображается массив B: showArray(B); // Задержка: Console.ReadLine(); } } }
Остановимся более подробно на функциях rez(). Они принимают два параметра: начальный и конечный символы массива и должны возвращать сам массив. Отсюда следует, что в заголовке методов вместо типа void, в одном случае должна располагаться конструкция int[], говорящая, что метод возвращает целочисленный массив, а во втором случае - char[], которая определяет, что возвращаемый массив состоит из символов.
В обоих случаях нужно этот массив определить, но, прежде всего узнать количество элементов в нем. Это значение определяется как разность между последним и первым элементами, увеличенная на 1. Указанное выражение мы используем при определении массива. Дополнительно для символьного массива мы начальное и конечные значения приводим к типу int, чтобы брать не сами символы, а их коды. На самом деле, такое приведение является излишним, так как среда программирования выполняет его автоматически. Однако мы решили это преобразование здесь оставить.
Заполнение массива осуществляется в цикле, причем номер элемента массива высчитывается как разность между текущим и начальным элементами. Для символьных значений мы также явно прописали преобразование этой разности в целое число, хотя его также можно было опустить.
Сформированные таким образом массивы пвозвращаются в место вызова метода конструкцией return.
Ссылка на возвращаемый массив помещается в переменную A (для целочисленного массива) или B (для массива символов), посредством которой можно получить доступ к результату работы метода. Это проиллюстрировано на примере вывода полученных массивов на экран.
Результат работы приложения изображен на рисунке 2.
Рис.2. Результат работы приложения
Раскрыть/скрыть решение и комментарии.
Программа, решающая эту задачу, приведена ниже:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr76_3 { class Program { // Метод для отображения одномерного // символьного массива: static void showArray(char[] nums) { // Перебор элементов массива: for (int k = 0; k < nums.Length; k++) { // Отображение значения элемента: Console.Write("| {0} ", nums[k]); } Console.WriteLine("|"); } // Метод для создания массива со случайными символами: static char[] rands(int n) { // Объект для генерирования случайных чисел: Random rnd = new Random(); // Создание массива: char[] symbs = new char [n]; // Заполнение массива: for (int k = 0; k < symbs.Length; k++) { // Значение элемента - случайный символ: symbs[k] = (char)('A' + rnd.Next(26)); } // Результат метода - ссылка на массив: return symbs; } // Метод для обмена значениями массива: static void obmen(ref char[] Mas) { int kol = Mas.Length; char temp; for (int i = 0; i < kol / 2; i++) { temp = Mas[i]; Mas[i] = Mas[Mas.Length - 1 - i]; Mas[Mas.Length - 1 - i] = temp; } } static void Main() { // Переменная для символьного массива: char[] B; // Создается массив с 4-мя случайными символами: B = rands(4); Console.WriteLine("Исходный массив:"); // Отображение содержимого массива: showArray(B); obmen(ref B); Console.WriteLine("Массив после обмена:"); // Отображение содержимого массива: showArray(B); // Создается массив с 3-мя случайными символами: B = rands(3); Console.WriteLine("Исходный массив:"); // Отображение содержимого массива: showArray(B); obmen(ref B); Console.WriteLine("Массив после обмена:"); // Отображение содержимого массива: showArray(B); // Задержка: Console.ReadLine(); } } }
Отметим, что в этой программе в метод посылается массив, и этот же массив должен вернуться из метода. Для того, чтобы это реализовать, нужно передавать массив по ссылке, то есть использовать служебное слово ref, которое размещается как при вызове метода, так и в его заголовке.
Для заполнения массива мы использовали рассмотренный ранее метод rands().
Реализация метода obmen(), где происходит обмен значениями элементов массива, достаточно проста. Вычисляем "середину" массива, после чего обмениваем первый элемент с последним, второй - с предпоследним и т.д. Например, если массив состоит из 5 элементов, то серединой будет значение 2, и требуется обменять 0 и 4, а также 1 и 3 элементы (не забываем, что нумерация элементов массива начинается с 0). Элемент с номером 2 должен остаться на месте.
Если количество элементов массива будет четно, например 4, то алгоритм будет работать так: вычисляем середину; она будет равна 2, после чего обмениваем значения элементов с номерами 0 и 3, а также 1 и 2.
Как видно из рассмотренных примеров, алгоритм правильно работает как при четных, так и при нечетных значениях, определяющих количество элементов массива.
Непосредственно сам обмен реализуется с использованием третьей переменной; здесь она имеет имя temp.
Результат работы приложения изображен на рисунке 3.
Рис.3. Результат работы приложения
Со следующего шага мы начнем знакомиться с классами и объектами.