Сформировать последовательность С - разницу двух последовательностей В и А - C (СИ)

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

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

Сформировать последовательность C, содержащую все элементы последовательности A без повторений, не входящие в последовательность B. Помогите пожалуйста найти ошибки в решении, я сделал наброски, но задача не работает. Файл Main
#include <stdio.h>  // Прототипы scanf, printf
#include <conio.h>  // Прототипы clrscr, getch
#define ESC 27      // Код ASCII клавиши Esc
#define M 1000
#define N 1000

//Главная процедура
//Выполняет ввод данных, вызов процедуры решения и печать результата
 
int main(){
// Объявления переменных и массивов
    int i, j;                  //Переменные-счётчики
    short   m,                        //количество элементов массива A
            n,                         //количество элементов массива B
            k=0;
            int a[N];           //Последовательность A
            int b[M];          //Последовательность B
            int c[N];          //Последовательность C
            void Solution(short, int[], short, int[], short, int[]);
 
    do{ // Цикл для повтора с выходом по ESC
//Ввод контролируемых данных
    printf("\nВведите количество элементов массива А: ");
    scanf_s("%d", &m);
    printf("\nВведите элементы массива А: ");
      for (i=0; i<m; i++)
    scanf_s("%d", &a[i]);
    printf("\nВведите количество элементов массива В: ");
    scanf_s("%d", &n);
    printf("\nВведите элементы массива В: ");
    for (j = 0; j<n; j++)
    scanf_s("%d", &b[j]);
        
// Ввод неконтролируемых данных
// Обращение к решению и печать результатов 
        Solution(m, a, n, b, k, c);
        printf("\nПоследовательность C: ");
        for(i=0; i<k; i++)
        printf("%3d ", a[i]);
        printf("\n");
        printf("\nВыход - Esc, продолжение - любая клавиша\n");
    }while(_getch()!=ESC);
        }// Конец файла Main
Файл Solution
#include <stdio.h>  // Прототипы scanf, printf
#include <conio.h>  // Прототипы clrscr, getch
#define M 1000
#define N 1000

void Solution(
    short m,
    int a[],
    short n,
    int b[],
    short k,
    int c[]){
 
    // Объявления и комментарии локальных переменных
    int i, j, p, temp=0;
    // АЛГОРИТМ РЕШЕНИЯ
 
    //1. Формирование массива, содержащего все элементы последовательности А без повторений (удаление повторений)
 
   for(i=0; i<m; i++) {
        for(j=i+1; j<m; j++) {
            if(a[i]==a[j]) {
                for(p=j; p<m-1; p++)
                        a[p]=a[p+1];
                m--;
                j--;
            }
        }
    }
 
   //2. Формирование массива C, который не содержит элементов из массива В
   for (i = 0; i<m; i++){
       for (j = 0; j<n; j++){
           if (a[i] == b[j])
               temp = 1;
       }
       if (temp == 0)
           a[k++] = a[i];
       temp = 0;
   }
  
   }
Спасибо большое заранее за помощь!

Решение задачи: «Сформировать последовательность С - разницу двух последовательностей В и А»

textual
Листинг программы
#include <stdio.h>
#include <stdbool.h> // в сях були только в c99 появились, и то в хэдере
 
// размер массивов, куда покладём-сь последовательности
#define BUF_SIZE 10
 
// здесь проверяем, входит ли num в seq размерности seq_size
bool numInSequence(int num, int* seq, size_t seq_size);
 
int
main(int argc, char** argv)
{
    int a[ BUF_SIZE ] = { // последовательность 'a' - нечётные
         1,  3,  5,  7,  9,
        11, 13, 15, 17, 19
    };
    int b[ BUF_SIZE ] = { // Фиббоначи
         1,  2,  3,  5,  8,
        13, 21, 34, 55, 89
    };
    int c[ BUF_SIZE ] = {0}; // инициализируем нулями
    int cur = 0;
    int iter;
    for (iter = 0; iter < BUF_SIZE; ++iter)
    {   // если число из 'a' не входит в 'b', пихаем его в 'c'
        if (!numInSequence(a[ iter ], b, BUF_SIZE))
        {
            c[ cur ] = a[ iter ];
            ++cur;
        }
    }
 
    // печатаем. т.к в исходных последовательностях нулей не было,
    // можно использовать нуль как условие останова
    for (iter = 0; iter < BUF_SIZE && c[ iter ]; ++iter)
    {
        printf("%d ", c[ iter ]);
    }
    puts("");
 
    return 0;
}
 
bool
numInSequence(int num, int* seq, size_t seq_size)
{
    int iter;
    for (iter = 0; iter < seq_size; ++iter)
    {
        if (num == seq[ iter ])
        {
            return false;
        }
    }
 
    return true;
}

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

В этом коде есть три переменные-массива: a, b и c. Переменная a содержит последовательность нечетных чисел, переменная b содержит последовательность Фибоначчи, а переменная c используется для хранения результата. Код проверяет, содержится ли каждый элемент из последовательности a в последовательности b, используя функцию numInSequence. Если элемент не найден в последовательности b, он добавляется в конец последовательности c. Затем код выводит все элементы последовательности c, используя цикл for и функцию printf. Функция numInSequence принимает три аргумента: число, которое нужно проверить, последовательность, в которой нужно проверить наличие этого числа, и размер этой последовательности. Она использует цикл for для проверки каждого элемента последовательности. Если число найдено, функция возвращает false, иначе она возвращает true.

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


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

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

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