Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Podbelsky_V_V_C_Bazovy_kurs.pdf
Скачиваний:
69
Добавлен:
02.06.2015
Размер:
1.73 Mб
Скачать

138

Г л а в а 8

 

 

передается в виде строки как аргумент методу Parse() класса int (иначе System.Int32). Задача метода – сформировать код целого числа, которое станет значением переменной int res. Особенность (и опасность) – в прочитанной строке не должно быть символов, отличных от десятичных цифр и знака числа (+ или -). Перед изображением числа и после него могут находиться пробелы, которые будут отброшены (проигнорированы). Например, строка может быть такой:

" - 240 "

Значением переменной res будет -240.

Как уже говорилось, при неверной строковой записи значения анализируемого типа, метод Parse() генерирует исключение. При отсутствии в программе операторов обработки этих исключений (а мы их ещё не рассматривали) программа завершается аварийно.

Для решения той же задачи чтения из входной строки целочисленного значения метод TryParse() можно применить так:

int res;

do Console.Write("Введите целое число: "); while(int.TryParse(Console.ReadLine(),out res)==false);

В цикле с постусловием пользователю выводится приглашение "Введите целое число: ". Набранную на клавиатуре последовательность символов считывает метод Console.ReadLine(). Возвращаемая методом строка служит первым аргументом метода TryParse() из класса int. Если строка является корректным изображением целого числа, то его код присваивается аргументу res, а метод TryParse() возвращает значение true. Тем самым цикл завершается. В противном случае параметр res остается без изменений, метод TryParse() возвращает значение false, что приводит к следующей итерации цикла. Цикл будет повторяться, пока пользователь не введет правильного изображения целого числа.

Методов преобразований для предопределенных типов в классе System.Convert много, и у них разные имена. Например, для преобразования строки в код целого числа типа int предназначен метод:

Convert.ToInt32(строка);

Строки – объекты класса string

139

 

 

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

string sPi = "3,14159", radius = "10,0";

double circle = 2 * Convert.ToDouble(sPi) * Convert. ToDouble(radius);

Console.WriteLine("Длина окружности="+circle.ToString());

В примере определены две строки, содержащие изображения вещественных чисел (типа double). Обратите внимание, что дробная часть строкового представления каждого числа отделена от целой части запятой, а не точкой. Это связано (как мы уже упоминали) с правилами локализации системы, в которой исполняется программа. В Европе и в России целая и дробная части числа традиционно разделяются запятой. В инициализаторе переменной double circle использованы два обращения к одному методу класса Convert. Возвращаемые этими методами значения использованы для вычисления инициализирующего выражения. Как догадался проницательный читатель, будет получено приближенное значение длины окружности с радиусом 10. В аргументе метода Console.WriteLine() явно выполнено (хотя это и не обязательно) преобразование значения circle к значению типа string. На консоль будет выведено:

Длина окружности=62,8318

(Опять запятая в изображении числа.)

8.10. Аргументы метода Main()

До настоящего времени мы использовали вариант метода Main() без параметров. Имеется возможность определять метод Main() с таким заголовком:

public static void Main (string [ ] arguments)

где arguments – произвольно выбираемое программистом имя ссылки на массив с элементами типа string.

140

Г л а в а 8

 

 

Эти элементы массива представляют в теле метод Main() аргументы командной строки. Конкретные аргументы командной строки – это разделенные пробелами последовательности символов, размещенные после имени программы при ее запуске из командной строки.

Если программа запускается не из командной строки, а из среды Visual Studio, то для задания аргументов командной строки нужно использовать следующую схему. В основном меню выбираете пункт Project, затем в выпадающем меню выбираете команду имя_проекта Properties. В открывшемся окне на панели слева (Application) выбираете закладку Debug. Справа открывается панель, одно из текстовых полей которой названо Command line arguments. Текст, который вводится в

это поле, воспринимается как последовательность (разделённых пробелами) значений аргументов метода Main(). Как воспользоваться этими значениями (этим массивом строк) – дело автора программы. Продемонстрируем на следующем примере основные особенности обработки аргументов командной строки. Пусть требуется подсчитать сумму целых чисел, записанных через пробелы при запуске программы в командной строке.

Числа вводятся в виде наборов символов, которые отделены друг от друга (и от имени запускаемой программы) пробелами. В программе предусмотрим печать сообщения об отсутствии аргументов в командной строке.

