Лекция №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();
}
|
|