Некоторые алгоритмы обработки массивов

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

ПРОГРАММИРОВАНИЕ ЗАДАЧ ОБРАБОТКИ ОДНОМЕРНЫХ МАССИВОВ

 

Цель и порядок работы

Цель работы - изучить операторы и алгоритмы, используемые при организации вычислительных процессов обработки одномерных массивов данных, получить практические навыки в составлении подобных программ.

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

· ознакомиться с описанием лабораторной работы;

· получить задание у преподавателя по вариантам;

· разработать алгоритм решения задачи;

· написать программу, ввести программу, отладить и выполнить ее на ЭВМ;

· оформить отчет.

·

Общие сведения

До настоящего момента в программах были использованы простые переменные. Для хранения значения каждой такой переменной, имеющей свое имя, выделяется своя область памяти. По сути, имя имеет эта выделенная область памяти, которая хранит текущее значение переменной. Если переменных много, программа, предназначенная для их обработки, получается длинной, и в ней не удается в полной мере использовать компьютерные возможности. Одним из случаев, когда ее удается сделать лаконичной и эффективной, является ситуация, требующая обработки однотипных величин, которые к тому же должны обрабатываться по одним и тем же правилам.

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

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

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

Массив значимых типов хранит значения, массив ссылочных типов — ссылки на элементы. Всем элементам при создании массива присваиваются значения по умолчанию: нули для значимых типов и null — для ссылочных.

Вот, например, как выглядят операторы создания массива из 5 целых чисел и массива из 5 строк:

int[ ] а = new int[5];

string[ ] z = new string[5];

В первом операторе описан массив а, состоящий из пяти элементов значимого типа int[ ]. Операция new выделяет память под 5 целых элементов, и они заполняются нулями (рис. 1).

 
 

 


Рисунок 1-Массив из элементов значимого типа

 

Во втором операторе описан массив z ссылочного типа string[ ]. Операция new выделяет память под 5 ссылок на строки, и эти ссылки заполняются значением null. Память под сами строки, составляющие массив, не выделяется — это будет необходимо сделать перед заполнением массива (рис. 2).

Рисунок 2 -Массив из элементов ссылочного типа

 

Количество элементов в массиве (размерность) задается при выделении памяти и не может быть изменено впоследствии. Размерность может задаваться не только константой, но и выражением. Результат вычисления этого выражения должен быть неотрицательным, а его тип должен иметь неявное преобразование к int, uint, long или ulong.

Пример размерности массива, заданной выражением:

short m = . . . ;

string[ ] s = new string[m + 1];

Элементы массива нумеруются с нуля, поэтому максимальный номер элемента всегда на единицу меньше размерности (например, в описанном выше массиве а элементы имеют индексы от 0 до 4). Для обращения к элементу массива конструкция переменная с индексом, где после имени массива указывается порядковый номер элемента в квадратных скобках, например:

а[4] z[i]

 

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

В С# для предотвращения подобной ситуации автоматически выполняется контроль выхода индекса за его объявленные границы и, если индекс принимает недопустимое значение, генерируется исключение IndexOutOfRangeException.

Массивы одного типа можно присваивать друг другу. При этом происходит присваивание ссылок, а не элементов, как и для любого другого объекта ссылочного типа, например:

int [ ] а = new int[10];

int[ ] b = а; / / b и а указывают на один и тот же массив

В С# массивы могут быть одномерными или многомерными. Многомерные массивы, в свою очередь, могут быть прямоугольными и ступенчатыми (невыровненными).

 

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

Одномерный массив - это такой массив, для идентификации которого требуется указать значение только одного индекса.

Для объявления одномерного массива используется следующая форма записи:

тип[] имя_массива = new тип [размер];

 

Формат инициализации одномерного массива имеет следующий вид:

тип[] имя_массива = [val1, val2,…, valN];

 

Здесь начальные значения, присваиваемые элементам массива, задаются с помощью последовательности val1-valN. Для получения доступа к элементу одномерного массива требуется указать индекс нужного элемента:

имя_массива[индекс] = val;

Существует несколько вариантов описания массива:

тип[ ] имя;

тип[] имя = new тип [ размерность ];

тип[] имя = { список_инициализаторов };

тип[] имя = new тип [] { список_инициализаторов };

тип[] имя = new тип [ размерность ] { список_ииициализаторов };

Примеры описаний (один пример для каждого варианта описания):

int[ ] а; / / 1 элементов нет

int[ ] b = new int[4]; / / 2 элементы равны 0

int[ ] с = { 61, 2, 5, -9 }; / / 3 new подразумевается

int[ ] d = new int[ ] { 61, 2, 5, -9 }; / / 4 размерность вычисляется

int[ ] е = new int[4] { 61, 2, 5, -9 }; / / 5 избыточное описание

Здесь описано пять массивов. Отличие первого оператора от остальных состоит в том, что в нем, фактически, описана только ссылка на массив, а память под элементы массива не выделена. Если список инициализации не задан, размерность может быть не только константой, но и выражением типа, приводимого к целому,

В каждом из остальных массивов по четыре элемента целого типа. Как видно из операторов 3-5, массив при описании можно инициализировать. Если при этом не задана размерность (оператор 4), количество элементов вычисляется по количеству инициализирующих значений. Для полей объектов и локальных переменных можно опускать операцию new, она будет выполнена по умолчанию (оператор 3). Если присутствует и размерность, и список инициализаторов, размерность должна быть константой (оператор 5).

Если количество инициализирующих значений не совпадает с размерностью, возникает ошибка компиляции.

Рассмотрим несколько часто встречающихся на практике задач обработки одномерных массивов.

 

Некоторые алгоритмы обработки массивов

Пример 1. Поиск наибольшего элемента в одномерном массиве.

Исходными данными в поставленной задаче являются массив x и его размерность n. Решение этой задачи осуществляется с помощью цикла по параметру i, изменяющегося с шагом +1 от 1 до n-1. Перед входом в цикл переменной max присваивается значение первого элемента массива х[0].

С каждым итерацией цикла происходит переход к новому элементу массива и сравнение его значения со значением, хранящемся в переменной max. Если значение текущего элемента массива оказывается больше значения max, то переменной max присваивается значение элемента массива с текущим порядковым номером. После выхода из цикла выводится найденное значение наибольшего элемента массива.

 

Листинг 1 – Поиск максимального элемента в одномерном массиве

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

const int n = 6;

int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };

 

Console.WriteLine("Исходный массив:");

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

Console.WriteLine("\t" + a[i]);

Console.WriteLine();

int max = a[0];

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

if (a[i] > max)

max = a[i];

Console.WriteLine("Максимальный элемент = " + max);

Console.Read();

}

}

}

Результаты расчета:

 

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

 

Пример 2. Найти сумму и количество отрицательных элементов, а также максимальный элемент массива.

В данной задаче предыдущий алгоритм входит как составная часть общего решения (листинг 2). Дополнительный независимый цикл с параметром:

long sum=0; // сумма отрицательных элементов

int num = 0; // количество отрицательных элементов

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

if ( a[i] < 0 )

{

sum += a[i];

++num;

}

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

Листинг 2 - Работа с одномерным массивом к примеру 2

using System;

namespace ConsoleApplication1

{

class Class1

{

static void Main()

{

const int n = 6;

int[ ] a= new int[n] { 3,12,5,-9,8,-4};

 

Console.WriteLine( "Исходный массив:" );

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

Console.WriteLine( "\t" + a[i] );

Console.WriteLine( );

long sum=0; // сумма отрицательных элементов

int num = 0; // количество отрицательных элементов

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

if ( a[i] < 0 )

{

sum += a[i];

++num;

}

Console.WriteLine( "Сумма отрицательных = " + sum );

Console.WriteLine( "Кол-во отрицательных = " + num );

 

int mах = a[0]; // максимальный элемент

for ( int i = 1; i < n; ++i )

if ( a[i] > mах ) mах = a[i];

Console.WriteLine( "Максимальный элемент = " + mах );

Console.Read();

}

}

}

 

Результаты расчета:

 

 

Пример 3.Сортировка элементов одномерного массива по убыванию методом выбора.

Введем дополнительные определения:

X - исходный массив, который нужно упорядочить;

Max- максимальный элемент массива;

Im- индекс максимального элемента;

сh- переменная для обмена элементов;

exch- признак нахождения Max в неотсортированной части массива.

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

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

 

Листинг 3 – Сортировка одномерного массива методом «выбора»

using System;

 

namespace ConsoleApplication7

{

class Program

{

static void Main(string[] args)

{

const int n = 6;

int ch;

int[] x = new int[n] { 3, 12, 5, -9, 8, -4 };

Console.WriteLine("Исходный массив:");

for (int i = 0; i <= n - 1; ++i)

Console.Write(" " + x[i]);

int im = n - 1;

for (int j = 0; j <= n - 2; j++)

{

int max = x[j];

bool exch = false;

for (int i = j + 1; i <= n - 1; ++i)

if (x[i] > max)

{

max = x[i];

im = i;

exch = true;

}

if (exch == true)

{

ch = x[j];

x[j] = max;

x[im] = ch;

}

}

Console.WriteLine();

Console.WriteLine("Результирующий массив:");

for (int i = 0; i <= n - 1; ++i)

Console.Write(" " + x[i]);

Console.Read();

}

}

}

 

Результаты расчета:

Пример 4.Сортировка элементов одномерного массива по убыванию методом вставки.

Обозначения:

X - исходный массив, который нужно упорядочить;

n- количество элементов массива;

i,j,k- переменные цикла;

ch- переменная обмена.

Схема алгоритма представлена ниже. Суть метода состоит в следующем. Предполагается, что первый элемент массива уже стоит на своём месте. Чтобы упорядочить второй элемент массива, нужно найти для него такое место в упорядоченной части массива, чтобы упорядоченность сохранялась. Затем требуется вставить этот элемент на найденное место. Чтобы упорядочить все элементы массива, эти действия нужно выполнить n-1 раз, т.е. для всех элементов, кроме первого.

Схема алгоритма решения данной задачи по структуре представляет собой внешний цикл для выполнения указанных выше действий, который содержит еще два вложенных в него следующих друг за другом цикла.

Первый из них организован как цикл с предусловием для поиска в упорядоченной части массива такого элемента массива, чье значение будет больше величины устанавливаемого элемента. Для достижения этой цели в указанном цикле осуществляется продвижение от конца упорядоченной части к ее началу путем уменьшения номера элемента i с каждой итерацией на единицу. Выход из цикла осуществляется тогда, когда такой элемент будет найден, либо будет достигнуто начало упорядоченной части.

Следующий за ним цикл производит перемещение элементов упорядоченной части, начиная с ее конца и заканчивая i+1 элементом, на один элемент вправо для освобождения места упорядочиваемому j элементу.

После выхода из цикла (цикл с параметром) производится запись j элемента, хранимого в переменной ch, на освобожденное место.

 

Схема алгоритма:

Листинг 4 – Сортировка одномерного массива методом «вставки»

Листинг

using System;

 

namespace ConsoleApplication7

{

class Program

{

static void Main(string[] args)

{

const int n = 6;

int ch;

int[] x = new int[n] { 3, 12, 5, -9, 8, -4 };

Console.WriteLine("Исходный массив:");

for (int i = 0; i <= n - 1; ++i)

Console.Write(" " + x[i]);

for (int j = 1; j <= n - 1; j++)

{

ch = x[j];

int i = j - 1;

while ((i > -1) && (x[i] < ch))

i--;

for (int k = j - 1; k >= i+1; --k)

x[k + 1] = x[k];

 

x[i+1] = ch;

}

Console.WriteLine();

Console.WriteLine("Результирующий массив:");

for (int i = 0; i <= n - 1; ++i)

Console.Write(" " + x[i]);

Console.Read();

}

}

}

Результаты расчета:

 

Пример 5.Сортировка элементов одномерного массива по возрастанию методом «пузырька».

Обозначения:

X - исходный массив, который нужно упорядочить;

n- количество элементов массива;

i,j- переменные цикла;

ch- переменная обмена;

exch- признак существования инверсии.

Суть метода состоит в последовательном просмотре соседних элементов массива. Если они нарушают требуемый порядок следования, то они меняются местами - осуществляется инверсия. Просмотр нужно выполнить n-1 раз.

Очень существенна проверка на наличие инверсии (нарушения порядка). Если в процессе просмотра массива была осуществлена хотя бы одна инверсия (exch=TRUE), то просмотр массива повторяется. В противном случае (exch=FALSE) в массиве уже все элементы упорядочены и целесообразно прервать работу цикла оператором break.

 

Листинг5– Сортировка одномерного массива методом «пузырька»

using System;

 

namespace ConsoleApplication7

{

class Program

{

static void Main(string[] args)

{

const int n = 6;

int ch;

int[] x = new int[n] { 3, 12, 5, -9, 8, -4 };

Console.WriteLine("Исходный массив:");

for (int i = 0; i <= n - 1; ++i)

Console.Write(" " + x[i]);

for (int j = 0; j <= n - 1; j++)

{

bool exch = false;

for (int i = 0; i <= n - 2 - j; ++i)

if (x[i] > x[i + 1])

{

ch = x[i + 1];

x[i + 1] = x[i];

x[i] = ch;

exch = true;

}

if (exch == false) break;

}

Console.WriteLine();

Console.WriteLine("Результирующий массив:");

for (int i = 0; i <= n - 1; ++i)

Console.Write(" " + x[i]);

Console.Read();

}

}

}

 

Схема алгоритма:

Результаты расчета:

 

Класс System.Arrау

Для облегчения программирования задач обработки массивов данных в С# все массивы имеют общий базовый класс Аrrау, определенный в пространстве имен System. Приведем несколько полезных методов этого класса (табл. 1).

Таблица 1- Основные элементы класса Аггау

Элемент Вид Описание
Length Свойство Количество элементов массива (по всем размерностям)
Rank Свойство Количество размерностей массива
BinarySearch Статический метод Двоичный поиск в отсортированном массиве
Сlear Статический метод Присваивание элементам массива значений по умолчанию
Сору Статический метод Копирование заданного диапазона элементов одного массива в другой массив
СоруТо Метод Копирование всех элементов текущего одномерного массива в другой одномерный массив
GetValue Метод Получение значения элемента массива
IndexOf Статический метод Поиск первого вхождения элемента в одномерный массив
LastIndexOf Статический метод Поиск последнего вхождения элемента в одномерный массив
Reverse Статический метод Изменение порядка следования элементов на обратный
SetValue Метод Установка значения элемента массива
Sort Статический метод Упорядочивание элементов одномерного массива

 

Свойство Length позволяет реализовывать алгоритмы, которые будут работать с массивами различной длины. Использование этого свойства вместо явного задания размерности исключает возможность выхода индекса за границы массива. В листинге продемонстрировано применение двух элементов класса Аrrау при работе с одномерным массивом.

Листинг 6 – Использование методов класса Аrrау

using System;

namespace ConsoleApplication1

{

class Class1

{

static void Main()

{

int[] x = { 21, 2, 14, -6, 38, -7, 30};

Console.WriteLine();

Console.WriteLine("Исходный массив:");

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

Console.Write(" " + x[i]);

Array.Sort(x);

Console.WriteLine();

Console.WriteLine("Упорядоченный массив:");

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

Console.Write(" " + x[i]);

Array.Reverse(x);

Console.WriteLine();

Console.WriteLine("Обратный порядок в массиве:");

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

Console.Write(" " + x[i]);

Console.Read();

 

}

 

}

}

 

Методы Sort, Reverse являются статическими, поэтому к ним обращаются через имя класса Array, а не экземпляра, и передают в них имя массива.

Как видно по результатам работы программы метод Sort осуществляет сортировку массива по возрастанию. Применив к массиву, отсортированному таким образом, метод Reverse, получим массив, отсортированный по убыванию.

 

Результаты работы:

 

Класс Random

Класс Random, определенный в пространстве имен System, содержит методы, позволяющие при отладке программ генерировать исходные данные, заданные случайным образом. Особенно это удобно при отладке программ обработки массивов данных, поскольку появляется возможность освободить программиста от утомительной работы ввода последовательности данных. Разумеется, подобный вариант может быть использован лишь тогда, когда ход решения задачи позволяет применять данные, полученные путем такой генерации.

В С# для получения псевдослучайной последовательности чисел существует два варианта создания экземпляра класса Random: конструктор без параметров и конструктор с параметром типа int. Рассмотрим их.

Конструктор без параметров:

Random a = new Random( );

создает уникальную последовательность, так как использует начальное значение генератора, вычисленное на основе текущего времени.

Конструктор с параметром типа int:

Random b = new Random(5);

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

Для получения очередного значения серии пользуются методами, перечисленными в табл. 2.

Таблица 2- Основные методы класса System.Random

Название Описание
Next( ) Возвращает целое положительное число во всем положительном диапазоне типа int
Next(макс) Возвращает целое положительное число в диапазоне [0, макс]
Next(мин, макс) Возвращает целое число в диапазоне [мин, макс]
NextDouble() Возвращает вещественное положительное число в диапазоне [0. 1)
NextBytes(массив) Возвращает массив чисел в диапазоне [0, 255]

 

Первые четыре метода позволяют получить одно число. Для получения последовательности случайных чисел необходима организация цикла. Последний метод табл. 2 генерирует массив чисел.

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

Листинг 7– Работа с генератором псевдослучайных чисел

using System;

namespace ConsoleApplication1

{ class Program

{ Random l = new Random( );

Random d = new Random( 1 );

const int n = 5;

Console.WriteLine( "Числа в диапазоне [0, 1]" );

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

Console.Write( "{0,6:0.##}", l.NextDouble() );

Console.WriteLine();

Console.WriteLine("Числа в диапазоне [0, 100]");

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

Console.Write( " " + d.Next( 100 ) );

Console.WriteLine();

Console.WriteLine("Числа в диапазоне [-5, 5]");

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

Console.Write( " " + l.Next( -5, 5) );

Console.WriteLine();

Console.WriteLine("Массив чисел в диапазоне[0, 255]");

byte[ ] mas = new byte[n];

l.NextBytes(mas);

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

Console.Write(" " + mas[i] );

}

}

}

Результат работы программы:

Варианты заданий для самостоятельной работы

1. Программа. Дано 100 целых чисел. Отсортировать их по возрастанию и распечатать их в обратном порядке по 6 чисел в строке.

2. Дано 100 чисел. Напечатать сначала все отрицательные из них, а затем все остальные.

3. Дано число А. Определить первый отрицательный член последовательности х(0), х(1), х(2),..., x(n). Массив заполнить случайным образом.

4. Даны координаты N точек на плоскости x(0), y(0) ,..., x(n), y(n) (N=20). Найти номера двух точек, расстояние между которыми наибольшее (считать, что такая пара точек единственная).

5. Вычислить величину: . Массивы x и y заполнить случайным образом.

6. По заданным вещественным числам а(0), а(1),..., а(20) и Т вычислить по формуле Горнера значения многочлена в точке x=Т.

7. Преобразовать массив Х, содержащий n вещественных чисел, по следующему правилу: элементы массива расположить в обратном порядке и вывести все элементы с четными индексами.

8. Переменной T присвоить значение TRUE, если элементы массива Х, содержащего n вещественных чисел, упорядочены строго по возрастанию, а значение FALSE иначе.

9. Преобразовать массив Х, содержащий n вещественных чисел, по следующему правилу:

x(0)=x(0), x(n)=x(n), x(k)=(x(k)-1+x(k)+x(k)+1)/3 при k=2,3,...,n-1.

10. Преобразовать массив Х, содержащий n вещественных чисел, по следующему правилу: элементы массива циклически сдвинуть на одну позицию влево.

11. Преобразовать массив Х, содержащий n вещественных чисел, по следующему правилу: элементы массива циклически сдвинуть на две позиции влево.

12. Преобразовать массив Х, содержащий n вещественных чисел, по следующему правилу (воспользоваться массивом Y как вспомогательным): все отрицательные элементы массива Х перенести в его начало, а все остальные - в конец, сохраняя исходное взаимное расположение как среди отрицательных, так и среди остальных элементов.

13. Преобразовать массив Х, содержащий n вещественных чисел, по следующему правилу: элементы массива Х циклически сдвинуть на k позиций влево.

14. Переменной T присвоить значение TRUE, если в массиве Х, содержащем n вещественных чисел, нет нулевых элементов и при этом положительные элементы чередуются с отрицательными, и значение FALSE иначе.

15. Переменной K присвоить либо номер первого вхождения Y в массив Х, либо число N+1, если Y не входит в Х.

16. Вычислить y=x(0)+x(0)*x(1)+x(0)*x(1)*x(2)+...+x(0)*x(1)*...*x(m), где m - либо номер первого отрицательного элемента массива Х, либо число N, если в массиве Х нет отрицательных элементов.

17. Переменной T присвоить значение TRUE или FALSE в зависимости от того, есть или нет среди элементов массива Х, содержащего n целых чисел, хотя бы одно число Фибоначчи.

18. Переменной T присвоить значение TRUE или FALSE в зависимости от того, есть или нет среди элементов массива X, содержащего n целых чисел, не менее двух степеней двойки.

19. Даны действительные числа a[0],a[2],..,a[10]. Получить (вывести) последовательность переносом первого элемента в конец массива: a[1],a[2],...,a[10],a[0], затем a[2],...,a[10],a[0], a[1], и т.д. Всего десять последовательностей.

20. Дана последовательность из 100 различных целых чисел. Найти сумму чисел этой последовательности, расположенных между максимальным и минимальным числами (в сумму включить и оба этих числа).

21. Получить последовательность n чисел Фибоначчи (целое число n>1).

22. Дано целое n и вещественные числа a[0],...,a[n]. Вычислить а[0]-a[1]+a[2]-...+(-1)n-1a[n].

23. Дано целое n и вещественные числа a, b (a<>b). Получить r[0],r[1],...,r[n], где r[i]=a+ih, где h=(b-a)/n.

24. Даны вещественные числа a[0], а[2],...,a[10]. Получить b[0],...,b[10], где b[i]=(a[i]2 -a[1])*b[i-1] при i=1,2,3,...10.

25. Получить последовательность b[0],...,b[10], где при i=0,1,2,...,10 значение b[i] равно 1+1/2 +...+1/i.

26. Даны семь значений емкостей конденсаторов с[0],..., с[6]. Определить емкости систем конденсаторов, которые получаются при последовательном и параллельном соединении исходных конденсаторов.

27. При n=15 и заданных значениях вещественных чисел a, h, b,d[0], ...,d[n], вычислить d[0]+d[1](b-a)+d[2] (b-a) (b-a-h)+...+ d[n] (b-a) (b-a-h)...(b-a-(n-1)h).

28. Дано целое число n и целые числа k[0],k[1],...,k[12]. В последовательности k[0],...,k[12] заменить каждый из членов остатком от деления его квадрата на n.

29. Дано целое число n, вещественные числа a[0],...,a[n] (n>3). Получить b[i], i=0,1,...,n-2, используя зависимость b[i]==a[i+1]+a[i+2].

30. Дана последовательность вещественных чисел а[0],...,а[10]. Подсчитать количество элементов последовательности до второго отрицательного элемента.

31. Даны вещественные числа x, a[0],...,a[10]. Найти значение целого числа k, при котором a[k-1]<x<a[k].

32. Получить последовательность b[0],...,b[n] (при n=7), где значение b[i] равно i! (n!=1*2...n; 0!=1).

33. Даны вещественные числа a[0], a[1],...,a[5].

Вычислить: a[0]/1! + a[1]/2! +...+ a[5]/5!.

34. Даны вещественные числа a[0],...,a[n] (n=15). Получить max(a[0],...,a[n]) и max(-a[0],a[2], -a[3],...,-a[n]).

35. Даны вещественные числа b[0],...,b[n] (n=10). Получить min(b[0],...,b[n]) и min(|b[0]|,...,|b[n]|).

36. Даны вещественные числа a[0],a[1],...,a[n] (n=12). Получить (min(a[0],...,a[n]))2 - min(a2[0] ,..a2[n] ).

37. Даны вещественные числа a[0],...,a[n] (n=10). Исключить из последовательности все числа, равные нулю.

38. Даны целые числа k[0],...,k[n] (n=12). Найти наименьшую сумму из трех рядом стоящих чисел.

39. Даны целые числа k[0],...,k[n] (n=15). Найти наибольшее из них, которое кратно трем.

40. Даны вещественные числа a[0],...,a[n] (n=16). Получить значения i (1< i < n-1), для которых a[i-1]<a[i]>a[i+1].

41. Даны целые числа k[0], ... ,k[10]. Вывести те значения, которые по значению больше всего приближаются к целым числам m и n.

42. Пусть a[0]=cos(x); a[1]=-sin(x); a[k]=2a[k-1]-a[k-2], k=2,3,... . Найти сумму квадратов тех чисел a[0],...,a[20], которые не превосходят двух. X вводится с клавиатуры.

43. Даны вещественные числа a[0],...,a[20]. В этой последовательности определить число соседств двух положительных чисел и двух чисел разного знака.

44. Даны целые числа k[0], k[1],...,k[m] (m=20). Имеются ли в последовательности два идущих подряд нулевых числа или три подряд одинаковых числа.

45. Даны вещественные числа a[1],...,a[3n] (n=5). Вычислить сумму чисел из a[n+1], a[n+2],...,a[3n], которые превосходят по величине все числа a[0],...,a[n].

46. Пусть a[0]=0.01; a[k]=sin(k+a[k-1]), k=1,...,30. Определить сколько значений последовательности a[i], i=0,...,30 с номерами 0, 2, 4, 8, 16,... имеют значение меньшее, чем 0.25.

47. Даны вещественные числа y[0],...,y[n] (n=10). Найти max(|z[0]|, ...,|z[n]|), где z[i]=y[i] при |y[i]|<2 и 0.5 в противном случае.

48. Даны вещественные числа a[0], ... ,a[n] (n=15). Найти max(a[0], a[0]*a[1], ... ,a[0]*a[1]..., a[n]).

49. Даны вещественные числа x[0],...,x[n] (n=12). Найти количество квадратов нечетных чисел.

50. Даны вещественные числа a[0],...,a[n] (n=10). Найти количество полных квадратов среди этих чисел.

51. Даны вещественные числа x[0],...,x[n] (n=15). Выяснить, является ли данная последовательность упорядоченной по убыванию.

52. Даны вещественные числа a[0],...,a[n] (n=10). Найти длину наименьшего отрезка числовой оси, содержащего все значения a[0],...,a[n].

53. Даны вещественные числа x, a[0],...,a[n] (n=12). Выяснить, во-первых, верно ли, что a[0]<x<a[12], и, во-вторых, верно ли, что t[1]<x<t[2], где t[1] - наименьшее, а t[2] - наибольшее среди a[0],...,a[n].

54. Дана последовательность вещественных чисел a[0],...,a[n] (n=15) и вещественное число x. Вставить x в то место последовательности, где удовлетворяется условие a[i-1]<x<a[i].

55. Дана последовательность целых чисел k[0],...,k[n] (n=12). Найти номер второго четного члена этой последовательности, если его нет, то выдать соответствующее сообщение.

56. Дана последовательность целых чисел k[0],...,k[n] (n=15). Найти номер последнего нечетного члена этой последовательности.

57. Даны вещественные числа x[0],...,x[n] (n=10). Получить (1+r)/ (1+s), где r - сумма всех чисел последовательности, которые не превосходят 1, а s - сумма чисел, больших 1.

58. Даны целые числа k[0],...,k[n] (n=15). Найти максимальное из чисел этой последовательности, предшествующее первому отрицательному.

59. Даны целые числа a[0],...,a[n] (n=12). Определить все числа, которые равны сумме всех предыдущих.

60. Дан массив целых чисел из 30 элементов. Найти наибольший элемент массива, кратный 5.

61. Даны целые числа a[0],...,a[n] (n=15). Определить min(a[0], a[1], ..., a[i]) до первого отрицательного числа последовательности a[0], ..., a[n].

62. Дан массив целых чисел из 20 элементов. Найти наибольший нечетный элемент массива.

63. Дана последовательность целых чисел из 20 элементов. Найти наименьшее произведение из рядом двух стоящих элементов.

64. Даны целые числа k[0],...,k[n] (n=15). Найти минимальное из чисел этой последовательности, предшествующее первому нулевому элементу.

 

Содержание отчета

4.1. Титульный лист.

4.2. Краткое теоретическое описание.

4.3. Задание на лабораторную работу, включающее математическую формулировку задачи.

4.4. Результаты выполнения работы, включающие схему алгоритма, тексты программ, результаты вычислений.