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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 17:00   #1
Ckiv
Новичок
Джуниор
 
Регистрация: 06.02.2014
Сообщений: 2
Вопрос Нахождение точек ближайших к прямой (Си)

Добрый день. Пишу программу которая должна из множества заданных точек, определить точки: ближайшую к прямой, из точек лежащих выше прямой, и из лежащих ниже прямой. Точки задаются координатами, прямая задается по координатам двух точек. Написал, все работало, кроме одного: если отсутствовала одна из точек (к примеру: не было ни одной точки ниже прямой), то программа накрывалась. Ввел проверку, но теперь даже не хочет компилироваться, выдает незнакомый мне error ("ссылка на неразрешенный внешний символ") без указания строки ошибки. Пол дня сижу ищу в чем может заключаться проблема, но так и не нашел. Подскажите, пожалуйста в чем ошибка.
Извините за большой объем сообщения, просто спойлеров я не нашел. Код:

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <locale.h>
#include "d:\Учеба\bibl.h"

void main()
{
setlocale(LC_ALL, "russian");

Point line[2]; //коорд. прямой
Point points[1000]; //массив точек

int n; //кол-во точек
char a; //пункты меню
int mintopk; //коорд. мин. высшей точки
int minbutk; //коорд. мин. нижней точки

printf("Where the result of it to print?\n");
printf("1. In file\n2. On display\n0. Exit\n");
a = getch();

switch (a)
{

case '1':
Input_from_keyboard(&n, line, points);
Raschet(n, line, points, &mintopk, &minbutk);
Output_file(points, mintopk, minbutk);
break;

case '2':
Input_from_keyboard(&n, line, points);
Raschet(n, line, points, &mintopk, &minbutk);
Output_screen(points, mintopk, minbutk);
break;

case '0': // Выход
return;
default:
printf_s("Неверное действие\n");
break;
}
getch();
}
Код:
typedef struct _Point { //Структура для хранения координат точек
int x; //координата х
int y; //координата y
int pos; //0-точка еще не задана;1-точка находится ниже прямой;2-точка находится на прямой;3-точка находится выше прямой
int v;
int vv;
} Point;

float Input_from_keyboard(int *, Point *, Point *);
float Raschet(int, Point *, Point *, int *, int *);
void Output_file(Point *, int, int);
void Output_screen(Point *, int, int);
Ckiv вне форума Ответить с цитированием
Старый 06.02.2014, 17:00   #2
Ckiv
Новичок
Джуниор
 
Регистрация: 06.02.2014
Сообщений: 2
По умолчанию

Код:
#include <stdio.h>
#include <conio.h>
#include <cmath>
#include <stdlib.h>
#include <locale>
#include "d:\Учеба\bibl.h"

float Input_from_keyboard(int * n, Point line[], Point points[])
{
setlocale(LC_ALL, "russian");

bool error;
float x, y;
float r, t;
float p, u;
float ab, bc, ca;
int w;
w = 0;
printf("Set (x,y) to the first point line\n");
scanf_s("%f %f", &x, &y);

line->x = x;
(line++)->y = y;
p = x;
u = y;
printf("%f %f\n", x, y);
do{
printf("Set (x,y) to the second point line\n");
scanf_s("%f %f", &r, &t);
printf("%f %f\n", r, t);
if (x == r && y == t)
{
w = 1;
}
else {
w = 0;
}
} while (w == 1);
//////////////////////////////////
x = r;
y = t;

(line)->x = x;
(line)->y = y;

printf("Set the number of the point");
do {
error = false;
if (!scanf_s("%d", n)) {
error = true;
}
else {
if (*n <= 0) {
error = true;
}
}

fflush(stdin);
} while (error);

for (int i = 0; i < *n; i++) {
w = 0;
printf("Set %d point:\n", i);
scanf_s("%f %f", &x, &y);
ab = (sqrt(((p - r) * (p - r)) + ((u - t) * (u - t))));
bc = (sqrt(((r - x) * (r - x)) + ((t - y) * (t - y))));
ca = (sqrt(((x - p) * (x - p)) + ((y - u) * (y - u))));
if (ab < bc && ca < bc) {
if (bc != ca + ab)
{
w = 1;
}

}
else {
if (ab > bc && ab > ca) {
if (ab != ca + bc)
{
w = 1;
}
}
else {
if (ab < ca && bc < ca) {
if (ca != ab + bc)
{
w = 1;
}
}
else {
w = 0;
}
}
}
if (w == 0) {
printf("точка не засчитана");
}
else {
(points)->x = x;
(points++)->y = y;
}

}

return 0.0;
}

