Задание 3 - Двумерные массивы (лабораторная по Си)
Лабораторная работа для школ и вузов по решению задач по обработке двумерных массивов на языке C (Си). Перечень задач лабораторной работы (клик по ссылке направляет на решение задачи, если таковое имеется):
- Дан двумерный массив. Найти минимальную сумму элементов строки. Задачу решить без использования дополнительного одномерного массива.
- Определить координаты элемента, наиболее близкого к среднему значению всех элементов массива.
- Определить, имеются ли в двумерном массиве только два одинаковых элемента.
- Дан двумерный массив. Определить максимальный номер строки, состоящей только из элементов, кратных числу а.
- Определить, есть ли в двумерном массиве столбец, в котором равное количество положительных и отрицательных элементов.
- Определить, является ли квадратный массив симметричным относительно своей главной диагонали.
- В квадратном массиве выделим четыре четверти, ограниченные главной и побочной диагоналями (без учета элементов, расположенных на диагоналях). Найти сумму элементов верхней четверти.
- В каждом столбце двумерного массива поменять местами первый отрицательный элемент и последний нулевой.
- Дан двумерный массив из четного числа столбцов. Столбцы левой половины массива поменять местами со столбцами правой половины.
- Дан двумерный массив. Удалить из него все строки с четными номерами. Под удалением строки двумерного массива следует понимать исключение этой строки из массива путем смещения всех сле-дующих за ней строк на одну вверх и присвоение всем элементам последней строки значения 0.
- В двумерный массив вставить два столбца из нулей: первый перед столбцом с номером k, второй - после него. Под вставкой заданного столбца после столбца с номером s следует понимать смещение всех столбцов после s-го на один вправо и присваивание заданных значений элементам s+1-го столбца.
- Дан двумерный массив размером n?n. Сформировать одномерный массив из элементов заданного массива, расположенных над побочной диагональю.
- Дан двумерный массив. Найти номера двух соседних столбцов, сумма элементов в которых минимальна.
- Для каждой строки двумерного массива выяснить количество элементов, последняя цифра которых равна а.
- Даны два двумерных массива. Перемножить их как матрицы. Результат записать в третий массив.
- Переставляя строки и столбцы двумерного массива, добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.
- Для двумерного массива а получить одномерный массив, присвоив его k-му элементу значение 1 (истина), если k-я строка массива а симметрична, и 0 (ложь) – в противном случае.
- Определить количество «особых» элементов массива, считая элемент «особым», если в его строке слева от него находятся элементы, меньшие его, а справа – большие.
- Дана матрица, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.
- Определить, является ли квадратный массив магическим квадратом, то есть массивом, в котором суммы элементов во всех строках, столбцах и на обеих диагоналях одинаковы.
- Дан двумерный массив b. Рассматривая его как матрицу, транспонировать b.
- Дан двумерный массив. Упорядочить его строки по неубыванию их первых элементов.
- Определить, является ли заданная квадратная матрица ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.
- Дан квадратный двумерный массив. Найти сумму элементов каждой его диагонали, параллельной побочной.
Работоспособность всех программ проверена в CodeBlocks 16.01 (MinGW, Windows 10). Свои решения нерешённых программ и пожелания по улучшению существующих можете давать в комментариях внизу страницы.
Скачать файл лабораторной и все исходные коды программ в архиве:

№1: Дан двумерный массив. Найти минимальную сумму элементов строки. Задачу решить без использования дополнительного одномерного массива.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *arr;
int x, y, i, j, sum = 0, min = 0, minstr = 0;
srand(time(NULL));
x = 2 + rand() % 10;
y = 2 + rand() % 6;
arr = (int*)malloc(x*y*sizeof(int));
printf("Array %d x %d: \n", x, y);
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
*(arr + i*y + j) = -50 + rand() % 100;
printf("arr[%d][%d] = %3d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
for (i = 0; i < y; i++)
min += *(arr + i);
minstr = 0;
for (i = 1; i < x; i++){
for (j = 0; j < y; j++)
sum += *(arr + i*y + j);
if (sum < min) {
min = sum;
minstr = i+1;
}
sum = 0;
}
printf("Minimum amount: %d (%d line)", min, minstr);
free(arr);
return 0;
}
№2: Определить координаты элемента, наиболее близкого к среднему значению всех элементов массива.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int main()
{
int *arr;
int x, y, i, j, minx = 0, miny = 0;
float ssum = 0;
srand(time(NULL));
x = 1 + rand() % 10;
y = 1 + rand() % 7;
arr = (int*)malloc(x*y*sizeof(int));
printf("Array %d x %d: \n", x, y);
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
*(arr + i*y + j) = -10 + rand() % 20;
printf("arr[%d][%d] = %2d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
ssum += (float)(*(arr + i*y + j));
ssum = ssum / (float)(x * y);
for (i = 1; i < x; i++)
for (j = 0; j < y; j++)
if (fabs(*(arr + i*y + j) - ssum) < fabs(*(arr + minx*y + miny) - ssum)) {
minx = i;
miny = j;
}
printf("Average value of elements: %f \n", ssum);
printf("Coordinates of the nearest element: arr[%d][%d]", minx, miny);
free(arr);
return 0;
}
№9: Дан двумерный массив из четного числа столбцов. Столбцы левой половины массива поменять ме-стами со столбцами правой половины.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *arr;
int x, y, i, j, d;
srand(time(NULL));
x = 1 + rand() % 10;
y = 2 * (1 + rand() % 3);
arr = (int*)malloc(x*y*sizeof(int));
printf("Array %d x %d: \n", x, y);
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
*(arr + i*y + j) = rand();
printf("arr[%d][%d] = %5d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
for (i = 0; i < x; i++){
for (j = 0; j < y/2; j++){
d = *(arr + i*y + j);
*(arr + i*y + j) = *(arr + i*y + (y-j-1));
*(arr + i*y + (y-j-1)) = d;
}
}
printf("New array: \n");
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
printf("arr[%d][%d] = %5d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
free(arr);
return 0;
}
№14: Для каждой строки двумерного массива выяснить количество элементов, последняя цифра которых равна а.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *arr;
int x, y, i, j, a, count;
srand(time(NULL));
printf("Enter a: ");
scanf("%d", &a);
x = 1 + rand() % 10;
y = 1 + rand() % 7;
arr = (int*)malloc(x*y*sizeof(int));
printf("Massiv %d x %d: \n", x, y);
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
*(arr + i*y + j) = rand();
printf("arr[%d][%d] = %5d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
for (i = 0; i < x; i++){
count = 0;
for (j = 0; j < y; j++){
if (*(arr + i*y + j) % 10 == a)
count++;
}
printf("In line %d there are %d elements with the last digit %d. \n", i+1, count, a);
}
free(arr);
return 0;
}
№21: Дан двумерный массив b. Рассматривая его как матрицу, транспонировать b.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *arr, *arrT, x, y, i, j;
srand(time(NULL));
x = 1 + rand() % 7;
y = 1 + rand() % 7;
arr = (int*)malloc(x*y*sizeof(int));
printf("Matrix %d x %d: \n", x, y);
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
*(arr + i*y + j) = rand();
printf("b[%d][%d] = %5d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
arrT = (int*)malloc(y*x*sizeof(int));
for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
*(arrT + j*x + i) = *(arr + i*y + j);
printf("The transposed matrix %d x %d: \n", y, x);
for (i = 0; i < y; i++){
for (j = 0; j < x; j++)
printf("b[%d][%d] = %5d; ", j, i, *(arrT + i*x + j));
printf("\n");
}
free(arr);
free(arrT);
return 0;
}
№1 (Доп): Дан двумерный массив. Упорядочить его строки по неубыванию их первых элементов.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *arr, x, y, i, j, k, d, max = 0;
srand(time(NULL));
x = 1 + rand() % 10;
y = 1 + rand() % 7;
arr = (int*)malloc(x*y*sizeof(int));
printf("Array %d x %d: \n", x, y);
for (i = 0; i < x; i++){
for (j = 0; j < y; j++){
*(arr + i*y + j) = -10 + rand() % 20;
printf("arr[%d][%d] = %2d; ", i, j, *(arr + i*y + j));
}
printf("\n");
}
for (i = 0; i < x; i++){
for (j = 0; j < x-i; j++)
if (*(arr + j*y) > *(arr + max*y))
max = j;
for (k = 0; k < y; k++) {
d = *(arr + max*y + k);
*(arr + max*y + k) = *(arr + (x-i-1)*y + k);
*(arr + (x-i-1)*y + k) = d;
}
max = 0;
}
printf("Ordered array:\n");
for (i = 0; i < x; i++){
for (j = 0; j < y; j++)
printf("arr[%d][%d] = %2d; ", i, j, *(arr + i*y + j));
printf("\n");
}
free(arr);
return 0;
}
№2 (Доп): Определить, является ли заданная квадратная матрица ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *arr;
int x, i, j, k, sum = 0;
printf("Enter the size of the square matrix: ");
scanf("%d", &x);
arr = (int*)malloc(x*x*sizeof(int));
printf("Enter the elements of the matrix %d x %d: \n", x, x);
for (i = 0; i < x; i++){
for (j = 0; j < x; j++){
printf("a[%d][%d] = ", i, j);
scanf("%d", (arr + i*x + j));
}
}
for (i = 0; i < x; i++){
sum = 0;
for (j = 0; j < x; j++)
sum = sum + (*(arr + i*x + j)) * (*(arr + i*x + j));
if (sum != 1) {
printf("The matrix is not orthonormal!");
return 0;
}
}
for (i = 0; i < x; i++){
sum = 0;
for (j = i+1; j < x-1; j++)
for (k = 0; k < x; k++)
sum = sum + (*(arr + i*x + k)) * (*(arr + j*x + k));
if (sum != 0) {
printf("The matrix is not orthonormal!");
return 0;
}
}
printf("The matrix is orthonormal!");
free(arr);
return 0;
}
№3 (Доп): Дан квадратный двумерный массив. Найти сумму элементов каждой его диагонали, параллельной побочной.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int *arr;
int x, y, i, j, sum;
srand(time(NULL));
x = 2 + rand() % 6;
arr = (int*)malloc(x*y*sizeof(int));
printf("Array %d x %d: \n", x, x);
for (i = 0; i < x; i++){
for (j = 0; j < x; j++){
*(arr + i*x + j) = rand() % 1000;
printf("arr[%d][%d] = %3d; ", i, j, *(arr + i*x + j));
}
printf("\n");
}
for (i = 0; i < x; i++){
sum = 0;
for (j = 0; j <= i; j++){
sum = sum + *(arr + j*x + (i-j));
printf("%d ", *(arr + j*x + (i-j)));
}
printf("= %d \n", sum);
}
for (i = x-1; 0 < i; i--){
sum = 0;
for (j = 0; j < i; j++){
sum = sum + *(arr + (x-j-1)*x + (j+x-i));
printf("%3d ", *(arr + (x-j-1)*x + (j+x-i)));
}
printf("= %d \n", sum);
}
free(arr);
return 0;
}