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

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

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

Условие задачи описано ниже, помогите пж найти ошибку в коде
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <time.h>
  5. /**
  6. 9. Дан целочисленный массив размера N. Удалить из массива все элементы, встречающиеся более двух раз,
  7. и вывести размер полученного массива и его содержимое.
  8. **/
  9. int main()
  10. {
  11. SetConsoleCP(1251);
  12. SetConsoleOutputCP(1251);
  13. int n,i,j;
  14. printf("Введите размер массива: ");
  15. scanf("%d",&n);
  16. int arr[n];
  17. for(i=0;i<n;i++)
  18. {
  19. printf("A[%d]=",i);
  20. scanf("%d",&arr[i]);
  21. }
  22. i=0;
  23. while (i<n)
  24. {
  25. int k=1,p;
  26. for (j=i+1;j<=n;j++)
  27. {
  28. if (arr[j]==arr[i])
  29. k++;
  30. }
  31. if (k>2)
  32. {
  33. j=i;
  34. int x=arr[i];
  35. while (j<n-1)
  36. {
  37. if (arr[j]==x)
  38. {
  39. for (p=j;p<=n;p++)
  40. {
  41. arr[p]=arr[p+1];
  42. n--;
  43. }
  44. }
  45. else
  46. j++;
  47. }
  48. }
  49. else
  50. i++;
  51. }
  52. if (n==0)
  53. printf("Все элементы удалены");
  54. else
  55. {
  56. printf("\n");
  57. printf("Количество оставшихся элементов: %d",n);
  58. printf("\n");
  59. printf("Массив после сжатия: ");
  60. for (i=0;i<n;i++)
  61. printf("%d ",arr[i]);
  62. }
  63. return 0;
  64. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. int pack(int arr[], const int size) {
  4.     int offs = 0, i, j, k, cnt;
  5.  
  6.     for (i = 1; i < size; ++i) {
  7.         cnt = 0;
  8.         k = i - offs;
  9.         for (j = k - 1; 0 <= j; --j) {
  10.             cnt += (arr[i] == arr[j]);
  11.         }
  12.         if (cnt < 2) {
  13.             arr[k] = arr[i];
  14.         } else {
  15.             offs++;
  16.         }
  17.     }
  18.     return size - offs;
  19. }
  20.  
  21. void print(const int arr[], const int size) {
  22.     if (0 < size) {
  23.         printf("%d ", *arr);
  24.         print(arr + 1, size - 1);
  25.     }
  26. }
  27.  
  28. int main() {
  29.     int arr[] = {1, 3, 1, 1, 1, 2, 1, 2, 3, 1, 1, 2, 3, 3, 2, 3, 3, 3};
  30.     int size = sizeof(arr) / sizeof(*arr);
  31.  
  32.     print(arr, size); putchar('\n');
  33.  
  34.     size = pack(arr, size);
  35.  
  36.     print(arr, size); putchar('\n');
  37.  
  38.     return 0;
  39. }

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

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

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


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

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

12   голосов , оценка 4.083 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы