Пользовательские функции
Функции в С# — это средство, позволяющее выполнять некоторые участки кода в произвольном месте приложения. Они позволяют делать программу более удобочитаемой, и группировать вместе логически связанные между собой части программ. Функцию можно представить себе как повторно используемыйкод.
Параметры и возвращаемое значение функции вместе называются заголовком, или сигнатуройфункции.
Синтаксис кода для простейшей функций консольного приложения будет выглядеть следующим образом:
static void <имяФункции>()
{
...
}
Ключевое слово static имеет отношение к понятиям объектно-ориентированного программирования, и гарантирует выполнение функции. Ключевое слово void (отсутствует) указывает, что функция не возвращает никакого значения.
Если функция должна возвращать вовне какие-либо данные, то синтаксис следующий:
static <возвращаемыйТип> <имяФункции>()
{
...
return <возвращаемоеЗначение>
}
Единственным ограничением в данном случае является требование того, ЧТО <возвращаемоеЗначение> ДОЛЖНО иметь ТИП <возвращаемыйТип> ИЛИ же должнасуществовать возможность его неявного преобразования в этот тип.
В простейшем случае это может выглядеть следующим образом:
static double getVal()
{
return 3.2;
}
Если же функция должна принимать извне какие-либо данные, то необходимо задать:
список принимаемых функцией параметров в ее описании, а также типы этих параметров;
совпадающий список параметров при каждом вызове функции.
Это предполагает использование следующего кода:
static <возвращаемыйТип> <имяФункции>(<типПараметра> <имяПараметра>, …)
{
...
return <возвращаемоеЗначение>
}
Здесь может быть произвольное число параметров, для каждого из которых указываются тип и уникальный идентификатор. В качестве разделителя между параметрами ставятся запятые. Каждый из параметров доступен внутри данной функции в качестве переменной. Например, следующая простая функция принимает два параметра типа double и возвращает их произведение:
static double product(double param1, double param2)
{
return paraml * param2;
}
Следует отметить, что когда при выполнении программы достигается оператор return, управление немедленно передается обратно в вызывающий код. Никакие строки кода после этого оператора выполняться не будут. Оператор return не обязательно должен быть последним. Он может быть использован и раньше, например, при ветвлении по какому-либо условию. Включение оператора return в цикл for, в блок if или в какую-нибудь другую структуру приведет к немедленному окончанию выполнения как этой структуры, так и всей функции в целом.
static string Inverse(double val)
{
if (val == 0) return "Аргумент равен нулю!";
return Convert.ToString(1 / val);
}
Здесь при выполнении условия (val == 0) в точку вызова будет возвращено сообщение, а вторая строка тела функции не выполнится. Иначе будет возвращен строковый эквивалент обратного значения аргумента.
Более сложный пример для решения задачи по обработке строк.
Задана строка, состоящая из слов, разделенных пробелами. Вывести на экран из исходной строки слова, которые, начинаются и заканчиваются одной и той же буквой, причем эта буква в слове больше не повторяется. В основную программу вернуть количество выведенных слов.
Решение.
Так как результатом решения задачи является вывод слов на экран, функция может иметь следующую сигнатуру: static int PrintWords(string TargetString)
Код функции PrintWords:
string s = TargetString.Trim().ToLower() + " ";
// Удаление пробелов в начале и в конце строки, перевод в нижний регистр и
// добавление 1 пробела в конце, чтобы можно было определить конец последного слова.
// Скорректированная строка в переменной s
int i, j, k, n, kol;
char b = ' '; // Переменная для хранения первой буквы слова
k = 0; // счетчик вхождений первой буквы внутри слова
n = 0; // позиция символа в текущем слове
j = 0; // координата начала текущего слова
kol = 0; // счетчик выведенных слов
for (i = 0; i < s.Length; i++)
{
if (s[i] == ' ') continue; // Если пробел, то переход к следующей итерации
n++; // следующий символ в слове
if (n == 1) // Если это первый символ в слове,
{
b = s[i]; // то запоминаем его в b
j = i; // и запоминаем начало слова в j
}
else
{
if (s[i + 1] == ' ') // Если это последний символ в слове ТО
{
if ((s[i] == b) && (k == 0)) // Если последний символ равен первому
{ // И внутри слова повторнеий не было ТО
if (kol == 0) // Если это превое найденное слово
Console.WriteLine("\nОбнаруженные слова:"); // то выводим сообщение
kol++; // наращиваем счетчик выведенных слов
Console.WriteLine(s.Substring(j, n)); // выделяем слово и выводим на экран
}
k = n = 0; // переходим к следующему слову
}
else if (s[i] == b) // Если внутри слова обнаружена первая буква,
k++; // то увеличиваем счетчик на 1
}
}
return kol;
// Конец тела функции PrintWords
Код метода Main(), который содержит все, что требуется по заданию, за исключением вывода результата решения задачи (он выведен в функции):
Console.WriteLine("Введите заданную строку со словами через пробелы: ");
string s = Console.ReadLine();
if (0 == PrintWords(s)) Console.WriteLine("\nСлов с заданными параметрами не найдено.");
Console.ReadKey();
Результат выполнения метода Main():
Введите заданную строку со словами через пробелы:
Однако в поездах Интерсити отопление вагонов отсутствовало
Обнаруженные слова:
однако
вагонов
Задание
1. Проанализировать индивидуальное задание из таблицы 9 и определить сигнатуру функции для решения заданной задачи (идентификатор функции, идентификаторы и типы данных аргументов, тип возвращаемых данных).
2. Разработать код тела функции на языке C#, которая реализует заданную задачу по обработке строк, выводит результат обработки на консоль и возвращает требуемые результаты. Решить задачу с использованием и без использования регулярных выражений. Обеспечить контроль исключительных ситуаций.
3. Разработать код метода Main(), который содержит:
вывод инструкций для консольного ввода исходных данных для заданной задачи;
ввод исходных данных с клавиатуры;
вызов разработанной функции, выполняющей решение задачи;
вывод результата решения задачи.
4. Протестировать обработку контролируемых исключений.
5. Разработать блок-схемы алгоритмов для разработанной функции и для метода Main().
6. Выполнить ручной просчет.
7. Сделать вывод по работе.
Таблица 9. Варианты индивидуальных заданий по обработке строк
№ варианта | Задание |
Заданная строка состоит из строчных букв и включает несколько предложений, заканчивающихся точкой. Первые буквы предложений, начиная с n-го, сделать прописными. В основную программу вернуть количество преобразованных предложений. Если в строке нет n-го предложения (возвращенное значение – 0), то вывести соответствующее сообщение. | |
Выделить из строки заданное количество слов, начиная со слова с номером n. В основную программу вернуть количество выделенных слов. Если в строке нет n-го слова (возвращенное значение – 0), то вывести соответствующее сообщение. | |
Исходная строка содержит список русских фамилий мужского рода (не более 10) через запятую. Преобразовать список таким образом, чтобы вначале шли все фамилии с окончанием -ев, затем фамилии с окончанием -ин, затем фамилии с окончанием -ов, и далее все остальные фамилии. Относительная последовательность фамилий в каждой группе должна быть та же, что и в исходном списке. В основную программу вернуть четырехзначное натуральное число, каждый разряд которого равен количеству фамилий в соответствующей группе. | |
"Перевернуть" в строке все слова. (Например: "Жили были дед и баба" - "илиЖ илиб дед и абаб"). В основную программу вернуть количество слов в строке. | |
Определить длину n-го слова, и все слова, которые длиннее n-го слова, преобразовать в верхний регистр. Если n-е слово самое длинное, то вывести сообщение. В основную программу вернуть длину n-го слова. Если в строке нет n-го слова (возвращенное значение – 0), то вывести соответствующее сообщение. | |
Ввести текст, содержащий только символы латинского алфавита и знаки препинания (: ; , .). Подсчитать статистику употребления в тексте следующих символов: “a, b, c, d, e, f, g”. Вывести на экран диаграмму, отображающую статистику по каждой из заданных букв. Например: A| aaaaaaaaa B| bb C| D|ddddd … В основную программу вернуть количество обнаруженных в строке знаков препинания. | |
Найти в строке первый символ, который не входит в другую заданную строку и вывести его на консоль. В основную программу вернуть позицию этого символа. | |
В каждом слове строки заданную букву в нечетной позиции удалить, а в четной позиции заменить символом подчеркивания (_). В основную программу вернуть разность количеств сделанных удалений и замен | |
Заменить в строке заданный символ на символ * n раз, начиная с заданной позиции. В основную программу вернуть фактическое количество замен. | |
Удалить из строки n-е слово. В основную программу вернуть длину удаленного слова, либо 0, если n-е слово не найдено. | |
Разбить строку на две части: до и после первого вхождения заданного символа. В основную программу вернуть позицию заданного символа, либо 0, если такой символ не найден. | |
Найти в строке два одинаковых фрагмента (не включающих в себя пробелы) длиной более 5 символов и возвратить индекс начала первого из них (т.е. для " aaaaaabcdefgxxxxxxbcdefgwwwww" вернуть n=6 - индекс начала " bcdefg") | |
Переписать все символы строки в обратном порядке. В результатной строке удалить все слова, начинающиеся с буквы А | |
Переписать строку. Если в строке обнаруживается число, то вместо него переписать в выходную строку соответствующее по счету слово из входной строки (например, " aaa bb1bb cc2cc" - " aaa bbaaabb ccbb1bbcc") | |
Переписать в выходную строку слова из входной строки в порядке возрастания их длины. | |
Заменить в строке все множественные вхождения заданного символа одним | |
Нечетные слова в строке заменить наборами звездочек соответствующей длины | |
Заменить в строке все целые числа соответствующим повторением следующего за ними символа (например "abc5xacb15y" - "abcxxxxxacbyyyyyyyyyyyyyyy") | |
Удалить из строки все буквы А независимо от регистра, а также знаки препинания | |
Выделить из заданной строки подстроку заданной длины, начиная с заданной буквы (символа). Если такого символа нет, то выводить сообщение. | |
Оставить в строке фрагменты, симметричные центрального символа, длиной более 5 символов (например, " dcbabcd" ), остальные символы заменить на пробелы. | |
Довести длину строки до заданной, вставляя пробелы между словами. |
Дата добавления: 2021-12-14; просмотров: 416;