Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие2013_09_28.doc
Скачиваний:
24
Добавлен:
20.05.2015
Размер:
2.72 Mб
Скачать

10. Программирование алгоритмов с использованием массивов

Массив — это группа последовательно расположенных в памяти элементов одинакового типа (double, float, intи т.д.), имеющих одно общее имя. Из описания массива компилятор должен получить информацию о типе элементов массива и их количестве. Поэтому описание массива отличается от описания простой переменной наличием после имени массива квадратных скобок, в которых указывается количество элементов массива.

Синтаксис:

тип имя_массива [константное_выражение]… ;

или

тип имя массива [ ] ;

Квадратные скобки, следующие за именем_массива, являются атрибутом синтаксиса, а не признаком необязательности конструкции.

При описании массива могут использоваться те же модификаторы (класс памяти, const и инициализатор ), что и для простых переменных (см. раздел 2. Базовые средства языка С/С++).

Описатель тип определяет тип элементов объявляемого массива (это может быть любой тип, кроме типов void и функция), а константное_выражение – размер массива (количество элементов в массиве). Компилятор отводит под массив память размером (sizeof (тип) * размер массива) байтов.

Во второй синтаксической форме (см. выше) константное_выражение в квадратных скобках опущено. Эта форма используется в следующих случаях:

– при объявлении массив инициализируется (см. далее);

– массив объявлен как формальный параметр функции;

– массив объявлен как ссылка на массив, явно определенный в другом файле.

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

тип имя_массива [константное_выражение][константное_выражение]...;

Количество пар скобок определяет размерностьмассива, а константное_выражение –размермассива по данному измерению. Различают одномерные (линейные) массивы, двумерные массивы (матрицы) и т.д., так что объявление двумерного массива содержит два константных_выражения, трехмерного — три и т.д.

Примеры:

double vector [10];

unsigned int matrix [3][5];

В первом примере определён линейный массив vector из 10 элементов типа double. Во втором примере объявляется двумерный массив с именем matrix (строго говоря, matrix представляет собой массив из 3 элементов, каждый из которых является массивом из 5 элементов типа unsigned int).

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

int a[3][4];

программист представляет в виде матрицы

a[0][0] a[0][1] a[0][2] a[0][3]

a[1][0] a[1][1] a[1][2] a[1][3]

a[2][0] a[2][1] a[2][2] a[2][3]

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

Примеры: vector[3], matrix[2][k+1], vector[2*i+3];

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

={<список инициализаторов>}

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

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

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

Примеры:

int b[5]= {1,2,3,4,5}; //инициализируется вектор из 5 элементов, имеющих тип int

int w[3][4] = { { 1, 1, 1, 1 },

{ 2, 2, 2, 2 },

{ 3, 3, 3, 3 }

};

В последнем примере объявлен и инициализирован двумерный массив wразмером 3 строки и 4 столбца. Списки, выделенные в фигурные скобки, соответствуют строкам массива. Если список инициализаторов не имеет вложенной структуры, аналогичной структуре двумерного массива, то элементы списка присваиваются построчно элементам массива в порядке их следования. Поэтому вышеприведенная инициализация эквивалентна следующей:

int w[3][4] = { 1,1,1,1, 2,2,2,2, 3, 3, 3, 3 };

Если же объявлен массив

int w[3][4] = { { 1, 1, 1},

{ 2, 2, 2 },

{ 3 }

};

то это равносильно такой инициализации:

int w[3][4] = { 1,1,1,0, 2,2,2,0, 3, 0, 0, 0 };

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

В языке С/С++ можно использовать сечения массива, однако на использование сечений накладывается ряд ограничений. Сечения формируются вследствие опускания одной или не­сколь­ких пар квадратных скобок. Пары квадратных скобок можно отбрасы­вать только справа налево и строго последовательно. Сечения массивов нередко используются при передаче в функцю параметров–массивов.

Примеры:

int s[2][3];

Если при обращении к некоторой функции использовать параметр s[1], то будет передаваться первая строка массива s.

int b[2][3][4];

При обращении к массиву b можно написать, например, b[1][2] и будет передаваться вектор из четырех элементов, а обращение b[1] даст двумерный массив размером 3 на 4.

Примеробъявления символьного массива.

char str[] = "объявление символьного массива";

Следует учитывать, что в символьном литерале находится на один элемент больше, так как последний из элементов является управляющей последовательностью '\0' (см. далее).

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

#include <iostream.h>

#include <conio.h>

int main()

{

const int n=100;

float z[n], s, maxz, nalog[n];

inti,m;

cout<<"Количество служащих ";

cin>>m;

cout<<"Введи зарплату каждого работника "<<"\n";

cout<<"\n\n";

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

{

cout<<"z["<<i+1<<"]= ";

cin>>z[i];

}

s=0; maxz=z[0];

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

{

s+=z[i];

if(z[i]>maxz)

maxz=z[i];

nalog[i]=0.17*z[i];

}

cout<<"Максимальная зарплата = "<<maxz<<"\n";

s/=m;

cout<<"Средняя зарплата = "<<s<<"\n";

cout<<"Зарплата выше средней: ";

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

if(z[i]>=s)

cout<<i+1<<". "<<z[i]<<"\n";

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

cout<<"Выдать "<<i+1<<"-му работнику сумму "<<z[i]-nalog[i]<<"\n";

getch();

return0;

}

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

#include <iostream.h>

#include <conio.h>

int main()

{

const int m=5;

int a[]={1, 2, 3, 4, 6}, b[m], i, k=m;

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

{

b[i]=a[m-i-1];

cout<<b[i]<<"\n";

}

getch();

return0;

}

