foreach(Тип Переменная in Коллекция)

Лабораторная работа №3

Разработка циклических программ с заданным числом повторений

Цель работы

Целью работы является освоение процесса разработки циклических программ с заданным (известным) числом повторений на языке C#.

Задание на лабораторную работу

Разработать две программы с использованием цикла FOR:

Вычисление заданной величины (суммы N слагаемых, произведения N сомножителей и т.п.);

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

Требования к программе

См. ЛР№1 пункт 1.3.

Порядок выполнения работы

1. Получить вариант задания (п. 3.7).

2. Изучить правила использования оператора FOR для разработки циклических программ (п. 3.5).

3. Составить и отладить программу вычисления заданной величины (суммы N слагаемых, произведения N сомножителей и т.п.) в соответствии с подпунктом "а" варианта задания.

4. Изучить правила определения и использования данных типа "массив", (п. 3.6) и рекомендации по обработке массивов данных.

5. Разработать и отладить программы обработки данных с использованием двумерных массивов в соответствии с подпунктом "б" варианта задания.

6. Устно ответить на контрольные вопросы (п. 3.9).

7. Оформить отчет (см. п. 1.10)

Операторы повтора (цикла) FOR и FOREACH

Это самый популярный оператор цикла для всех С-подобных языков.

Популярность объясняется необычайной гибкостью и мощью этого оператора. Циклы for в языках типа Basic и тем более Pascal кажутся просто примитивными.

Формальная запись оператора for следующая:

For(начальные действия; условие; дополнительные действия)

{

Операторы тела цикла

}

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

Условие — логическое выражение, записывается так же, как и для других операторов цикла и оператора if.

Дополнительные действия — любые записанные через запятую операторы присваивания и (или) операторы-выражения (автоувеличение, автоуменьшение).

Алгоритм работы оператора for:

1. Вычисляются операторы, составляющие начальные действия.

2. Вычисляется условие. Если оно ложно, то оператор заканчивает свою работу. Если условие истинно, то выполняются операторы тела цикла, потом — операторы, составляющие группу дополнительных действий, и затем снова делается проверка истинности условия. И так до тех пор, пока оно остаётся истинным.

Количество операторов в начальных и в дополнительных действиях может быть любым. Любая часть в заголовке (или даже все части) могут отсутствовать:

for( ; ; ) { операторы тела цикла }

Пример программы вычисления температуры по Фаренгейту в зависимости от заданной температуры по Цельсию от 15 до 30 градусов. Перевод температуры выполняется по формуле F=C*1.8+32;

class Program

{

static void Main(string[] args)

{

int i;

double F=0;

Console.WriteLine("Температура по Цельсию и по Фаренгейту");

for (i = 15; i <= 30; i++)

{

F = i * 1.8 + 32;

Console.WriteLine("Цельсий={0} Фаренгейт={1}", i, F);

}

Console.Write("Press any key to continue . . . ");

Console.ReadKey(true);

}

}

 

Цикл foreach

Это новый вид цикла, которого не было в языках C/C++. Он появился только в языке C#. Дословный перевод: «для каждого».

Формальная запись этого цикла следующая:

foreach(Тип Переменная in Коллекция)

{

// тело цикла

}

где

Тип — тип данных;

Переменная — имя переменной;

in — ключевое слово;

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

Понимать оператор надо так: для каждого элемента коллекции в теле цикла надо выполнить требуемые действия.

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

3.6. Определение и использование данных типа "массив"

Массив — это совокупность данных одного типа, имеющих одно общее имя. Доступ к элементам массива осуществляется путём указания имени массива и номера элемента.

Одномерные массивы

Одномерный массив — это массив, имеющий одно измерение.

Прежде чем начать работать с массивом, необходимо создать ссылку на объект:

тип_элементов [] имя_массива;

 

Затем выделяется память под заданное количество элементов массива:

имя_массива = newтип_элементов[количество_элементов];

 

После этого с массивом можно выполнять какие-либо действия.

Например, создадим массив из 5 вещественных чисел:

double[] x;

x = new double[5];

 

Две рассмотренные выше операции можно объединить:

double[] x = new double[5];

 

Как и простую переменную, массив можно инициализировать, т.е. задать элементам массива начальные значения (пусть это будут числа 4,5,3,2,1):

double[] x = new double[5] { 4, 5, 3, 2, 1 };

 

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

Полученную запись можно упростить:

double[] x = { 4, 5, 3, 2, 1 };

 

Здесь память под массив будет выделяться по фактическому количеству данных, записанных в блоке (фигурных скобках).

В обоих случаях выделяется память под массива из 5 элементов вещественного типа.

Пример. Дан массив из n действительных чисел. Вычесть из каждого элемента массива среднее значение массива. Распечатать полученный массив.

double []x = new double[5];

int i, n = x.Length;

