Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Гриха
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 24
#1

Длина перпендикуляра из точки к отрезку - C++

31.01.2013, 06:05. Просмотров 1487. Ответов 1
Метки нет (Все метки)

Даны координаты точки (x,y) и координаты концов отрезка (x1,y1) и (x2,y2). С точки (x,y) опущен перпендикуляр на заданный отрезок. Найти длину перпендикуляра.
Формат входных данных
Шесть чисел — координаты точки и координаты концов отрезка.
Формат выходных данных
Одно число — длину перпендикуляра. Если перпендикуляр не падает на отрезок вывести -1. Результат вывести с точностью до четырех знаков после точки.
вот цифры для проверки ответа в input.txt вводим 0 4 2 3 2 5, а должно выводиться 2.0000 но выходит не то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
FILE *f1;
f1=fopen("input.txt","r");
FILE *f2;
f2=fopen("output.txt","w");
double x,y,x1,y1,x2,y2,s,A,B,C,T,d1,d2,min;
fscanf(f1,"%lf %lf %lf %lf %lf %lf",&x,&y,&x1,&x2,&y1,&y2);
A=y2-y1;
B=x1-x2;
C=-x1*(y2-y1)+y1*(x2-x1);
T=sqrt(A*A+B*B);
s=A*x/T + B*y/T + C/T;
fprintf(f2,"%.4lf",min);
 
}
Добавлено через 9 минут
там в конце должно быть
fprintf(f2,"%.4lf",s);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2013, 06:05     Длина перпендикуляра из точки к отрезку
Посмотрите здесь:
Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки C++
C++ Принадлежность точки к отрезку.
Принадлежность точки отрезку C++
Найти уравнение серединного перпендикуляра C++
задан текст. удалить из нее все слова, длина которых четная (создать новый массив, оставив все слова, длина которых нечетная) C++
Определить, принадлежит ли число Х отрезку (-0,2; 10) C++
Получить сумму членов, принадлежащих отрезку C++
C++ Указать те ее элементы, которые принадлежат отрезку [с, d].
C++ Вычисления количества простых чисел, принадлежащих отрезку
Найти дружественные числа, принадлежащие отрезку [1; 10000] C++
Во введенной строке заменить все запятые на точки, а точки - на восклицательные знаки C++
Во введенной строке заменить все запятые на точки, а точки - на восклицательные знаки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
01.02.2013, 06:58     Длина перпендикуляра из точки к отрезку #2
Я сделал программу с упором на С++, так как неизучал С
Я не смог портестить ваш вариант, так как мой компилятор не находит fopen, fscanf, fprintf

у меня работает, тока вывод в файл output.txt странный
у меня выводит не 2.0000 а 2.23607
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <clocale>
#include <cmath>
 
#define     iFILE       "input.txt"
#define     oFILE       "output.txt"
 
class Point {
    public:     double x;
    public:     double y;
};
 
int main(){setlocale(LC_ALL,"Rus");
    std::ifstream inp;inp.open(iFILE);
        while(!inp.is_open()){
            std::cout << "Файл не найден." << std::endl;
        system("pause");
        return 0;
        }
        Point A,B,C;
        inp >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
        std::ofstream ofs;ofs.open(oFILE);
            if( A.y<C.y && A.y>B.y  ||  // если А находится между С и Б
                A.y<B.y && A.y>C.y){    // если А находится между Б и С
                    double AB = sqrt(pow(B.x-A.x    ,2.0)+pow(B.y-A.y   ,2.0)); // ищем растояниие между точками А и Б
                    double CB = sqrt(pow(C.x-B.x    ,2.0)+pow(C.y-B.y   ,2.0)); // ищем растояниие между точками С и Б
                    double Bh = (1/2)*CB;                                       // ищем катит, будем искать "высоту = перпендикуляр" по теореме Пифагора
                    double Ah = sqrt(pow(AB ,2.0)-pow(Bh  ,2.0));               // <- перепендикуляр
            ofs << Ah;
            }
            else 
                ofs << -1;
        ofs.close();
    inp.close();
system("pause");
return 0;
}
Добавлено через 14 часов 1 минуту
Попровил немножко код, теперь получается всё как надо
выводит 2.0000, с 4 фиксированными знаками после запятой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <clocale>
#include <cmath>
#include <iomanip>
 
#define     iFILE       "input.txt"
#define     oFILE       "output.txt"
 
class Point {
    public:     double x;
    public:     double y;
};
 
int main(){setlocale(LC_ALL,"Rus");
    std::ifstream inp;inp.open(iFILE);
        while(!inp.is_open()){
            std::cout << "Файл не найден." << std::endl;
        system("pause");
        return 0;
        }
        Point A,B,C;
        inp >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
        std::ofstream ofs;ofs.open(oFILE);
            if( A.y<C.y && A.y>B.y  ||      // если А находится между С и Б
                A.y<B.y && A.y>C.y){        // если А находится между Б и С
                    double AB = sqrt(pow(C.x-A.x    ,2.0)+pow(C.y-A.y   ,2.0)); // ищем растояниие между точками А и Б
                    double AC = sqrt(pow(C.x-A.x    ,2.0)+pow(C.y-A.y   ,2.0)); // ищем растояниие между точками А и С
                    double CB = sqrt(pow(C.x-B.x    ,2.0)+pow(C.y-B.y   ,2.0)); // ищем растояниие между точками С и Б
                    // полупериметр и площадь
                    double p = (AB+AC+CB)/2;
                    double S = sqrt(p*(p-AB)*(p-AC)*(p-CB));
                    // площадь треуголника S = 1/2Ah - Где A-основание треугольник, h-высота
                    // вырожаем высоту (h),  h = (2*S)/A
                    double Ah = (2*S)/CB;
            ofs << std::fixed << std::setprecision(4) << Ah;
            }
            else if(A.y==C.y && A.y>B.y ||  // если А находится на = с С и > Б
                    A.y==B.y && A.y>C.y){   // если А находится на = с Б и > С
                        double Ah = sqrt(pow(C.x-A.x    ,2.0)+pow(C.y-A.y   ,2.0));
                ofs << std::fixed << std::setprecision(4) << Ah;
                }
            else 
                ofs << -1;
        ofs.close();
    inp.close();
system("pause");
return 0;
}
чтобы вывести 4 знака после запятой нужно использовать библиотеку
C++
1
#include <iomanip>
и в std::cout или как у меня ofs
деать так
C++
1
/*ofs*/ << std::fixed << std::setprecision(4) << /*Ah;*/
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru