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

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

  1. Дан массив из 30 элементов. Найти пять соседних элементов, сумма значений которых максимальна.
  2. Дан массив целых чисел. Все элементы, оканчивающиеся цифрой 4, уменьшить вдвое.
  3. Найти число пар соседних элементов массива, являющихся четными числами.
  4. Дан массив. Определить количество элементов, больших суммы всех элементов массива, и напечатать их номера.
  5. Найти элемент, наиболее близкий к среднему значению всех элементов массива.
  6. По заданным вещественным числам a0, a1, … a10 (а - массив), t вычислить значение многочлена a10x10 + a9x9 + … + a1x1 + a0 и его производной в точке t.
  7. Определить, имеются ли в массиве одинаковые элементы.
  8. В массиве числа образуют неубывающую последовательность. Несколько элементов, идущих подряд, равны между собой. Найти количество таких элементов.
  9. Даны два массива. Найти наименьшее среди тех чисел первого массива, которые не входят во второй массив (считая, что хотя бы одно такое число есть).
  10. В массиве числа образуют неубывающую последовательность. Найти количество различных чисел в массиве.
  11. Дан массив. Определить номера минимального элемента массива и элемента, являющегося минимальным без учета этого элемента.
  12. Изменить знак у максимального по модулю элемента массива.
  13. Переменной t присвоить значение 1 или 0 (истина или ложь) в зависимости от того, есть ли среди элементов массива число, являющееся степенью двойки.
  14. Удалить из массива первый отрицательный элемент (если отрицательные элементы есть). Под удалением элемента понимается исключение этого элемента из массива путем смещения всех следую-щих за ним элементов влево на 1 позицию и присваивание последнему элементу массива значения 0.
  15. Рассматривая массив как последовательность цифр десятичной записи некоторого неотрицательного целого числа, получить само это число. (Например, массив {1,2,3} представляет число 123).
  16. Вставить заданное число в массив целых чисел перед последним четным элементом (если четные элементы есть). Под вставкой числа n в массив после k-го элемента понимается смещение всех элементов, начиная с (k+1)-го вправо на 1 позицию, и присваивание (k+1)-му элементу массива значения n.
  17. Если в массиве есть хотя бы одна пара соседних неотрицательных элементов, то напечатать все элементы, следующие за элементами первой из таких пар.
  18. Дан массив. Переписать его положительные элементы во второй массив, а остальные – в третий. Во втором и третьем массивах значения элементов первого массива должны быть записаны подряд с начала массива.
  19. Элементы массива циклически сдвинуть на две позиции влево.
  20. Вычислить y = x1 + x1x2 + x1x2x3 + … + x1x2…xm, где m – либо номер первого отрицательного элемента массива x, либо номер последнего элемента, если в массиве x нет отрицательных элементов.
  21. Найти сумму элементов массива, расположенных между максимальным и минимальным элементами (включительно).
Дополнительные задачи:
  1. Даны два массива. Элементы каждого из массивов упорядочены по неубыванию. Объединить элементы этих двух массивов в третий массив так, чтобы они снова оказались упорядоченными по неубыванию.
  2. Упорядочить массив по неубыванию, используя алгоритм сортировки выбором: отыскивается максимальный элемент и переносится в конец массива; затем этот метод применяется ко всем элементам, кроме последнего, который уже находится на своем месте, и т.д.
  3. Для арифметических операций с большими числами, которые не могут быть представлены в памяти компьютера, используется следующий прием. Каждая цифра таких чисел записывается в отдельный элемент массива, и необходимые операции проводятся с элементами массива цифр. Написать программу выполняющую сложение 20-значных чисел.
  4. Подсчитать количество «счастливых» шестизначных автобусных билетов, т.е. таких, в номерах которых сумма трех первых цифр равна сумме трех последних. (Воспользоваться тем, что число «счастливых» билетов равно S(2,0) + S(2,1) + ... + S(2,27) , где ( ,n) – количество чисел от 0 до 999, сумма цифр которых равна n).
  5. Элементы массива x упорядочены по возрастанию. Требуется присвоить переменной k номер элемента массива, равного числу y, или -1, если такого элемента нет. Использовать метод двоичного (бинарного) поиска: сравнить y со средним элементом массива (или элементом около середины); если эти числа равны, поиск завершается, если же y меньше среднего элемента, то y надо искать в левой половине массива, а иначе – в правой; к выбранной половине применяется этот же алгоритм.
  6. Удалить из массива все повторяющиеся элементы, оставив их первые вхождения, то есть в массиве должны остаться только различные элементы.

Работоспособность всех программ проверена в CodeBlocks 16.01 (MinGW, Windows 10). Свои решения нерешённых программ и пожелания по улучшению существующих можете давать в комментариях внизу страницы.

Скачать файл лабораторной и все исходные коды программ в архиве:


№1: Дан массив из 30 элементов. Найти пять соседних элементов, сумма значений которых максимальна.

#include <stdio.h>
#define N 30

int main()
{
    int i, maxsum = 0, K;
    int arr[N];
    printf("Enter the elements of the array: \n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < N-4; i++){
        if (arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4] > maxsum) {
            maxsum = arr[i] + arr[i+1] + arr[i+2] + arr[i+3] + arr[i+4];
            K = i;
        }
    }
    printf("5 elements with the maximum amount: %d %d %d %d %d", arr[K], arr[K+1], arr[K+2], arr[K+3], arr[K+4]);
    return 0;
}

