Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > не правельно выводит min из массива


Автор: аНТ 27.12.2012, 11:52
Код

        float min(xySqrt(ms[1].x,ms[0].x,ms[1].y,ms[0].y));
        for(i=0; i<=k-1; i++)
            for(j=1; j<=k-1; j++)
                if( (i!=j) && ((i!=0)&&(j!=1)) )
                {
                    if(xySqrt(ms[j].x,ms[i].x,ms[j].y,ms[i].y) <= min)
                    {
                        min = ms[j].x,ms[i].x,ms[j].y,ms[i].y;
                        cout << min <<endl;
                    };
                    cout << xySqrt(ms[j].x,ms[i].x,ms[j].y,ms[i].y) << endl;
                };

Ищу мин расстояние между точками, за min взял две 1е координаты,
и тут возникают следующие ошибки:
если попадаются в начале 2 мин координаты
1.0,1.0
1.0,2.0
1.0,2.0
то выводит мин только одну;
если эти же координаты раскиданы дальше в файле(как пример) дальше получается, что он находит эти 2 мин и ниже этого мин (2е - по 1 и 2е по 0)


Автор: xvr 27.12.2012, 13:20
  • В строке 8 забыли написать вызов функции xySqrt
  • В строке 4 неправильное условие - вы не включите в сравнение все пары с 0м и 1м элементами, а не только пару из 0го и 1го элемента
  • Ну и печатать min, равно как и индексы, надо после завершения всех циклов. Т.к. в процессе вы найдете много 'минимальных' элементов, которые таковыми не являются, т.к. дальше может найтись элемент еще 'минимальнее'

Автор: аНТ 27.12.2012, 13:23
исправил, и теперь нормально min находит,
но так же попарно одну и ту же координату выводит
(
1.0,2.0
0.0,0.0
4.0,6.0 //вот эти 2 последние координаты
3.0,8.0 // повторяются почему то 2 раза у них находит мин
)
сначала смотрит [3.8]и [4.6], а потом их в обратном порядке [4.6] и [3.8] 

    
Код

    for(i=0; i<=k-1; i++)
            for(j=1; j<=k-1; j++)
                if( (i!=j) && !(i==0 && j==1) ) 
                {
                    if(xySqrt(ms[j].x,ms[i].x,ms[j].y,ms[i].y)<=min)
                        cout << setprecision(2)
                             << xySqrt(ms[j].x,ms[i].x,ms[j].y,ms[i].y) << " - min length, point coordinates: "
                             << "[" << ms[j].x << " . " << ms[j].y << "] and ["
                             << "[" << ms[i].x << " . " << ms[i].y << "] "
                             << endl;
                };

Автор: xvr 27.12.2012, 13:32
  • Вынесите печать за циклы
  • Цикл в строке 2 можно сделать for(j=i+1; j<k; j++). Ну и первый цикл (по i) стартовать с 1. Тогда if в строке 3 не понадобится и координаты 2 раза (i,j и j,i) проверять не будет

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)