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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2010, 21:09   #1
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
Вопрос Вопрос по двумерным массивам - НЕ ЛАБА :)

Я - не студент. Просто изучаю С++. Пару дней назад наткнулся на тему на этом же формуе. Сейчас ее удалили (думаю за несоответствие правилам форума). Но задача из этой темы меня зацепила.

Суть задачки такая. Есть координаты несольких точек. (Я для простоты взял двумерное пространство). Нужно написать фунцию, создающую двумерный массив размерностью [n][n-1], где n-количество точек. Каждый элемент массива - это расстояние от одной из точек до все остальных. То есть например в первой строчке - расстояния от первой точки до второй, третьей и т.д.

Собсно, код:
Код:
#include <math.h>

/*
В текущей версии points объявляется так:
	float ins[5][2] =	{1,4,	-1,2,	-3,2,	0,5,	0,0,	3,5};	
	float ** points = new float * [5];
	for (int i=0; i<5; i++)
		points[i] = new float [2];
	for (int i=0; i<5; i++)
*/

float ** function (float ** points)		
{
	// int n = sizeof(points) << "\n";
	int n = 5;

	float ** answer = new float * [n];  // объявляем массив из n строк и n-1 столбцов
	for (int i=0; i<5; i++)
		answer[i] = new float [n-1];
	
	int j;
	for (int i=0; i<5; i++)										// функция вывода координат заданных точек
		cout << points [i][0] << "\t" << points[i][1] << "\n";	// ДОЛЖНА БЫТЬ УДАЛЕНА из итоговой версии

	for (int i=0; i<5; i++)		// Здесь вычисляется расстояние от текущей точки до всех остальных
	{							// Алгоритм разбит на 2 части - вычисление предыдущих точек и последующих.
		j=0;					
		while (j < i)			// Например, для третей точки здесь вычисляются расстояний до первой и второй
		{
			answer [i][j] = sqrt(pow((points[j][0]-points[i][0]),2) + pow((points[j][1]-points[i][1]),2));
			j++;
		};
		j++;					// Здесь мы пропускаем текущую точку			
		while (j < n)			// Здесь вычисляются расстояния до последующих точек
		{						// Например, для третьей здесь вычисляются расстояния до четвертой, пятой и т.д.
			answer [i][j-1] = sqrt(pow((points[j][0]-points[i][0]),2) + pow((points[j][1]-points[i][1]),2));
			j++;
		};
	};
	return answer;				// Возвращаем указатель на "строчные" указатели;
Код работает - сверял выходные данные с калькулятором. Но есть несколько вопросов.

1. Как определить количество строк в массиве points. Я уже пробовал sizeof(points) и sizeof(*points) и sizeof(**points) - во вех случаях эта величина получается равной 4 (4 байта - размер объекта float ИМХО).
А то, кончено. хочется, чтобы программа работала с любым количеством точек (например, заданным пользователем).

2. Можно ли как-то упростить основную вычисляющую часть алгоритма - где алгоритм разбит на 2 части...

3. Т.к. это моя первая тема на форуме - не нарушил ли я чего?

p/s/ тэгом CODE раскидало все мои комментарии. А ведь стаоялт все красиво один-под-одним
Sapfil вне форума Ответить с цитированием
Старый 16.01.2010, 22:06   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

1. если память выделяете динамически, то размерность массива должна быть известна, sizeof в этом случае возвратит размер указателя
2. не проверял, но вроде как-то так
Код:
for (int i=0; i<5; i++)	
{
    k=0;
    for(int j=0;j<5;j++)
    {
         if(i!=j)
         {
             answer [i][k] = sqrt(pow((points[j][0]-points[i][0]),2) + pow((points[j][1]-points[i][1]),2));      
             k++;
          } 
    }
};
counter вне форума Ответить с цитированием
Старый 17.01.2010, 14:49   #3
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
По умолчанию

Спасибо. Вообще - было бы неплохо создать несколько больших тем на форуме. Вот например, про дву- (трех-, много-) -мерные массивы стопудово уже где-то есть. Но все свалено в одну большую кучу и найти нужную инфу трудно, поэтому большинство и не старается искать, а создает новые и новые темы.
Sapfil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача по двумерным массивам на C++ Phenom9650 Помощь студентам 2 14.12.2009 20:56
Задача по двумерным массивам(Паскаль) pupik100 Помощь студентам 19 26.10.2009 16:11
Лаба по массивам DimaG Помощь студентам 19 30.10.2007 08:56
Программа по двумерным массивам! Elmander Помощь студентам 9 22.06.2007 14:32