Задание 3 - Двумерные массивы (лабораторная по Си)

Лабораторная для школ и вузов по решению задач по обработке двумерных массивов на языке C (Си). Перечень задач лабораторной работы (клик по ссылке направляет на решение задачи, если таковое имеется):

  1. Дан двумерный массив. Найти минимальную сумму элементов строки. Задачу решить без использования дополнительного одномерного массива.
  2. Определить координаты элемента, наиболее близкого к среднему значению всех элементов массива.
  3. Определить, имеются ли в двумерном массиве только два одинаковых элемента.
  4. Дан двумерный массив. Определить максимальный номер строки, состоящей только из элементов, кратных числу а.
  5. Определить, есть ли в двумерном массиве столбец, в котором равное количество положительных и отрицательных элементов.
  6. Определить, является ли квадратный массив симметричным относительно своей главной диагонали.
  7. В квадратном массиве выделим четыре четверти, ограниченные главной и побочной диагоналями (без учета элементов, расположенных на диагоналях). Найти сумму элементов верхней четверти.
  8. В каждом столбце двумерного массива поменять местами первый отрицательный элемент и последний нулевой.
  9. Дан двумерный массив из четного числа столбцов. Столбцы левой половины массива поменять местами со столбцами правой половины.
  10. Дан двумерный массив. Удалить из него все строки с четными номерами. Под удалением строки двумерного массива следует понимать исключение этой строки из массива путем смещения всех сле-дующих за ней строк на одну вверх и присвоение всем элементам последней строки значения 0.
  11. В двумерный массив вставить два столбца из нулей: первый перед столбцом с номером k, второй - после него. Под вставкой заданного столбца после столбца с номером s следует понимать смещение всех столбцов после s-го на один вправо и присваивание заданных значений элементам s+1-го столбца.
  12. Дан двумерный массив размером n?n. Сформировать одномерный массив из элементов заданного массива, расположенных над побочной диагональю.
  13. Дан двумерный массив. Найти номера двух соседних столбцов, сумма элементов в которых минимальна.
  14. Для каждой строки двумерного массива выяснить количество элементов, последняя цифра которых равна а.
  15. Даны два двумерных массива. Перемножить их как матрицы. Результат записать в третий массив.
  16. Переставляя строки и столбцы двумерного массива, добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.
  17. Для двумерного массива а получить одномерный массив, присвоив его k-му элементу значение 1 (истина), если k-я строка массива а симметрична, и 0 (ложь) – в противном случае.
  18. Определить количество «особых» элементов массива, считая элемент «особым», если в его строке слева от него находятся элементы, меньшие его, а справа – большие.
  19. Дана матрица, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.
  20. Определить, является ли квадратный массив магическим квадратом, то есть массивом, в котором суммы элементов во всех строках, столбцах и на обеих диагоналях одинаковы.
  21. Дан двумерный массив b. Рассматривая его как матрицу, транспонировать b.
Дополнительные задачи:
  1. Дан двумерный массив. Упорядочить его строки по неубыванию их первых элементов.
  2. Определить, является ли заданная квадратная матрица ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.
  3. Дан квадратный двумерный массив. Найти сумму элементов каждой его диагонали, параллельной побочной.

Работоспособность всех программ проверена в 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;
}



Реклама