Задача 78. Изменить порядок следования элементов заданного массива на обратный (вспомогательный массив не использовать).

#include <iostream.h>

#include <conio.h>

int main()

{

const int m=5;

int a[]={1, 2, 3, 4, 6}, p, k=m, i;

for(i=0; i<m/2; i++)

{

p=a[--k];

a[k]=a[i];

a[i]=p;

}

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

cout<<a[i]<<"\n";

getch();return0;

}

Задача 79.Сгенерировать массив изnслучайных чисел, равномерно распределенных в заданном интервале отAдоBи вывести его в виде таблицы по 10 элементов в строке.

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

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

функция rand() непосредственно генерирует очередное псевдослучайное целое число из диапазона от 0 до RAND_MAX (обычно RAND_MAX = 32767); например, оператор

int x = rand() % (B-A+1) + A;

генерирует случайное число x из интервала от А до В.

Вот примеры использования этих функций.

#include <time.h>

#include <stdlib.h>

srand((unsigned)time(NULL)); // базовое число

int x = rand()%9+1; // случайное число от 1 до 9

Более изощренный способ: если А, В – границы диапазона равномерно распределенных случайных чисел, то строка

int x = A+(int)((B-A+1)*rand()/(RAND_MAX+1.0));

генерирует требуемое случайное число x. В частности, конструкция

int x = 1+(int)((9.0)*rand()/(RAND_MAX+1.0));

возвращает случайное число x от 1 до 9.

// программа отлажена в Visual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <time.h>

#include <conio.h>

#include <stdlib.h>

using namespace std;

int main()

{

const int m=200, A=1, B=m;

int a[m], n, i;

srand((unsigned)time(NULL)); // базовое число

cout<<"Введите размер массива <= "<<n<<" ";

cin>>n;

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

a[i]= A+(int)((B-A+1)*rand()/(RAND_MAX+1.0));

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

printf("%6d%c", a[i], (i%10)?' ':'\n');

getch(); return 0;

}

Задача 80.Сформировать и вывести на экран единичную матрицу размером 5х5.

//Первый вариант

#include<iostream>

#include<conio.h>

using namespace std;

const int M=5;

int main()

{

int em[M][M], k, i;

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

{

for(k=0; k<M; k++)

{ if(i==k)

em[i][k]=1;

else

em[i][k]=0;

cout<<em[i][k]<<' ';

}

cout<<"\n";

}

getch(); return 0;

}

//Второй вариант

#define M 5

#include<iostream>

#include<conio.h>

using namespace std;

int main()

{

int em [M][M]={0},i,k;

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

em[i][i]=1;

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

{ cout<<"\n";

for (k=0; k<M; k++)

cout<<"\t"<<em[i][k];

}

getch(); return 0;

}

//Третий вариант.

#include<iostream>

#include<conio.h>

using namespace std;

const int M=6;

int main()

{

int em[M][M],i,k;

for (i=1; i<M; i++)

for (k=1; k<M; k++)

em[i][k]=(k/i)*(i/k); // хитрый прием

for (i=1; i<M; i++)

{ cout<<"\n";

for (k=1; k<M; k++)

cout<<"\t "<<em[i][k];

}

getch();return 0;

}

Задача 81. Определить одномерный массив А из m вещественных чисел. Вычислить сумму элементов массива, расположенных за последним отрицательным элементом. По заданному массиву А построить новый массив В, содержащий вначале все положительные элементы исходного массива, затем – отрицательные и нулевые элементы массива А.

// Программа отлажена в Visual Studio 2008 (13.03.2010г)

#include<conio.h>

#include<stdio.h>

#include <iostream>

using namespace std;

const int n= 10;

float sum(float a[],float b[],int n);

int main()

{

//float a[n]={8,3,-2,6,0,-5,0,-8,9,1};

float a[n]={8,3,2,6,0,5,0,8,9,1};

float s, b[n]={0}; int i;

//*************************

s=sum(a,b,n);

//*************************

setlocale(NULL, ".1251");

if(s != -1)

{

cout<<"\nСумма крайних положительных="<<s<<endl;

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

cout<<b[i]<<endl;

}

else

cout << "\nНет отрицательных элементов ";

getch();return 0;

}

//сумма элементов, стоящих за последним отрицательным

float sum(float a[],float b[],int n)

{ int i,k; float s;

s=0; k=-1;

//поиск последнего отрицательного числа в массиве

//a)

/* for(i=n-1; i>=0; i--)

if (a[i]<0) {k=i; break;}

*/

//б)

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

if(a[i]<0) k=i;

if( k == -1)

{ //cout << "\nНет отрицательных элементов ";

return k;

}

//вычисление суммы

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

s=s+a[i];

//пересылка положительных элементов к началу массива

k=0;

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

if(a[i]>0)

{ b[k]=a[i];

k++;

}

//пересылка отрицательных элементов массива

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

if(a[i]<0)

{ b[k]=a[i];

k++;

}

return s;

}

Задача 82.Сформировать и напечатать таблицу Пифагора

#define M 10

#include <conio.h>

#include <stdio.h>

#include <iostream.h>

intmain()

{

int em[M][M],i,k;

for(i=1;i<M;i++)

for(k=1;k<M;k++)

em[i][k] = i*k;

for(i=1;i<M;i++)

{ cout<<"\n\n";

for (k=1;k<M;k++)

cout<<"\t "<<em[i][k];

}

getch();return 0;

}

Задача 83.Вывести матрицу размером 9х9 следующего вида: наддиагональный треугольник — нули, диагональ — девятки, под ними — восьмёрки, затем — семёрки и т. д.

//Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

const int m=9;

int a[m][m], k, i;

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

{

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

{ if(k<=i)

a[i][k]=m-i+k;

else

a[i][k]=0;

cout<<a[i][k]<<' ';

}

cout<<"\n";

}

getch();return0;

}

Задача 84.Программа с помощью функцииnozero() пересылает элементы массиваa[m]={ 8, 0, 3, 0, -5, 0, 0, 9 } в массивb[m]следующим образом: сначала с сохранением порядка записываются ненулевые элементы, а все нулевые — записываются в конец массиваb[m].

//Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

// Функция пересылки:

void nozero( const int x[], int y[], int n)

{

int i, k=0;

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

if(x[i]!=0)

y[k++]=x[i];

while(k<n)

y[k++]=0;

}

// Основная:

const int m=8;

int main()

{

int i, k, a[m]={8, 0, 3, 0, -5, 0, 0, 9}, b[m];

cout<<"Массив до обработки:\n";

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

cout<<a[i]<<" ";

cout<<"\n";

//****************

nozero(a, b, m);

//****************

cout<<"Массив после обработки:\n";

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

cout<<b[k]<<" ";

cout<<"\n";

getch();return 0;

}

Задача 85. Программа с помощью функцииnozero() преобразуетет заданный массивa[m]={ 8, 0, 3, 0, -5, 0, 0, 9 } следующим образом: в начало массива с сохранением порядка записываются ненулевые элементы, а все нулевые — записываются в конец массива. Вспомогательный массив не используется.

Программа иллюстрирует важное понятие теории — способы передачи параметров функции. Один из них — передача параметров по значению— был явно продемонстрирован ранее (см. задачу 54). Здесь иллюстрируется другой способ — передача параметровпо адресу (по ссылке): функция получает не значение, а адрес соответствующего фактического параметра. При таком способе любое изменениеформального параметра в теле функции равносильно изменению соответствующегофактического параметра в вызывающей программе. Именно таким образом функции передаются параметры-массивы и строки.

В предыдущей программе первый формальный параметр функции nozero() имеет описатель const, что делает невозможным его изменение в теле функции. В следующей программе элементы массива x[], подвергаясь изменениям в теле функции nozero(), обеспечивают требуемое преобразование фактического параметра – массива a[].

//Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

// Функция пересылки

void nozero(int x[], int n)

{

int i, k=0;

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

if(x[i]!=0)

x[k++]=x[i];

while(k<n)

x[k++]=0;

}

// Основная:

const int m=8;

int main()

{

int i, k, a[m]={8, 0, 3, 0, -5, 0, 0, 9};

cout<<"Массив до обработки:\n";

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

cout<<a[i]<<" ";

cout<<"\n";

//****************

nozero(a, m);

//****************

cout<<"Массив после обработки:\n";

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

cout<<a[k]<<" ";

cout<<"\n";

getch();return 0;

}

Задача 86. Программа пересылает нечетные элементы заданного целочисленного массива x[ ] в массив y[ ], а четные — в массив z[ ]. Результаты выдаются на экран. Функция mas3( ) используетглобальныепеременные r и l для подсчета количества тех и других.

#include<iostream.h>

#include<conio.h>

int k=0,l=0; //глобальные переменные

void mas3(int x[],int n,int z[],int y[])

{

inti;

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

if(x[i]%2==0)

z[k++]=x[i];

else

y[l++]=x[i];

}

voidmain()

{

const int n=10; int i;

intx[n]={8,3,4,8,4,5,3,6,7,1};

int z[n]={0}; int y[n]={0};

mas3(x,n,z,y);

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

cout<<z[i]<<endl;

cout<<endl;

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

cout<<y[i]<<" ";

getch();

}

Задача 87. Программа осуществляет линейный поиск заданного целого числа в массиве целых чисел. Резуль­тат поиска выводится , например, так: «2 на 7-ом месте», либо «2 не найден».

#include <iostream.h>

#include <conio.h>

// Функция поиска:

int lpoisk(int x[], int n, int Q)

{

inti, k;

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

if(x[i]==Q)

{

k=i;

break;

}

if(i<n)

return k;

else

return -1;

}

// Основная:

const int m=8;

voidmain()

{

int Q, t;

inta[m]={8, 3, 97, 5, -9, 13, 0, 1};

cout<<"Введи ключ поиска: ";

cin>>Q;

t=lpoisk(a, m, Q);

if(t>=0)

cout<<Q<<" на "<<t+1<<"-м месте.";

else

cout<<Q<<" не найден.";

getch();

}

Задача 88. Вариант предыдущей программы. Слегка изменена функцияlpoisk.

#include<conio.h>

#include <iostream>

using namespace std;

// Функция поиска:

int lpoisk(int x[], int n, int Q)

{

int i=0;

while(x[i]!=Q && i<n)

i++;

if(i<n)

return i;

else

return -1;

}

// Основная:

const int m=8;

void main()

{

int Q, t;

int a[m]={8, 3, 97, 5, -9, 13, 0, 1};

setlocale (NULL, ".1251");

cout<<"Введи ключ поиска: ";

cin>>Q;

t=lpoisk(a, m, Q);

if(t>=0)

cout<<Q<<" на "<<t+1<<"-м месте.";

else

cout<<Q<<" не найден.";

getch();

}

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

// Программа отлажена вVisual Studio 2008

// Сортировка выбором

#include "stdafx.h"

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <stdlib.h>

int main()