float Raschet(int n, Point line[], Point points[], int * mintopk, int * minbutk, int * v, int * vv)
{
float A; //
float B; //составляющие части уравнения прямой
float C; //
float formula;
float * lengths;
int i;

A = line[1].y - line[0].y;
B = line[0].x - line[1].x;
C = -line[0].x * A + line[0].y * (line[1].x - line[0].x);
i = 0;
for (int i = 0; i < n; i++) {
formula = A*points[i].x + B*points[i].y + C;
if (formula > 0) {
points[i].pos = 1;
}
else if (formula == 0) {
points[i].pos = 2;
}
else if (formula < 0) {
points[i].pos = 3;
}
}

lengths = (float*)malloc(sizeof(float)*n);

for (int i = 0; i < n; i++) {
if (points[i].pos == 2) {
lengths[i] = 0;
}
else {
lengths[i] = abs((A*points[i].x + B*points[i].y + C) / sqrt(pow(A, 2) + pow(B, 2)));
}
}

float mintop;
float minbut;

int j = 0; //j - выше прямой
int k = 0; //k - ниже прямой

for (int i = 0; i < n; i++) {
switch (points[i].pos) {
case 3:
if (j == 0) {
mintop = lengths[i];
*mintopk = i;
*v = i;
}
else {
if (mintop > lengths[i]) {
mintop = lengths[i];
*mintopk = i;
*v = 1;
}
}
j++;
break;
case 1:
if (k == 0) {
minbut = lengths[i];
*minbutk = i;
*vv = 1;
}
else {
if (minbut > lengths[i]) {
minbut = lengths[i];
*minbutk = i;
*vv = 1;
}
}
k++;
break;
}
}

return 0.0;
}

void Output_file(Point points[], int mintopk, int minbutk, int v, int vv)
{
FILE * fp;
fp = fopen("result.txt", "w");
if (fp)
{
if (v != 0) {
fprintf(fp, "Nearest to the line top point: (%f; %f)\n", points[mintopk].x, points[mintopk].y);
}
else {
fprintf(fp, "Don't have top point");
}
if (vv != 0) {
fprintf(fp, "Nearest to the line buttom point: (%f; %f)\n", points[minbutk].x, points[minbutk].y);
}
else {
fprintf(fp, "Don't have buttom point");
}
fclose(fp);
}
}

void Output_screen(Point points[], int mintopk, int minbutk, int v, int vv)
{
if (v != 0) {
printf("Nearest to the line top point: (%f; %f)\n", points[mintopk].x, points[mintopk].y);
}
else {
printf("Don't have top point");
}
if (vv != 0) {
printf("Nearest to the line buttom point: (%f; %f)\n", points[minbutk].x, points[minbutk].y);
}
else {
printf("Don't have buttom point");
}
}
Ckiv вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Максимальное количество точек лежащих на одной прямой ccherya Общие вопросы C/C++ 1 25.11.2012 16:53
Число точек пересечения прямой с окружностью Night61 Помощь студентам 1 20.01.2012 16:57
Нахождение точек пересечения n-угольника c прямой(c\c++)). forever042 Помощь студентам 5 17.12.2011 02:57
Задача о паре ближайших точек CyberGirl Помощь студентам 4 18.06.2011 18:11