Подтвердить эквивалентность массивов после перестановки элементов - C (СИ)

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

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

Добрый день. Нужно составить программу, определяющую, можно ли получить один массив перестановкой элементов другого массива. Програмка должна считывать из стандартного потока ввода элементы обоих массивов, а затем выводить в стандартный поток вывода слово "yes", если массивы совпадают с точностью до перестановки элементов, и "no" – в противном случае. Сортировать массивы запрещается. Для цифр "1 2 3 4 5 6 7 8" и "8 7 6 5 4 3 2 1" выводится значение "yes". Но проблема в том, что для "1 1 2 2 3 3 4 4" и "1 2 3 4 1 2 3 4" выводится значение "no", но должно вывести "yes". мой код:
 #include<stdio.h>
#include<stdlib.h>
 
int main()
{
    int a[8];
    int b[8];
    int i;
    int k = 0;
    for (i = 0; i < 8; i++)
    {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < 8; i++)
    {
        scanf("%d", &b[i]);
    }
    for (i = 0; i < 8; i++)
    {
        if (a[i] == b[7 - i]) k++;
    }
    if (k == 8) printf("yes");
    else printf("no");
    return 0;
}
По этой программе: 1)Ввод 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 Вывод yes 2)Ввод 1 1 2 2 3 3 4 4 1 2 3 4 1 2 3 4 Вывод yes 3)Ввод 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 Вывод no ---------------------------------------------- У меня ко второму случаю не получается( помогите, пожалуйста.

Решение задачи: «Подтвердить эквивалентность массивов после перестановки элементов»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
 
int check(int a[], int b[], unsigned size) {
    bool use[size];
    unsigned i, j;
 
    memset(use, 0, sizeof(use));
 
    for (i = 0; i < size; ++i) {
        for (j = 0; j < size; ++j) {
            if (!use[j] && (a[i] == b[j])) {
                use[j] = true;
                break;
            }
        }
        if (j == size) {
            return 0;
        }
    }
    return 1;
}
 
int main() {
    int a[8], b[8], i;
 
    for (i = 0; i < 8; ++i) {
        scanf("%d", &a[i]);
    }
 
    for (i = 0; i < 8; ++i) {
        scanf("%d", &b[i]);
    }
 
    printf("%s\n", check(a, b, 8) ? "yes" : "no");
 
    return 0;
}

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

  1. Включаем необходимые заголовочные файлы для работы с массивами, строками и булевыми значениями
  2. Определяем функцию check, которая принимает три аргумента: массив a, массив b и размер массива
  3. Создаем внутри функции массив use типа bool с размерностью size для отслеживания использованных элементов
  4. Инициализируем все элементы массива use значением false с помощью функции memset
  5. Проходим по всем элементам массива a в функции main и запрашиваем у пользователя ввод соответствующих значений
  6. Проходим по всем элементам массива a и b в функции check и сравниваем их значения
  7. Если элемент массива b не использован и равен элементу массива a, то устанавливаем значение true для соответствующего элемента массива use и прерываем внутренний цикл с помощью оператора break
  8. Если после прохода по всем элементам массива b не было найдено соответствующих элементов, то возвращаем 0, что означает, что массивы не эквивалентны
  9. Если же были найдены соответствующие элементы, то возвращаем 1, что означает, что массивы эквивалентны
  10. Выводим на экран результат проверки с помощью функции printf

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


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

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

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