русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Метод Split


Дата добавления: 2013-12-23; просмотров: 4478; Нарушение авторских прав


Класс Convert

Класс Console

Основные классы

Оператор switch

Полноценный логический тип данных

Помните, как замысловато был представлен логический тип данных в C – числовое значение 0 воспринималось как «ложь», а любое другое – как «истина». Так что цикл while(5){. . .} хотя и выглядел странновато, оказывался бесконечным циклом. Кроме того, в C операция присваивания имела два результата – побочный (сам факт копирования значения в правую часть) и основной – значение правой части после присваивания. Это позволяло выполнять цепочечные присваивания (a=b=c;). В силу этих двух особенностей многие невнимательные программисты (а кто же всегда будет внимателен?) допускали маленькую опечатку – вместо операции сравнения == в условных выражения использовали операцию присваивания =). Хуже всего, что с точки зрения компилятора эта конструкция воспринималась правильно. В результате цикл while(a=5){. . .} также становился бесконечным циклом.

В языке C# никакого хитроумного моделирования логических значений нет – вместо этого имеется полноценный логический тип bool, на самом деле реализованный классом Boolean (помните int и Int32?).

В результате компилятор обнаруживает ошибку в условном выражении a=1 и сообщает, что не может неявно преобразовать целую величину в логическую.

Отметим две особенности, отличающие оператор switch в языках C# и C++:

1. C# не поддерживает “провала” передачи управления, возникающего при отсутствии оператора break.

Фрагмент программы

int a; a=2;

switch (a)

{ case 1: cout<<”Один”;

case 2: cout<<”Два”;

case 3: cout<<”Три”;

case 4: cout<<”Четыре”;

}

приводил к выводу на экран строки «ДваТриЧетыре».

В C# аналогичный оператор будет считаться компилятором ошибочным – C# требует в конце каждого исполняемого блока указывать оператор break, либо goto, либо return. Таким образом, можно написать следующее:



int a; a=2;

switch (a)

{ case 1: Console.Write(”Один”); break;

case 2: Console.Write(”Два”); break;

case 3: Console.Write(”Три”); break;

case 4: Console.Write(”Четыре”); break;

}

В результате на экране появится только слово «Два»

2. В качестве выражения и констант, отмечающих варианты оператора switch можно использовать строковые данные (тип string)

string a; a=”Два”;

switch (a)

{ case ”Один”: Console.Write(1); break;

case ”Два”: Console.Write(2); break;

case ”Три”: Console.Write(3); break;

case ”Четыре”: Console.Write(4); break;

}

Такой фрагмент выводит на экран число 2.

Ниже рассмотрим использование наиболее популярных классов платформы .NET

Класс Math

Как вы уже успели заметить, этот класс используется для организации взаимодействия пользователя с компьютером с помощью двух устройств: клавиатура (для ввода информации) и монитор (для вывода). В предыдущих примерах были использованы методы ReadLine и WriteLine. Отметим ещё одну полезную особенность метода WriteLine.

Допустим, нужно вывести на экран значения трёх переменных x, y и z. это можно сделать следующим образом:

Console.WriteLine(“x=”+x+”, y=”+y+”, z=”+z);

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

Console.WriteLine(“x={0}, y={1}, z={2}”,x,y,z);

В этом случае метод WriteLine имеет несколько параметров. Первый обязательно является строкой, определяющей структуру выводимой информации. В этой строке присутствуют специальные элементы ({0}{1}{2}), вместо которых выводятся значения соответствующих других параметров (в нашем примере x, y и z).

Кроме ReadLine и WriteLine класс Console содержит дополнительные методы для управления клавиатурой и выводом информации на монитор. Например, с помощью метода SetCursorPosition можно управлять позицией курсора.

Мы уже знаем о существовании метода ToInt32, осуществляющего преобразование в целое число. Кроме того, в этом классе имеется ещё ряд методов преобразования: ToBoolean, ToByte, ToChar, ToDateTime, ToDecimal, ToDouble, ToSingle, ToString. Этот (неполный!) перечень методов позволяет сделать следующие выводы:

1. Система основных типов языка в основном унаследована от языка С++, однако, в ней появились и новшества.

Как уже говорилось, в C# имеется полноценный логический тип данных Boolean.

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

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

