Member 14052307 Ответов: 5

Срочно помогите пожалуйста! ! ! Функция не отображает объединенный массив после его сортировки


Эта функция объединяет два массива в порядке возрастания и убывания и отображает третий массив в порядке убывания..

#include <iostream>
#include<stdlib.h>
#включить<stdio.h>

пустота mergedesc()
{int i=0,j,k=0,A[5],B[5],C[10],M,N;
std::cout<<"введите M";
std::cin>>M;
std::cout<<"введите N";
std::cin>>N;
std::cout<<"введите первые элементы массива в порядке возрастания";
для(i=0;i<M;i++)
std::cin>>A[i];

std::cout<<"введите вторые элементы массива в порядке убывания";
для(j=0;j<N;j++)
std::cin>>B[j];

в то время как(i<M& j>=0)
{if(A[i]<B[j])
{
C[k] = A[i];
я++;
к++;
}
еще {
C[k] = B[j];
j--;
к++;
}
std::cout<<"сортированный массив";
для(k=N-1;k<M+N;k--)
{СТД::соиь<&ЛТ;с[K]&ЛТ;&ЛТ;" ";}

}}
тап_п()
{
mergedesc();
возвращает 0;
}

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

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

Чтобы изменить знаки больше и меньше, когда цикл сортирует введенный массив

5 Ответов

Рейтинг:
32

Richard MacCutchan

std::cout<<"Enter the second array elements in descending order";
for(j=0;j<N;j++)
std::cin>>B[j];

while(i<M&&j>=0) // *** value of j

В конце приведенного выше цикла for значение j будет равно числу элементов B. Таким образом, используя j в качестве индекса в цикле while, он будет слишком велик на 1. Вы должны уменьшить его на единицу перед запуском цикла while. Вы также должны проверить, что M и N никогда не превышают 5.


Рейтинг:
1

OriginalGriff

Цитата:
Пожалуйста, скажите мне, где я иду не так, и пожалуйста, предоставьте правильный код.

Нет, потому что мы не делаем твою домашнюю работу! (И мы понятия не имеем, что ваш учитель сказал вам делать).

Цитата:
Компиляция не означает, что ваш код верен! Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

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

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
0

KarstenK

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

Некоторые советы:

- напишите сортировку в собственной функции, которая принимает 3 массива в качестве входных данных и чем сортирует
- напишите некоторые тестовые данные для легкой отладки
- сделайте отступ в коде и используйте лучшие имена
- сделайте какой-нибудь вывод (вы можете удалить его, когда будете готовы)

прототип для функции сортировки.

void mergeArraysSorted( int *arr1, int *arr2, int *arrResult, int count)


Рейтинг:
0

Rick York

Сначала я бы посмотрел на код, который отображает массив:

std::cout<<"Sorted Array";
for( k=N-1; k < M+N; k-- )
{
   std::cout<<C[k]<<" ";
}
Я думаю, что эта петля должна быть:
for( k = 0; k < M + N; ++k )
{
   std::cout << C[k] << " ";
}
Это будет начинаться с начала массива, элемента 0, и продолжаться до последнего элемента, который является M + N - 1. он предполагает, что направление сортировки и отображения находятся как от первого до последнего в массиве.


Рейтинг:
0

CPallini

Чтобы исправить ваш код (в соответствии с предложениями, которые уже были даны другими)

#include <iostream>

void mergedesc()
{
  int i=0,j,k=0,A[5],B[5],C[10],M,N;
  std::cout<<"Enter M";
  std::cin>>M;
  std::cout<<"Enter N";
  std::cin>>N;
  std::cout<<"Enter the first array elements in ascending order";
  for(i=0;i<M;i++)
    std::cin>>A[i];
  
  std::cout<<"Enter the second array elements in descending order";
  for(j=0;j<N;j++)
    std::cin>>B[j];
  
  i=0; j=N-1; 
  while ( k < (M+N) )
  { 
    if ( i == M)
    {
      C[k++] = B[j--];
    }
    else if ( j == -1)
    {
      C[k++] = A[i++];
    }
    else
    {
      if(A[i]<B[j])
      {
        C[k++] = A[i++];
      }
      else
      {
        C[k++] = B[j--];
      }
    }
  }

  std::cout<<"Sorted Array ";
  for(k=0;k<M+N;++k)
  { 
    std::cout<<C[k]<<" ";
  }
  std::cout << std::endl;
 
}

int main()
{
  mergedesc();
  return 0;
}



Однако я бы переписал его таким образом
#include <iostream>
#include <vector>
using namespace std;

vector<int> merge(const vector<int> & vasc, const vector<int> & vdesc);

int main()
{
  vector <int> vasc;
  vector <int> vdesc;
  int M, N;

  cout << "Enter M";
  cin >> M;
  cout << "Enter N";
  cin >> N;

  vasc.resize(M);
  vdesc.resize(N);

  std::cout<<"Enter the first array elements in ascending order";
  for (auto & a : vasc)
    cin >> a;

  std::cout<<"Enter the second array elements in descending order";
  for (auto & d : vdesc)
    cin >> d;

  auto vres = merge(vasc, vdesc);

  cout<<"Sorted array ";
  for (  auto i : vres)
    cout << i << " ";
  cout << endl;
}

vector<int> merge(const vector<int> & vasc, const vector<int> & vdesc)
{
  vector<int> vres;

  auto ita = vasc.begin();
  auto itd = vdesc.rbegin();

  while ( true )
  {
    if ( ita != vasc.end() )
      if ( itd != vdesc.rend() )
        if ( *ita < *itd )
          vres.push_back( *ita++ );
        else
          vres.push_back( *itd++ );
      else
        vres.push_back( *ita++);
    else
      if ( itd != vdesc.rend() )
        vres.push_back( *itd++);
      else
        break;
  }
  return vres;
}