Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OOP_C++ / 04

.htm
Скачиваний:
23
Добавлен:
02.02.2015
Размер:
11.69 Кб
Скачать
<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="03.htm">Предыдущее 
  занятие</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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 &lt;iostream&gt;

<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 &lt; n; i++)
    sum += a[i];
  cout &lt;&lt; &quot;Sum is &quot; &lt;&lt; ' ' &lt;&lt; sum;
  <b>return</b> 0;
}</pre>
  </blockquote>
</blockquote>
<h3> Пример 2<b></b></h3>
<p class="justified">Следующая программа находит номер максимального элемента 
  в массиве целых чисел.</p>
<blockquote> 
  <blockquote> 
    <pre>
#include &lt;iostream&gt;

<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 &lt; n; i++)
    <b>if</b> (a[i] &gt; a[indexOfMax])
      indexOfMax = i;
  cout &lt;&lt; indexOfMax &lt;&lt; ' ' &lt;&lt; a[indexOfMax];
  <b>return</b> 0;
}</pre>
  </blockquote>
</blockquote>
<h3> </h3>
<h3>Пример 3<b></b></h3>
<p class="justified">В следующей программе определяется сумма произведений строк 
  двумерного массива.</p>
<blockquote> 
  <blockquote> 
    <pre>
#include &lt;iostream&gt;

<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 &lt; 4; i++)
  {
    <b>int</b> product = 1;
    <b>for</b> (<b>int</b> j = 0; j &lt; 3; j++)
      product *= a[i][j];
    sum += product;
  }
  cout &lt;&lt; sum;
  <b>return</b> 0;
}</pre>
  </blockquote>
</blockquote>
<h3>Пример 4</h3>
<p class="justified">В следующей программе отрицательные элементы двумерного массива 
  заменяются нулями.</p>
<blockquote> 
  <blockquote> 
    <pre>
#include &lt;iostream&gt;

<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 &lt; 3; i++)
    <b>for</b> (j = 0; j &lt; 3; j++)
      <b>if</b> (a[i][j] &lt; 0)
        a[i][j] = 0;
  <b>for</b> (i = 0; i &lt; 3; i++)
  {
    <b>for</b> (j = 0; j &lt; 3; j++)
      cout &lt;&lt; '\t' &lt;&lt; a[i][j];
    cout &lt;&lt; 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&lt;<b>int</b>&gt;::min();</pre>
  </blockquote>
</blockquote>
<p class="justified">Для обхода всех элементов двумерного массива необходимо вложить 
  одну циклическую конструкцию в другую:</p>
<blockquote> 
  <blockquote> 
    <pre><b>for</b> (<b>int</b> i = 0; i &lt; 4; i++)
<b>  for</b> (<b>int</b> j = 0; j &lt; 3; j++)
<b>    if</b> (a[i][j] &lt; 0)
      max = (max &gt; a[i][j]) ? max : a[i][j]; // Выбор максимального из двух значений</pre>
  </blockquote>
</blockquote>
<p class="justified">В некоторых случаях может оказаться, что исходный массив 
  не содержит отрицательных элементов. В этом случае значение переменной max не 
  изменится:</p>
<blockquote> 
  <blockquote> 
    <pre><b>if</b> (max == numeric_limits&lt;<b>int</b>&gt;::min())
  cout &lt;&lt; "No negative values";
<b>else</b>
  cout &lt;&lt; max;</pre>
  </blockquote>
</blockquote>
<p class="justified">Вся программа будет иметь следующий вид:</p>
<blockquote> 
  <blockquote> 
    <pre>#include &lt;iostream&gt;
#include &lt;limits&gt;

<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&lt;<b>int</b>&gt;::min();
  <b>for</b> (<b>int</b> i = 0; i &lt; 4; i++)
    <b>for</b> (<b>int</b> j = 0; j &lt; 3; j++)
      <b>if</b> (a[i][j] &lt; 0)
        max = (max &gt; a[i][j]) ? max : a[i][j];
  <b>if</b> (max == numeric_limits&lt;<b>int</b>&gt;::min())
    cout &lt;&lt; "No negative values";
  <b>else</b>
    cout &lt;&lt; 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">&quot;Эратосфеново решето&quot;. Заполнить массив из трехсот 
  целых чисел последовательными положительными значениями. Заменить все значения, 
  не являющиеся простыми числами, некоторым отрицательным значением. Для этого 
  последовательно исключать все числа - делители других чисел. Вывести на экран 
  оставшиеся положительные значения (простые числа).</p>
<div align="left">
<p class="justified">&nbsp;</p>
</div>
<p class="justified"><a href="Index.htm">Содержание</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="03.htm">Предыдущее 
  занятие</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="05.htm">Следующее занятие</a></p>
<p class="justified">&nbsp;</p>
<p class="justified">© 2001 <code>-</code> 2006 Иванов Л.В. </p>
</body>
</html>
Соседние файлы в папке OOP_C++