Member 13596568 Ответов: 1

Кто-нибудь, пожалуйста, найдите ошибку в моем подходе и коде.


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

Что я уже пробовал:

#include<iostream

int *merge(int *p,int n);
int *halfa(int *ptr,int n);
int *halfb(int *ptr,int n);
int main()
{    int *a,arr[8];
    cout<<"enter";
    for(int i=0;i<8;i++) 
    {
               cin>>arr[i];   }

a=merge(arr,8);

cout<<"\n";

for(int i=0;i<8;i++,a++)

        { cout<<*a;}

return 0;
}

int *merge(int *p,int n)
{ 
 int *q,*r,*t;
 q=halfa(p,16);
 r=halfb(p,16);
 for(int i=0;i<16;i++,t++)
   {
         if(*q<*r)
            {*t=*q;
                      q++;}
        
         if(*r<*q)
             {*t=*r;
                       r++;}
}
return(t);
}

int *halfa(int *ptr,int n)
{         int *q,*y;
           
           for(int i=0;i<(n/2);i++,q++,ptr++)
             {
                   q=ptr;
                            }

y=merge(q,(n/2));

return(y);
}
int *halfb(int *ptr,int n)
   {  int *q,*y;
       for(int i=0;i<n;i++,q++,ptr++)
        {
                if(i>=(n/2))
                 { q=ptr;
                    break; }
                                         }

  y=merge(q,(n/2));
    return(y);
 }

Peter_in_2780

-... предложи лучший способ.." Это называется отладчик. Пройдитесь по своему коду, понаблюдайте за переменными и потоком управления.

Rick York

В вашем коде есть несколько буквальных значений, разбросанных по нему, и это действительно плохая идея. Я имею в виду 8-е и 16-е там. Что произойдет, если вы решите иметь 9 или 10 значений? У вас есть целая куча мест, чтобы изменить его, а затем надеяться, что вы получили их все. Для этого лучше использовать постоянное значение, например :
const int InputCount = 8; и замените все экземпляры 8 на InputCount. Затем, если вы решите иметь другое количество входов позже, у вас будет только одна вещь, которую нужно изменить. Если 16s зависят от другого значения, равного 8, то они должны быть изменены на 2*InputCount. Опять же - только одна вещь, чтобы изменить, если вы должны. Может показаться, что это не так сейчас, но это может оказаться очень важным в будущем.

Member 13596568

Спасибо за Ваш вклад.
На самом деле я пытался заставить его работать по крайней мере с 16, а затем использовать значение const.
Но никаких проблем нет, в приведенном выше коде есть много ошибок, которые я обнаружил после его повторного просмотра.
Еще раз большое спасибо

1 Ответов

Рейтинг:
1

Patrice T

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

#include<iostream>

int *merge(int *p,int n);
int *halfa(int *ptr,int n);
int *halfb(int *ptr,int n);
int main()
{
  int *a,arr[8];
  cout<<"enter";
  for(int i=0;i<8;i++)
  {
    cin>>arr[i];
  }

  a=merge(arr,8);

  cout<<"\n";

  for(int i=0;i<8;i++,a++)

  {
    cout<<*a;
  }

  return 0;
}

int *merge(int *p,int n)
{
  int *q,*r,*t;
  q=halfa(p,16);
  r=halfb(p,16);
  for(int i=0;i<16;i++,t++)
  {
    if(*q<*r)
    {
      *t=*q;
      q++;
    }

    if(*r<*q)
    {
      *t=*r;
      r++;
    }
  }
  return(t);
}

int *halfa(int *ptr,int n)
{         int *q,*y;

  for(int i=0;i<(n/2);i++,q++,ptr++)
  {
    q=ptr;
  }

  y=merge(q,(n/2));

  return(y);
}
int *halfb(int *ptr,int n)
{  int *q,*y;
  for(int i=0;i<n;i++,q++,ptr++)
  {
    if(i>=(n/2))
    {
      q=ptr;
      break;
    }
  }

  y=merge(q,(n/2));
  return(y);
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]
-----
Почему у вас есть константа 16 в вашем коде?
Вы сливаетесь воедино t- но куда он указывает?

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

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Member 13596568

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