Задание 2 - Одномерные массивы (лабораторная по Си)
Лабораторная работа для школ и вузов по решению задач с помощью одномерных массивов на языке C (Си). Перечень задач лабораторной работы (клик по ссылке направляет на решение задачи, если таковое имеется):
- Дан массив из 30 элементов. Найти пять соседних элементов, сумма значений которых максимальна.
- Дан массив целых чисел. Все элементы, оканчивающиеся цифрой 4, уменьшить вдвое.
- Найти число пар соседних элементов массива, являющихся четными числами.
- Дан массив. Определить количество элементов, больших суммы всех элементов массива, и напечатать их номера.
- Найти элемент, наиболее близкий к среднему значению всех элементов массива.
- По заданным вещественным числам a0, a1, … a10 (а - массив), t вычислить значение многочлена a10x10 + a9x9 + … + a1x1 + a0 и его производной в точке t.
- Определить, имеются ли в массиве одинаковые элементы.
- В массиве числа образуют неубывающую последовательность. Несколько элементов, идущих подряд, равны между собой. Найти количество таких элементов.
- Даны два массива. Найти наименьшее среди тех чисел первого массива, которые не входят во второй массив (считая, что хотя бы одно такое число есть).
- В массиве числа образуют неубывающую последовательность. Найти количество различных чисел в массиве.
- Дан массив. Определить номера минимального элемента массива и элемента, являющегося минимальным без учета этого элемента.
- Изменить знак у максимального по модулю элемента массива.
- Переменной t присвоить значение 1 или 0 (истина или ложь) в зависимости от того, есть ли среди элементов массива число, являющееся степенью двойки.
- Удалить из массива первый отрицательный элемент (если отрицательные элементы есть). Под удалением элемента понимается исключение этого элемента из массива путем смещения всех следую-щих за ним элементов влево на 1 позицию и присваивание последнему элементу массива значения 0.
- Рассматривая массив как последовательность цифр десятичной записи некоторого неотрицательного целого числа, получить само это число. (Например, массив {1,2,3} представляет число 123).
- Вставить заданное число в массив целых чисел перед последним четным элементом (если четные элементы есть). Под вставкой числа n в массив после k-го элемента понимается смещение всех элементов, начиная с (k+1)-го вправо на 1 позицию, и присваивание (k+1)-му элементу массива значения n.
- Если в массиве есть хотя бы одна пара соседних неотрицательных элементов, то напечатать все элементы, следующие за элементами первой из таких пар.
- Дан массив. Переписать его положительные элементы во второй массив, а остальные – в третий. Во втором и третьем массивах значения элементов первого массива должны быть записаны подряд с начала массива.
- Элементы массива циклически сдвинуть на две позиции влево.
- Вычислить y = x1 + x1x2 + x1x2x3 + … + x1x2…xm, где m – либо номер первого отрицательного элемента массива x, либо номер последнего элемента, если в массиве x нет отрицательных элементов.
- Найти сумму элементов массива, расположенных между максимальным и минимальным элементами (включительно).
- Даны два массива. Элементы каждого из массивов упорядочены по неубыванию. Объединить элементы этих двух массивов в третий массив так, чтобы они снова оказались упорядоченными по неубыванию.
- Упорядочить массив по неубыванию, используя алгоритм сортировки выбором: отыскивается максимальный элемент и переносится в конец массива; затем этот метод применяется ко всем элементам, кроме последнего, который уже находится на своем месте, и т.д.
- Для арифметических операций с большими числами, которые не могут быть представлены в памяти компьютера, используется следующий прием. Каждая цифра таких чисел записывается в отдельный элемент массива, и необходимые операции проводятся с элементами массива цифр. Написать программу выполняющую сложение 20-значных чисел.
- Подсчитать количество «счастливых» шестизначных автобусных билетов, т.е. таких, в номерах которых сумма трех первых цифр равна сумме трех последних. (Воспользоваться тем, что число «счастливых» билетов равно S(2,0) + S(2,1) + ... + S(2,27) , где ( ,n) – количество чисел от 0 до 999, сумма цифр которых равна n).
- Элементы массива x упорядочены по возрастанию. Требуется присвоить переменной k номер элемента массива, равного числу y, или -1, если такого элемента нет. Использовать метод двоичного (бинарного) поиска: сравнить y со средним элементом массива (или элементом около середины); если эти числа равны, поиск завершается, если же y меньше среднего элемента, то y надо искать в левой половине массива, а иначе – в правой; к выбранной половине применяется этот же алгоритм.
- Удалить из массива все повторяющиеся элементы, оставив их первые вхождения, то есть в массиве должны остаться только различные элементы.
Работоспособность всех программ проверена в 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;
}
№4: Дан массив. Определить количество элементов, больших суммы всех элементов массива, и напечатать их номера.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, N, sum = 0, count = 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]);
sum = sum + arr[i];
}
printf("Sum of elements = %d\n", sum);
printf("Item numbers:\n");
for (i = 0; i < N; i++){
if (arr[i] > sum){
printf("arr[%d] = %d\n", i, arr[i]);
count++;
}
}
printf("The number of elements of a large sum of all elements: %d", count);
return 0;
}
№5: Найти элемент, наиболее близкий к среднему значению всех элементов массива.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i, N, sum = 0, min = 0, *arr;
float mean = 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");
for (i = 0; i < N; i++){
printf("arr[%d] = ", i);
scanf("%d", &arr[i]);
sum = sum + arr[i];
}
mean = sum / N;
printf("Average value: %f\n", mean);
for (i = 1; i < N; i++)
if (fabs(arr[i] - mean) < fabs(arr[min] - mean))
min = i;
printf("Nearest element: arr[%d] = %d", min, arr[min]);
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;
}