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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2012, 18:50   #1
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
Печаль Обьясните, в чем ошибка.

Здравствуйте.
Программа расчета периметра десятигранника.
Координаты точек вершин вводятся с клавиатуры в массив.
И цикле вызывается функция расчета длины отрезка и возвращаемые результаты суммируются.
При компилировании в Visual C++ получается, что функция расчета длины
сегмента всегда возвращает 2.
Скажите куда копать (С только осваиваю, если возможно по подробней)

Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>


int xy[10][2] ,i = 1,j = 0,count;
float perimetr;

float lenght_of_segment(const int *x2 ,const int *x1 ,const int *y2 ,const int *y1)
{
  float x=sqrt(float((x2-x1)^2+(y2-y1)^2));
  return x;
}

int main()
{
	for( ;j<10;j++,i++)
	{
		printf("\nEnter values of x%i & y%i separeted by commas:\t",i,i);
		scanf("%i%*c%i",&xy[j][0],&xy[j][1]);
	}
	i=1,j=0;
	for(count=0;count<10;count++)
	{
		if(i==0)i=0,j=9;
		perimetr+=lenght_of_segment(&xy [i][0],&xy[j][0],&xy[i][1],&xy[j][1]);
		i++,j++;
	}
	printf("Perimeter = %6.2f",perimetr);
	getch();

	return 0;
}
Зарание благодарю.

Последний раз редактировалось ACE Valery; 09.01.2012 в 22:40.
beerouser вне форума Ответить с цитированием
Старый 07.01.2012, 19:08   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

A ^ B

как ты думаешь, что в Си означает эта запись?
Rififi вне форума Ответить с цитированием
Старый 07.01.2012, 19:18   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

И ещё, у вас в функции lenght_of_segment параметры - указатели, их нужно разыменовывать.
8Observer8 вне форума Ответить с цитированием
Старый 08.01.2012, 08:06   #4
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
A ^ B

как ты думаешь, что в Си означает эта запись?
Точно, поразрядное ИЛИ.
Пора в отпуск
beerouser вне форума Ответить с цитированием
Старый 08.01.2012, 08:09   #5
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
И ещё, у вас в функции lenght_of_segment параметры - указатели, их нужно разыменовывать.
А вот сдесь не порнял.
Сейчас раскутим man.
beerouser вне форума Ответить с цитированием
Старый 08.01.2012, 08:18   #6
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
По умолчанию

sqrt(float((x2-x1)^2+(y2-y1)^2))
Будет так:
sqrt((pow((float(x2-x1)),2)+pow((float(y2-y1)),2));
Верно?
Как-то уродливо.Целая куча скобок.

Последний раз редактировалось beerouser; 08.01.2012 в 08:38.
beerouser вне форума Ответить с цитированием
Старый 08.01.2012, 08:33   #7
beerouser
 
Регистрация: 07.01.2012
Сообщений: 7
По умолчанию

Работает!
beerouser вне форума Ответить с цитированием
Старый 08.01.2012, 08:51   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от beerouser Посмотреть сообщение
sqrt(float((x2-x1)^2+(y2-y1)^2))
Будет так:
sqrt((pow((float(x2-x1)),2)+pow((float(y2-y1)),2));
Верно?
Как-то уродливо.Целая куча скобок.
Что бы улучшить читабельность, можно например, поюзать временные промежуточные переменные.
_Bers вне форума Ответить с цитированием
Старый 08.01.2012, 11:20   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от beerouser Посмотреть сообщение
А вот сдесь не порнял.
Сейчас раскутим man.
В вашей функции переменные x1 и x2 хранят адреса переменных xy [i][0] и xy [i][0] соответственно. Пройдите в отладчике по шагам и посмотрите. К примеру, посмотрите, что будет в переменной val в следующем коде, при установке точки останова на return.

Код:
float lenght_of_segment(const int *x2 ,const int *x1 ,const int *y2 ,const int *y1)
{
    int val= x1;
    return sqrt(pow((float(x2-x1)),2)+pow((float(y2-y1)),2));;
}
Чтобы получить значение по адресу, который храниться в x1 нужно применить операцию разыменования (*).

Вот так работает правильно:

Код:
double lenght_of_segment(const int *x2 ,const int *x1 ,const int *y2 ,const int *y1)
{
    double a, b, c;

    a = fabs((double)(*x2-*x1));
    b = fabs((double)(*y2-*y1));
    c = sqrt(pow(a, 2) + pow(b, 2));
    return c;
}
1) Используйте double, вместо float. Пусть double и больше места занимает, но всё же его мат. функции используют, предупреждений от компилятора будет меньше (усечение значений).

2) В данной задачи и подобных лучше использовать структуры, это облегчает программирование.

3) Хотя бы на этапе разработки, заведите файл с координатами, чтобы не мучатся с вводом значений.

Последний раз редактировалось 8Observer8; 08.01.2012 в 11:22.
8Observer8 вне форума Ответить с цитированием
Старый 08.01.2012, 11:33   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение

Вот так работает правильно:

Код:
double lenght_of_segment(const int *x2 ,const int *x1 ,const int *y2 ,const int *y1)
{
    double a, b, c;

    a = fabs((double)(*x2-*x1));
    b = fabs((double)(*y2-*y1));
    c = sqrt(pow(a, 2) + pow(b, 2));
    return c;
}
А с какой целью тут вообще указатели передаются? Не проще ли сразу значения:

Код:
double lenght_of_segment(const int x2 ,const int x1 ,const int y2 ,const int y1)
{
    double a, b, c;

    a = fabs((double)(x2-x1));
    b = fabs((double)(y2-y1));
    c = sqrt(pow(a, 2) + pow(b, 2));
    return c;
}
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем ошибка??? Севастьянов Microsoft Office Excel 3 17.08.2011 11:48
Люди обьясните в чем ошибка. FreeFire_a Помощь студентам 0 16.01.2011 23:53
Обьясните почему тут ошибка? Skorpion555 Помощь студентам 11 10.03.2010 08:28
Ошибка "не найден файл vc60.bpl" обьясните Нур C++ Builder 4 22.12.2009 23:12