Основы программирования
Класс System. Array
Массивы в С# реализованы как объекты. Если говорить более точно, то они реализованы на основе базового класса Array, определенного в пространстве имен System. Данный класс содержит различные свойства и методы. Например, свойство Length позволяет определять количество элементов в массиве:
Class Program
{
Static void Print(int[] a) // передаемтолькоссылкунамассив
{
For (int i = 0; i < a. Length; i++) Console. Write("{0} ", a[i]);
Console. WriteLine();
}
Static void Change(int[] a)
{
For (int i = 0; i < a. Length; i++)
If (a[i] > 0) a[i] = 0;
}
Static void Main()
{
Int[] myArray = { 0, -1, -2, 3, 4, 5, -6, -7, 8, -9 };
Print(myArray);
Change(myArray);
Print(myArray);
}
}
Задание 1
Создайте консольное приложение, введите и выполните приведенный код.
Другие свойства и методы класса Array приведены в следующей таблице:
Элемент |
Вид |
Описание |
Length |
Свойство |
Количество элементов массива (по всем размерностям) |
BinarySearch |
Статический метод |
Двоичный поиск в отсортированном массиве |
Clear |
Статический метод |
Присваивание элементам массива значений по умолчанию |
Copy |
Статический метод |
Копирование заданного диапазона элементов одного массива в другой |
CopyTo |
Экземплярный метод |
Копирование всех элементов текущего одномерного массива в другой массив |
GetValue |
Экземплярный метод |
Получение значения элемента массива |
IndexOf |
Статический метод |
Поиск первого вхождения элемента в одномерный массив |
LastIndexOf |
Статический метод |
Поиск последнего вхождения элемента в одномерный массив |
Reverse |
Статический метод |
Изменение порядка следования элементов на обратный |
SetValue |
Экземплярный метод |
Установка значения элемента массива |
Sort |
Статический метод |
Упорядочивание элементов одномерного массива |
Вызов статических методов происходит через обращение к имени класса, например, Array. Sort(myArray). В данном случае мы обращаемся к статическому методу Sort класса Array и передаем данному методу в качестве параметра объект myArray - экземпляр класса Array.
Обращение к свойству или вызов экземплярного метода производится через обращение к экземпляру класса, например, myArray. Length или myArray. GetValue(i).
Пример:
Class Program
{
Static void Main()
{
Try
{
Int[] MyArray;
Console. Write("Введитеразмерностьмассива: ");
Int n = int. Parse(Console. ReadLine());
MyArray = new int[n];
For (int i = 0; i < MyArray. Length; ++i)
{
Console. Write("a[{0}]=",i);
MyArray[i] = int. Parse(Console. ReadLine());
}
PrintArray("исходныймассив:", MyArray);
Array. Sort(MyArray);
PrintArray("массив отсортирован по возрастанию", MyArray);
Array. Reverse(MyArray);
PrintArray("массив отсортирован по убыванию", MyArray);
}
Catch (FormatException)
{
Console. WriteLine("неверный формат ввода данных");
}
Catch (OverflowException)
{
Console. WriteLine("переполнение");
}
Catch (OutOfMemoryException)
{
Console. WriteLine("недостаточнопамятидлясозданияновогообъекта");
}
}
Static void PrintArray(string a, int[] mas)
{
Console. WriteLine(a);
For (int i = 0; i < mas. Length; i++) Console. Write("{0} ", mas[i]);
Console. WriteLine();
}
}
}
Задание 2. (модификация)
Добавьте в программу метод InputArray, предназначенный для ввода с клавиатуры элементов массива. Продемонстрируйте работу данного метода.
Символы char
Обработка текстовой информации является одной из самых распространенных задач современного программировании. С# предоставляет для ее решения широкий набор средств: символы char, неизменяемые строки string, изменяемые строки StringBuider и регулярные выражения Regex. В данном разделе мы рассмотрим работу с символами, неизменяемыми и изменяемыми строками.
Символьный тип char предназначен для хранения символа в кодировке Unicode. Символьный тип относится к встроенным типам данных С# и соответствует стандартному классу Сhar библиотеки Net из пространства имен System. В этом классе определены статические методы, позволяющие задавать вид и категорию символа, а также преобразовывать символ в верхний или нижний регистр, в число. Рассмотрим основные методы:
Метод |
Описание |
GetNumericValue |
Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае. |
GetUnicodeCategory |
Возвращает категорию Unicode-символа. В Unicode символы разделены на категории, например цифры (DecimalDigitNumber), римские цифры (LetterNumber), разделители строк (LineSeparator), буквы в нижнем регистре (LowercaseLetter) и т. д. |
IsControl |
Возвращает true, если символ является управляющим. |
IsDigit |
Возвращает true, если символ является десятичной цифрой. |
IsLetter |
Возвращает true, если символ является буквой. |
IsLetterOrDigit |
Возвращает true, если символ является буквой или десятичной цифрой. |
IsLower |
Возвращает true, если символ задан в нижнем регистре. |
IsNumber |
Возвращает true, если символ является числом (десятичным или шестнадцатеричным). |
IsPunctuation |
Возвращает true, если символ является знаком препинания. |
IsSeparator |
Возвращает true, если символ является разделителем. |
IsUpper |
Возвращает true, если символ задан в верхнем регистре. |
IsWhiteSpace |
Возвращает true, если символ является пробельным (пробел, перевод строки, возврат каретки). |
Parse |
Преобразует строку в символ (строка должна состоять из одного символа). |
ToLower |
Преобразует символ в нижний регистр |
ToUpper |
Преобразует символ в верхний регистр |
В следующем примере рассмотрим применение данных методов:
Static void Main()
{
Try
{
Char b = 'B', c = 'x64', d = 'uffff';
Console. WriteLine("{0}, {1}, {2}", b, c, d);
Console. WriteLine("{0}, {1}, {2}", char. ToLower(b), char. ToUpper(c), char. GetNumericValue(d));
Char a;
Do //цикл выполняется до тех пор, пока не ввели символ e
{
Console. WriteLine("Введитесимвол: ");
A = char. Parse(Console. ReadLine());
Console. WriteLine("Введен символ {0}, его код {1}, его категория {2}", a,
(int)a, char. GetUnicodeCategory(a));
If (char. IsLetter(a)) Console. WriteLine("Буква");
If (char. IsUpper(a)) Console. WriteLine("Верхнийрегистр");
If (char. IsLower(a)) Console. WriteLine("Нижнийрегистр");
If (char. IsControl(a)) Console. WriteLine("Управляющийсимвол");
If (char. IsNumber(a)) Console. WriteLine("Число");
If (char. IsPunctuation(a)) Console. WriteLine("Разделитель");
} while (a!= 'e');
}
Catch
{
Console. WriteLine("Возниклоисключение");
}
}
Задание 3
Программа массив текстовая информация
Создайте консольное приложение, введите и выполните приведенный код.
Используя символьный тип можно организовать массив символов и работать с ним на основе базового класса Array:
Static void Main()
{
Char[] a ={ 'm', 'a', 'Х', 'i', 'M', 'u', 'S' , '!', '!', '!' };
Char [] b="кол около колокола".ToCharArray(); //преобразование строки в массив символов
PrintArray("Исходный массив а:", a);
For (int x=0;x<a. Length; x++)
If (char. IsLower(a[x])) a[x]=char. ToUpper(a[x]);
PrintArray("Измененный массив а:", a);
PrintArray("Исходный массив b:", b);
Array. Reverse(b);
PrintArray("Измененныймассив b:", b);
}
Static void PrintArray(string line, Array a)
{
Console. WriteLine(line);
Foreach( object x in a) Console. Write(x);
Console. WriteLine(' ');
}
Задание 4. (модификация)
Измените программу так, чтобы в ней подсчитывалось количество знаков пунктуации в массиве a.
Неизменяемые строки string
Тип string, предназначенный для работы со строками символов в кодировке Unicode, является встроенным типом С#. Ему соответствует базовый тип класса System. String библиотеки Net. Каждый объект string - это неизменяемая последовательность символов Unicode, т. е. методы, предназначенные для изменения строк, возвращают измененные копии, исходные же строки остаются неизменными.
Создать строку можно несколькими способами:
String s; // инициализация отложена
String s="кол около колокола"; //инициализация строковым литералом
String s=new string (' ', 20); //конструктор создает строку из 20 пробелов
Int x = 12344556;//инициализировали целочисленную переменную
String s = x. ToString();//преобразовали ее к типу string
Char [] a={'a', 'b', 'c', 'd', 'e'}; //создали массив символов
String v=new string (a); // создание строки из массива символов
Char [] a={'a', 'b', 'c', 'd', 'e'};
Stringv=newstring (a, 0, 2);// создание строки из части массива символов,
// при этом: 0показывает с какого символа,
//2 - сколько символов
// использовать для инициализации
Класс string обладает богатым набором методов для сравнения строк, поиска в строке и других действий со строками. Рассмотрим эти методы.
Название |
Вид |
Описание |
Compare |
Статический метод |
Сравнение двух строк в лексикографическом (алфавитном) порядке. Разные реализации метода позволяют сравнивать строки с учетом или без учета регистра. |
CompareTo |
Метод |
Сравнение текущего экземпляра строки с другой строкой. |
Concat |
Статический метод |
Слияние произвольного числа строк. |
Copy |
Статический метод |
Создание копии строки |
Empty |
Статическое поле |
Открытое статическое поле, представляющее пустую строку |
Format |
Статический метод |
Форматирование строки в соответствии с заданным форматом |
IndexOf, IndexOfAny, LastIndexOf, LastIndexOfAny |
Экземплярные методы |
Определение индексов первого и последнего вхождения заданной подстроки или любого символа из заданного набора в данную строку. |
Insert |
Экземплярный метод |
Вставка подстроки в заданную позицию |
Join |
Статический метод |
Слияние массива строк в единую строку. Между элементами массива вставляются разделители. |
Length |
Свойство |
Возвращает длину строки |
PadLeft, PadRigth |
Экземплярные методы |
Выравнивают строки по левому или правому краю путем вставки нужного числа пробелов в начале или в конце строки. |
Remove |
Экземплярный метод |
Удаление подстроки из заданной позиции |
Replace |
Экземплярный метод |
Замена всех вхождений заданной подстроки или символа новыми подстрокой или символом. |
Split |
Экземплярный метод |
Разделяет строку на элементы, используя разные разделители. Результаты помещаются в массив строк. |
StartWith, EndWith |
Экземплярные методы |
Возвращают true или false в зависимости от того, начинается или заканчивается строка заданной подстрокой. |
Substring |
Экземплярный метод |
Выделение подстроки, начиная с заданной позиции |
ToCharArray |
Экземплярный метод |
Преобразует строку в массив символов |
ToLower, ToUpper |
Экземплярные методы |
Преобразование строки к нижнему или верхнему регистру |
Trim, TrimStart, TrimEnd |
Экземплярные методы |
Удаление пробелов в начале и конце строки или только с одного ее конца. |
Напоминаем, что вызов статических методов происходит через обращение к имени класса, например, String. Concat(str1, str2), в остальных случаях через обращение к экземплярам класса, например, str. ToLower(). На примере рассмотрим использование данных свойств и методов.
Static void Main()
{
String str1 ="Перваястрока";
String str2 = string. Copy(str1);
String str3 = "Вторая строка";
String str4 = "ВТОРАЯ строка";
String strUp, strLow;
Int result, idx;
Console. WriteLine("str1: " + str1);
Console. WriteLine("Длинастроки str1: " +str1.Length);
// Создаем прописную и строчную версии строки str1.
StrLow = str1.ToLower();
StrUp = str1.ToUpper();
Console. WriteLine("Строчнаяверсиястроки str1: " +strLow);
Console. WriteLine("Прописнаяверсиястроки str1: " +strUp);
Console. WriteLine();
// Сравниваемстроки,
Result = str1.CompareTo(str3);
If (result == 0) Console. WriteLine("str1 и str3 равны.");
Else if (result < 0) Console. WriteLine("str1 меньше, чем str3");
Else Console. WriteLine("str1 больше, чем str3");
Console. WriteLine();
//сравниваем строки без учета регистра
Result = String. Compare(str3,str4,true);
If (result == 0) Console. WriteLine("str3 и str4 равныбезучетарегистра.");
Else Console. WriteLine("str3 и str4 неравныбезучетарегистра.");
Console. WriteLine();
//сравниваемчастистрок
Result = String. Compare(str1, 4, str2, 4, 2);
If (result == 0) Console. WriteLine("часть str1 и str2 равны");
Else Console. WriteLine("часть str1 и str2 неравны");
Console. WriteLine();
// Поискстрок.
Idx = str2.IndexOf("строка");
Console. WriteLine("Индекс первого вхождения подстроки строка: " + idx);
Idx = str2.LastIndexOf("о");
Console. WriteLine("Индекс последнего вхождения символа о: " + idx);
//конкатенация
String str=String. Concat(str1, str2, str3, str4);
Console. WriteLine(str);
//удалениеподстроки
Str=str. Remove(0,str1.Length);
Console. WriteLine(str);
//замена подстроки "строка" на пустую подстроку
Str=str. Replace("строка","");
Console. WriteLine(str);
}
Задание 5
Создайте консольное приложение, введите и выполните приведенный код.
Очень важными методами обработки строк, являются методы разделения строки на элементы Split и слияние массива строк в единую строку Join.
Static void Main()
{
String poems = "тучки небесные вечные странники";
Char[] div = {' '}; //создаем массив разделителей
// Разбиваем строку на части,
String[] parts = poems. Split(div);
Console. WriteLine("Результат разбиения строки на части: ");
For (int i = 0; i < parts. Length; i++)
Console. WriteLine(parts[i]);
// Теперь собираем эти части в одну строку, в качестве разделителя используем символ |
String whole = String. Join(" | ", parts);
Console. WriteLine("Результатсборки: ");
Console. WriteLine(whole);
}
Задание 6. (модификация)
Измените программу так, чтобы слова в предложении записывались в обратном порядке.
В общем случае строка может содержать и другие разделители:
Static void Main()
{
String poems = "Тучки небесные, вечные странники...";
Char[] div = { ' ', ',', '.'}; //создаем массив разделителей
// Разбиваем строку на части,
String[] parts = poems. Split(div);
Console. WriteLine("Результат разбиения строки на части: ");
For (int i = 0; i < parts. Length; i++)
Console. WriteLine(parts[i]);
// Теперь собираем эти части в одну строку,
String whole = String. Join(" | ", parts);
Console. WriteLine("Результатсборки: ");
Console. WriteLine(whole);
}
Задание 7. (модификация)
Объясните, почему в массиве строк parts появились пустые строки. Внесите изменения в программу так, чтобы пустых строк не было.
Рассмотрим другой пример - используя метод Split вводить двумерный массив можно не поэлементно, а построчно:
Static void Main()
{
Try
{
Int[][] MyArray;
Console. Write("введите количество строк: ");
Int n = int. Parse(Console. ReadLine());
MyArray = new int[n][];
For (int i = 0; i < MyArray. Length; i++)
{
String line = Console. ReadLine();
String[] mas = line. Split(' ');
MyArray[i] = new int[mas. Length];
For (int j = 0; j < MyArray[i].Length; j++)
{
MyArray[i][j] = int. Parse(mas[j]);
}
}
PrintArray("исходныймассив:", MyArray);
For (int i = 0; i < MyArray. Length; i++) Array. Sort(MyArray[i]);
PrintArray("итоговыймассив", MyArray);
}
Catch
{
Console. WriteLine("возниклоисключение");
}
}
Static void PrintArray(string a, int[][] mas)
{
Console. WriteLine(a);
For (int i = 0; i < mas. Length; i++)
{
Foreach (int x in mas[i]) Console. Write("{0} ", x);
Console. WriteLine();
}
}
В этом примере могут возникнуть исключительные ситуации, если введенная строка элементов массива будет содержать лишние пробелы. Следовательно, от этих пробелов нужно избавиться:
Static void Main()
{
Try
{
Int[][] MyArray;
Console. Write("введите количество строк: ");
String line= Console. ReadLine()
Int n = int. Parse(line. Trim());
MyArray = new int[n][];
For (int i = 0; i < MyArray. Length; i++)
{
Line = Console. ReadLine();
Line=line. Trim(); //удаляемпробелывначалеиконцестроки
//удаляем лишние пробелы внутри строки
N = line. IndexOf(" ");
While (n > 0)
{
Line = line. Remove(n, 1);
N = line. IndexOf(" ");
}
String[] mas = line. Split(' ');
MyArray[i] = new int[mas. Length];
For (int j = 0; j < MyArray[i].Length; j++)
{
MyArray[i][j] = int. Parse(mas[j]);
}
}
PrintArray("исходныймассив:", MyArray);
For (int i = 0; i < MyArray. Length; i++) Array. Sort(MyArray[i]);
PrintArray("итоговыймассив", MyArray);
}
Catch
{
Console. WriteLine("возниклоисключение");
}
}
Static void PrintArray(string a, int[][] mas)
{
Console. WriteLine(a);
For (int i = 0; i < mas. Length; i++)
{
Foreach (int x in mas[i]) Console. Write("{0} ", x);
Console. WriteLine();
}
}
Задание 8. (модификация)
Объясните, можно ли удалить внутри строки лишние пробелы, используя метод Replace. Например, следующим способом str. Replace(" ", " "), где мы пытаемся заменить подстроку состоящую из двух пробелов, на подстроку из одного пробела. Создайте консольное приложение, введите и выполните приведенный код.
При работе с объектами класса string нужно учитывать их свойство неизменяемости, т. е. тот факт, что методы изменяют не сами строки, а их копии. Рассмотримфрагментпрограммы:
String a="";
For (int i = 1; i <= 100; i++) a +="!";
Console. WriteLine(a);
В этом случае в памяти компьютера будет сформировано 100 различных строк вида:
!
!!
!!!
...
!!!...!!
И только последняя строка будет храниться в переменной а. Ссылки на все остальные строчки будут потеряны, но эти строки будут храниться в памяти компьютера и засорять память. Бороться с таким засорением придется сборщику мусора, что будет сказываться на производительности программы. Поэтому если нужно изменять строку, то лучше пользоваться классом StringBuilder.
1. Изменяемые строкиStringBuilder
Чтобы создать строку, которую можно изменять, в С# предусмотрен класс StringBuilder, определенный в пространстве имен System. Text. Объекты этого класса всегда объявляются с явным вызовом конструктора класса (через операцию new) . Примеры создания изменяемых строк:
StringBuilder a =new StringBuilder(); //создание пустой строки, размер по умолчанию 16 символов
//инициализация строки и выделение необходимой памяти
StringBuilder b = new StringBuilder("abcd");
//создание пустой строки и выделение памяти под 100 символов
StringBuilder с = new StringBuilder(100);
//инициализация строки и выделение памяти под 100 символов
StringBuilder d = new StringBuilder("abcd", 100);
//инициализация подстрокой "bcd", и выделение памяти под 100 символов
StringBuilder d = new StringBuilder("abcd", 1, 3,100);
Основные элементы класса приведены в таблице:
Название |
Вид |
Описание |
Append |
Экземплярный метод |
Добавление данных в конец строки. Разные варианты метода позволяют добавлять в строку величины любых встроенных типов, массивы символов, строки и подстроки string. |
AppendFormat |
Экземплярный метод |
Добавление форматированной строки в конец строки |
Capacity |
Свойство |
Получение и установка емкости буфера. Если устанавливаемое значение меньше текущей длины строки или больше максимального, то генерируется исключение ArgumentOutOfRangeException |
Insert |
Экземплярный метод |
Вставка подстроки в заданную позицию |
Length |
Изменяемое свойство |
Возвращает длину строки. Присвоение ему значения 0 сбрасывает содержимое и очищает строку |
MaxCapacity |
Неизменное свойство |
Возвращает наибольшее количество символов, которое может быть размещено в строке |
Remove |
Экземплярный метод |
Удаление подстроки из заданной позиции |
Replace |
Экземплярный метод |
Замена всех вхождений заданной подстроки или символа новой подстрокой или символом |
ToString |
Экземплярный метод |
Преобразование в строку типа string |
Chars |
Изменяемое свойство |
Возвращает из массива или устанавливает в массиве символ с заданным индексом. Вместо него можно пользоваться квадратными скобками [] |
Equals |
Экземплярный метод |
Возвращает true, только если объекты имеют одну и ту же длину и состоят из одних и тех же символов |
CopyTo |
Экземплярный метод |
Копирует подмножество символов строки в массив char |
Как видим, методы класса StringBuilder менее развиты, чем методы класса String, но они позволяют более эффективно использовать память за счет работы с изменяемыми строками. Рассмотрим примеры использования данных методов.
Static void Main()
{
Try
{
StringBuilder str=new StringBuilder("Площадь");
PrintString(str);
Str. Append(" треугольникаравна");
PrintString(str);
Str. AppendFormat(" {0:f2} см ", 123.456);
PrintString(str);
Str. Insert(8, "данного ");
PrintString(str);
Str. Remove(7, 21);
PrintString(str);
Str. Replace("а", "о");
PrintString(str);
StringBuilder str1=new StringBuilder(Console. ReadLine());
StringBuilder str2=new StringBuilder(Console. ReadLine());
Console. WriteLine(str1.Equals(str2));
}
Catch
{
Console. WriteLine("Возникоисключение");
}
}
Static void PrintString(StringBuilder a)
{
Console. WriteLine("Строка: "+a);
Console. WriteLine("Текущаядлинастроки " +a. Length);
Console. WriteLine("Объембуфера "+a. Capacity);
Console. WriteLine("Максимальныйобъембуфера "+a. MaxCapacity);
Console. WriteLine();
}
Задание 9
Создайте консольное приложение, введите и выполните приведенный код.
С изменяемой строкой можно работать не только как с объектом, но как с массивом символов:
Static void Main()
{
StringBuilder a = new StringBuilder("2*3=3*2");
Console. WriteLine(a);
Int k=0;
For (int i = 0; i < a. Length; ++i )
If (char. IsDigit(a[i])) k+=int. Parse(a[i].ToString());
Console. WriteLine(k);
}
На практике часто комбинируют работу с изменяемыми и неизменяемыми строками. Однако если необходимо изменять строку, то в этом случае используют StringBuilder.
Пример. Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания. Вывести все слова сообщения, которые начинаются и заканчиваются на одну и ту же букву.
Static void Main()
{Console. WriteLine("Введитестроку: ");
StringBuilder a = new StringBuilder(Console. ReadLine());
Console. WriteLine("Исходнаястрока: "+a);
For (int i=0; i<a. Length;)
If (char. IsPunctuation(a[i])) a. Remove(i,1);
Else ++i;
String str=a. ToString();
String []s=str. Split(' ');
Console. WriteLine("Искомыеслова: ");
For (int i=0; i<s. Length; ++i)
If (s[i][0]==s[i][s. Length-1]) Console. WriteLine(s[i]);
}
Задание 10. (модификация)
Измените программу так, чтобы она корректно работала и для случая, когда в исходной строке встречаются лишние пробелы.
Практикум
При решении задач следует руководствоваться правилом: если в строке должны производится изменения, то лучше пользоваться классом StringBuilder; если необходимо разбивать строки на слова, то классом String. При решении некоторых задач, потребуется использовать оба класса.
Задание 11. (2 задачи из 2-20)
Разработать программу (консольное приложение), которая для заданной строки s:
1. вставляет символ x после каждого вхождения символа y;
Пример
Using System;
Using System. Text;
Namespace ConsoleApplication
{
Class Class
{
Static void Main()
{
Console. WriteLine("Введитестроку: ");
StringBuilder a = new StringBuilder(Console. ReadLine());
Console. WriteLine("Исходнаястрока: "+a);
Console. WriteLine("Введитесимвол x: ");
Char x=char. Parse(Console. ReadLine());
Console. WriteLine("Введитесимвол y: ");
Char y=char. Parse(Console. ReadLine());
For (int i=0; i<a. Length; ++i)
If (a[i]==x){a. Insert(i+1,y); ++i;}
Console. WriteLine("Измененная строка: "+a);
}
}
}
- 2. меняет местами первую букву со второй, третью с четвертой и т. д. 3. определяет, какой из двух заданных символов встречается чаще в строке; 4. подсчитывает общее число вхождений символов х и y; 5. подсчитывает количество букв в строке; 6. определяет, имеются ли в строке два соседствующих одинаковых символа; 7. удаляет среднюю букву, если длина строки нечетная, и две средних, если длина строки четная; 8. удваивает каждое вхождение заданного символа x; 9. удаляет все символы х; 10. удаляет все подстроки substr; 11. заменяет все вхождения подстроки substr1 на подстроку substr2; 12. подсчитывает сумму всех содержащихся в ней цифр; 13. подсчитывает количество содержащихся в ней цифр; 14. находит порядковые номера первого и последнего вхождения символа x; 15. заменяет все группы стоящих рядом точек на многоточие; 16. выводит на экран последовательность символов, расположенных до первого двоеточия; 17. выводит на экран последовательность символов, расположенных после последнего двоеточия; 18. удаляет из нее последовательность символов, расположенных между круглыми скобками (считается, что в строке ровно одна пара круглых скобок). 19. удаляет из нее последовательность символов, расположенных между двумя запятыми (считается, что в строке ровно две запятые); 20. определяет, сколько различных символов встречается в строке.
Задание 12. (2 задачи из 22-40)
Разработать программу (консольное приложение) для решения следующей задачи. Дана строка, в которой содержится осмысленное текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания.
21. Вывести только те слова сообщения, в которых содержится заданная подстрока.
Пример
Using System;
Using System. Text;
Namespace ConsoleApplication
{
Class Class
{
Static void Main()
{
Console. WriteLine("Введитестроку: ");
StringBuilder a = new StringBuilder(Console. ReadLine());
Console. WriteLine("Исходнаястрока: "+a);
Console. WriteLine("Введитезаданнуюподстроку: ");
String x=Console. ReadLine();
For (int i=0; i<a. Length;)
If (char. IsPunctuation(a[i]))a. Remove(i,1);
Else ++i;
String str=a. ToString();
Str=str. Trim();
String []s=str. Split(' ');
Console. WriteLine("Искомыеслова: ");
For (int i=0; i<s. Length; ++i)
If (s[i].IndexOf(x)!=-1) Console. WriteLine(s[i]);
}
}
}
- 22. Вывести только те слова сообщения, которые содержат не более чем n букв. 23. Вывести только те слова сообщения, которые начинаются с прописной буквы. 24. Вывести только те слова сообщения, которые содержат хотя бы одну цифру. 25. Удалить из сообщения все слова, которые заканчиваются на заданный символ. 26. Удалить из сообщения все слова, содержащие данный символ (без учета регистра). 27. Удалить из сообщения все однобуквенные слова (вместе с лишними пробелами). 28. Удалить из сообщения все повторяющиеся слова (без учета регистра). 29. Подсчитать сколько раз заданное слово встречается в сообщении. 30. Подсчитать сколько слов, состоящих только из прописных букв, содержится в сообщении. 31. Найти самое длинное слово сообщения. 32. Найти все самые длинные слова сообщения. 33. Найти самое короткое слово сообщения. 34. Найти все самые короткие слова сообщения. 35. Вывести на экран все слова-палиндромы, содержащиеся в сообщении. 36. По правилу расстановки знаков препинания перед каждым знаком препинания пробел отсутствует, а после него обязательно стоит пробел. Учитывая данное правило, проверьте текст на правильность расстановки знаков препинания и, если необходимо, внесите в текст изменения. 37. Вывести только те слова, которые встречаются в тексте ровно один раз. 38. Вывести только те слова, которые встречаются более n раз. 39. Вывести слова сообщения в алфавитном порядке. 40. Вывести слова сообщения в порядке возрастания их длин.
Указание
При выполнении заданий 1-12 создайте решение Ch8_fio(где fio-Ваша фамилия), состоящее из двух проектов.
- 1-й проект - это библиотека классов, где можно разместить статические методы (без формальных параметров), реализующие алгоритмы решения задач 1-12. 2-й проект - это консольное приложение, состоящее из последовательности вызовов методов предыдущего проекта. Отработанные методы могут быть закомментированы.
Похожие статьи
-
Основы работы с файлами, Режимы открытия файла - Сортировка массивов
Работа с файлом осуществляется в три этапа: - Открытие файла. - Обработка файла (чтение или запись). - Закрытие файла. Функция открытия файла возвращает...
-
Скалярные переменные - Язык программирования PERL. Сфера применения
Как отмечалось, скалярная переменная может содержать единственное значение. В языке Perl имена скалярных переменных всегда начинаются со знака ($). В еле...
-
Реализация - Обьекто-ориентированное программирование
Для реализации задачи воспользуемся языком программирования Java и средой разработки NetBeans. Создадим два класса: Triangle и Test. В классе Triangle...
-
При проектировании упражнения встал вопрос о его реализации. Было необходимо найти такой метод, который не только соответствовал основным требованиям...
-
Принципы SOLID - Программирование на языке C++
SOLID - мнемонический акроним, введенный Майклом Фэзерсом ( Michael Feathers ) для первых пяти принципов, названных Робертом Мартином в начале 2000-х,...
-
Описание классов и методов - Обзор проблематики и теоретических основ электронного документооборота
В данной работе реализован один публичный класс Form1, в котором и происходит основной функционал программы, посредством выполнения методов по кнопкам....
-
Цель Работы - изучить приемы создания и использования шаблонов классов. - Теоретические сведения Достаточно часто встречаются классы, объекты которых...
-
Сохранение проекта Возможны как минимум три варианта: 1. Меню File, строка Save All с подсказкой горячих клавиш Shift+Ctrl+S; 2. Щелкнуть по иконке двух...
-
Цель Работы - изучить основные способы работы с пользовательским типом данных "класс", его объектами, методами и способы доступа к ним. - Теоретические...
-
Введение, РЕКУРСИЯ - Рекурсивное программирование
Основой для разработки рекурсивных алгоритмов служат, так называемые, Рекуррентные соотношения (формулы), устанавливающие зависимость между результатами...
-
МОДУЛИ - Язык программирования Паскаль
Наличие модулей в Turbo Pascal позволяет программировать и отлаживать программу по частям, создавать библиотеки подпрограмм и данных, воспользоваться...
-
ОПЕРАТОР ВВОДА ДЛЯ ЧТЕНИЯ ФАЙЛА, ОПЕРАТОР ВЫВОДА - Язык программирования Паскаль
Оператор ввода для чтения файла обладает всеми свойствамии обычного оператора READ. Вкачестве параметров могут быть переменные; каждая переменная поучает...
-
ПРОЦЕДУРЫ - Язык программирования Паскаль
Delete (St, Pos, N) - удаление N символов строки St, начиная с позиции Pos. Если значение Pos > 255, возникает ошибка. Значение St Выражение Результат...
-
Подпрограммы - Язык программирования PERL. Сфера применения
Как и все структурированные языки программирования, Perl поддерживает подпрограммы. Подпрограмма может быть определена с помощью ключевого слова sub, как...
-
Кодированием называется представление символов одного алфавита средствами другого алфавита. Алфавит содержащий два символа называется двоичным (часто их...
-
Кроме поддержки интерпретатора порождающих правил, описанного в главе 5, CLIPS обладает следующими функциональными возможностями: - для определения...
-
Технология программирования Для реализации поставленной задачи наиболее удобной парадигмой программирования будет являться объектно-ориентированная...
-
Необходимо отметить специальный класс приложений - систем поддержки принятия решений, позволяющие моделировать правила и стратегии бизнеса и иметь...
-
Методы Рунге-- Кутты-- важное семейство численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы...
-
Рассмотрим особенности программирования под Android. Класс Activity - самый важный класс, из которого строится приложение Android. Этот класс...
-
Описание модулей системы Первый модуль - это перевод документов из формата pdf в формат txt. Как было представлено ранее, самым качественным ПО для...
-
Теоретическая основа линейного программирования, Симплекс метод - Линейное программирование
Симплекс метод Симплекс метод - метод линейного программирования, который реализует рациональный перебор базисных допустимых решений, в виде конечного...
-
ДД-код Константа16 ДД-код Константа16 1111 1111 FF 0000 0000 00 0011 0101 35 1111 0100 F4 0101 0111 57 1001 1010 9A 1000 1101 8D 0000 0111 07 1000 0000...
-
СТРОКИ. ОПИСАНИЕ ТИПА - Язык программирования Паскаль
Для обработки последовательностей символов в ТУРБО - ПАСКАЛЕ предусмотрены строчные типы. Строчные типы - это структурные типы. Количество символов в...
-
Постановка задачи, Подход к реализации - Обьекто-ориентированное программирование
Создать класс Triangle для представления треугольника. Поля класса - длины сторон. Требуется реализовать операции: вычисления углов треугольника,...
-
Введение - Обьекто-ориентированное программирование
Объектно-ориентированное программирование (ООП) позволяет разложить проблему на составные части, каждая из которых становится самостоятельным объектом....
-
Объектно - ориентированное программирование - Модульное и объектно-ориентированное программирование
Объектно-ориентированное программирование является в настоящее время наиболее популярной технологией программирования. Объектно-ориентированными языками...
-
Использование языка PERL для написания CGI-cкриптов - Язык программирования PERL. Сфера применения
Как вы узнали из предыдущей главы, CGI обеспечивает узлам Web вoзмoжнoсть интерактивной работы с клиентскими программами, в качестве которых обычно...
-
Для того, чтобы избежать копирования карты доступа злоумышленниками был введен защитный механизм. Механизм основан на использовании алгоритма RSA....
-
Объекты управления и их свойства - Visual Basic. Основы программирования
Объектом называется некая сущность, которая, во-первых, четко проявляет свое поведение, а во-вторых, является представителем некоторого класса подобных...
-
По Р. Шеннону (Robert E . Shannon - профессор университета в Хантсвилле, штат Алабама, США ), "имитационное моделирование - Есть процесс конструирования...
-
Особенностью API для коммуникации с СКУД является то, что авторизация методов происходит не с помощью токена, а с помощью проверки IP адреса клиента на...
-
Линейное программирование - Линейное программирование
Линейный программирование математический графический Что же такое линейное программирование? Это один из первых и наиболее подробно изученных разделов...
-
Введение - Линейное программирование
Линейное программирование - это наука о методах исследования и отыскания наибольших и наименьших значений линейной функции, на неизвестные которой...
-
1. Каковы основные этапы решения задач ЛП в MS Excel? 2. Каков вид и способы задания формул для целевой ячейки и ячеек левых частей ограничений? 3. В чем...
-
Резюме - Язык программирования PERL. Сфера применения
В этой главе рассмотрено введение в программирование на языке Perl. Используя рассмотренные здесь концепции, можно писать сложные скрипты CGI на языке...
-
Что такое Flash? Flash (от англ. Flash - "вспышка", произносится "флэш") Flash - это технология веб-мультипликации и создания интерактивного контента от...
-
Разработка концептуальной модели базы данных При проектировании программ выясняются запросы и пожелания клиента и определяется возможный подход к решению...
-
Прямое использование предсказания позволяет воспроизводить звук, но с плохим качеством. Поэтому этот метод имеет много различных разновидностей,...
-
Диаграмма классов, Разработка пользовательского интерфейса - Основы технологии программирования
На основе построенных диаграмм взаимодействия и переходов состояний можно построить диаграмму классов информационной системы. Рис. 5 Диаграмма классов...
Основы программирования