Два основных вещественных типа языка C++ (float и double) в C# «поменялись местами» - стандартным теперь является Double. Это означает, что вещественные константы, записываемые обычным образом, относятся к типу Double. Поэтому оператор a = 0.5 будет признан компилятором ошибочным (несовместимость типов в присваивании), если переменная a имеет тип float.

Преобразованием в тип float занимается метод ToSingle.

2. Каждый из методов преобразования является перегруженным. Это позволяет применять метод с одним и тем же именем для преобразования разнотипной исходной информации. Например:

Convert.ToInt32(3.2);

Convert.ToInt32(false);

Convert.ToInt32(“Hello”);

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

Строковый тип данных string (класс String)

Работу со строками символов в .NET очень удобно осуществлять с помощью типа данных String из пространства имен System. Переменные этого типа можно описывать также с помощью ключевого слова string.

Переменная строкового типа может получить свое значение несколькими способами:

1. Присваиванием строковой константы или строкового выражения:

String name;

name=”John”;

name=”Mr. ” + name; //для строк + действует как конкатенация

2. Путем ввода с клавиатуры

name=Console.Readline();

Сравнивать строки можно операциями == (равно) и != (не равно). При этом проверяется точное совпадение содержимого этих строк. Однако применять для сравнения операции <, >, >= и <= нельзя. Для таких сравнений существует специальный метод Compare в классе String.

В C# сохранилась возможность работать со строкой как с массивом символов.

В следующем фрагменте программы проиллюстрированы некоторые из перечисленных возможностей:

string s1,s2;

s1 = Console.ReadLine().ToLower();

s2 = ""; //строка может быть пустой

for (int i = 0; i < s1.Length; i++) s2 += s1[s1.Length-i-1];

Console.WriteLine(s2);

Здесь сначала описываются две строковые переменные s1 и s2. Далее с помощью метода ToLower вводимая с клавиатуры строка переводится в нижний регистр и результат присваивается переменной s1. Обратите внимание на цепочку вызовов методов Console.ReadLine().ToLower(). Сначала ReadLine возвращает строку, а затем ToLower переводит ее в нижний регистр.

Далее выполняется цикл, переворачивающий содержимое строки s1. Перевернутое содержимое оказывается в строке s2. Обратите внимание на то, что для определения длины строки используется Length. Вы не видите спика параметров в круглых скобках после Length. Это значит, что Length не является методом, а свойством класса. Позже мы обсудим свойства подробнее.

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

s[0]=’!’; //Ошибка

Класс String предлагает обширный набор полезных методов. В следующей таблице указаны некоторые из них.

Таблица членов класса String

Член Описание
Length Свойство, возвращающее длину текущей строки
Compare() и CompareTo() Методы, сравнивающие два заданных объекта String и возвращающие целое число (0,1,-1), которое показывает их связь друг с другом в порядке сортировки
Contains() Метод, применяемый для выяснения того, содержит ли текущий строковый объект данную строку
Copy() Метод, создающий новый экземпляр String, имеющий то же значение, что и заданный экземпляр String
CopyTo() Метод, копирующий заданное число знаков начиная с указанной позиции в этом экземпляре до указанной позиции в массиве знаков Юникода
EndsWith() и StartsWith() Методы, определяющие, совпадает ли конец (начало) экземпляра String с указанной строкой
Format() Метод, который заменяет каждый элемент формата в указанном объекте String текстовым эквивалентом значения соответствующего объекта
IndexOf() Метод, возвращающий индекс первого вхождения String или одного или нескольких знаков в данной строке
IndexOfAny() Метод, возвращающий индекс первого обнаруженного в данном экземпляре знака из указанного массива знаков Юникода
Insert() Метод, используемый для получения копии текущей строки, содержащей добавляемые строковые данные
Join() Метод, который вставляет заданный разделитель типа String между элементами заданного массива String, создавая одну сцепленную строку
LastIndexOf() Возвращает индекс последнего вхождения указанного знака Юникода или String в пределах данного экземпляра
LastIndexOfAny() Возвращает индекс последнего вхождения в данном экземпляре какого-либо одного или нескольких знаков, указанных в массиве знаков Юникод
PadLeft() и PadRight() Выравнивает знаки в данном экземпляре по левому (правому) краю, добавляя справа (слева) пробелы или указанные знаки Юникода до указанной общей длины
Remove() Replace() Методы, используемые для получения копии строки с соответствующими модификациями (при удалении или замене символов)
Split() Возвращает строковый массив, содержащий подстроки данного экземпляра, разделенные элементами заданной строки или массива знаков Юникода
Substring() Метод, возвращающий строку, которая представляет подстроку текущей отроки
ToCharArray() Метод, возвращающий массив символов, из которых состоит текущая строка
ToUpper() ToLower() Методы, создающие копию данной строки, представленную символами в верхнем или, соответственно, нижнем регистре
Trim() Удаляет все начальные и конечные вхождения заданных наборов знаков из текущего объекта String
TrimEnd() и TrimStart() Удаляет все конечные (начальные) вхождения набора знаков, заданного в виде массива, из текущего объекта String

 

