Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:OOP_C++ / 04
.htm<html>
<head>
<title>04 - Массивы</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<link rel="stylesheet" href="lects.css" type="text/css">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p class="justified"><a href="Index.htm">Содержание</a> <a href="03.htm">Предыдущее
занятие</a> <a href="05.htm">Следующее занятие</a></p>
<h3>Занятие 04</h3>
<table width="100%" border="0" height="46">
<tr>
<td height="9" class="title">
<h1 align="center" class="Head"><font color="#000000">Массивы</font></h1>
</td>
</tr>
</table>
<h2>1 Массивы</h2>
<p class="justified">Массивы относятся к так называемым сложным, или составным
типам данных. Массив - это структура данных, состоящая из элементов одного типа.
В отличие от других структур данных (например, списков), элементы массивов всегда
последовательно расположены в памяти.</p>
<p class="justified">При объявлении массива после идентификатора в квадратных
скобках задается константа (в частности именованная или константное выражение)
- число элементов массива:</p>
<blockquote>
<blockquote>
<pre><b>int</b> a[5]; // Массив из пяти элементов типа <b>int</b>
<b>const</b> <b>int</b> n = 5;
<b>double</b> a1[n]; // Массив из пяти элементов типа <b>double</b> </pre>
</blockquote>
</blockquote>
<p class="justified">Число элементов массива нельзя задавать переменной или неконстантным
выражением. Массив может инициализироваться списком значений в фигурных скобках:
</p>
<blockquote>
<blockquote>
<pre><b>int</b> b[4] = {1, 2, 3, 4}; </pre>
</blockquote>
</blockquote>
<p class="justified">При наличии списка инициализации, охватывающего все элементы
массива, можно не указывать число элементов массива, оно будет определено компилятором:
</p>
<blockquote>
<blockquote>
<pre><b>int</b> c[] = {1, 2, 3}; // Массив из трех элементов типа <b>int</b> </pre>
</blockquote>
</blockquote>
<p class="justified">Если размерность массива больше числа значений в списке,
то не инициализированные явно элементы массива будут установлены в 0 (значение
по умолчанию). Если размерность массива меньше числа значений в списке, возникнет
ошибка компиляции.</p>
<p class="justified">Один массив не может инициализироваться другим массивом и
не может быть присвоен другому массиву. Чтобы скопировать один массив в другой,
необходимо скопировать каждый элемент по очереди в цикле.</p>
<p class="justified">Доступ к каждому элементу осуществляется по его номеру в
массиве (индексу), который указывается после имени массива в квадратных скобках.
В качестве индекса массива может использоваться любое выражение, которое приводится
к целочисленному значению. Индексы элементов массива всегда начинаются с 0,
индекс последнего элемента на единицу меньше числа элементов в массиве. Размерность
массива известна транслятору только в момент определения массива. При использовании
стандартных массивов невозможен какой-либо автоматический контроль выхода за
пределы массива. </p>
<h2>2 Многомерные массивы</h2>
<p class="justified">Массивы с размерностью 2 и более рассматриваются как массивы
массивов и для каждого измерения указывается число элементов: </p>
<blockquote>
<blockquote>
<pre><b>double</b> aa[2][2] = {1, 2, 3, 4}; // Матрица 2 * 2 </pre>
</blockquote>
</blockquote>
<p class="justified">То же самое, но более наглядно: </p>
<blockquote>
<blockquote>
<pre><b>double</b> aa[2][2] = {{1, 2},
{3, 4}}; </pre>
</blockquote>
</blockquote>
<p class="justified">Первая размерность - это размерность по строкам, а вторая
- по столбцам. При инициализации списка значений вторая и последующие размерности
должны указываться явно.</p>
<p class="justified">Для индексирования в многомерном массиве требуется пара скобок
для каждого измерения:</p>
<blockquote>
<blockquote>
<pre><b>int</b> i = 0, j = 1;
aa[i][j] = i + j;</pre>
</blockquote>
</blockquote>
<p class="justified">Элементы многомерных массивов в памяти выстраиваются в одномерную
структуру (массив), в которой в начале стоят элементы первой строки, потом второй
и т.д.</p>
<h2>3 Примеры программ</h2>
<h3>Пример 1<b></b></h3>
<p class="justified">Следующая программа находит сумму элементов массива вещественных
чисел.</p>
<blockquote>
<blockquote>
<pre>
#include <iostream>
<b>using</b> <b>namespace</b> std;<b>
</b>
<b></b><b>int</b> main()
{
<b>const int</b> n = 5;
<b>double</b> a[] = {1, 2, 1, 2.5, 1};
<b>double</b> sum = 0;
<b>for</b> (<b>int</b> i = 0; i < n; i++)
sum += a[i];
cout << "Sum is " << ' ' << sum;
<b>return</b> 0;
}</pre>
</blockquote>
</blockquote>
<h3> Пример 2<b></b></h3>
<p class="justified">Следующая программа находит номер максимального элемента
в массиве целых чисел.</p>
<blockquote>
<blockquote>
<pre>
#include <iostream>
<b>using</b> <b>namespace</b> std;<b>
</b>
<b></b><b>int</b> main()
{
<b>const int</b> n = 4;
<b>int</b> a[] = {1, 2, 4, 8};
<b>int</b> indexOfMax = 0;
<b>for</b> (<b>int</b> i = 1; i < n; i++)
<b>if</b> (a[i] > a[indexOfMax])
indexOfMax = i;
cout << indexOfMax << ' ' << a[indexOfMax];
<b>return</b> 0;
}</pre>
</blockquote>
</blockquote>
<h3> </h3>
<h3>Пример 3<b></b></h3>
<p class="justified">В следующей программе определяется сумма произведений строк
двумерного массива.</p>
<blockquote>
<blockquote>
<pre>
#include <iostream>
<b>using</b> <b>namespace</b> std;<b>
</b>
<b></b><b>int</b> main()
{
<b>int</b> a[][3] = {{1,2,3},
{2,3,4},
{0,1,2},
{1,1,12}};
<b>int</b> sum = 0;
<b>for</b> (<b>int</b> i = 0; i < 4; i++)
{
<b>int</b> product = 1;
<b>for</b> (<b>int</b> j = 0; j < 3; j++)
product *= a[i][j];
sum += product;
}
cout << sum;
<b>return</b> 0;
}</pre>
</blockquote>
</blockquote>
<h3>Пример 4</h3>
<p class="justified">В следующей программе отрицательные элементы двумерного массива
заменяются нулями.</p>
<blockquote>
<blockquote>
<pre>
#include <iostream>
<b>using</b> <b>namespace</b> std;<b>
</b>
<b>int</b> main(<b>int</b> argc, <b>char</b>* argv[])
{
<b>double</b> a[][3] = {{1, -2, 3},
{2.1, 3, -4},
{0,-0.5, 11}};
<b>int</b> i, j;
<b>for</b> (i = 0; i < 3; i++)
<b>for</b> (j = 0; j < 3; j++)
<b>if</b> (a[i][j] < 0)
a[i][j] = 0;
<b>for</b> (i = 0; i < 3; i++)
{
<b>for</b> (j = 0; j < 3; j++)
cout << '\t' << a[i][j];
cout << endl;<br> }<b>
return</b> 0;
}</pre>
</blockquote>
</blockquote>
<blockquote>
<blockquote></blockquote>
</blockquote>
<h3>Пример 5</h3>
<p class="justified">Необходимо проинициализировать двумерный массив целых чисел
списком начальных значений, найти максимальный среди отрицательных элементов
и вывести на экран.</p>
<p class="justified">При инициализации массива важно обратить внимание на обязательное
явное указание количества столбцов:<br>
</p>
<blockquote>
<blockquote>
<pre><b>int</b> a[][3] = {{-4, 3, 11},
{ 1, -1, -5},
{ 0, -2, 12},
{15, 11, -9}};</pre>
</blockquote>
</blockquote>
<p class="justified">Для вычисления максимума среди отрицательных элементов можно
воспользоваться следующей схемой: вначале искомому значению присваивается очень
большое по модулю отрицательное значение, затем в цикле данное значение заменяется,
если текущий отрицательный элемент оказался больше. Гарантированно маленькое
отрицательное число можно получить с помощью специализации шаблона класса numeric_limits
(заголовочный файл limits) и получения искомого значения с помощью функции-элемента
min() (объяснение данной конструкции будет дано позже):</p>
<blockquote>
<blockquote>
<pre><b>int</b> max = numeric_limits<<b>int</b>>::min();</pre>
</blockquote>
</blockquote>
<p class="justified">Для обхода всех элементов двумерного массива необходимо вложить
одну циклическую конструкцию в другую:</p>
<blockquote>
<blockquote>
<pre><b>for</b> (<b>int</b> i = 0; i < 4; i++)
<b> for</b> (<b>int</b> j = 0; j < 3; j++)
<b> if</b> (a[i][j] < 0)
max = (max > a[i][j]) ? max : a[i][j]; // Выбор максимального из двух значений</pre>
</blockquote>
</blockquote>
<p class="justified">В некоторых случаях может оказаться, что исходный массив
не содержит отрицательных элементов. В этом случае значение переменной max не
изменится:</p>
<blockquote>
<blockquote>
<pre><b>if</b> (max == numeric_limits<<b>int</b>>::min())
cout << "No negative values";
<b>else</b>
cout << max;</pre>
</blockquote>
</blockquote>
<p class="justified">Вся программа будет иметь следующий вид:</p>
<blockquote>
<blockquote>
<pre>#include <iostream>
#include <limits>
<b>using</b> <b>namespace</b> std;
<b>int</b> a[][3] = {{-4, 3, 11},
{ 1, -1, -5},
{ 0, -2, 12},
{15, 11, -9}};
<b>int</b> main(<b>int</b> argc, <b>char</b>* argv[])
{
<b>int</b> max = numeric_limits<<b>int</b>>::min();
<b>for</b> (<b>int</b> i = 0; i < 4; i++)
<b>for</b> (<b>int</b> j = 0; j < 3; j++)
<b>if</b> (a[i][j] < 0)
max = (max > a[i][j]) ? max : a[i][j];
<b>if</b> (max == numeric_limits<<b>int</b>>::min())
cout << "No negative values";
<b>else</b>
cout << max;
<b>return</b> 0;
}</pre>
</blockquote>
</blockquote>
<h2>4 Задания на самостоятельную работу</h2>
<h3>Задание 1</h3>
<p class="justified">Найти сумму положительных элементов одномерного массива вещественных
чисел.</p>
<h3>Задание 2</h3>
<p class="justified">Проинициализировать одномерный массив вещественных чисел
списком начальных значений, определить сумму минимального и максимального элементов
и вывести на экран.</p>
<h3></h3>
<h3>Задание 3</h3>
<p class="justified">Проинициализировать двумерный массив целых чисел списком
начальных значений, найти произведение ненулевых (неравных нулю) элементов и
вывести на экран. Для пропуска ненулевых элементов использовать оператор <b>continue</b>.</p>
<h3>Задание 4*</h3>
<p class="justified">Проинициализировать одномерный массив вещественных чисел
списком начальных значений, изменить порядок следования элементов на противоположный
и вывести элементы массива на экран.</p>
<h3>Задание 5*</h3>
<p class="justified">"Эратосфеново решето". Заполнить массив из трехсот
целых чисел последовательными положительными значениями. Заменить все значения,
не являющиеся простыми числами, некоторым отрицательным значением. Для этого
последовательно исключать все числа - делители других чисел. Вывести на экран
оставшиеся положительные значения (простые числа).</p>
<div align="left">
<p class="justified"> </p>
</div>
<p class="justified"><a href="Index.htm">Содержание</a> <a href="03.htm">Предыдущее
занятие</a> <a href="05.htm">Следующее занятие</a></p>
<p class="justified"> </p>
<p class="justified">© 2001 <code>-</code> 2006 Иванов Л.В. </p>
</body>
</html>