double arrow

Циклы for, foreach и while

Цикл for. Пример цикла for:

int k = 100;

int sum=0;

for(int i=1; i < =k; i++)

{

sum+=i;

}

Console.WriteLine(sum);

Этот пример подсчитывает сумму чисел от 1 до 100. Сумма записывается в переменную sum и выводится на экран.

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

int[] a = {-5, 4, 55};

int sum=0;

for(int i=0; i < 3; i++)

{

sum+=a[i];

}

В этом примере начальное значение для счетчика цикла равно нулю, и в условии продолжения цикла записывается знак "меньше", после которого ставится количество элементов в массиве. Разумеется, если в цикле должен выполниться только один оператор, то фигурные скобки можно не писать. Аналогичным образом цикл for организован в C/C++ - подобных языках.

Цикл foreach. Рассмотрим пример цикла foreach:

int[] m = {-5, 4, 10};

int sum=0;

foreach(int i in m)

{

sum+=i;

}

В данном примере суммируются все элементы массива m, а сумма записывается в sum.

В приведенном примере цикл перебирает все элементы массива m. На это указывает строка foreach(int i in m), которая интерпретируется так: для каждого целого числа из массива m выполняются некоторые действия. Если бы элементами массива были бы не целые, а, скажем, вещественные, то следовало бы записать foreach(float i in m).

Вообще foreach используется не только для массивов, но и для других объектов (например, для списков, хэш-таблиц).

Циклы while. Циклы while бывают двух видов - собственно цикл while и do-while. Оба эти цикла используются, как правило, когда точно не известно, сколько раз цикл должен выполниться. Например, при вводе пользователем пароля или при подсчете чего-либо с определенной точностью. Оба эти цикла будут выполняться до тех пор, пока условие в круглых скобках после слова while будет истинно. Как только условие станет равным false, выполнение цикла прекращается. Самое важное отличие между while и do-while в том, что while может не выполниться ни одного раза, тогда как do-while по крайней мере один раз выполнится. Вот примеры их использования:

// Пример 1

string password;

do

{

password=Console.ReadLine();

}

while(password!="wi98zK");

// Пример 2

int k=0; // Количество попыток

// заводим новую последовательность случайных чисел

Random rnd=new Random(112); //Пишем любой параметр

while(rnd.Next(1, 6)!=5)

{

k++;

};

Console.WriteLine("С "+(k+1).ToString()+"-го раза выпало 5");

В первом примере цикл будет вращаться до тех пор, пока пользователь не введет правильный пароль (wi98zK), во втором - пока некоторое случайное число не окажеться равным 5. При этом если число с самого начала оказалось равным пяти, то цикл вообще выполняться не будет.

Работа с массивами

В C# массив – это тип наследник от класса System.Array. Формально массив – набор элементов, доступ к которым производится с помощью числового индекса. Индексы могут содержать элементы любого встроенного типа данных С#, в том числе могут существовать массивы объектов, интерфейсов и структур.

Пример определения массива:

String[] stringArray

stringArray = new string[10];

Альтернативный вариант записи:

String[] stringArray = new string[10];

Размер массива задается при его создании, но не при объявлении. Следующий вариант создает массив из 3 элементов и заполняет его данными:

String []stringArray = {“Строка1”,”Строка2”,”Строка3”};

В C# при создании массива его элементам автоматически присваивается значение по умолчанию, в зависимости от используемого типа данных.

String [] stringArray = new string[10];

stringArray[0] = “Строка 1”;

stringArray[1] = “Строка 2”;

stringArray[2] = “Строка 3”;

Многомерные массивы

int [,] myMatrix;

myMatrix = new int[6,6];

for(int i=0; i < 6; i++)

{

for (int j=0; j < 6; j++)

{

  myMatrix[i,j]=i*j;

}

}

for (int i=0; i < 6; i++)

