Массивы

Лекция №6

СЛОЖНЫЕ ТИПЫ ДАННЫХ

Массивы

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

Объявление массива имеет два формата:

СпецификаторТипа ИмяМассива [КонстантноеВыражение];

СпецификаторТипа ИмяМассива [ ];

СпецификаторТипа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

КонстантноеВыражение в квадратных скобках задает количество элементов массива. КонстантноеВыражение при объявлении массива может быть опущено в следующих случаях:

• при объявлении массив инициализируется,

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

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

Пример:

double b[10]; /* вектор из 10 элементов имеющих тип double */float f[4]={3.5,6.8,9.0,6};float f1[]={2.3,5.6,6.7,4.2,3};

Пример: Найти максимальный элемент массива A[10]

#include<stdio.h>

main()

{

const N=10; /*размерность масcива А*/

static float A[N]; /*описание масcива А */

float MAX;

int I;

//ввод элементов массива

printf("Bведите через пробел %d чисел\n ",N);

for (I=1;I<=N;I++) scanf("%f",&A[I]);

// нахождение наибольшего элемента последовательности

MAX =A[1];

for (I=2;I<=N;I++)

if (A[I]>MAX) MAX =A[I];

printf("\nMАX=%.3f",MAX);

}

Пример: Дан массив А[10]. Выполнить сортировку первой половины массива в порядке убывания (метод обмена), а вторую – в порядке возрастания (метод выбора).

#include<stdio.h>

void main()

{

const N=10; /*размерность масcива А*/

static float A[N]; /*описание масcива А */

float k;

int I,J,m;

//ввод элементов массива

printf("Bведите через пробел %d чисел\n ",N);

for (I=0;I<N;I++) scanf("%f",&A[I]);

// Сортировка методом обмена

for(I=0;I<N/2-1;I++)

for (J=0;J<N/2-1;J++)

if (A[J]<A[J+1]) /*Сравнение пары соседних чисел A[J] и A[J+1]*/

{

k=A[J]; /*Перестановка A[J] и A[J+1] местами */

A[J]=A[J+1];

A[J+1]=k;

}

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

for(I=N-1;I>N/2+2;I--)

{

m=N/2+1; /* Индекс первого элемента */

for (J=N/2+1;J<I;J++)

if (A[J]>A[m]) m=J;

k=A[m]; /*Перестановка A[m] и A[I] местами */

A[m]=A[I];

A[I]=k;

}

//вывод отсортированного массива

printf("\nОтсортированный массив\n");

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

printf("%8.2f\n",A[I]);

}

Пример: Дан массив А[10]. Выполнить сортировку массива в порядке возрастания.

#include<stdio.h>

void main()

{

const N=10; /*размерность масcива А*/

static float A[N]; /*описание масcива А */

float k;

int I,J,m;

//ввод элементов массива

printf("Bведите через пробел %d чисел\n ",N);

for (I=0;I<N;I++) scanf("%f",&A[I]);

// Сортировка

for(I=0;I<N-1;I++)

for (J=I+1;J<N;J++)

if (A[I]<A[J])

{

k=A[I];

A[I]=A[J];

A[J]=k;

}

//вывод отсортированного массива

printf("\nОтсортированный массив\n");

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

printf("%8.2f\n",A[I]);

}

Пример: Дан массив A[N]. Найти произведение положительных элементов первой половины массива и сумму отрицательных элементов второй половины массива. Использовать цикл while.

#include<stdio.h>

#include<conio.h>

void main()

{

const N=10;

int I,P,S;

static int A[N];

printf("Введите %d чисел\n",N);

I=0;

P=1;

while(I<N/2)

{ scanf("%d",&A[I]);

if (A[I]>0) P=P*A[I];

I++;}

I=N/2+1;

S=0;

while (I<N)

{ scanf("%d",&A[I]);

if (A[I]<0) S=S+A[I];

I++;}

printf("P= %d\n",P);

printf("S= %d",S);

getch();

}

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

Форма записи многомерного массива:

СпецификаторТипа ИмяМассива [КонстантноеВвыражение1] …[КонстантноеВыражениеN];

Каждое КонстантноеВыражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит два КонстантныхВыражения, трехмерного - три и т.д. Отметим, что в языке С++ первый элемент массива имеет индекс равный 0.

Инициализация массива выполняется при помощи заключенного в фигурные скобки списка инициализаторов. Инициализаторы даются по возрастанию индекса массива.

Примеры:

int w[3][3] = { { 2, 3, 4 },{ 3, 4, 8 },{ 1, 0, 9 } };int a[2][3]; /* представлено в виде матрицыa[0][0] a[0][1] a[0][2]a[1][0] a[1][1] a[1][2] */

В последнем примере объявлен массив w[3][3]. Списки, выделенные в фигурные скобки, соответствуют строкам массива, в случае отсутствия скобок инициализация будет выполнена неправильно.

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

Примеры:

int s[2][3];

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

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

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

Пример: Дан двумерный массив A[N][M]. Выполнить сортировку массива по возрастанию.

#include<stdio.h>

#include<conio.h>

main()

{

const N=2,M=3; /*размерность масcива А*/

static int A[N][M];

static int B[N*M]; /*описание масcивов А,В,С*/

int I,J,K;

//ввод элементов массива

K=1;

printf("Bведите элементы массива А[%d][%d]\n ",N,M);

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

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

{

scanf("%d",&A[I][J]);

B[K]=A[I][J];

K=K+1;

}

for (I=0;I<N*M-1;I++)

for (J=I+1;J<N*M;J++)

if (B[I]<B[J])

{ K=B[I];

B[I]=B[J];

B[J]=K;

}

K=1;

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

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

{

A[I][J]=B[K];

K=K+1;

}

printf("\nОтсортированный массив \n");

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

{

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

printf("%4d",A[I][J]);

printf("\n");

}

getch();

}

Пример: Дан двумерный массив NxM целых чисел, где N=2, а M=3. Сформировать массив В, состоящий из четных максимальных элементов каждой строки массива, и массив С, состоящий из максимальных нечетных элементов каждой строки массива.

#include<stdio.h>

#include<conio.h>

void main()

{

const N=2,M=3; /*размерность масcива А*/

static int A[N][M];

int B[N],C[N]; /*описание масcивов А,В,С*/

int MAX;

int I,J;

//ввод элементов массива

printf("Bведите элементы массива А[%d][%d]\n ",N,M);

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

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

scanf("%d",&A[I][J]);

// нахождение наибольшего элемента последовательности

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

{

MAX=A[I][1];

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

if (A[I][J]>MAX) MAX=A[I][J];

if (MAX%2==0)

{

B[I] =MAX;

C[I]=0;

}

else

{C[I] =MAX;

B[I]=0;

}

}

printf("\nМассив B\n");

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

printf("%-4d",B[I]);

getch();

printf("\nМассив С\n");

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

printf("%-4d",C[I]);

getch();

}

Пример: Дан массив A[N][M]. Найти максимальный элемент каждой строки массива.

#include<stdio.h>

void main()

{

const N=2,M=3;

static int A[N][M];

int I,J,MAX;

printf("Введите массив А[%d][%d]\n",N,M);

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

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

scanf("%d",&A[I][J]);

printf("\nМаксимальные элементы каждой строки:\n");

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

{

MAX=A[I][1];

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

if (A[I][J]>MAX) MAX=A[I][J];

printf("%d\n",MAX);

}

}

Пример: Дан двумерный массив A[N][M]. Поменять местами 1 и 2 строку, а затем поменять местами 1 и 3 столбец.

#include <stdio.h>

void main()

{

const n=3,m=3;

static int a[n][m];

int i,j,k;

printf(" Введите массив %d X %d\n",n,m);

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

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

scanf("%d",&a[i][j]);

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

{

k=a[1][j];

a[1][j]=a[2][j];

a[2][j]=k;

}

printf(" 1 и 2 строки поменяли местами\n");

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

{

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

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

printf("\n");

}

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

{

k=a[i][1];

a[i][1]=a[i][3];

a[i][3]=k;

}

printf(" 1 и 3 столбцы поменяли местами\n");

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

{

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

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

printf("\n");

}

}

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

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

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

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

Пример: Дано натуральное n, символы S1,..,Sn. Подсчитать наибольшее число букв А, идущих подряд в данной последовательности

символов.

#include<stdio.h>

#include<conio.h>

void main()

{

const N=10;

int I,K,K1;

char S[N];

K=0; K1=0;

printf("ВВЕДИТЕ СТРОКУ СИМВОЛОВ\n");

scanf("%s",S);

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

{

if (S[I]=='A') K=K+1; else K=0;

if ((K>1)&&(K>K1)) K1=K;

}

printf("КОЛИЧЕСТВО СТОЯЩИХ ПОДРЯД А = %d",K1);

getch();

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: