Member 11324568 Ответов: 2

Программа для объединения двух массивов в один без повторения элементов и печати объединенного массива но его не печати


#include<stdio.h>
#include<stdlib.h>
int *add(int *p,int a,int *q,int b);

void sort(int *p,int a);
int tem=0;  /* tem is the count of the total elements without repetition*/
int main()
{
    int *p,*q,a,b,i,*r;
    printf("enter the number of elements in the first array\n");
    scanf("%d",&a);
    p=(int *) malloc(a*sizeof(int));

    printf("enter the number of elements in the second array\n");
    scanf("%d",&b);
    q=(int *) malloc(b*sizeof(int));
    printf("enter the elements in the first array\n");
    for(i=0;i<a;i++)
    {
         printf("enter the %d element\n",i+1);
         scanf("%d",p+i);
    }
    printf("enter the elements in the second array\n");
    for(i=0;i<b;i++)
    {
        printf("enter the %d element\n",i+1);
        scanf("%d",q+i);
    }
    sort(p,a);sort(q,b);
    
    r= add(p,a,q,b);
    sort(r,tem);
    printf("the sorted and combined list without repetitions is\n");
    for(i=0;i<tem;i++)
    {
        printf("%d\n",*(r+i));
    }
    return 0;
}
void sort(int *p,int a)
{
    int i,j,temp;
    for(i=0;i<a;i++)
    {
        for(j=i;j<a;j++)
        {
            if(*(p+i)>*(p+j))
            {
                 temp=*(p+i);
                 *(p+i)=*(p+j);
                 *(p+j)=temp;
            }
        }
    }
}
int *add(int *p,int a,int *q,int b)
{
    int i,j,k;
    int *r;
    int z,count=a+b;/* initialized count as the total number of elements
                       in both including repetitions*/

    r=(int *) malloc(count*sizeof(int));

    for(j=0;j<a;j++)
    {
        for(k=0;k<=tem;k++)
        {
            if(k==tem&&tem!=0)
                break;
            if(*(r+k)!=*(p+j))
            {
                *(r+tem)=*(p+j);
                tem++;
            }
        }
    }
    for(j=0;j<b;j++)
    {
        for(k=0;k<tem;k++)
        {
            if(*(r+k)!=*(q+j))
                *(r+tem)=*(q+j);
            tem++;
        }/*at last tem will be equal to count.*/
    }
    return r;
}

Richard MacCutchan


if(*(r+k)!=*(p+j))
*(r+tem)=*(p+j);

Как вы ожидаете, что кто-то (даже вы через несколько недель) поймет такие запутанные заявления? Используйте читаемые имена переменных и комментарии, чтобы сделать ваш код понятным.

Member 11324568

сэр,i,j,k-это общие переменные , используемые для выполнения цикла,а p, q-указатели на первый элемент двух массивов.Я использовал все переменные определенного вида в качестве непрерывных алфавитов, чтобы избежать путаницы.

[no name]

Переменные должны иметь значимые имена, иначе никто, даже вы, не сможет понять код. Почему вы оказались в такой ситуации - подумайте об этом? Зачем кому-то тратить драгоценное время на изучение этой головоломки? Перепишите его четко, и он может просто работать.

Member 11324568

Хорошо ,я буду использовать значимые переменные,попробуйте помочь мне найти здесь ошибку.

[no name]

В мире, где я живу, люди отлаживают свой собственный код. Это все, о чем вы просите. Стараться.

Member 11324568

Я новичок в программировании и умею писать алгоритмы, но делаю определенные ошибки при преобразовании их в код...я уже написал 2 версии кода без массивов, но я просто пытаюсь узнать свою ошибку здесь, чтобы не повторять их в долгосрочной перспективе...спасибо

Philippe Mori

Пожалуйста, пусть код отформатирован как код C++. Прекратите удалять форматирование. Это не трудно правильно использовать этот сайт, так что приложите некоторые усилия.

Andreas Gieriet

Пожалуйста, *не* возвращайте текущее форматирование - исходное форматирование было настолько нарушено, что никто не может разумно помочь.
Спасибо
Энди

2 Ответов

Рейтинг:
17

Philippe Mori

Во-первых, вы не должны кричать.

Затем вы должны объяснить, в чем заключается ваша проблема.

Во всяком случае, следующая строка, вероятно, неверна:

if(*(p+i)==*(p+j))

Вы сравниваете элемент из первого массива с элементом из того же массива.

Кроме того, кажется, что когда эта строка выполняется, tem еще не инициализирован до нужного значения (но все равно 0):
for(k=0;k<tem;k++)>