Console.WriteLine("Задайте {0} вещественных чисел:", n);

for(i = 0; i < n; i++)

{

Console.Write("x[{0}] = ", i);

x[i] = double.Parse(Console.ReadLine());

}

double s = 0;

for(i = 0; i < n; i++)

s += x[i];

s /= n; // это среднее значение

for(i = 0; i < n; i++)

x[i] -= s;

Console.WriteLine("Массив после обработки:");

foreach(double r in x)

Console.WriteLine(r);

Console.Write("Press any key to continue . . . ");

Console.ReadKey(true);

 

Двумерныемассивы (матрицы)

 

Двумерный массив имеет два измерения. Работа с матрицей, как и работа с одномерным массивом, начинается с создания ссылки на матрицу с последующим выделением памяти. Также возможна инициализация элементов матрицы. Пусть требуется создать матрицу действительных чисел A[2x3]. Рассмотрим варианты работы.

1)Создание ссылки на матрицу и выделение памяти:

double[,] a = new double[2, 3];

 

2)Создаём ссылку на матрицу, выделяем память и одновременно инициализируем элементы матрицы:

double[,] a = new double[2, 3] { { 2, 4, 0 }, { 1, 6, 4 } };

 

Как видим, каждую строку берём в свой блок, в остальном всё делается так же, как и для одномерного массива.

То же самое можно записать по аналогии с одномерным массивом ещё проще:

double[,] a = new double[,] { { 2, 4, 0 }, { 1, 6, 4 } };

 

Пример. Пронормировать матрицу действительных чисел A[2x3], т.е. каждый элемент матрицы поделить на максимальное по модулю число. Возможный вариант решения:

 

class Program

{

static void Main(string[] args)

{

const int n = 2;

const int m = 3;

double [,]a = new double[n, m];

int i, j;

Console.WriteLine("Задайте матрицу A[{0}*{1}]:", n , m);

for(i = 0; i < n; i++)

for(j = 0; j < m; j++)

a[i, j] = double.Parse(Console.ReadLine());

double max = Math.Abs(a[0, 0]);

for(i = 0; i < n; i++)

for(j = 0; j < m; j++)

if(Math.Abs(a[i, j]) > max)

max = Math.Abs(a[i, j]);

Console.WriteLine("max = {0}", max);

for(i = 0; i < n; i++)

for(j = 0; j < m; j++)

a[i, j] /= max;

Console.WriteLine("Mатрица A[{0}*{1}] после нормирования:", n , m);

for(i = 0; i < n; i++)

{

for(j = 0; j < m; j++)

Console.Write(a[i,j]+"\t ");

Console.WriteLine();

}

Console.Write("Press any key to continue . . . ");

Console.ReadKey(true);

}

}

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

При работе с многомерными массивами всё делается по аналогии. Единственно, надо учитывать количество измерений таких массивов. Пример описания трёхмерного массива:

 

double[, ,] V = new double[2, 3, 3];

 

Здесь выделяется память под массив, который можно представить состоящим из двух таблиц размером 3x3.

Пример инициализации трёхмерного массива:

double[, ,] V = new double[2, 3, 3]

{

{{2,4,0}, {1,6,4}, {5,3,3}},

{{2,1,6}, {1,8,5}, {0,2,7}}

};

 

А ещё проще инициализировать так:

double[, ,] V =

{

{{2,4,0}, {1,6,4}, {5,3,3}},

{{2,1,6}, {1,8,5}, {0,2,7}}

};

 

Дальнейшая работа с многомерными массивами ведётся как и с матрицами, только индексов больше и, как правило, возрастает вложенность циклов.

 

Стандартные методы и свойства для работы с массивами

 

Все массивы, как было сказано ранее, являются наследниками класса Array. Благодаря этому при работе с массивами имеется большое количество готовых методов и свойств. Рассмотрим некоторые из них. Во всех примерах x — одномерный массив, a — матрица.

Свойства

1)Length — возвращает количество элементов в массиве. Обычно используется в циклах, например:

for (i = 0; i < x.Length; i++)

Console.WriteLine(x[i]);

2)Rank — возвращает размерность массива. Пример:

int r = a.Rank;

Console.WriteLine("Размерность=" + r);

Методы

1)Sort() — сортировка массива. Метод многократно перегружен. Примеры использования:

- сортируем весь массив по возрастанию:

Array.Sort(x);

 

- начиная с i-го элемента, упорядывачиваем k элементов массива (у нас: сортируем 3 элемента, начиная с 2-го):

Array.Sort(x, 2, 3);

 

2)Reverse() — изменяем порядок следования элементов массива на обратный:

Array.Reverse(x);

 

А таким способом первые три элемента будут записаны в обратном порядке:

Array.Reverse(x, 0, 3);

 

