C ++, Перегрузка, Создание функций в классе, которые получают массив и размер массива в качестве входных данных и находят наименьшее значение - PullRequest
0 голосов
/ 21 ноября 2018

Я сейчас изучаю C ++.У меня возникают проблемы, когда я работаю над проблемой перегрузки.Функция в классе должна принимать массив и размер массива в качестве входных данных и выводить наименьшее значение.Всего существует три массива, включая int, float и char.Мой код работает только под int.Я не могу понять, почему я прикрепил свой код ниже.Кто-нибудь может сказать мою ошибку?Я знаю, что должен быть лучший метод, чем мой, и я действительно хочу выяснить, почему мой код не работает с плавающей точкой и регистром символов.Любая помощь будет сильно оценена.

Для случая int он может правильно вывести наименьшее значение, равное 2. Однако для условия с плавающей запятой он продолжает давать мне 0 вместо числа изсписок с плавающей точкой.

Основная функция

int main()
{
  Compare c;
  int arrayInt[5] = {65,43,2,898,678};
  float arrayInF[4] = {4.5,4.9,4.3,6.5};
  char arrayInC[6] = {'w','z','t','h','e','c'};

  std::cout<<c.findSmaller(arrayInt, 5)<<" is the smallest of the input array\n";
  std::cout<<c.findSmaller(arrayInF, 4)<<" is the smallest of the input array\n";
  std::cout<<c.findSmaller(arrayInC, 6)<<" is the smallest of the input array\n";
  return 0;
}

Класс

class Compare
{
public:
    int findSmaller(int input1[],int input2);
    float findSmaller(float input1[],int input2);
};


int Compare::findSmaller(int input1[], int input2)
{
int small;
for(int i=0;i<input2;i++)
{
    if(input1[i]<input1[i+1])
    {
        small = input1[i];
        input1[i+1] = small;
    }
    else
    {
        small = input1[i+1];
        input1[i+1] = small;
    }
}
return small;
}

float Compare::findSmaller(float input1[], int input2)
{
float small;
for(int i=0;i<input2;i++)
{
    if(input1[i]<input1[i+1])
    {
        small = input1[i];
        input1[i+1] = small;
    }
    else
    {
        small = input1[i+1];
        input1[i+1] = small;
    }
}
return small;
}

char Compare::findSmaller(char input1[], int input2)
{
char small;
for(int i=0;i<input2;i++)
{
   if(input1[i]<input1[i+1])
{
    small = input1[i];
    input1[i+1] = small;
}
else
{
    small = input1[i+1];
    input1[i+1] = small;
}
}
return small;
} 

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018
float arrayInF[4] = {4.5, 4.9, 4.3, 6.5};

имеет 4 значения (используйте пробел в вашем коде, это значительно упрощает чтение)

Вы передаете input2 (также используйте более описательные имена переменных) из 4, что означает, что

for(int i=0;i<input2;i++)

i увеличивается до 3.

Затем вы получаете доступ к индексам массива 3 и 3 + 1 = 4 здесь (и в других местах):

if(input1[i]<input1[i+1])

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

Эта проблема не ограничивается только реализацией float.

0 голосов
/ 21 ноября 2018

Причина, по которой код не работает должным образом, в два раза

  1. , потому что ваш алгоритм разрушителен
  2. , потому что вы пересекаете границы массива

ваш фрагмент кода:

if(input1[i]<input1[i+1]) // <-- 2) over step array when i = (input2 - 1)
{
    small = input1[i];
    input1[i+1] = small;  // <-- 1) this will overwrite the NEXT value
}
else
{
    small = input1[i+1];
    input1[i+1] = small;
}

если вы пройдете через это с вашим входом arrayInt

int arrayInt[5] = {65,43,2,898,678};

данные станут {65, 43, 2, 2, 2} по мере их выполнения,уничтожение исходных данных.

c и c ++ используют индексирование базы 0, то есть массив из 4 элементов индексируется 0, 1, 2, 3 и т. д., поэтому при выполнении итерации «i

|пункт 0 |пункт 1 |пункт 2 |пункт 3 |пункт 4 |etc.

ссылка на input1 [5] просто вернет следующий блок памяти, интерпретируемый как ожидаемый тип данных, целое число в случае arrayInt.

Поскольку 3 массива объявляются вместе,компилятор выделил их пространство вместе, это означает, что arrayInt находится рядом с arrayInf в физической памяти, что также означает, что arrayInt [5] будет таким же, как (int) arrayInf [0].4.5 float - это большое целое число, которое задействует деструктивную природу вашего алгоритма. Это означает, что при переборе массиваInt вы на самом деле перезаписали 4.5 float с целым числом 2, и это будет интерпретироваться как действительно маленькое число с плавающей запятой.первый элемент массива arrayInf.

@ Bo-r дает пример лучшего алгоритма для выполнения того, что вы хотите.

0 голосов
/ 21 ноября 2018

Кажется, вы не объявили и не реализовали метод char Compare::findSmaller(char *input1, int input2).

Примером такой реализации будет:

char Compare::findSmaller(char input1[], int input2) {
    assert(input2 >0);
    char small = input1[0];
    for (int i = 1; i < input2; i++)
        if (input1[i] < small)
            small = input1[i];
    return small;
}
...