№2: Дан массив целых чисел. Все элементы, оканчивающиеся цифрой 4, уменьшить вдвое.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, N, *arr;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    printf("New array:\n");
    for (i = 0; i < N; i++){
        if (abs(arr[i] % 10) == 4)
            arr[i] = arr[i] /2;
        printf("arr[%d] = %d;\n", i, arr[i]);
    }
    return 0;
}

№3: Найти число пар соседних элементов массива, являющихся четными числами.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, N, j = 0, *arr;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < N-1; i++)
        if (arr[i] % 2 == 0 && arr[i+1] % 2 == 0)
            j += 1;
    printf("Number of even pairs: %d", j);
    return 0;
}

№7: Определить, имеются ли в массиве одинаковые элементы.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, j, N, *arr;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < N - 1; i++)
        for (j = i + 1; j < N; j++)
            if (arr[i] == arr[j]){
                printf("Identical elements are available!");
                return 0;
            }
    printf("Identical elements are missing!");
    return 0;
}

№8: В массиве числа образуют неубывающую последовательность. Несколько элементов, идущих подряд, равны между собой. Найти количество таких элементов.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, N, *arr, count = 0;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    printf("arr[0] = ");
    scanf("%d", &arr[0]);
    for (i = 1; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
        if (arr[i] < arr[i-1]) {
            printf("The sequence is decreasing!");
            return 0;
        }
    }
    for (i = 0; i < N-1; i++)
        if (arr[i] == arr[i+1])
            count++;
    printf("Number of equal elements: %d", count + 1);
    return 0;
}

№12: Изменить знак у максимального по модулю элемента массива.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, N, max = 0, *arr;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    for (i = 1; i < N; i++)
        if (abs(arr[i]) > abs(arr[max]))
            max = i;
    arr[max] = -arr[max];
    printf("New array:\n");
    for (i = 0; i < N; i++)
        printf("arr[%d] = %d;\n", i, arr[i]);
    return 0;
}

№13: Переменной t присвоить значение 1 или 0 (истина или ложь) в зависимости от того, есть ли среди элементов массива число, являющееся степенью двойки.

#include <stdio.h>

int main()
{
    int i, N, *arr, t;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < N; i++){
        if (arr[i] > 1){
            if ((arr[i] & (arr[i] - 1)) == 0) {
                t = 1;
                printf("t = %d", t);
                return 0;
            }
        }
    }
    t = 0;
    printf("t = %d", t);
    return 0;
}

№1 (Доп): Даны два массива. Элементы каждого из массивов упорядочены по неубыванию. Объединить элементы этих двух массивов в третий массив так, чтобы они снова оказались упорядоченными по неубыванию.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, j, k, N1, N2, N3, *arr1, *arr2, *arr3;
    printf("Enter the size of the array 1: ");
    scanf("%d", &N1);
    arr1 = (int*)calloc(N1, sizeof(int));
    printf("Enter the elements of the array 1:\n");
    printf("arr1[0] = ");
    scanf("%d", &arr1[0]);
    for (i = 1; i < N1; i++){
        printf("arr1[%d] = ", i);
        scanf("%d", &arr1[i]);
        if (arr1[i] < arr1[i-1]) {
            printf("The sequence 1 decreases!");
            return 0;
        }
    }
    printf("Enter the size of the array 2: ");
    scanf("%d", &N2);
    arr2 = (int*)calloc(N2, sizeof(int));
    printf("Enter the elements of the array 2:\n");
    printf("arr2[0] = ");
    scanf("%d", &arr2[0]);
    for (i = 1; i < N2; i++){
        printf("arr2[%d] = ", i);
        scanf("%d", &arr2[i]);
        if (arr2[i] < arr2[i-1]) {
            printf("The sequence 2 decreases!");
            return 0;
        }
    }
    N3 = N1 + N2;
    arr3 = (int*)calloc(N3, sizeof(int));
    i = 0; j = 0; k = 0;
    while(k <= N3){
        if (arr1[i] < arr2[j])
            arr3[k++] = arr1[i++];
        else
            arr3[k++] = arr2[j++];
    }
    printf("\nSorted array:\n");
    for (i = 0; i < N3; i++){
        printf("arr[%d] = %d;\n", i, arr3[i]);
    }
    return 0;
}

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

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, j, N, d, max = 0, *arr;
    printf("Enter the size of the array: ");
    scanf("%d", &N);
    arr = (int*)calloc(N, sizeof(int));
    printf("Enter the elements of the array:\n");
    for (i = 0; i < N; i++){
        printf("arr[%d] = ", i);
        scanf("%d", &arr[i]);
    }
    for (i = 0; i < N; i++){
        for (j = 0; j < N-i; j++){
            if (arr[j] > arr[max])
                max = j;
        }
        d = arr[max];
        arr[max] = arr[N-i-1];
        arr[N-i-1] = d;
        max = 0;
    }
    printf("Sorted array:\n");
    for (i = 0; i < N; i++)
        printf("arr[%d] = %d;\n", i, arr[i]);
    return 0;
}



Реклама