Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2012, 11:09   #1
Aliosha2
 
Регистрация: 21.12.2012
Сообщений: 9
По умолчанию не корректно выводит min из массива [с++]

Код:
float min(0);
    min=xySqrt(ms[1].x,ms[0].x,ms[1].y,ms[0].y);
    
    for(int i=0;i<=k-1;i++)
        for(int 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)//ошибка тут с МИН(если мин 1, а 2 меньше) и по н переменных мин
                cout << setprecision(2) 
                     << xySqrt(ms[j].x,ms[i].x,ms[j].y,ms[i].y) 
                     << "Koordin "<< 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)

Последний раз редактировалось Aliosha2; 27.12.2012 в 11:15.
Aliosha2 вне форума Ответить с цитированием
Старый 27.12.2012, 11:33   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ой, Вы, имхо, слишком много лишнего нагородили.

я бы так написал:
Код:
  int iMin = 0;
  int jMin = 1; // минимальными считаем координаты 1-й и 2-й точек
  
    for(int i=0;i<=k-2;i++)
        for(int j=i+1;j<=k-1;j++)
            if(xySqrt(ms[j].x,ms[i].x,ms[j].y,ms[i].y)<xySqrt(ms[jMin].x,ms[iMin].x,ms[jMin].y,ms[iMin].y)) 
                 { iMin := i; j Min = j }
если я неправильно понял и суть проблемы в том, чтобы вывести ВСЕ пары, расстояние между которыми равно минимальному,
то я бы это сделал дополнительным циклом. первые два цикла по i/j находим минимальное значение.
вторые два цикла по i,j выводим все пары, расстояние между которыми равно минимальному.
Профит.



С не знаю, пишу примерно, за ошибки прошу извинить

Последний раз редактировалось Serge_Bliznykov; 27.12.2012 в 11:36.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.12.2012, 11:46   #3
Aliosha2
 
Регистрация: 21.12.2012
Сообщений: 9
По умолчанию

тут находите координаты мин точки,
я пытаюсь найти min расстояние между 2мя точками

Странная вещь происходит:

Код:
		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)) )  //что бы не искать 2й раз одни и те же пары координат
				{
						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<<endl<< min <<endl;
координаты:
Цитата:
1.0,2.0
0.0,0.0
4.0,6.0
3.0,8.0
Присваивается мин значение 1го = 2.2 , далее идет поиск мин и в конце выдаёт присваивает мин вообще 4

Последний раз редактировалось Aliosha2; 27.12.2012 в 12:17.
Aliosha2 вне форума Ответить с цитированием
Старый 27.12.2012, 12:20   #4
der_igel
Пользователь
 
Регистрация: 25.12.2012
Сообщений: 29
По умолчанию

А расстояние правильно считается? И чему равна к в for()?
der_igel вне форума Ответить с цитированием
Старый 27.12.2012, 12:25   #5
Aliosha2
 
Регистрация: 21.12.2012
Сообщений: 9
По умолчанию

Расстояние правильно считается:
Код:
float xySqrt(float x2,float x1,float y2,float y1){
	return sqrt((pow((x2-x1),2))+(pow((y2-y1),2)));
};
Код:
нахожу k она равна в данном случае 4
while ( !file.eof() )
{
	file >> ms[k].x >> ms[k].t >> ms[k].y;
	k++;
};
Aliosha2 вне форума Ответить с цитированием
Старый 27.12.2012, 12:32   #6
Aliosha2
 
Регистрация: 21.12.2012
Сообщений: 9
По умолчанию

Весь исходный код
потерял:
Цитата:
cout<<"==== "<<k;
};
после:
Цитата:
<< " "<< ms[j].x << " -" << ms[i].x <<"]("<< ms[j].y << "-" << ms[i].y
<< endl;
};
Вложения
Тип файла: txt kod.txt (1.9 Кб, 117 просмотров)

Последний раз редактировалось Aliosha2; 27.12.2012 в 12:35.
Aliosha2 вне форума Ответить с цитированием
Старый 27.12.2012, 12:51   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
тут находите координаты мин точки,
Вы не правы. я своим кодом нахожу минимальное расстояние между парой точек.
в iMin и jMin будут номера (индексы, считая от 0) тех двух точек, расстояние между которыми минимально!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.12.2012, 12:59   #8
Aliosha2
 
Регистрация: 21.12.2012
Сообщений: 9
По умолчанию

вроде понял сейчас гляну

Последний раз редактировалось Aliosha2; 27.12.2012 в 13:02.
Aliosha2 вне форума Ответить с цитированием
Старый 27.12.2012, 13:02   #9
der_igel
Пользователь
 
Регистрация: 25.12.2012
Сообщений: 29
По умолчанию

А попробуй вместо
Цитата:
if( (i!=j) && ((i!=0)&&(j!=1)) )
сделать
Цитата:
if( (i!=j) && !(i==0 && j==1) )
der_igel вне форума Ответить с цитированием
Старый 27.12.2012, 13:13   #10
Aliosha2
 
Регистрация: 21.12.2012
Сообщений: 9
По умолчанию

исправил, и теперь нормально 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;
                };

Последний раз редактировалось Aliosha2; 27.12.2012 в 14:26.
Aliosha2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
списке целых чисел все элементы между max и min заменить полусуммой max и min Roman one C/C++ Базы данных 0 20.12.2012 12:14
Почему то выводит только верхнюю строку массива(всего 4 строки) Nikitos_ Паскаль, Turbo Pascal, PascalABC.NET 10 06.06.2012 00:14
При выводe массива , выводит и грязь , в чём проблeма собcHо ?? zipo666 Общие вопросы C/C++ 11 14.02.2012 11:56
Min сумма столбцов 2-ого массива Sparky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 23.09.2009 17:20