Member 14106396 Ответов: 4

Ошибка nan, out put заключается в том, чтобы вывести самое дальнее значение из x из массива(извините за плохой английский)


выход заключается в том, чтобы вывести самое дальнее число из массива x
например массив: 19 434 23 55 7
x: 2
тогда самое дальнее значение от x равно: 434
мой код, на всякий случай, только распечатай Нэн, я уже несколько часов смотрю на свой код, но все равно ничего не получаю, хотя и знаю, что что-то пошло не так


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

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

вот мой код:
#include <iostream>
#define MAX 100
#include <cmath>
using namespace std;
void nhap(float a[] ,int &n)
{
    int x;
    do
       {
        cout<< "\nnhap so n: ";
        cin >> n;
        cout<< "\nnhap so x: ";
        cin >> x;
    if(n<0 || n> MAX)
        cout << "\nsai roi, moi nhap lai ";
        }
        while(n<0 || n >MAX);
        for(int i=0; i<n; i++)
            {
            cout << "a[" << i << "]= ";
            cin >> a[i];
            }
}
void xuat(float a[], int &n)
{
    for(int i=0; i <n; i++)
    {
    cout << a[i] << " ";
    }
}
void taomang (float a[], float b[], int &n, int x)
{
    for (int i=0; i<n; i++)
        b[i] = abs(a[i] - x);
}
float xaxnhat(float a[], float b[], int &n)
{
    int s = b[0];
    for(int i=0; i<n; i++)
    {
        if(b[i]>s)
        {
            s=b[i];
        }
    }
        return s;
}
float xuatketqua (float a[], float b[], int n)
{
    int k = xaxnhat(a,b,n);
    for (int i=0; i<n; i++)
    {
        if (b[i] == k)
            return a[i];
    }
}
int main()
{
    int n;
    float a[MAX];
    float b[MAX];
    nhap(a,n);
    xuat(a,n);
    cout << " \ngia tri xa gia tri x nhat la: ";
    cout << xuatketqua(a,b,n);
    return 0;
}

4 Ответов

Рейтинг:
2

Rick York

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

float xuatketqua (float a[], float b[], int n)
{
    int k = xaxnhat(a,b,n);
    for (int i=0; i<n; i++)
    {
        if (b[i] == k)
            return a[i];
    }
}
Ошибка заключается в том, что не все пути управления возвращают значение. Если вы пройдете по списку и не найдете совпадения, что будет возвращено? Вам нужно добавить строку return 0 в нижней части или что-то в этом роде.

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

Это только одна проблема. Еще одна проблема заключается в этом:
float xaxnhat(float a[], float b[], int &n)
{
    int s = b[0];
    for(int i=0; i<n; i++)
    {
        if(b[i]>s)
        {
            s=b[i];
        }
    }
    return s;
}
Проблема здесь в том, что s объявляется как целое число. Это должен быть поплавок, чтобы быть последовательным. Кроме того, почему массив "а" никогда не используется в xaxnhat? Он не должен быть передан, если он не используется.

Еще одна вещь - я рекомендую резервировать однобуквенные имена переменных только для индексов цикла и таких вещей, как x и y для координат точек или r и i для компонентов мнимого числа. Это места, где однобуквенные имена являются общими терминами, используемыми. В противном случае они не несут никакого смысла и затрудняют понимание кода. В вашей программе массив a представляется входными данными, а b-расстояниями. Эти массивы лучше было бы назвать входами и расстояниями или чем-то подобным, что указывает на то, что представляют собой данные.


Рейтинг:
2

Richard MacCutchan

Почему вы используете типы float, когда все ваши входные значения являются целыми числами? Эта задача представляет собой простую логическую головоломку:

BEGIN
    WHILE some condition
        INPUT next value to the array
    ENDWHILE

    SET maxvalue = 0
    FOR EACH value in the array
        IF arrayvalue is GREATER THAN maxvalue
            SET maxvalue = arrayvalue
    ENDFOR
    PRINT "Maximum value is " maxvalue
END


Рейтинг:
1

Stefan_Lang

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

Если бы вы это сделали, то, вероятно, обнаружили бы, что вы получаете доступ к массиву b даже не инициализируя его! Значения внутри действительно NAN, и это то, что вы получаете в результате.

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


Рейтинг:
0

CPallini

C++ это немного сильнее, чем вы, кажется, предполагаете

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

constexpr size_t MaxSize = 100;

int main()
{
  vector<int> v;

  size_t n;

  cout << "please insert the number of items ";
  cin >> n;

  n = n > MaxSize ? MaxSize : n;

  cout << "please insert the " << n << " items\n";
  for (size_t i = 0; i<n; ++i)
  {
    int x;
    cout << "a[" << i << "] =";
    cin >> x;
    v.push_back(x);
  }


  for (auto x : v)
    cout << x << " ";
  cout << "\n";

  cout << "now, please insert the starting number x = ";
  int x;
  cin >> x;

  cout << "the farthest value from the starting number is ";
  cout << *max_element(v.begin(), v.end(), [x](int a, int b){ return abs(a-x) < abs(b-x);});
  cout << endl;

}


Maciej Los

5ed!

CPallini

Спасибо!