- •Министерство образования и науки Республики Казахстан
- •Кафедра программного обеспечения
- •Языки программирования
- •Лабораторная работа № 1
- •Краткая теория
- •Задания
- •Лабораторная работа № 2
- •Краткая теория
- •Лабораторная работа №3
- •Краткая теория
- •Задания
- •Задания
- •Лабораторная работа № 4
- •Краткая теория
- •Задания
- •Лабораторная работа № 5
- •Краткая теория
- •Задания
- •Лабораторная работа № 6
- •Краткая теория
- •Объединения
- •Задания
- •Лабораторная работа № 7
- •Краткая теория
- •Задания
- •Лабораторная работа № 8
- •Краткая теория
- •Задания
Задания
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");
}
}