Учитывая это, этот цикл никогда не выполняется. Та же проблема несколькими строками ниже. Вероятно, вы используете неправильные переменные в некоторых местах этих циклов.

Не глядя дальше и даже не пробуя вашу программу, ясно, что она не будет работать так, как задумано.

Тогда ваша программа далека от оптимальной. Вы выделили r в 2-х местах. В main бесполезный.

Кроме того, если вы сортируете оба массива, вам не нужно сравнивать каждый элемент в каждом массиве,но вы можете добавить минимальный элемент из текущего местоположения в каждом массиве, и вам не нужно будет сортировать результат еще раз в конце.

Кроме того, если вы знаете, что исходные массивы не дублируются или вы хотите удалить дубликаты, вы можете создать большой массив и отсортировать его один раз, а затем удалить дубликаты либо на месте, либо в новый массив.


Member 11324568

сэр, код был обновлен,но он не работает, после того как я запускаю код и после того, как я даю все детали в качестве входных данных, я получаю на дисплее. это не работает...что же теперь делать?

Philippe Mori

Похоже, что вы рассмотрели только первые два пункта.

Вы должны использовать отладчик, чтобы понять свой собственный код, хотя в этом случае не так уж трудно понять, что код все еще неверен. В частности tem увеличивается только в том случае, если оно не равно нулю, так как цикл выполняется только в этом случае!

Кстати, пишите свой код по одной функции за раз. Начните с 2-х уже отсортированных массивов, и никаких дубликатов и элементов во вторых массивах все больше, чем в первом. Сделайте добавление работ в этом случае, затем добавьте еще один случай, например несортированный массив, затем перекрывающийся диапазон и, наконец, дубликаты.

Member 11324568

Да ,сэр,третий метод,который вы мне посоветовали, очень эффективен по сравнению с тем, что я написал, но мне просто любопытно узнать, какую ошибку я совершил, чтобы избежать такого рода ошибок, а я всего лишь новичок в программировании на Си.

Andreas Gieriet

Используйте qsort из stdlib.h вместо повторного изобретения сортировки.
Не используйте глобальные переменные в функциях (как вы используете tem в add функция и т. д.).
Попробуйте запустить код с помощью бумаги и карандаша (или запустить его в отладчике...), чтобы определить, какой поток управления или данные не являются ожидаемыми.
Овации
Энди

Member 11324568

спасибо :) я не знал о qsort..и я начал смотреть видео о том, как использовать отладчик..

Andreas Gieriet

Для упражнения и получения большей информации я предлагаю вам пройтись по вашему коду на бумаге и карандаше, чтобы вручную оценить поток управления и значения переменных. Вы заметите, что именование имеет решающее значение. И вы увидите, что использование глобальных переменных внутри функций сильно усложняет жизнь (т. е. зависит от последовательности выполнения).
Овации
Энди

Member 11324568

Есть ли какие-либо проблемы, кроме использования памяти при использовании глобальных переменных ?

Member 11324568

Большое спасибо за ваши предложения сэр

Andreas Gieriet

Вы могли бы переварить это: Почему глобальное государство такое злое?.
Овации
Энди

Рейтинг:
1

Member 13920176

#include<stdio.h>
int main()
{
    int a[30],b[30];
    int n,k,i,j,p,c=0;
    printf("How many element in first array\n");
    scanf("%d",&n);
    printf("Enter elements");
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }


     printf("How many element in sceond array\n");
    scanf("%d",&k);
    printf("Enter elements");
    for(i=0;i<k;i++)
    {
        scanf("%d",&b[i]);
    }
     printf("The new array is \n");
     for(i=n,j=0;i<(n+k);i++)
     {
         a[i]=b[j++];
     }

     for(i=0;i<(n+k);i++)
     {
         printf("%d ",a[i]);
     }
    for(i=0,p=0;i<(n+k);i++)
    {
        if(a[i]!=NULL)
        {

            for(j=i+1;j<(n+k);j++)
            {
                if(a[i]==a[j])
                {
                    a[j]=NULL;
                }
            }
            a[p++]=a[i];
            c++;
        }


    }
printf("\nAfter eliminate the dublicate elements,the new arry is : \n");
for(i=0;i<c;i++)
     {
         printf("%d ",a[i]);
     }

}


jeron1

Сбрасывать код для вопроса старше трех лет, без соответствующих объяснений, возможно, не самое лучшее, что можно сделать. Что произойдет, если я введу 80 для количества элементов?