Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНТРОЛЬНАЯ_РАБОТА_Лабораторный практикум Алгор...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
521 Кб
Скачать
☆

Задания

21. Дан линейный массив а из n элементов. Получить сумму всех четных элементов.

22. Дан массив а из n элементов. Поменять местами максимальный и минимальный элементы этого массива.

23. Дан линейный массив из n элементов. Удалить из него максимальный элемент.

24. Дан линейный массив из n элементов. Определить номер последнего отрицательного элемента массива.

25. Дан линейный массив из n элементов. Получить новый массив только из положительных элементов данного.

26 *. Дан линейный массив из n элементов. Удалить те элементы массива, которые нарушают упорядоченность элементов массива по возрастанию.

27 *. Дан линейный массив из n элементов, в котором положительных и отрицательных элементов поровну. Преобразовать этот массив, поставив их в следующем порядке: положительный, отрицательный, положительный, отрицательный и т.д.

28 *. Дан линейный массив из n элементов. Найти элемент, значение которого ближе других к значению среднего арифметического элементов массива.

29 *. Дан линейный массив из n элементов. Определить длину самой длинной последовательности элементов, расположенных в массиве по возрастанию.

30 *. Дан линейный массив из n целых элементов. Удалить из массива те из элементов, которые являются делителями самого максимального элемента массива.

31. Дан линейный массив из n элементов. Упорядочить все элементы массива, расположенные между минимальным и максимальным элементами массива.

32. Дан линейный массив из n элементов. Удалить все элементы, расположенные между минимальным и максимальным элементами массива.

33. Дан линейный массив из n элементов. Все элементы, стоящие до максимального элемента, упорядочить по возрастанию, а элементы, расположенные после него - по убыванию.

34. Дан одномерный массив. Выяснить, является ли он упорядоченным по возрастанию.

Лабораторная работа № 4

Дисциплина: Языки программирования

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

Цель: Разобрать приведенные примеры, уметь решать задачи с многомерными массивами

Краткая теория

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

<спецификация_типа><описатель>[<кон.выр.1>][<кон.выр.2>]...;

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

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

Имя многомерного массива является константой-указателем на первый элемент массива.

Поэтому обращение к первому элементу массива

int a[5][5];

Для обращения к j-ому элементу i-ой строки можно воспользоваться a[i][j], компилятор интерпретирует обращение как *(*(a+i)+j) и вычисляет адрес элемента как смещение от начального адреса массива.

Элементы двумерного массива располагаются в памяти в порядке скорейшего возрастания младшего индекса. Сначала идут элементы первой строки массива, затем элементы второй стоки массива и т.д. Отсчет индексов начинается с нуля, поэтому первая строка и первый столбец массива имеют номер 0, а элемент, стоящий на их пересечении - a[0][0].

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

int a[5][3];

int n,m;

printf("\n введите размерность массива n и m");

scanf("%d%d",&n, &m);

printf("\n введите элементы массива построчно");

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

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

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

При n=3, m=2 массив a= выглядит в памяти так:

1

2

3

4

5

6

Двумерный массив можно инициализировать значениями сразу при определении:

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

1.

Дан двумерный массив размерности n*m. Найти номер строки и столбца, на пересечении которых находится минимальный элемент.

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

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

# include <stdio.h>

main()

{

// исходный массив

int n,m;

int a[10][10];

int min, row, col; // минимум, и номера строки и столбца

int i,j;

printf("\n введите размерность массива n и m");

scanf("%d%d",&n,&m);

printf("\n введите элементы массива построчно");

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

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

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

min=a[0][0];

row=col=0;

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

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

if (min>a[i][j])

{

min=a[i][j];

row=i;col=j;

}

printf("\n строка - %d, столбец - %d",row,col);

}

2.

Дан двумерный массив размерности n*m. Поменять местами первую строку массива со строкой, в которой все элементы отрицательны, в предположении, что такая строка есть.

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

Чтобы осуществить требуемую перестановку, необходимо первоначально найти нужную строку. Можно перебирать все строки, начиная с первой, до тех пор, пока эта строка не будет найдена, т.е. в ней количество отрицательных элементов будет равно общему количеству элементов строки.

Это можно сделать так:

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

{

s=0;

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

if (a[i][j]<0)

s++;

if (s==m)

k=i;

}

Однако, такой фрагмент будет перебирать все строки, даже если искомая строка уже определена. Введем дополнительную переменную-признак pr. Ее значение 0 будет означать, что строка не найдена. Ее значение переключится в 1, только когда строка будет найдена. В цикл добавим дополнительное условие (!pr) - «пока признак не 1» (пока строка не найдена).

pr=0;

for (i=0; i<n && !pr; i++)

{

s=0; //кол-во отрицательных элементов строки

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

if (a[i][j]<0)

s++;

if (s==m)

{

k=i; pr=1;

}

}

Второй этап - поменять местами строки с номерами 0 и k. Обмен между строками будет производиться поэлементно, при этом необходимо использовать дополнительную переменную x.

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

{

x=a[0][j];

a[0][j]=a[k][j];

a[k][j]=x;

}

Окончательный вид программы:

# include <stdio.h>

main()

{

// исходный массив

int n,m;

int a[10][10];

int k; // номер строки

int pr; // pr - признак: 0 - строка не найдена, 1 - найдена

int s; // количество отрицательных элементов в строке

int i,j,x;

printf("\n введите размерность массива n и m");

scanf("%d %d",&n,&m);

printf("\n введите элементы массива построчно");

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

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

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

pr=0;

for (i=0; i<n && !pr; i++)

{

s=0;

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

if (a[i][j]<0)

s++;

if (s==m)

{

k=i; pr=1;

}

}

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

{

x=a[0][j];

a[0][j]=a[k][j];

a[k][j]=x;

}

// вывод массива

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

{

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

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

printf("\n");

}

}

3.

Дан двумерный массив размерности n*m. Удалить из него столбец, в котором все элементы одинаковы, в предположении что такой столбец единственный.

Исходный массив после выполненных действий предстанет как результат.

Сначала найдем искомый столбец, перебирая все, начиная с первого. Фрагмент будет походить на поиск строки из предыдущей задачи.

// pr - признак: 0 - столбец не найден, 1 - найден

pr=0;

for (j=0;j<m && !pr;j++)

{

for (i=1,kol=0; i<n &&a[i][j]==a[0][j];kol++,i++);

if (kol+1==n)

{

pr=1;

k=j;

}

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

for (j=k;j<m-1;j++)

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

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

При этом количество значимых столбцов уменьшается на единицу.

m--;

Окончательный вид программы:

# include <stdio.h>

main()

{

int n,m;

int a[10][10]; // исходный массив

int k; // номер столбца

int pr; // pr - признак: 0 - столбец не найден, 1 - найден

int kol; // количество одинаковых элементов в строке

int i,j;

printf("\n введите размерность массива n и m");

scanf("%d %d",&n,&m);

printf("\n введите элементы массива построчно");

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

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

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

pr=0;

for (j=0;j<m && !pr;j++)

{

for (i=1,kol=0; i<n &&a[i][j]==a[0][j];kol++,i++);

if (kol+1==n)

{

pr=1;

k=j;

}

}

for (j=k;j<m-1;j++)

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

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

m--;

// вывод массива

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

{

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

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

printf("\n");

}

}