Определение трассы пути движения точки на плоскости
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Определение трассы пути движения точки на плоскости - 2009-06-12 17:04:55.156666
|
|
|
Klan_1985
Сообщений: 6
Оценки: 0
Присоединился: 2009-06-12 17:01:24.233333
|
Добрый день! Помогите поалуйста решить задачу.. Делал в Borland C++ 3.1 после ввода значений точек А и В автоматически вылетает из окна вывода результата.. вот текст программы:#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
#include <stdio.h>
struct point
{float x,y;
};
struct koord
{
float xu;
float yu;
float xd;
float yd;
};
void main()
{ clrscr();
float y,x, s, k, l;
s=1;
int i,j;
struct koord kv[5][5];
kv[0][0].yd=0;
kv[0][0].xd=0;
kv[0][0].yu=kv[0][0].yd+s;
kv[0][0].xu=kv[0][0].xd+s;
for(i=0;i<5;i++)
{
for(j=1;j<5;j++)
{
kv[i][j].xd=kv[i][j-1].xu;
kv[i][j].yd=kv[i-1][j].yu;
kv[i][j].xu=kv[i][j-1].xu+s;
kv[i][j].yu=kv[i-1][j].yu;
printf("KV xd=%.0f, yd=%.0f, xu=%.0f, yu=%.0f\n",kv[i][j].xd, kv[i][j].yd, kv[i][j].xu, kv[i][j].yu);
}
}
struct point A,B;
printf ("Vvedite koord A(x,y)\n");
scanf ("%f%f",&A.x,&A.y);
printf ("Vvedite koord B(x,y)\n");
scanf ("%f%f",&B.x,&B.y);
float xmin, xmax, ymin, ymax;
if(A.x<B.x)
{
xmin=A.x;
xmax=B.x;
}
else
{
xmin=B.x;
xmax=A.x;
}
if(A.y<B.y)
{
ymin=A.y;
ymax=B.y;
}
else
{
ymin=B.y;
ymax=A.y;
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{ if(xmin<kv[i][j].xu&&xmin>kv[i][j].xd&&ymin<kv[i][j].yu&&ymin>kv[i][j].yd)
printf("Kvadrat tochki A= %d %d\n",i+1,j+1);
else
if(xmax<kv[i][j].xu&&xmax>kv[i][j].xd&&ymax<kv[i][j].yu&&ymax>kv[i][j].yd)
printf ("Kvadrat tochki B= %d %d\n",i+1,j+1);}}
if(B.x!=A.x)
{
l=(B.y-A.y)/(B.x-A.x);
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
k=(kv[i][j].yu-kv[i][j].yd)/(kv[i][j].xu-kv[i][j].xd);
if(k!=l||-k!=l)
{
x=(k*kv[i][j].xd-l*A.x+A.y-kv[i][j].yd)/(k-l);
y=(((x-kv[i][j].xd)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xu-kv[i][j].xd))+kv[i][j].yd;
if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[i][j].xu&&x>kv[i][j].xd&&y<kv[i][j].yu&&y>kv[i][j].yd)
{
printf("Kvadrat %d %d\n",i+1,j+1);
}
else
{
x=(-k*kv[i][j].xu-l*A.x+A.y-kv[i][j].yd)/(-k-l);
y=(((x-kv[i][j].xu)*(kv[i][j].yu-kv[i][j].yd))/(kv[i][j].xd-kv[i][j].xu))+kv[i][j].yd;
if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[i][j].xu&&x>kv[i][j].xd&&y<kv[i][j].yu&&y>kv[i][j].yd)
{
printf("Kvadrat %d %d\n",i+1,j+1);
}
}
}
else
{
printf("Kvadrat %d %d\n",i+1,j+1);
}
}
}
}
else
{
for(i=0;i<5;i++)
for(j=0;j<5;j++) if(kv[i][j].xd<xmax&&kv[i][j].xu>xmin&&kv[i][j].yd<ymax&&kv[i][j].yu>ymin)
printf("Kvadrat %d %d\n",i+1,j+1);
}
getch();
}
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-12 17:06:02.163333
|
|
|
Klan_1985
Сообщений: 6
Оценки: 0
Присоединился: 2009-06-12 17:01:24.233333
|
где k-коэффициент диагонали квадрата, l-коэффициент прямой проходящей через эти квадраты
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-12 17:12:43.293333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Поменяй компилятор. Это ошибка в BC++ 3.1 при работе с полями структуры с плавающей точкой. Или в структуры читай данные через промежуточные переменные, например так:
float tmp;
scanf( "%f", &tmp );
A.x = tmp;
Если не поможет - пройди пошагово в отладчике и посмотри, в каком именно месте вылетает.
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-12 17:22:03.930000
|
|
|
Klan_1985
Сообщений: 6
Оценки: 0
Присоединился: 2009-06-12 17:01:24.233333
|
мне кажется сетка не правильно задана…
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-12 17:23:45.683333
|
|
|
Klan_1985
Сообщений: 6
Оценки: 0
Присоединился: 2009-06-12 17:01:24.233333
|
вылетает в том месте где я вывожу на экран номера квадратов где находятся точки А и В
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-12 19:51:12.610000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Отформатируй нормально код, читать невозможно. Возможно, просто внутри циклов меняешь переменные, которые используются во внешних циклах.
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-13 00:09:35.246666
|
|
|
Klan_1985
Сообщений: 6
Оценки: 0
Присоединился: 2009-06-12 17:01:24.233333
|
Struct koord kv-структура координат квадрата: (рисунок 2.3) Рисунок 2.3- Структура координат квадрата kv[5][5]-двумерный массив, где 5- максимальное значение struct point- структура точки k-угловой коэффициент диагонали квадрата s-шаг координатной сетки l-угловой коэффициент прямой I,j-номер столбца и строки соответственно float-вещественные числа одинарной точности int-целые числа #include <iostream.h> #include <conio.h> #include <math.h> #include <stdlib.h> #include <dos.h> #include <stdio.h> struct point // структура точки { float x,y; }; struct koord // структура координат квадрата { float xu; float yu; float xd; float yd; }; void main() //главная функция { clrscr(); //очистка экрана float y,x, s, k, l; s=1; //шаг деления координатной сетки int i,j; struct koord kv[5][5]; // создание координатной сетки размерностью 5*5 kv[0][0].yd=0; // присваивание координат первому квадрату kv[0][0].yu=kv[0][0].yd+s kv[0].xd=0; kv[0][0].xu=kv[0][0].xd+s for(i=0;i<5;i++) { for(j=1;j<5;j++) { kv[j].xd=kv[j-1].xu; kv[j].yd=kv[i-1][j].yu; kv[j].xu=kv[j-1].xu+s; kv[j].yu=kv[i-1][j].yu; printf("KV xd=%.0f, yd=%.0f, xu=%.0f, yu=%.0f\n",kv[j].xd, kv[j].yd, kv[j].xu, kv[j].yu); } } struct point A,B; // Ввод координат точек А и В printf ("Vvedite koord A(x,y)\n"); scanf ("%f%f",&A.x,&A.y); printf ("Vvedite koord B(x,y)\n"); scanf ("%f%f",&B.x,&B.y); float xmin, xmax, ymin, ymax; if(A.x<B.x) { xmin=A.x; xmax=B.x; } else { xmin=B.x; xmax=A.x; } if(A.y<B.y) { ymin=A.y; ymax=B.y; } else { ymin=B.y; ymax=A.y; } for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(xmin<kv[j].xu&&xmin>kv[j].xd&&ymin<kv[j].yu&&ymin>kv[j].yd) // если точка принадлежит тому или иному квадрату printf("Kvadrat tochki A= %d %d\n",i+1,j+1); else if(xmax<kv[j].xu&&xmax>kv[j].xd&&ymax<kv[j].yu&&ymax>kv[j].yd) printf ("Kvadrat tochki B= %d %d\n",i+1,j+1); } } if(B.x!=A.x) // условие- если координаты х точек А и В не равны между собой, то делаем следующие операции { l=(B.y-A.y)/(B.x-A.x); // угловой коэффициент прямой k=(kv[j].yu-kv[j].yd)/(kv[j].xu-kv[j].xd); // угловой коэффициент диагонали координатного квадрата for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(k!=l||-k!=l) // если коэффициенты не равны по модулю { x=(k*kv[j].xd-l*A.x+A.y-kv[j].yd)/(k-l); y=(((x-kv[j].xd)*(kv[j].yu-kv[j].yd))/(kv[j].xu-kv[j].xd))+kv[j].yd; if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[j].xu&&x>kv[j].xd&&y<kv[j].yu&&y>kv[j].yd) { printf("Kvadrat %d %d\n",i+1,j+1); } else { x=(-k*kv[j].xu-l*A.x+A.y-kv[j].yd)/(-k-l); y=(((x-kv[j].xu)*(kv[j].yu-kv[j].yd))/(kv[j].xd-kv[j].xu))+kv[j].yd; if(x<xmax&&x>xmin&&y<ymax&&y>ymin&&x<kv[j].xu&&x>kv[j].xd&&y<kv[j].yu&&y>kv[j].yd) { printf("Kvadrat %d %d\n",i+1,j+1); } } } else { printf("Kvadrat %d %d\n",i+1,j+1); } } } } else { for(i=0;i<5;i++) for(j=0;j<5;j++) if(kv[j].xd<xmax&&kv[j].xu>xmin&&kv[j].yd<ymax&&kv[j].yu>ymin) printf("Kvadrat %d %d\n",i+1,j+1); // вывод координаты квадрата на экран } getch(); }
|
|
|
RE: Определение трассы пути движения точки на плоскости - 2009-06-13 21:09:22.906666
|
|
|
Klan_1985
Сообщений: 6
Оценки: 0
Присоединился: 2009-06-12 17:01:24.233333
|
вот отредактировал текст программы
|
|
|
|
|