{

for (int j=0; j < 6; j++)

{

  Console.Write(String.Format("{0} ",myMatrix[i,j]));

}

Console.WriteLine();

}

Console.ReadLine();

Результат выполнения:

000000

012345

0246810

03691215

048121620

0510152025

Полученный массив является прямоугольным (квадратным).

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

// Ломаный массив

int size = 8;

int[][] jaggedArray = new int[size][];

jaggedArray[0] = new int[1];

jaggedArray[0][0] = 1;

for (int i=1; i < size; i++)

{

jaggedArray[i] = new int[i];

jaggedArray[i][0] = 1;

jaggedArray[i][i-1] = 1;

for (int j=2; j < jaggedArray[i].Length-1; j++)

{

  jaggedArray[i][j] = jaggedArray[i-1][j-1] +

  jaggedArray[i-1][j];

}

}

for (int i=0; i < size; i++)

{

for (int j=0; j < jaggedArray[i].Length; j++)

{

  Console.Write(String.Format("{0}",

jaggedArray[i][j]));

}

Console.WriteLine();

}

Результат выполнения - треугольник Паскаля:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

Работа со строками

Как было сказано выше, строки в C# – это объекты класса String, значением которых является текст. Для работы со строками в этом классе определено множество методов (функций). Рассмотрим некоторые из них.

Чтобы использовать строку, ее нужно сначала создать – присвоить какое-либо значение, иначе мы получим ошибку: "Использование локальной переменной "[имя переменной]", которой не присвоено значение". Объявим простую строку и выведем ее на экран:

string s = "Hello, World!";

Console.WriteLine(s);

string s;

Console.WriteLine(s); // ошибка, строка не создана

Для объединения (конкатенации) строк используется оператор "+".

string s = "Hello," + " World!";

Оператор "[]" используется для доступа (только чтение) к символу строки по индексу:

string s = "Hello, World!";

char c = s[1]; // 'e'

 

Свойство Length возвращает длину строки.

При задании строковой константы допустимо использовать специальные символы. Символ "\" является служебным, поэтому, чтобы использовать символ обратного слэ­ша необходимо указывать его дважды "\\". Символ табуляции – "\t" Символ перевода строки – "\r\n". Двойные кавычки – "\"".

3.8.1. Методы (функции) класса String
для работы со строками в C#

Метод IsNullOrEmpty() возвращает True, если значение строки равно null либо когда она пуста (значение равно ""):

string s1 = null, s2 = "", s3 = "Hello";

String.IsNullOrEmpty(s1); // True

String.IsNullOrEmpty(s2); // True

String.IsNullOrEmpty(s3); // False

Метод IsNullOrWhiteSpace() работает, как и метод IsNullOrEmpty(), только возвращает True еще и тогда, когда строка представляет собой набор символов пробела и/или табуляции ("\t"):

string s1 = null, s2 = "\t", s3 = " ", s4 = "Hello";

String.IsNullOrWhiteSpace(s1); // True

String.IsNullOrWhiteSpace(s2); // True

String.IsNullOrWhiteSpace(s3); // True

String.IsNullOrWhiteSpace(s4); // False

Для сравнивания строк используется метод Compare(). Суть сравнения строк состоит в том, что проверяется их отношение к алфавиту. Строка "a" "меньше" строки "b", "bb" "больше" строки "ba". Если обе строки равны - метод возвращает "0", если первая строка меньше второй – "-1", если первая больше второй – "1":

String.Compare("a", "b"); // возвращает -1

String.Compare("a", "a"); // возвращает 0

String.Compare("b", "a"); // возвращает 1

String.Compare("ab", "abc"); // возвращает -1

String.Compare("Romania", "Russia"); // возвращает -1

String.Compare("Rwanda", "Russia"); // возвращает 1

String.Compare("Rwanda", "Romania"); // возвращает 1

Чтобы игнорировать регистр букв, в метод нужно передать как третий аргумент true.

String.Compare("ab", "Ab"); // возвращает -1

String.Compare("ab", "Ab", true); // возвращает 0

Для перевода строки в верхний/нижний регистр используются методы ToUpper() и ToLower():

string s = "Hello, World";

Console.WriteLine(s.ToUpper()); //"HELLO, WORLD"

Console.WriteLine(s.ToLower()); //"hello, world"

Console.ReadLine();

Для проверки содержания подстроки строкой используется метод Contains(). Данный метод принимает один аргумент – подстроку. Возвращает True, если строка содержит подстроку, в противном случае – False. Пример:

string s = "Hello, World";

if (s.Contains("Hello"))

Console.WriteLine("Содержит");

Console.ReadLine();

Данная программа выводит слово "Содержит", так как "Hello, World" содержит подстроку "Hello".

Метод IndexOf() возвращает индекс первого символа подстроки, которую содержит строка. Данный метод принимает один аргумент – подстроку. Если строка не содержит подстроки, метод возвращает "-1". Пример:

string s = "Hello, World";

Console.WriteLine(s.IndexOf("H")); // 0

Console.WriteLine(s.IndexOf("World")); // 7

Console.WriteLine(s.IndexOf("Zoo")); // -1

Console.ReadLine();

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

string s = "Hello, World";

Console.WriteLine(s.StartsWith("Hello")); // True

Console.WriteLine(s.StartsWith("World")); // False

Console.WriteLine(s.EndsWith("World")); // True

Console.ReadLine();

Метод Insert() используется для вставки подстроки в строку, начиная с указанной позиции. Данный метод принимает два аргумента – позиция и подстрока. Пример:

string s = "Hello World";

// вставляет запятую на 5 позицию

Console.WriteLine(s.Insert(5,","));

Console.ReadLine();

Метод Remove() принимает один аргумент – позиция, начиная с которой обрезается строка:

string s = "Hello, World";

// удаляем все символы, начиная с 5 позиции,

// на экран выведется "Hello"

Console.WriteLine(s.Remove(5));

Console.ReadLine();

В метод Remove() можно передать и второй аргумент – количество обрезаемых символов. Remove(3,5) – удалит из строки пять символов, начиная с 3-го.

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

string s = "Hello, World";

// получаем строку, начиная с 7 позиции,

// выведет "World"

Console.WriteLine(s.Substring(7));

Console.ReadLine();

В метод Substring(), как в метод Remove(), можно передать и второй аргумент – длину подстроки. Substring(3,5) – возвратит подстроку длиной в 5 символов, начиная с 3-й позиции строки.

Заменить в строке все подстроки указанной новой подстрокой позволяет метод Replace(). Метод принимает два аргумента – подстроку, которую нужно заменить, и новую подстроку, на которую будет заменена первая:

string s = "Hello, World, Hello";

Console.WriteLine(s.Replace("Hello", "World"));

// выведет "World, World, World"

Console.ReadLine();

Метод ToCharArray() возвращает массив символов указанной строки:

string s = "Hello, World";

// элементы массива – 'H', 'e', 'l', 'l'

char[] array = s.ToCharArray();

Метод Split() позволяет разбить строку по указанному символу на массив подстрок. Метод принимает один аргумент - символ, по которому будет разбита строка. Возвращает массив строк. Пример:

string s = "Arsenal,Milan,Real Madrid,Barcelona";

string[] array = s.Split(',');

// элементы массива – "Arsenal", "Milan", "Real

// Madrid", "Barcelona"

Стоит знать, что объекты класса String представляют собой неизменяемые (Immutable) последовательности символов Unicode. Когда вы используете любой метод по изменению строки (например Replace()), он возвращает новую, измененную копию строки, исходные же строки остаются неизменными. Так сделано потому, что операция создания новой строки гораздо менее затратна, чем операции копирования и сравнения, что повышает скорость работы программы.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: