Найти в массиве последовательности из идущих подряд трех равных между собой элементов, и удалить два из них - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задача: Дан массив а1,...,а50. Найти в нем последовательности из идущие подряд трех равных между собой элементов, и удалить два из них. Если таких нет напечатать 0. Подскажите хотя бы на словах, что за чем делать. Заранее благодарен.

Решение задачи: «Найти в массиве последовательности из идущих подряд трех равных между собой элементов, и удалить два из них»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
 
    int n=0;//Вводим количество элементов
    printf("Write size of array:\n");
    scanf("%d", &n);
 
    int *a = (int *)calloc(n, sizeof(int));//Вводим элементы масива
    printf("Write elements of array:\n");
    for(int i=0;i<n;i++)
        scanf("%d", &a[i]);
 
    int t = a[0], s = 1, w = 1;//в t - имеем текушее значение, s - количествораз которое t встречалось без перерыва, w - флаг того что небыло обнаруженно последовательностей длины 3
    for(int i=1;i<n;i++){ // со второго элемента проверяем
        if(a[i] == t) // если a[i] == t  то увеличиваем значение s
            s++;
        else{// устанавливаем новое значение t=a[i] и то количество раз которое оно встречалось s = 1
            t = a[i];
            s = 1;
        }
        if(s == 3){//если текущее значение t встретилось в s=3ий раз, то
            for(int j=i-1, k = i+1;k<n;j++, k++) // сдвигаем элементы масива
                a[j] = a[k];                        //j - второй повторяющийся элемент,  k - следующий элемент за третим повторяющимся элементом
            a = (int *)realloc(a, (n-2)*sizeof(int)); // изменяем раззмер на 2
            n-=2;i-=2;t = a[i];s = 1;// устанавливаем соот значения
            w = 0; // ставим флаг того что изменение произошло, те не 0 не будет выведен 0
        }
    }
 
    if(w==1){// если изменения не было выводим 0
        printf("Result is:\n");
        printf("0\n");
    }else{// иначе выводим изменённый масив
        printf("Result is:\n");
        for(int i=0;i<n;i++)
            printf("%d ", a[i]);
        printf("\n");
    }
    return 0;
}

Объяснение кода листинга программы

  1. Программа запрашивает у пользователя размер массива и сохраняет его в переменной n.
  2. Программа выделяет память под массив a с помощью функции calloc и сохраняет указатель на начало массива в переменной a.
  3. Программа запрашивает у пользователя значения для заполнения массива a и сохраняет их в соответствующую память.
  4. Программа инициализирует переменные t, s и w значениями, необходимыми для поиска последовательности из трех одинаковых элементов.
  5. Программа начинает цикл, который проходит по всем элементам массива, начиная со второго, и проверяет, является ли текущий элемент равным t.
  6. Если текущий элемент равен t, программа увеличивает значение s на единицу.
  7. Если текущий элемент не равен t, программа устанавливает новое значение t и сбрасывает значение s на единицу.
  8. Если значение s равно 3, программа начинает цикл, который сдвигает элементы массива, начиная с третьего повторяющегося элемента, и изменяет размер массива на два элемента меньше.
  9. После завершения цикла программа проверяет значение переменной w. Если оно равно 1, программа выводит сообщение 0, что означает, что в массиве не было найдено последовательности из трех одинаковых элементов.
  10. Если значение переменной w не равно 1, программа выводит измененный массив.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы