Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы_по_проге_Берлин / Книги / учебное пособие ОАиП.pdf
Скачиваний:
49
Добавлен:
11.02.2015
Размер:
947 Кб
Скачать

while(i2>=0) // аналогично для второго массва m3[i3++]=m2[i2--];

puts("\nРезультирующий массив"); for(i3=0;i3<(n+m);i3++) printf("%3d",m3[i3]);

}

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

#include <stdio.h> #define n 3 #define m 5

void main()

{int m1[n], m2[m], m3[n+m], i1, i2, i3; puts("\nВведите первый массив по возрастанию"); for(i1=0;i1<n;i1++)

{printf("\nm1[%d]=",i1);

scanf("%d",&m1[i1]);

}

puts("\nВведите второй массив по убыванию"); for(i2=0;i2<m;i2++)

{ printf("\nm2[%d]=",i2); scanf("%d",&m2[i2]);

}

i1=n-1; i2=0; i3=0; while(i1>=0 && i2<m)

{while(m1[i1]>=m2[i2] && i1>=0) m3[i3++]=m1[i1--];

if(i1<0) break; while(m2[i2]>m1[i1] && i2<m)

m3[i3++]=m2[i2++];

}

while(i1>=0) m3[i3++]=m1[i1--]; while(i2<m) m3[i3++]=m2[i2++];

puts("\nРезультирующий массив"); for(i3=0;i3<(n+m);i3++) printf("%3d",m3[i3]);

}

Многомерные массивы (матрицы)

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

доступа к конкретному элементу массива. Пример объявления двухмерного массива.

int mas[5][15];

Константное выражение, определяющее одну из размерностей массива, не может принимать нулевое значение:

int mas[0][7]; // ошибка

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

int mas[2][3]={2, 14, 36, 23, 1, 9};

Проинициализированный массив будет выглядеть так: 2 14 36 23 1 9

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

int mas[][3]={ 34, 23, 67, 38, 56, 73, 37, 94, 28 };

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

int mas[][3]={{ 0 },

{10, 11},

{21, 21, 22} };

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

n= mas[i][j];

//

работа с элементом расположенным на i-ой

mas[i][j]=n;

//

строке и в j-ом столбце матрицы mas

Примеры программ

Рассмотрим некоторые примеры программ с использованием многомерных матриц.

Пример . Транспонировать матрицу относительно главной диагонали. #include <stdio.h>

#define nn 3 void main()

{int mas[nn][nn],i,j,kk; printf("\n‚Введите матрицу");

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

//

цикл по строкам матрицы

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

//

цикл по столбцам матрицы

{printf("\n‚введите элемент mas[%d][%d] = ",i,j); scanf("%d",&mas[i][j]);

}

clrscr();

printf("\nИсходная матрица "); // Вывод матрицы на экран

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

//

цикл по строкам матрицы

{

printf("\n");

 

 

 

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

//

цикл по столбцам матрицы

}

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

 

 

 

 

// пример транспонирования используя оператор for for(i=0;i<nn;i++)

for(j=i+1;j<nn;j++) { kk=mas[i][j];

mas[i][j]=mas[j][i];

mas[j][i]=kk;

}

// пример транспонирования используя оператор do while i=0;

do

{ j=i+1; do

{kk=mas[i][j];

mas[i][j]=mas[j][i];

mas[j][i]=kk; } while(++j<nn);

}while(+i<nn);

//пример транспонирования используя оператор while i=0;

while(i<nn)

{j=i+1;

while(j<nn)

{kk=mas[i][j];

mas[i][j]=mas[j][i];

mas[j++][i++]=kk;

}

}

printf("\nИсходная матрица "); // Вывод матрицы на экран for(i=0;i<nn;i++) // цикл по строкам матрицы

{

printf("\n");

 

 

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

// цикл по столбцам матрицы

}

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

 

 

}

Пример . Нахождение седловой точки двухмерного массива (элемента являющегося наибольшим в строке и наименьшим в столбце).

#include<stdio.h> #define n 4

void main()

{int ms[n][n],i,i1,i2,j,j1,k,kk; clrscr();

printf("\n‚Введите матрицу"); for(i=0;i<n;i++)

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

{printf("\ms[%2d][%2d]= ",i,j); scanf("%d",&ms[i][j]);

}

clrscr();

printf("\nВведенный массив MS"); for(i=0;i<n;i++)

{printf("\n");

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

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

}

// блок поиска седловой точки for(i=0;i<n;i++)

{k=ms[i][0]; i1=0; j1=0; // начальное значение координат в матрице

//для поиска седловой точки

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

// цикл анализа i-ой строки

if (ms[i][j]>k)

// найдено новое максимальное в строке

{ k=ms[i][j];

// запоминаем найденное значение

i1=i; j1=j;

// и его координаты в матрице

}

kk=0;

for(i2=0;i2<n;i2++) if(ms[i1][j1]>=ms[i2][j1] && i1!=i2) kk=1; if(kk==0)

printf("\nседловая точка = %d \nкоординаты : MS[%d][%d] ", ms[i1][j1],i1,j1);

}

}

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

#include<stdio.h> void main()

{int i,j,k,n,t;

int a[3][4],b[4][2],c[3][2]; printf("\nВведите матрицу a"); for(i=0;i<3;i++) for(j=0;j<4;j++)

{printf("\na[%d][%d]=",i,j);

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

}

printf("\n Введите матрицу b"); for(i=0;i<4;i++) for(j=0;j<2;j++)

{printf("\nb[%d][%d]=",i,j);

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

}

// умножение матриц используя оператор while

i=0;

while(i<3)

{j=0;

while(j<2)

{c[i][j]=0;

k=0;

while(k<4)

{c[i][j]+=a[i][k]*b[k][j];

k++;

}

j++;

}

i++;

}

// умножение матриц используя оператор do while

i=0; do

{j=0; do

{c[i][j] = 0; k = 0;

do

{c[i][j] += a[i][k] * b[k][j]; k++;

}while( k < 3 );

j++;