Слайд 2
Вопросы для повторения
Назовите 4 обязательных характеристики переменной?
Что определяет
типа данных?
Зачем определены 2 числовых типа данных: int и
double?
Какие операции можно выполнять над строками?
Как происходит сравнение строк?
Опишите “время жизни” переменной.
Слайд 3
Содержание
Массивы. Одномерные массивы
Понятие алгоритма, запись алгоритма
Примеры простейших
алгоритмов
Поиск наибольшего/наименьшего
Поиск условного наибольшего/наименьшего
Дополнительные операторы управления циклом (break и
continue)
Массивы. Многомерные массивы
Слайд 4
Массивы
Важнейшая структура данных
Массив – совокупность элементов данных одного
типа, имеющих одно имя, доступ к которым выполняется по
номеру элемента.
Массив – новый тип данных. Абстрактный. Контейнер.
Слайд 5
Примеры
int [] v = new int [16]; //
16 целых
double [] a = new double [4]; //
4 double
Массивы могут быть образованы из данных любого определенного ранее типа.
В общем виде:
<тип> [] <имя массива> = new <тип>[<количество>];
Слайд 6
Доступ к элементам массива
int [] v = new
int [16];
int x = v[3]; // чтение элемента массива
v[1]
= x; // изменение элемента
Слайд 7
Нумерация элементов массива
У объекта–массива имеется свойство Length.
int n
= v.Length; // количество элементов
Нумерация элементов всегда начинается с
0;
//Какой тип данных напоминает?
Слайд 8
Перебор элементов
double [] v = new double [16];
//Заполнение
массива
for(int i = 0; i < v.Length; i++)
{
v[i] =
…
}
Слайд 9
Инициализация массива
Массивы можно инициализировать как и обычные переменные.
int
[] a = new int[3] {1, 2, 3};
Для числовых
типов, если массив не инициализирован, все его элементы равны 0;
Для логических – false;
Для строковых – пустой строке.
Слайд 10
Применения массивов
Вектора в математике в программировании задаются массивами.
Задача.
Найти скалярное произведение векторов a(0,1,1) и b(1,1,0)
double [] a
= new double[3]{0,1,1};
double [] b = new double[3]{1,1,0};
double dp = 0;
for(int i = 0; i < a.Length; i++)
{
dp += a[i] * b[i];
}
//Здесь в dp содержится скалярное произведение векторов
Слайд 11
Контрольные вопросы
Что такое массив?
Могут ли элементы одного массива
иметь разные типы?
Какой номер имеет последний элемент массива v?
Чему
равен элемент массива v с номером 1?
int [] v = new int [3] {1, 2, 3};
Что общего между массивом символов и строкой?
В чем различие между массивом символов и строкой?
Слайд 12
Алгоритм
Алгоритм – конечная последовательность выполнимых действий, которая приводит
к решению задачи.
Поваренная книга - пример сборника алгоритмов: имеется
задача, исходные данные, указана последовательность действий для достижения цели.
Слайд 13
Текстовая запись алгоритма
Задача. Найти скалярное произведение двух векторов
одинаковой размерности.
Обозначим вектора имени a и b, а результат
dp.
Занулить аккумулятор dp (dp = 0)
Цикл по элементам вектора a. (i-тый компонент)
Увеличить аккумулятор dp на произведение i-тых (текущих) компонентов векторов a и b.
Конец цикла 2
В dp содержится скалярное произведение a и b.
Слайд 14
Поиск наибольшего/наименьшего
Задача. Найти значение наибольшего элемента массива.
Обозначим наибольшее
значение aMax, а массив a.
Присвоим aMax значение первого элемента
массива;
Цикл по элементам массива начиная со второго
Очередной элемент массива ai сравниваем с aMax
Если ai больше aMax, то присвоить значение ai в aMax
Конец цикла 2
В aMax содержится значение наибольшего элемента массива a.
Что изменится, если нужно найти наименьший?
Слайд 15
Программирование алгоритма
//Присвоим aMax значение первого элемента массива
double aMax
= a[0];
//Цикл по элементам массива начиная со второго
for(int i
= 1; i < a.Length; i++)
{
//Очередной элемент массива ai сравниваем с aMax
if(a[i] > aMax)
{
//Если ai больше aMax, то присвоить значение ai в aMax
aMax = a[i];
}
//Конец цикла 2
}
Слайд 16
Поиск наибольшего/наименьшего
Задача. Найти номер первого наибольшего элемента массива.
Обозначим
номер наибольшего элемента iMax, а массив a.
Присвоим iMax значение
0;
Цикл по элементам массива начиная со второго
Очередной элемент массива ai сравниваем с aiMax
Если ai больше aiMax, то присвоить значение i в iMax
Конец цикла 2
В iMax содержится номер первого наибольшего элемента массива a.
Как изменится, если нужен номер последнего наибольшего?
Слайд 17
Программирование алгоритма
//Присвоим iMax значение 0
int iMax = 0;
//Цикл
по элементам массива начиная со второго
for(int i = 1;
i < a.Length; i++)
{
//Очередной элемент массива ai сравниваем с aiMax
if(a[i] > a[iMax])
{
//Если ai больше aiMax, то присвоить значение i в iMax
iMax = i;
}
//Конец цикла 2
}
Слайд 18
Усложнение задачи
Задача. Найти значение наибольшего элемента массива целых,
среди элементов, делящихся на 3.
Исходная задача решалась так:
int aMax
= a[0];
for(int i = 1; i < a.Length; i++)
{
if(a[i] > aMax)
aMax = a[i];
}
Как ее изменить?
Слайд 19
Укрупнение алгоритма
Найти первый элемент массива, который делится на
3 и присвоить его в aMax.
Применить алгоритм “поиск наибольшего”
к оставшимся элементам массива, пропуская те, которые не делятся на 3.
Что произойдет, если у в массиве не будет элементов, которые делятся на 3?
Слайд 20
Уточнение алгоритма
Будем искать НОМЕР элемента
Поместить в iMax значение
-1
Найти номер первого элемента массива, который делится на 3
и присвоить его в iMax.
Если в массиве нет будет элементов, которые делятся на 3, то iMax будет равно -1. На этом решение задачи завершено. Искомого элемента нет!
Применить алгоритм “поиск наибольшего” к последующим (iMax) элементам массива, пропуская те, которые не делятся на 3.
Если в массиве не будет элементов, которые делятся на 3, то iMax будет равно -1. Если такие элементы есть, то iMax равно номеру наибольшего элемента
Слайд 21
Реализация алгоритма
int iMax = -1;
for(int i = 0;
i < a.Length; i++)
if(a[i] % 3 == 0)
{
iMax =
i;
break;
}
//Здесь известен номер первого элемента, который делится на 3
if(iMax >= 0)
{
for(int i = iMax + 1; i < a.Length; i++)
if(a[i] % 3 == 0 && a[i] > a[iMax])
iMax = i;
}
// Здесь iMax или равно -1 или равно номеру наибольшего элемента массива, среди тех, которые делятся на 3.
Слайд 22
Дополнительные операторы управления циклом
break – прекращает выполнение цикла
continue
– переход к следующей итерации
for(int i = 0; i
< 100; i++)
{
if(i%5 == 0) continue;
…
}
Слайд 23
Контрольные вопросы
Что такое алгоритм?
Что значит: “Задача не имеет
алгоритмического решения”?
Что означает фраза: “Степень детализации алгоритма”?
Для чего применяется
ключевое слово break?
Для чего применяется ключевое слово continue?
Как будет выглядеть алгоритм задачи:
“Найти среднее арифметическое элементов массива”?
7. В чем отличие алгоритма и программы, которые вы разрабатываете для реализации алгоритма?
Слайд 24
Многомерные массивы
Можно создавать массивы более чем из одной
размерности.
int [,] m = new int[3, 3] {{1, 2,
3}, {4,5,6}, {7,8,9}};
У такого массива свойство Length говорит об общем количестве элементов. (в примере m.Length == 9)
Чтобы узнать размер массива по одному из измерений нужно пользоваться методом GetLength(n), где n – целое число, номер измерения.
Нумеруются измерения с 0, т.е. m.GetLength(0) вернет количество строк матрицы m, а m.GetLength(1) – количество столбцов.
Элемент такого массива определяется 2-мя индексами
m[1,2] = …
int t = m[0,2]
Слайд 25
Массив массивов
Элементами массива могут быть и массивы.
int [][]
a = new int [3][];
Пользоваться таким массивом еще нельзя.
Нужно задать каждый из его элементов.
for(int i = 0; I < a.Length; i++)
a[i] = new int[3];
Теперь задана матрица, которая состоит из 3 строк по 3 элемента в каждой.
Слайд 26
Пример использования массива массивов
У массива массивов каждый элемент-массив
может иметь свою длину. Вот как можно выяснить длину
каждого элемента.
for(int i = 0; i < a.Length; i++)
Console.WriteLine(“Элемент {0} имеет длину {1}.”,
i, a[i].Length);
for(int i = 0; i < a.Length; i++)
for(int j = 0; j < a[i].Length; j++)
a[i][j] = i+j;
Слайд 27
Применения многомерных массивов
Матрицы в математике задаются двумерными массивами.
Задача.
Найти сумму 2-х матриц одинаковой размерности.
double [,] a =
new double[3,3]{{0,1,1}, {1,1,1}, {0,1,1}};
double [,] b = new double[3,3]{{1,1,0}, {2,0,0}, {3,1, 0}};
double [,] ab = new double[a.GetLength(0), a.GetLength(1)];
for(int i = 0; i < a.GetLength(0); i++)
for(int j = 0; j < a.GetLength(1); j++)
ab[i, j] = a[i, j] + b[i, j];
//Здесь в ab содержится сумма двух матриц a и b.