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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2010, 17:15   #1
HackNick
 
Регистрация: 27.08.2010
Сообщений: 5
Печаль Программа на Си

Добрый день, форумчане! :-)
Вот перехожу с Паскаля на Си и в качестве практики делаю программы из задачника. Так вот, задача следующая:

Составить программу для расчета треугольника (определения длин его сторон и величин углов) по заданным координатам его вершин на плоскости.

Я написал программу:

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

float radtodeg(float a) {
      return (a * 180/M_PI);
}

float degtorad(float a) {
      return (a * M_PI/180);
}

int main() {
	struct Vector2 { float x, y; } points[3];
	float angles[3], length[3];
	int i;

	puts("Hello!");
	for (i = 0; i < 3; i++) {
		printf("Point #%i\nx = ", i+1); scanf("%f", &points[i].x);
		printf("y = "); scanf("%f", &points[i].y);
	}

	for (i = 0; i < 3; i++) {
		length[i] = (float) sqrt(pow(points[i].x - points[(i+1)%3].x, 2) + pow(points[i].y - points[(i+1)%3].y, 2));
		printf("Line #%i have length %4.2f;\n", i+1, length[i]);
    }
    
    for (i=0;i<3;i++) {
        angles[i] = (float) radtodeg(acosf(degtorad(((pow(length[i],2) + pow(length[(i+1)%3],2) - pow(length[(i+2)%3],2)) / 2*length[i]*length[(i+1)%3]))));
        printf("Angle #%i is equal %4.2f degrees;\n", i+1, angles[i]);
    }
    
    getch();
}
Так вот, длины сторон она находит правильно, а углы к сожалению у меня -1.#J. Что за фигня? Как вырулить ситуацию? Помогите, пожалуйста. Да, кстати я пока тестировал её только для (0;0), (5;0) и (0;5). И он один из углов (3) определяет правильно (=90 градусам), я так понял это потому что cos(90)=0, так что я считаю там что то с типами не так...
HackNick вне форума Ответить с цитированием
Старый 27.08.2010, 18:28   #2
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Ошибок у тебя несколько, но все в одной строке, замени ее на

Код:
angles[i] = (float) radtodeg(acosf(((pow(length[i],2) + pow(length[(i+1)%3],2) - pow(length[(i+2)%3],2)) / (2*length[i]*length[(i+1)%3]))));
Первая ошибка - брать градус от значение косинуса не надо, сразу же на этом будет неверный результат.
Вторая - когда ты пишешь выражение a/b*c - то это одинаково a*c/b, потому надо писать a/(b*c)
dexterua вне форума Ответить с цитированием
Старый 27.08.2010, 18:34   #3
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

Код:
angles[i] = (float) radtodeg(acosf(degtorad(((pow(length[i],2) + pow(length[(i+1)%3],2) - pow(length[(i+2)%3],2)) / 2*length[i]*length[(i+1)%3]))));
выражение внутри скобок возвращает угол в радианах. Зачем вы заворачиваете его в функцию degtorad?
sashonk вне форума Ответить с цитированием
Старый 27.08.2010, 18:51   #4
HackNick
 
Регистрация: 27.08.2010
Сообщений: 5
По умолчанию

Спасибо, разобрался :-)
HackNick вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09
[PASCAL]Программа создания файла, программа обработки файла Виколяшка Фриланс 7 23.09.2009 17:38
Программа создания файла, программа обработки файла [PASCAL] Виколяшка Помощь студентам 1 22.09.2009 22:56
программа в С++ Grizzli Мультимедиа в Delphi 1 24.06.2009 15:04