3)BinarySearch() — поиск в упорядоченном массиве индекса элемента, равного заданному значению. Если поиск не увенчался успехом, то ответом будет отрицательное число. Пример:

int t = 4;

int j = Array.BinarySearch(x, t);

 

4)IndexOf() — поиск первого вхождения в массиве заданного значения, например, поиск положения числа 4 в массиве x. Если в массиве нет такого значения, то ответом будет отрицательное число.

 

int j = Array.IndexOf(x, 4);

 

5)LastIndexOf() — поиск последнего вхождения в массиве заданного значения, например, поиск положения числа 4 в массиве x. Если в массиве нет такого значения, то ответом будет отрицательное число.

int j = Array.LastIndexOf(x, 4);

 

6)GetLength() — получение количества элементов по данной размерности.

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

for (i = 0; i < a.GetLength(0); i++)

for (j = 0; j < a.GetLength(1); j++)

a[i, j] = double.Parse(Console.ReadLine());

Варианты заданий

1.а) Вычислить n!

б) Подсчитать количество нулевых элементов кортежа

в) Определить количество элементов матрицы, значения которых не превышают заданное число.

2.а) Вычислить .

б) Подсчитать сумму нечетных элементов кортежа

в) Найти минимальный элемент матрицы n´m.

3.а) Вычислить .

б) Заменить отрицательные элементы кортежа на 0.

в) Найти максимальный элемент матрицы.

4.а) Вычислить .

б) Найти сумму четных и нечетных по номеру элементов кортежа А(20)

в) Поменять местами минимальный и максимальный элемент матрицы.

5.а) Вычислить .

б) Вычислить разность элементов двух кортежей одинаковой размерности

в) Поменять местами два заданных элемента матрицы.

6.а) Вычислить .

б) Разделить четные по номеру элементы кортежа на 2 и умножить нечетные на 2.

в) Поменять местами две заданных строки матрицы.

7.а) Вычислить .

б) Вывести на печать номера элементов кортежа, значение которых равно p

в) Транспонировать матрицу А (5´5)

8.а) Вычислить .

б) Подсчитать количество отрицательных и положительных элементов кортежа.

в) Сформировать массив В, содержащий сумму элементов каждого столбца матрицы А.

9.а) Вычислить .

б) Заменить все элементы кортежа, значение которых больше "-3" и меньше "+3", на 0.

в) Поменять местами два заданных столбца матрицы.

10.а) Вычислить .

б) Найти сумму отрицательных и количество положительных элементов кортежа В(25).

в) Определить количество отрицательных элементов матрицы.

11.а) Вычислить

б) Переписать элементы кортежа А(20) в кортеж В(20) в обратном порядке.

в) Определить количество положительных элементов матрицы.

12.а) Вычислить .

б) Заменить отрицательные элементы кортежа на их квадрат.

в) Вычислить среднее арифметическое элементов матрицы.

13.а) Вычислить .

б) Переставить элементы кортежа в обратном порядке.

в) Вычислить произведение отрицательных элементов матрицы.

14.а) Вычислить .

б) Заполнить кортеж А случайными числами от 0 до 15 с помощью функции Random и подсчитать количество элементов кортежа, значение которых больше 7.

в) Вычислить сумму положительных элементов матрицы.

15.а) Вычислить .

б) Найти произведение нечетных по номеру элементов кортежа А(10).

в) Все отрицательные элементы матрицы возвести в квадрат.

16.а) Вычислить

б) Определить номер и значение минимального элемента кортежа

в) Сформировать массив B, содержащий максимальные элементы строк матрицы A.

17.а) Вычислить .

б) Всем четным по номеру элементам кортежа присвоить значение 0, а нечетным 1.

в) Сформировать массив B, содержащий суммы элементов строк матрицы A.

18.а) Вычислить

б) Вычислить сумму n членов геометрической прогрессии.

в) Вычислить сумму всех отрицательных элементов матрицы.

19.а) Вычислить .

б) Заполнить кортеж А случайными числами от 0 до 10 с помощью функции Random и подсчитать среднее арифметическое элементов кортежа.

в) Вычислить сумму элементов вспомогательной диагонали матрицы М(5´5)

20.а) Вычислить .

б) Определить номер максимального элемента кортежа

в) Вычислить сумму элементов главной диагонали матрицы.

 

Содержание отчета (см. п. 1.10)

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

1. Каково назначение операторов цикла FOR и FOREACH?

2. Каковы правила записи оператора цикла FOR?

3. Каковы алгоритмы работы оператора цикла FOR?

4. Какие циклы называются вложенными?

5. Какие ограничения наложены на оператор FOR?

6. Как определяются данные типа "массив"?

7. Какие типы могут иметь индексы?

8. Как получить доступ к элементам одно-, дву-, n-мерного массива?

9. Как можно организовать ввод (вывод) элементов одно-, дву, n-мерного массива?