{ const int M=20;

srand((unsigned)time(NULL)); //базовое число

int i, j, max, nmax, a[M];

// А, В -границы диапазона случайных чисел

int A=1, B=100;

// генерация случайных чисел

//rand() = случайное число от 0 до RAND_MAX(32767)

printf("До сортировки:\n" );

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

{

a[i]=A+(int)((B-A+1)*rand()/(RAND_MAX+1.0));

printf("%3d ",a[i] );

}

printf("\n");

for (i=0; i<M-1; i++)

{ // поиск максимального элемента

max=a[0]; nmax=0;

for (j=1; j < M-i; j++)

if (a[j] > max)

{

max=a[j]; //максимальный

nmax=j; //его номер

}

// обмен максимального с последним

a[nmax]=a[M -i -1];

a[M -i -1] = max;

}

printf("После сортировки:\n" );

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

printf("%3d ",a[i]);

getch(); return 0;

}

Задача 90. В заданном массиве подсчитать количество чисел между первым вхождением максимального и последним вхождением минимального элемента массива

// Программа отлажена вVisual Studio 2005

#include "stdafx.h"

#include<conio.h>

#include<iostream>

using namespace std;

int count (float a[], int n);

int main()

{

int k;

float a[]={10,3,18,3,19,6,25,7,25,4,5,4,11} ;

// float a[]={3,3,3,3,3,3,3,3,3} ;

int n=sizeof(a)/sizeof(float);

k=count ( a, n);

cout<<"Всего чисел между max и min => "<<k;

getch(); return 0;

}

// функция обработки массива

int count (float a[], int n)

{ int i, nmin=0, nmax=0, tmp;

float min=a[0], max=a[0];

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

if(a[i] > max)

{ max=a[i]; nmax=i;} // первый максимум

cout<<max<<' '<<nmax<<'\n';

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

if(a[i] <= min )

{ min=a[i]; nmin=i; } // последний минимум

cout<<min<<' '<<nmin<<'\n';

if(nmax > nmin)

{ tmp=nmax; nmax=nmin; nmin=tmp;}

tmp=0;

for(i=nmax+1; i < nmin; i++)

tmp++;

return tmp;

}

Задача 91.Ввести массив из произвольного количества чисел (но не более заданного числа). Отсортировать его методом «пузырька» по неубыванию, выводя на экран все промежуточные и окончательный вари­анты.

Поясним суть упорядочения элементов массива указанным методом, реализованным ниже в функции bubble(). Во внешнем цикле (индекс i) фиксируется начальный элемент массива (x[i]); затем во внутреннем цикле (индекс k) выбранный элемент последовательно сравниваеся со всеми остальными элементами массива и переставляется местами с теми из них, которые меньше начального элемента. Таком образом, за один оборот внешнего цикла минимальный элемент массива оказывается на первом месте и в дальнейших рассмотрениях не участвует. Теперь во внешнем цикле за начальный выбирается второй элемент массива и описанная выше процедура повторяется для оставшейся части массива: на втором месте оказывается минимальный элемент из оставшихся. Так продолжается вплоть до предпоследнего элемента массива, пока весь массив не станет упорядоченным. орой икле за отрениях не участвует. альный элемент массива оказывается на пером мента в маас0000000000000000000000

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

const int n=1000;

// Функция сортировка массива по неубыванию методом пузырька

void bubble(float x[], int m)

{

int i, k, r; float p;

for(i=0; i < m-1; i++)

{

for(k=i+1; k < m; k++)

{

if(x[i]>x[k])

{

p=x[i];

x[i]=x[k];

x[k]=p;

}

}

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

cout<<" "<<x[r];

cout<<"\n";

}

}

int main()

{

int m=0,i,k; float a[n];

do

{

cout<<"Введите длину массива (не более 1000): "; cin>>m;

}

while (m>1000);

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

{

cout<<"Введите a["<<i+1<<"] = "; cin>>a[i];

}

//****************//

bubble(a, m);

//****************//

cout<<"\n"<<"Массив отсортирован: ";

for(k=0; k<m; k++) cout<<"\n"<<"a["<<k+1<<"] = "<<a[k];

getch(); return 0;

}

Задача 92.Вводится упорядоченный по неубыванию массив изMчисел. Используется методбинарногопоиска ключевого элемента.

Поясним суть бинарного (двоичного) поиска, который реализует функция bpoisk(). Функция bpoisk() работает с массивом, элементы которого отсортированы по возрастанию. Определяется индекс “срединного ” элемента mid и его значение x[mid] сравнивается с ключом поиска Q. В случае несовпадения сравниваемых элементов отбрасывается та часть рассматриваемого массива, в которой искомого элемента заведомо быть не может (берется во внимание упорядоченность массива). Теперь к оставшейся части массива снова применяется только что описанная процедура. Так продолжается, пока не будет обнаружен искомый элемент массива, либо выяснится, что такого элемента в масwe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000о быть не может ()овина маив обороте внешнего0000000000000000000000000000000000000000000000000сиве нет, когда весь массив исчерпается.

#include <iostream.h>

#include <conio.h>

//Функция бинарного поиска

int bpoisk(int x[], int n, int Q)

{

int low=0, mid, high=n-1;

while(low<=high)

{

mid=(low+high)/2;

if(Q==x[mid])

return mid;

else

if(x[mid]<Q)

low=mid+1;

else

high=mid-1;

}

return -1;

}

// Главная

const int m=10;

int main()