Текст программы:

// 08_04.cs Аргументы метода Main() using System;

class Program

{

static void Main(string[] numbs)

{

int sum = 0;

if (numbs.Length == 0)

{

Console.WriteLine("Нет аргументов в командной строке!");

return;

}

Строки – объекты класса string

141

 

 

for (int i = 0; i < numbs.Length; i++) sum += Convert.ToInt32(numbs[i]);

Console.WriteLine("Сумма чисел = " + sum);

}

}

Результаты первого выполнений программы:

Командная строка: Program_1.exe<ENTER>

Результат:

Нет аргументов в командной строке!

Результаты второго выполнений программы:

Командная строка: Program_1.exe 24 16 -15<ENTER>

Результат:

Сумма чисел = 25

В теле метода Main() определена целочисленная переменная sum для подсчёта суммы. Параметр numbs – ссылка на массив ссылок на объекты типа string. Если при запуске программы в командной строке нет аргументов, – массив пуст, значение свойства numbs.Length равно нулю. Выводится сообщение "Нет аргументов в командной строке", и оператор return; завершает выполнение программы. При наличии аргументов, выполняется цикл for с параметром int i. (Можно применить и цикл foreach.) Строка – очередной элемент массива numbs[i]

– служит аргументом метода Convert.ToInt32(). Возвращаемое целочисленное значение увеличивает текущее значение переменной sum.

8.11. Неизменяемость объектов класса

String

К символам объекта класса string, будь то объект, созданный компилятором для представления строки-литера- ла, или объект, созданный с помощью обращения к конструк-

142

Г л а в а 8

 

 

тору класса string, можно обращаться только для получения их значений. Например, для получения значения одного символа строки используется выражение с операцией индексирования [ ].

Чтобы «изменить» строку, приходится прибегать к обходным маневрам. Например, можно переписать символы строки во вспомогательный массив с элементами типа char. Элементы такого массива доступны изменениям. Выполнив нужные преобразования, создадим на основе измененного массива новую строку, используя конструктор string (char[ ]). Если исходная строка не нужна, – можем присвоить ее ссылке значение ссылки на полученный объект. Схема преобразованний показана на рис.8.2.

Рис. 8.2. Как изменить объект типа string

Последовательность операторов, соответствующая описанной схеме:

string row = "0123456789"; char[] rev;

rev = row.ToCharArray(); Array.Reverse(rev);

row = new string(rev); Console.WriteLine(row);

Результат выполнения этого фрагмента программы:

9876543210

Строки – объекты класса string

143

 

 

В примере определена ссылка row на объект класса string, инициализированный строковым литералом "0123456789". Определена без инициализации ссылка rev на символьный массив. Затем к объекту, связанному ссылкой row, применен метод ToCharArray(), и результат присвоен ссылке rev. Метод Reverse() класса Array меняет на обратный порядок размещения значений элементов массива, связанного со ссылкой rev, использованной в качестве аргумента. Из измененного массива, адресованного ссылкой rev, конструктор string() создает новую строку, ссылка на которую присваивается переменной row. Тем самым разрывается связь ссылки row со строкой "0123456789", и row связывается с объектом, содержащим последовательность "9876543210".

Контрольные вопросы

1.Объясните различия между регулярным и буквальным строковыми литералами.

2.Каким образом в буквальный строковый литерал поместить символ кавычки?

3.Перечислите способы создания объектов типа string.

4.Перечислите операции над строками.

5.В чем особенность операции индексирования для строк?

6.В чем отличия и в чем сходство строк и массивов типа char[]?

7.Как выполняется операция присваивания для строк?

8.Какие операции сравнения применимы к строкам?

9.Перечислите особенности конкатенации строк со значениями других типов.

10.В каких случаях метод ToString() вызывается неявно?

11.Каково значение свойства Length для регулярного строкового литерала, содержащего эскейп-последовательности?

12.Как выполняется сравнение строк?

13.Как выполняется метод Join()?

14.Как выполняется метод Split()?

15.Объясните правила применения метода Format().

16.Назовите назначения элементов поля подстановки строки форматирования.

17.Перечислите спецификаторы формата, применяемые в полях подстановок.

18.Какой тип должна иметь переменная цикла foreach, применяемого к строке?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]