Удалить из массива все элементы, встречающиеся более двух раз - C (СИ) (71944)

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

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

Условие задачи описано ниже, помогите пж найти ошибку в коде
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
/**
9.  Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз,
 и вывести размер полученного массива и его содержимое.
**/
int main()
{
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        int n,i,j;
        printf("Введите размер массива: ");
        scanf("%d",&n);
        int arr[n];
        for(i=0;i<n;i++)
        {
            printf("A[%d]=",i);
            scanf("%d",&arr[i]);
        }
        i=0;
while (i<n)
 {
  int k=1,p;
  for (j=i+1;j<=n;j++)
  {
      if (arr[j]==arr[i])
        k++;
  }
      if (k>2)
   {
    j=i;
    int x=arr[i];
    while (j<n-1)
    {
      if (arr[j]==x)
       {
          for (p=j;p<=n;p++)
          {
            arr[p]=arr[p+1];
            n--;
          }
       }
 
    else
     j++;
    }
   }
    else
    i++;
 }
 
    if (n==0)
     printf("Все элементы удалены");
else
 {
   printf("\n");
  printf("Количество оставшихся элементов: %d",n);
   printf("\n");
  printf("Массив после сжатия: ");
  for (i=0;i<n;i++)
  printf("%d ",arr[i]);
 }
 return 0;
 }

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

textual
Листинг программы
#include <stdio.h>
 
int pack(int arr[], const int size) {
    int offs = 0, i, j, k, cnt;
 
    for (i = 1; i < size; ++i) {
        cnt = 0;
        k = i - offs;
        for (j = k - 1; 0 <= j; --j) {
            cnt += (arr[i] == arr[j]);
        }
        if (cnt < 2) {
            arr[k] = arr[i];
        } else {
            offs++;
        }
    }
    return size - offs;
}
 
void print(const int arr[], const int size) {
    if (0 < size) {
        printf("%d ", *arr);
        print(arr + 1, size - 1);
    }
}
 
int main() {
    int arr[] = {1, 3, 1, 1, 1, 2, 1, 2, 3, 1, 1, 2, 3, 3, 2, 3, 3, 3};
    int size = sizeof(arr) / sizeof(*arr);
 
    print(arr, size); putchar('\n');
 
    size = pack(arr, size);
 
    print(arr, size); putchar('\n');
 
    return 0;
}

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

  1. В функции pack() удаляются все элементы массива, которые встречаются более двух раз.
  2. В функции main() создается массив arr[] и инициализируется значениями.
  3. Размер массива arr[] хранится в переменной size.
  4. Функция print() выводит элементы массива на экран.
  5. В функции main() сначала выводится исходный массив на экран, затем вызывается функция pack(), которая удаляет повторяющиеся элементы, и после этого выводится измененный массив на экран.
  6. Результатом работы программы будет вывод на экран исходного массива, а затем массива без повторяющихся элементов.

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


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

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

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