{

int Q, t, i; int a[m];

cout<<"Введите массив:"<<”\n”;

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

{

cout<<"Введите a["<<i+1<<"] = "; cin>>a[i];

}

cout<<"Введите искомое число: ";

cin>>Q;

//**********************

t=bpoisk(a, m, Q);

//**********************

if(t>=0)

cout<<Q<<" на "<<t+1<<"-ом месте.";

else

cout<<Q<<" не найден.";

getch(); return 0;

}

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

Дадим некоторые предварительные пояснения. Во внутреннем цикле ( for(int i=0;…) ) функции sort_sp() последовательно сравниваются все пары соседних элементов и меняются местами, если они не упорядочены по возрастанию. За один оборот внешнего цикла (do – while) максимальный элемент из рассматриваемого множества чисел окажется на последнем, (n-1)–м месте и в дальнейших сравнениях он не участвует: при каждом обороте внешнего цикла количество сравниваемых во внутреннем цикле элементов уменьшается на единицу (n--;). Так происходит, пока во внешнем цикле не исчерпается весь массив (n=0). Однако возможно “ досрочное ” завершение сортировки, если на некотором шаге во внутреннем цикле не было ни одной перестановки элементов. Об этом сигнализирует состояние флага flag.

// Программа отлажена в Visual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

// функция сортировки сравнением смежных пар

void sort_sp(int x[], int n)

{ int flag;

do

{ n--; flag=0; // флаг, возможно, досрочного завершения

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

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

{ int r=x[i];

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

x[i+1]=r;

flag=1;

}

}

while(n != 0 && flag);

return;

}

// Функция бинарного поиска.

int bpoisk(int x[], int n, int Q)

{

int low=0, mid, high=n-1;

while(low<=high)

{

mid=(low+high)/2; //Середина массива

if(Q==x[mid])

return mid;

else

if(x[mid]<Q)

low=mid+1;

else

high=mid-1;

}

return -1;

}

// Главная

const int m=10;

int main()

{

int Q, t, i; int a[m];

setlocale(NULL, ".1251");

cout<<"Введи первичный массив(10 чисел)\n ";

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

cin>>a[i];

cout<<"Введи искомое число: ";

cin>>Q;

//**************************

sort_sp (a, m);

//**************************

cout<<"Отсортированный массив : "<<endl;

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

cout<<" "<<a[i];

cout<<"\n";

//**************************

t=bpoisk(a, m, Q);

//**************************

if(t>=0)

cout<<Q<<" на "<<t+1<<"-ом месте.";

else

cout<<Q<<" не найден.";

getch(); return 0;

}

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

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

// функция подсчитывает количество различных

// чисел в массиве

int razn(int x[], int m)

{

int i,j,k=1;

for(i=0; i<m-1; i++)

{

for(j=i+1;j<m;j++)

if(x[i]==x[j])

break;

if(j==m)

k++;

}

return k;

}

int main()

{

int a[]={0,9,5,7,5,7,9,0};

int n=sizeof(a)/sizeof(int);

printf("В массиве %d различных чисел\n",razn(a,n));

getch(); return 0;

}

Задача 95.Программа выводит на экран те элементы массива, которые встречаются в нём только по одному разу.

// Программа отлажена вVisual Studio 2008

#include <iostream>

#include <conio.h>

using namespace std;

const int m = 10;

int main()

{

int a[m]={3,7,6,1,5,7,6,9,5,7},i,k;

cout<<"Встречаются в массиве один раз:"<<endl;

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

{

k=0;

while(k<m)

{

if(a[k]==a[i] && i!=k)

break;

k++;

}

if(k==m) //цикл не завершился досрочно?

cout<<"a["<<i<<"]="<<a[i]<<endl;

}

getch(); return 0;

}

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

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#define n 10

#include<stdio.h>

#include<conio.h>

int main()

{

int k,i,r,kol;

int a[n]={10,9,8,5,9,7,9,8,9,1},

t[n]={0}, max,nmax;

// В массиве t[] фиксируется количество вхождений

// каждого из элементов массива a[].

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

{ r=a[i]; kol=0;

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

if(a[k]==r)

kol++;

t[i]=kol;

}

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

printf("%3d встречается %3d раз(а)\n",a[i],t[i]);

max=t[0]; nmax=0;

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

if(t[k] > max)

{ max=t[k];

nmax=k;

}

printf("Число %3d встречается %3d раз(а)\n",a[nmax], t[nmax]);

getch(); return 0;

}

Задача 97.Программа находит в заданном массиве три наибольших числа и выводит их значения на экран. Сначала элементы массива подвергаются сортировке сравнением смежных парпо убыванию. Три первых числа упорядоченного массива и есть результат работы программы.

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

int main()

{

int k, i, priz, r;

int a[]={10,9,5,7,2,4,12};

int n=sizeof(a)/sizeof(int);

k=n;

do

{ priz=1; k--;

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

if(a[i] < a[i+1])

{ r=a[i];

a[i]=a[i+1];

a[i+1]=r;

priz=0;

}

}

while(! priz);

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

printf("%d\n",a[i]);

getch(); return 0;

}

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

Задача 98. Это более совершенный алгоритм предыдущей задачи: если в массивеa[] имеется несколько одинаковых максимальных чисел, то программа после выявления первого максимального числа удаляет из массива все его вхождения, сдвигая все элементы массива в начало и корректируя число элементовn. Затем программа находит второе максимальное число и проделывает с ним то же самое. В конце концов, она сообщит о найденных трёх максимальных числах массива, предварительно переслав их в массивb[].

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

// вернуть как результат работы функции 3 максимальные

// числа в массиве с последовательным их удалением

int max3( int a[], int n, int b[])

{ int k,i,t,max;

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

{ max=a[0];

//найти очередной максимум

for(k=1; k<n; k++)

if(a[k] > max) max=a[k];

b[i] = max;

//удалить все его вхождения

t=0;

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

if(a[k] != max)

a[t++] = a[k];

n=t; //новый размер массива

}

return n;

}

int main()

{

int b[3],a[]={10,19,25,7,25,4,19,11,11};

int i,n=sizeof(a)/sizeof(int);

//**************

max3(a,n,b);

//**************

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

printf("%d-й максимум=%d\n",i+1, b[i]);

getch(); return 0;

}

Задача 99.Программа находит в заданном двумерном массиве mat[m][n] сумму минимальных элементов каждой строки матрицы.

// Программа отлажена вVisual Studio 2008

#include <iostream>

#include <conio.h>

using namespace std;

const int m=4,n=5;

int main()

{ int mat[m][n]= {{7,8,9,4,3},

{8,2,19,3,7},

{4,8,9,11,5},

{1,2,3,4,9}};

int min,i,k,s=0;

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

{ min=mat[i][0];

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

if(mat[i][k]< min)

min=mat[i][k];

s+=min;

}

cout<<"Сумма миним. элементов = "<<s;

getch(); return 0;

}

Задача 100.Даны два двумерных массива A[M][N] и B[M][N]. Построить одномерный массив R[M*N], содержащий те элементы массива A, которые не входят в массив B (т. н. разность множеств A и B).

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

const int m=4, n=5; int flag;

int d,i,j,k,l,r[m*n],

a[m][n]={{1,2,3,4,5},

{1,52,53,4,6},

{1,62,63,4,7},

{1,2,3,44,8}},

b[m][n]={{1,2,3,4,5},

{1,42,43,4,6},

{1,72,73,4,7},

{1,2,3,4,8} };

int t=0;

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

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

{ d=a[i][j]; flag=0;

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

{ for(l=0; l<n; l++)

if(d==b[k][l])

{ flag=1; goto m1;} // break;}

// if ( flag==1)

// break;

}

m1:if(flag==0)

r[t++]=d;

}

cout << "Разность множеств А и В :"<<endl;

for(k=0;k<t;k++)

cout<<r[k]<<'\n';

getch(); return 0;

}

Задача 101.Определить квадратную матрицу n–го порядка. Создать функцию для транспонирования заданной матрицы. Результат поместить на месте исходной матрицы.

При определении формального параматра-матрицы (int a[][n]) первая пара скобок после имени пуста, а вот количество столбцов матрицы во второй паре скобок следует указать явно. Количество столбцов жестко задано в функции, но количество строк может изменяться. Имейте в виду, что следующее объявление не будет работать надлежащим образом:

int a[][]; //ошибочное объявление

Обратите внимание, что для транспонирования матрицы только те её элементы, которые находятся под главной диагональю (или над нею), переставляются местами с элементами, симметричными им относительно главной диагонали.

// Программа отлажена вVisual Studio 2008

#include<conio.h>

#include<stdio.h>

#include<iostream>

using namespace std;

const int n=5;

// функция транспонирования матрицы

void transp_matr(int a[][n])

{ int rab,i,k;

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

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

{ rab = a[i][k];

a[i][k] = a[k][i];

a[k][i] = rab;

}

}

int main()

{ int mat[n][n]={{ 1, 2, 3 ,4, 5},

{ 6, 7, 8, 9,10},

{11,12,13,14,15},

{16,17,18,19,20},

{21,22,23,24,25} };

int i, k;

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском языке !

wcout<<L"Исходная матрица :\n";

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

{ for(k=0; k<n; k++)

printf("%3d ", mat[i][k]);

cout<<endl;

}

//*****************

transp_matr(mat);

//*****************

wcout<<L"Транспонированная иатрица :\n";

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

{ for(k=0; k<n; k++)

printf("%3d ", mat[i][k]);

cout<<endl;

}

getch(); return 0;

}

Задача 102. Определить квадратную матрицу n–го порядка. Подсчитать сумму её элементов под главной диагональю и произведение элементов под побочной диагональю.

// Программа отлажена вVisual Studio 2008

#include<iostream>

#include<conio.h>

using namespace std;

const int n=4;

int main()

{int mat[n][n]={{7,8,3,4},

{8,2,9,7},

{4,8,2,5},

{1,2,3,1}};

int i,k,s1=0,s2=1;

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

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

{ if (i>k) s1=s1+mat[i][k];

if (i+k>=n) s2=s2*mat[i][k];

}

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

wcout<<L"Сумма элементов под главной диагональю = "<<s1<<endl;

wcout<<L"Произведение элементов под побочной диагональю = "<<s2;

_getch();return 0;

}

Задача 103. Пусть дана вещественная матрица размером M x N ( M, N – заданные константы). Упорядочить её строки по неубыванию сумм их элементов (Задача 9.23б из В. Пильщикова).

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

const int M=6, N=6 ;

// функция сортировки строк матрицы

void sort_matr(float mat[][N],int m, int n, float s[])

{ float rab ; int j, i, k;

// сортировка строк матрицы

for (i=0; i<m-1; i++)

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

if( s[i] > s[k])

{ rab=s[i]; s[i]=s[k]; s[k]=rab;

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

{ //перестановка строк

rab=mat[i][j];

mat[i][j]=mat[k][j];

mat[k][j]= rab;

}

}

return ;

}

int main()

{ float mat[M][N] = {{6,666,1,1,1,1},

{5,555,1,1,1,1},

{1,111,1,1,1,1},

{3,333,1,1,1,1},

{2,222,1,1,1,1},

{4,444,1,1,1,1}};

int i,k; float s[M];

//сумма элементов каждой строки

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

{

//cout<<i<<" я строка:\n";

s[i]=0;

for (k=0; k<N; k++)

s[i]=s[i] + mat[i][k];

}

printf("исходная матрица сумма по строке\n");

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

{

printf("\n");

for(k=0; k<N; k++)

printf ("%5.0f ", mat[i][k]);

printf ("%7d -я строка %6.0f ",i, s[i]);

}

//-******************

sort_matr( mat, M, N, s);

//*******************

printf("\n\nрезультат сортировки матрицы\n");

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

{

printf("\n");

for(k=0; k<N; k++)

printf ("%5.0f ", mat[i][k]);

}

getch(); return 0;

}

Задача 104. По заданной матрице A [m, m] определить линейный массив В[m], получаемый из элементов побочной диагонали матрицы их делением на максимальный среди элементов, расположенных ниже главной диагонали матрицы A. Выполнить сортировку массива В по убыванию элементов.

// Программа отлажена вVisual Studio 2008

#include "stdafx.h"

#include<conio.h>

#include<stdio.h>

#include<iostream>

using namespace std;

const int n=5;

// функция сортировки сравнением смежных пар

void sort_sp(double x[], int n)

{ int flag;

do

{ n--; flag=0; // флаг, возможно, досрочного завершения

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

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

{ double r=x[i];

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

x[i+1]=r;

flag=1;

}

}

while(n != 0 && flag);

return;

}

//Головной модуль

int main()

{ double a[n][n] = {{ 1, 2, 3, 4, 5},

{ 6, 7, 8, 9, 10},

{11, 12, 13, 14, 15},

{16, 17, 18, 19, 20},

{21, 22, 23, 24, 25} };

double b[n]; int i, k;

// Устанавливаем локализацию для выходного потока

wcout.imbue( locale( "rus_rus.866" ) );

// Выводим строку на русском !

wcout<<L"Исходная матрица :\n";

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

{ for(k=0; k<n; k++)

printf("%3.0lf ", a[i][k]);

cout<<endl;

}

// Найти максимальный среди элементов ниже главной диагонали

double max = a[1][0];

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

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

if (a[i][k] > max)

max = a[i][k];

//Создать массив из побочной диагонали

wcout<<L"массив из побочной диагонали :\n";

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

b[i]= a[i][n-i-1]/max;

// вызвать функцию сортировки по убыванию элементов

sort_sp(b, n);

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

printf("%5.2lf ", b[i]);

getch(); return 0;

}

Задача 105. В заданной матрице A[n, n] максимальный элемент каждой строки таблицы обменять с диагональным элементом этой же строки.

// Программа отлажена вVisual Studio 2008

//swap_dia.cpp - максимальный элемент каждой строки таблицы

// обменять с диагональным элементом этой же строки.

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

const int N = 4;

int main()

{

int a[N][N]={ {8, 3, 11, 5},

{4, 22, 9, 13},

{8, 1, 0, 33},

{-1, 0,91, 1}}, i,k,amax,kmax;

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

{ amax=a[i][0]; kmax=0;

for (k=1;k<N;k++)

if (a[i][k]>amax)

{ amax=a[i][k];kmax=k;}

a[i][kmax] = a[i][i];

a[i][i] = amax;

}

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

{

for (k=0;k<N;k++)

cout<<"\t "<<a[i][k];

cout<<"\n";

}

getch(); return 0;

}

Задачи для самостоятельного решения

а) линейные массивы

  1. В заданном целочисленном массиве A[20] найти первый равный нулю элемент и напечатать его порядковый номер .

  1. Зарплата m сотрудников фирмы представлена как массив вещественных чисел. Вычислить среднюю зарплату и порядковый номер того сотрудника, у которого зарплата максимальна

  1. Составить программу, которая организует массив P[m], куда последовательно вводится вес багажа каждого из m пассажиров авиарейса. Затем программа вычисляет и выводит на экран:

- суммарный вес багажа всех пассажиров;

- максимальный вес багажа;

- средний багаж на 1 пассажира

  1. В детском садике регулярно измеряют рост и вес детей, занося данные изменений в два массива H и P. Найти в каждом массиве порядковый номер элемента, соответствующий минимальному весу и максимальному росту ребёнка соответственно

  1. На товарном складе данные о проданных товарах хранятся в виде двух массивов: массив объёмов товаров (в шт.) и массив цен (грн. за штуку). Сформировать третий массив — стоимость каждой партии товаров. Результат выдать на экран .

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