Рассмотрим подробнее использование некоторых методов класса String.

Английское слово split означает «разбить на части». Одним вызовом этого метода можно решить популярную задачу разбиения текста на некоторые фрагменты.

Рассмотрим следующую постановку задачи:

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

Очевидно, что для решения этой задачи нужно выделять в тексте отдельные слова. Это достаточно сложный циклический процесс, поскольку слова отделяются друг от друга множеством разных символов-разделителей. Именно эту задачу решает метод Split.

Исходную строку можно получить путём ввода с клавиатуры.

string text = Console.ReadLine();

Для успешной работы методу Split нужно передать параметр – массив символов-разделителей.

char[] separators = new char[] {' ', ',', '.'};

(читатели, знакомые с массивами в языке С++ заметят, что описание и инициализация массивов в C# выглядит несколько иначе; об этом подробнее будет рассказано далее).

Метод Split в результате своей работы возвращает массив строк, полученных в результате выделения их из всего текста на основе информации о символах-разделителях.

string[] words = text.Split(separators);

Вот и всё! Однако, в этой короткой строчке содержится очень важное новшество, непосредственно относящее к объектно-ориентированному программированию. Метод Split вызывается в форме text.Split(…), то есть метод Split как будто принадлежит строковой переменной text. Это действительно правильная точка зрения, которую Вы должны усвоить в ходе этого курса. Будьте внимательны, поскольку некоторые методы класса String вызываются «от имени» класса, например, String.Format(…). Такие методы называются статическими. Методы, подобные Split называются нестатическими или методами экземпляра класса.

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

int L = 0;

for(int i = 0; i<words.Length; i++) L += words[i].Length;

double aL = Convert.ToDouble(L) / words.Length;

Здесь мы видим, что по своей форме цикл for в C# такой же, как и в С++. Новшеством является удобная возможность задать границу цикла (количество элементов массива!) с помощью свойства Length массива words, то есть массив сам содержит информацию о своём размере. Аналогично можно определить и длину (количество символов) одной строки: words[i].Length. Приведение Convert.ToDouble понадобилось для того, чтобы операция «деления» выдала вещественный, а не целый результат.

В C# имеется возможность несколько улучшить последний цикл, используя новую разновидность оператора цикла – foreach.

foreach(string w in words) L += w.Length;

Для читателя, знающего английский язык, этот цикл выглядит очень естественно, поскольку хорошо «переводится» на «человеческий» язык. В переводе на русский это звучит примерно так: «Для каждой строки w из words выполнить некоторое действие». Формальный синтаксис этого оператора следующий:

foreach(<тип> <переменная> in<массив>)<тело цикла>;

Далее Вы узнаете, что кроме массивов в цикле foreach можно использовать и другие «контейнерные» типы.

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

foreach(…) { Console.WriteLine(w); L += w.Length; }

Выполнение программы с входной строкой " yes, no hello." покажет, что метод Split разбил эту строку не на три, а на шесть строк: пустая строка, “yes”, пустая строка, “no”,“hello”, пустая строка. Это произошло потому, что метод Split считает «словом» любую строку, расположенную между символами-разделителями. Чтобы избавиться от этой проблемы можно «заставить» метод Split работать несколько иначе – не выделять в качестве «слов» пустые строки между соседними символами-разделителями. Для этого в метод Split нужно передать дополнительный параметр - StringSplitOptions.RemoveEmptyEntries. Теперь вызов метода выглядит так:

string[] words=

text.Split(separators, StringSplitOptions.RemoveEmptyEntries);

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

Ещё больший интерес представляет форма записи и тип этого параметра. Тип параметра является перечислением (подробнее об этом в следующем параграфе).



<== предыдущая лекция | следующая лекция ==>
Собственные пространства имен | Метод ToCharArray


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.