Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Многомерные массивы




И) Поиск совпадений

З) Сортировка массива

Е) Обмен местами

Задача 14. Поменять местами первый и последний элемент массива.

 

При обмене, чтобы не потерять одно из значений, потребуется дополнительная переменная:

 

p=a[0];

a[0]=a[n-1];

a[n-1]=p;

 

ж) Поиск минимума/максимума

Задача 15. Найти в массиве наименьший элемент и его позицию.

 

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

 

min=a[0]; k=0;

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

if (a[i]<min)

{ min=a[i]; k=i; }

 

Эту же программу можно переписать и короче:

 

for (i=k=0, min=a[0]; i<n; i++)

if (a[i]<min)

min=a[k=i];

 

Задача 16. Отсортировать массив по возрастанию (т.е. расположить его элементы в порядке возрастания).

 

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

 

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

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

if (a[k]<a[i]) {

p=a[k]; // Обмен a[k] и a[i]

a[k]=a[i];

a[i]=p;

}

 

Здесь на каждой итерации внешнего цикла происходит помещение на i-ую позицию наименьшего из "оставшихся" (т.е. расположенных от i-ой позиции до конца массива) значений элементов.

Этот алгоритм включает в себя, таким образом, алгоритмы поиска минимума и обмена.

Задача 17. Найти в массиве элемент, повторяющийся наибольшее количество раз. (Если таких элементов несколько, вывести любой из них).

 

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

s=1; // s - число повторений i-го элемента

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

if (a[k]==a[i]) s++;

if (s>max) {

max=s; // max - число повторений x

x=a[i]; // x - значение наиболее

} // частого элемента

}

 

Заметим, что x здесь не присвоено начальное значение, т.к. оператор x=a[i]; обязательно выполнится хотя бы раз (max вначале = 0, а s не меньше 1), а использовано x будет лишь впоследствии.

 

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

Декларация многомерного массива имеет следующий формат:

тип ID [ размер 1] [ размер 2]…[ размерN ] =

{ { список начальных значений },

{ список начальных значений },

};

Списки начальных значений – атрибут необязательный.

Пример:

 

int a[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };

 

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

a[2][1]

a[i+1][k]

 

Рассмотрим особенности работы с многомерными массивами на конкретном примере двумерного массива (двумерные массивы называют также матрицами):

 

#include <stdio.h>

void main()

{

int i, j;

int m[3][4] = { { 1, 2, 3, 4}, {11,12,13,14}, {21,22,23,24} };

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

printf("\n %2d)", i+1);

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

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

}

}

 

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

1) 1 2 3 4

2) 11 12 13 14

3) 21 22 23 24

 

б) Диагонали квадратной матрицы

 

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

 

 

Обозначим размер матрицы буквой N, индекс строки буквой I, а индекс столбца буквой J. Тогда у элементов, лежащих на главной диагонали, I = J, а у элементов, лежащих на побочной диагонали, I + J = N - 1.

 

Задача 4. Найти сумму элементов матрицы, лежащих над главной диагональю.

 

Из рисунка видно, что у элементов, лежащих над главной диагональю,

I < J.

Можно учесть это в условии оператора if, либо цикла for:

 

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

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

s+=a[i][j];

 

 

в) Работа со строками и столбцами

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

В применении же ко всей матрице это обычно требует дополнительного внешнего цикла (циклов).

 

Задача 5. Поменять местами первую и последнюю строки матрицы.

 

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

p=a[0][j];

a[0][j]=a[n-1][j];

a[n-1][j]=p;

}

 

Задача 6. Найти сумму элементов в каждой строке матрицы.

 

Поскольку строк в матрице несколько, ответом будет не одно число, а одномерный массив:

 

int b[10];

 

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

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

s+=a[i][j];

b[i]=s;

}

 

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

printf("%d ", b[i]);

puts("");

 

Задача 7. Найти сумму элементов в каждом столбце матрицы.

 

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

 

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

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

s+=a[i][j];

b[j]=s;

}

 

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

printf("%d ", b[j]);

puts("");

 

 

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

 

Прежде всего, нужно определить эти количества и занести их в одномерный массив (обозначим его b):

 

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

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

if (a[i][j]==0) s++;

b[i]=s;

}

 

 

Затем нужно отсортировать матрицу. В процессе этого обменивать местами нужно как сами строки, так и соответствующие им элементы одномерного массива b (чтобы каждый его элемент продолжал соответствовать своей строке):

 

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

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

if (b[k]>b[i]) {

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

{ p=a[i][j]; a[i][j]=a[k][j]; a[k][j]=p; }

p=b[i]; b[i]=b[k]; b[k]=p;

}




Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 467; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.