Оператор foreach
Оператор foreach применяется для перебора элементов в специальным образом организованной группе данных. Массив является именно такой группой. Удобство этого вида цикла заключается в том, что нам не требуется определять количество элементов в группе и выполнять их перебор по индексу: мы просто указываем на необходимость перебрать все элементы группы. Синтаксис оператора:
foreach ( тип имя in выражение ) тело_цикла
Имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива выражение (в качестве выражения чаще всего применяется имя массива или другой группы данных). В простом или составном операторе, представляющем собой тело цикла, выполняются действия с переменной цикла. Тип переменной должен соответствовать типу элемента массива.
Например, пусть задан массив:
int[] а = {24, 50, 18, 3, 16, -7, 9, -1};
Вывод этого массива на экран с помощью оператора foreach выглядит следующим образом:
foreach (int x in а)
Console.WriteLine(x);
Этот оператор выполняется так: на каждом проходе цикла очередной элемент массива присваивается переменной х и с ней производятся действия, записанные в теле цикла(пример 5).
Листинг 4.5 – пример 5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace lab4
{
class Program
{
public static void PrintArray(string header, Array arr)
{
Console.WriteLine(header);
foreach (int elem in arr)
Console.Write("\t" + elem);
Console.WriteLine();
}
static void Main(string[] args)
{
Console.WriteLine("Работа с одномерным массивом с использованием цикла foreach\n");
int[] arr = { 3, 12, 5, -9, 8, -4 };
PrintArray("Исходный массив", arr);
int sum = 0, num = 0;
int max = arr[0];
foreach (int elem in arr)
{
if (elem < 0)
{
sum += elem;
num++;
}
if (elem > max)
max = elem;
}
Console.WriteLine("Сумма отрицательных: " + sum);
Console.WriteLine("Кол-во отрицательных: " + num);
Console.WriteLine("Максимальный элемент: " + max);
}
}
}
Рисунок 4.7 – результат выполнения примера 5
Символы и строки
Обработка текстовой информации является, вероятно, одной из самых распространенных задач в современном программировании, и С# предоставляет для ее решения широкий набор средств: отдельные символы, массивы символов, изменяемые и неизменяемые строки и регулярные выражения.
Символы
Символьный тип char предназначен для хранения символов в кодировке Unicode. Символьный тип относится к встроенным типам данных С# и соответствует стандартному классу Char библиотеки .NET из пространства имен System. В этом классе определены статические методы, позволяющие задать вид и категорию символа, а также преобразовать символ в верхний или нижний регистр и в число. Основные методы приведены в таблице.
Таблица 4.2 – Основные методы класса System.Char
Метод Описание |
Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае |
GetNumericValue |
Возвращает категорию Unicode-символа1 |
GetUnicodeCategory |
Возвращает true, если символ является управляющим |
IsControl |
Возвращает true, если символ является десятичной цифрой |
IsDigit |
Возвращает true, если символ является буквой |
IsLetter |
Возвращает true, если символ является буквой или цифрой |
IsLetterOrDigit |
Возвращает true, если символ задан в нижнем регистре |
IsLower |
Возвращает true, если символ является числом (десятичным или шестнадцатеричным) |
IsNumber |
Возвращает true, если символ является знаком препинания |
IsPunctuation |
Возвращает true, если символ является разделителем |
IsSeparator |
Возвращает true, если символ записан в верхнем регистре |
Isllpper |
Возвращает true, если символ является пробельным (пробел, перевод строки и возврат каретки) |
IsWhiteSpace |
Преобразует строку в символ (строка должна состоять из одного символа) |
Parse |
Преобразует символ в нижний регистр |
ToLower |
Преобразует символ в верхний регистр |
ToUpper |
Возвращают символы с максимальным и минимальным кодами (эти символы не имеют видимого представления) |
MaxValue, MinValue |
Возвращает числовое значение символа, если он является цифрой, и -1 в противном случае |
В листинге 4.6 продемонстрировано использование этих методов.
Листинг4.6 – Использование методов класса System.Char
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace lab4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Использование методов класса System.Char");
try
{
char b = 'B', c = '\x63', d = '\u0032'; //1
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 //2
{
Console.Write("Введите символ ");
a = char.Parse(Console.ReadLine());
Console.WriteLine("Введен символ {0}, его код {1}", a, (int)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 != 'q');
}
catch
{
Console.WriteLine("Возникло исключение");
return;
}
}
}
}
Результат выполнения:
Рисунок 4.8 – Использование методов класса System.Char
В операторе 1 описаны три символьных переменных. Они инициализируются символьными литералами в различных формах представления. Далее выполняются вывод и преобразование символов.
В цикле 2 анализируется вводимый с клавиатуры символ. Можно вводить и управляющие символы, используя сочетание клавиши Ctrl с латинскими буквами. При вводе использован метод Parse, преобразующий строку, которая должна содержать единственный символ, в символ типа char. Поскольку вводится строка, ввод каждого символа следует завершать нажатием клавиши Enter. Цикл выполняется, пока пользователь не введет символ q.
Вывод символа сопровождается его кодом в десятичном виде1. Для вывода кода используется явное преобразование к целому типу. Явное преобразование из символов в строки и обратно в С# не существует, неявным же образом любой объект, в том числе и символ, может быть преобразован в строку2, например:
string s = 'к' + 'о' + 'т'; // результат - строка "кот"
При вводе и преобразовании могут возникать исключительные ситуации, например, если пользователь введет пустую строку. Для «мягкого» завершения программы предусмотрена обработка исключений.