7. Элементы заданного целочисленного массива A упорядочены по возрастанию. Расположить эти числа в массиве B в порядке убывания их значений .

  1. Переслать нечётные элементы заданного целочисленного массива А в его начало, а чётные — в конец массива А. Результаты выдать на экран.

  1. Переслать положительные элементы заданного целочисленного массива А в новый массив В, а отрицательные — в массив С. Результаты выдать на экран.

  1. Дан массив A[N]. Составить программу, которая подсчитывает наибольшее количество одинаковых подряд идущих элементов.

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

  1. Для заданного массива из 100 чисел подсчитать S1 и количество K1 его положительных элементов, а также сумму S2 и количество K2 отрицательных элементов.

  1. Составить программу, которая определяет, есть ли в массиве А[1..n] одинаковые элементы и выдает на экран такие числа и их индексы.

  1. Элементы заданного целочисленного массива A упорядочены по возрастанию. Расположить эти числа в массиве B в порядке убывания их значений.

  1. Даны два массива A[N] и B[M], упорядоченные по возрастанию значений их элементов. Переслать все элементы этих массивов в новый массив C[N+M], который также должен быть упорядочен по возрастанию. Сортировку не применять.

  1. Задан массива чисел A[N]. Составить программу, которая в качестве каждого i-го элемента этого массива записывает сумму предшествующих ему чисел от A[0] до A[i] включительно (i = 1,2,...,N-1).

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

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

  1. Дан массив A[N]. Составить программу, которая определяет, какое из чисел встречается в нём наибольшее количество раз.

  2. В заданном целочисленном массиве Z[0..n] выполнить циклический сдвиг всех его элементов на К шагов влево. При этом каждый элемент Z[i] перемещается на место Z[i-K], а те элементы, которым "не хватило места", последовательно заполняют массив с противоположного конца.

  3. В заданном целочисленном массиве Z[1..n] найти наиболее протяжённую последовательность повторяющихся чисел, напечатав количество таких чисел и индексы начала и конца такой последовательности( например, в массиве 8,3,3,7,8,8,8,8,9 это цепочка 8,8,8,8).

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

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

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

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

  1. Дана квадратная матрица n-го порядка, элементы которой — натуральные числа. Найти сумму элементов главной и побочной диагоналей.

  2. В заданной матрице размерами m x n найти строку, сумма элементов которой максимальна. Найти в этой строке минимальный элемент.

  3. В двумерном массиве A[m][n] все числа различны. В каждой строке выбирается мини­мальный элемент, а затем среди этих чисел выбирается максимальное. Определить номер строки и столбца массива А, в которых расположено выбранное число.

  4. Найти число положительных и число отрицательных элементов каждой строки матрицы A[1..m][1..n]. Результаты выдать на экран, а также переслать в массивы КР[1..m] и KO[1..m] соответственно.

  5. Определить количество положительных элементов каждого столбца матрицы X[M][N] и запомнить найденные числа в массиве B[N].

  6. В заданной матрице A[M][N] найти строку, в которой находится максимальный элемент матрицы и переслать эту строку в массив B[N].

  7. В заданной целочисленной матрице A[M][N] найти строку, содержащую наибольшее число нулевых элементов и напечатать её.

  8. Составить программу формирования и печати квадратной матрицы n-го порядка, содержащей нули на главной диагонали, единицы под главной диагональю и двойки — над ней.

  9. Составить программу формирования и печати матрицы X[8][8], заполненной нулями и единицами в шахматном порядке.

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

  11. В данной матрице A[N][N] найти минимальный из элементов, расположенных под главной диагональю, и максимальный из элементов, расположенных над главной диагональю.

в) массивы как параметры функций

  1. В массиве A[N] каждый элемент равен 0, 1, или 2. Составить функцию, которая позволяет переставить элементы массива так, чтобы сначала располагались все двойки, затем нули и, наконец, все единицы.

  2. Составить функцию для циклической перестановки элементов массива A[m] на заданное число n шагов, так что элемент A[i] перемещается в A[i+n], а последние n элементов, которым “не хватило места”, перемещаются в освободившиеся первые n ячеек массива.

  3. Создать функцию, которая позволяет сформировать массив f[30], содержащий последовательность чисел Фибоначчи. Эти числа определяются так: f0 = 1, f1 = 1, а каждое следующее число равно сумме двух предыдущих:

fn+1 = fn + fn-1 n = 1, 2, 3, …

Вот несколько первых чисел Фибоначчи:

1, 1, 2, 3, 5, 8, 13, 21, …

  1. Создать функцию, которая позволяет проверить, составляют ли элементы заданного целочисленного массива A[0..N] арифметическую прогрессию.

  1. Создать функцию, которая позволяет переслать положительные элементы заданного массива a[] в массив b[], а отрицательные — в массив c[] и подсчитать количество тех и других (K1 и K2 соответственно).

  2. Создать функцию, которая по заданному массиву а[20] формирует новый массив b[20], каждый элемент которого формируется так:

b[0] = a[0]

b[1] = a[0] + a[1]

b[2] = a[0] + a[1] + a[2]

…………………………

  1. Создать функцию, которая позволяет для целого числа N выделить каждую его цифру и записать последовательность цифр в массив a[5] . Результат выдать на экран .

  2. Создать функцию, которая позволяет решить следующую задачу. Дан массив А[ ] — непустая последовательность ненулевых целых чисел, за которой следует 0. Определить, сколько раз в этой последовательности меняется знак. (Например, в последовательности 1, –34, 5, 6, –9 знак меняется 3 раза)

  3. Создать функцию, которая, позволяет в упорядоченном по возрастанию элементов массиве X найти все те элементы, которые не принадлежат заданному интервалу [A,B] и переслать их в массив Y. Результат выдать на экран.

  4. В заданном целочисленном массиве A[1..n] подсчитать количество различных чисел (повторяющиеся числа учитывать один раз). Например, в массиве 8, 3, 8, 4, 8, 3, 4 три различных числа. Оформить в виде функции.

  5. Создать функцию, которая позволяет найти элемент матрицы, минимальный в той строке, в которой стоит элемент, максимальный для всей матрицы.

  6. Создать функцию, которая позволяет в каждой строке заданной матрицы найти минимальный элемент и обменять его с диагональным элементом этой же строки.

  7. Даны два двумерных массива A[M][N] и B[M][N]. Построить одномерный массив R, содержащий те элементы массива A, которые входят в массив B. Оформить в виде функции.

  8. Cоставить функцию, которая переставляет местами два столбца заданной матрицы A[M][N] с заданными номерами P и Q.