Mam problem z wczytywaniem danych z pliku. Przy wczytywaniu danych z pliku w którym są podane współrzędne punktów X i Y wszystkie punkty wczytują się dobrze oprócz ostatniego X i ostatniego Y. Zamiast prawidłowych wartości program podstawia pod ostatnie zmienne zupełnie inne liczby. Proszę o pomoc, ponieważ siedzę już dłuższy czas nad tym i nic nie mogę wymyśleć. Żeby skompilowac program trzeba utworzyć plik wsp.txt w którym są współrzędne punktów x i y oddzielone tabulatorem(jeden punkt w jedej linii). Program oblicza współrzędne punktów zapisuje je na listę a następnie zapisuje je w pliku wsp2.txt. Przy okazji wyświetla na konsolę wyniki (Xwczytane \t Ywczytane \t x1 \t y1 \t x2 \t y2). Problem jest z ostatnim X wczytane i Ywczytane. Do wczytywania danych z pliku stworzyłem strukturę i pewnie tam jest gdzieś problem, czyli na początku funkcji main lub w którejkolwiek pętli for. Z góry dzięki za odpowiedź i sory za kiepskie uporządkowanie całego programu ;) (to dopiero prototyp ;P)
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cmath>
using namespace std;
//strultura odczytująca punkty z pliku
struct Tpunkt {
int x;
int y;
};
//lista
struct element_listy {
double dane1, dane2, dane3, dane4, dane5, dane6;
element_listy *wsk_nastepnika;
};
//funkcja drukujaca liste rekurencyjnie
void drukuj_liste_rek(element_listy *adres)
{
// warunek zakończenia rekurencji
if (adres != NULL)
{
//zawartosc elementu
cout <<(*adres).dane1<<"\t"<<(*adres).dane2<<"\t"<<(*adres).dane3<<"\t"<<(*adres).dane4<<"\t"<<(*adres).dane5<<"\t"<<(*adres).dane6<<endl;
// nast element
adres=adres->wsk_nastepnika;
// rek
drukuj_liste_rek(adres);
};
};
void zapis_list_it(element_listy *adres)
{
ofstream plik_wy;
plik_wy. open ("wsp2.txt");
while (adres!=NULL)
{
// wypisujemy zawartość elementu
plik_wy <<(*adres).dane1<<"\t"<<(*adres).dane2<<"\t"<<(*adres).dane3<<"\t"<<(*adres).dane4<<"\t"<<(*adres).dane5<<"\t"<<(*adres).dane6<<endl;
// i przechodzimy do następnego
adres = adres->wsk_nastepnika;
}
plik_wy. close ();
}
int main() {
//czytanie punktow z pliku
int lp=0;
Tpunkt punkty[lp], pkt;
ifstream dane ("wsp.txt");
dane >> pkt.x >> pkt.y; // pierwsze czytanie
while (! dane. eof()) {
punkty [lp]=pkt;
lp++;
dane >> pkt.x >> pkt.y; // czytanie w petli
}
dane.close();
double a, b, a2, b2, xb, yb, c, d, e, xp, yp, r, delta, yo1, yo2, xo1, xo2, f, g, h, i, j, k, yo, xo, b3, l, m, o, x1, x2, y1, y2, x11, y11, x22, y22, delta2;
//obliczanie parametrow prostej
cout<<"podaj wspolrzedne 1 punktu(x1_y1)"<<endl;
cin>>x11>>y11;
if(x11==y11){
do{
cout<<"podaj wspolrzedne 1 punktu(x1_y1)"<<endl;
cin>>x22>>y22;//wspolrzedne punktow do prostej(l)
}
while((x11==x22)&&(y11==y22));
}
else{
cout<<"podaj wspolrzedne 1 punktu(x2_y2)"<<endl;
cin>>x22>>y22;//wspolrzedne punktow do prostej(l)
}
cout<<"Podaj promien"<<endl;
cin>>r;
element_listy *glowa, *aktualny, *poprzedni, *tmp;
aktualny = NULL;
poprzedni = NULL;
glowa = poprzedni;
if((x11!=x22)&&(y11!=y22)){
a=(y11-y22)/(x11-x22);//obliczania prostej
b=y22-a*x22;
cout<<"Prosta utworzona z 2 punktow to: y="<<a<<"x+"<<b<<endl;
//prosta prostopadla(k) przechodzac przez punkt wczytany z pliku (a)
for (int z=0;z<lp+1;z++){
//jezeli punkt lezy na prostej lub odleglosc jest wieksza niz 2r nie ma okregow
if( (yp!=(a*xp+b)) && (abs(a*xp-yp+b)/ (sqrt(pow(a,2)+1))<2*r) ){
xp=punkty[z].x;//punkty z pliku
yp=punkty[z].y;
poprzedni = aktualny;
// tworzymy nowy element
aktualny = new element_listy;
// zapisujemy do niego odczytane dane
aktualny->dane1 = punkty[z].x;
aktualny->dane2 = punkty[z].y;
// tworzennie prostej k prostopadlej do wczytanej prostej przechodzacej przez pkt A
a2=-(1/a);
b2=yp-a2*xp;
//obliczanie wspolrzednych punktu przeciecia prostych k i l (b)
xb=(b2-b)/(a-a2);
yb=a*xb+b;
//obliczanie wspolrzednych punktu o ( punkt oddalony o r od prostej l)(rownanie kwadratowe cyo^2+dyo+e)
c=1+pow(a2,2);
d=2*a2*b2-2*xb-2*a2*yb;
e=pow(xb,2)+pow(yb,2)+pow(b2,2)-2*yb*b2-pow(r,2);
//obliczanie delty i pierwiastkow
delta=pow(d,2)-4*c*e;
if (delta!=0)
{
xo1=(-d+sqrt(delta))/(2*c);
xo2=(-d-sqrt(delta))/(2*c);
yo1=a2*xo1+b2;
yo2=a2*xo2+b2;
}
else{
xo=(-d)/(2*c);
yo=a2*xo+b2;
}
//eliminacja jednego z punktow
//obliczanie wektorow ba=[f,g], bo1[h,i], bo2[j,k]
if(delta!=0){
f=xp-xb;
g=yp-yb;
h=xo1-xb;
i=yo1-yb;
j=xo2-xb;
k=yo2-yb;
if(f>0)f=1;else f=2;
if(g>0)g=1;else g=2;
if(h>0)h=1;else h=2;
if(i>0)i=1;else i=2;
if(j>0)j=1;else j=2;
if(k>0)k=1;else k=2;
if((f==h)&&(g==i)){
yo=yo1;
xo=xo1;
}
else{
xo=xo2;
yo=yo2;
}
}
else {
xo=(-d)/(2*c);
yo=a2*xo+b2;
}
//wyznaczam prosta przechodzaca przez punkt O i rownolegla do prostej l y=ax+b3
b3=yo-a*xo;
//wyznaczam srodki okregow z odleglosci punktow
l=1+pow(a,2);
m=-2*xp+2*a*b3-2*a*yp;
o=pow(xp,2)-pow(r,2)+pow(b3,2)+pow(yp,2)-2*b3*yp;
delta2=pow(m,2)-4*l*o;
if(delta2!=0){
x1=(-m+sqrt(delta2))/(2*l);
x2=(-m-sqrt(delta2))/(2*l);
y1=a*x1+b3;
y2=a*x2+b3;
aktualny->dane3 = x1;
aktualny->dane4 = y1;
aktualny->dane5 = x2;
aktualny->dane6 = y2;
}
else{
x1=(-m)/(2*l);
y1=a*x1+b3;
aktualny->dane3 = x1;
aktualny->dane4 = y1;
aktualny->dane5 = 0000;
aktualny->dane6 = 0000;
}
}
else
cout<<"brak"<<endl;
aktualny->dane3 = x1;
aktualny->dane4 = y1;
aktualny->dane5 = x2;
aktualny->dane6 = y2;
// teraz jest to ostatni element listy
aktualny->wsk_nastepnika = NULL;
// natomiast poprzedni ostatni już nie jest ostatnim
if (poprzedni != NULL) // Zabezpieczenie na początek
poprzedni->wsk_nastepnika = aktualny;
else
glowa = aktualny;
}
}
else{
if(x11==x22){
for (int z=0;z<lp+1;z++){
xp=punkty[z].x;//punkty z pliku
yp=punkty[z].y;
poprzedni = aktualny;
// tworzymy nowy element
aktualny = new element_listy;
// zapisujemy do niego odczytane dane
aktualny->dane1 = punkty[z].x;
aktualny->dane2 = punkty[z].y;
if((xp-x11)>(0)){
x1=x11+r;
x2=x11+r;
y1=yp+r;
y2=yp-r;
}
else{
x1=x11-r;
x2=x11-r;
y1=yp+r;
y2=yp-r;
}
aktualny->dane3 = x1;
aktualny->dane4 = y1;
aktualny->dane5 = x2;
aktualny->dane6 = y2;
// teraz jest to ostatni element listy
aktualny->wsk_nastepnika = NULL;
// natomiast poprzedni ostatni już nie jest ostatnim
if (poprzedni != NULL) // Zabezpieczenie na początek
poprzedni->wsk_nastepnika = aktualny;
else
glowa = aktualny;
}
}
else if(y11==y22){
for (int z=0;z<lp+1;z++){
xp=punkty[z].x;//punkty z pliku
yp=punkty[z].y;
poprzedni = aktualny;
// tworzymy nowy element
aktualny = new element_listy;
// zapisujemy do niego odczytane dane
aktualny->dane1 = punkty[z].x;
aktualny->dane2 = punkty[z].y;
if((yp-y11)>(0))
{
x1=xp+r;
x2=xp-r;
y1=y11+r;
y2=y11+r;
}
else{
x1=xp+r;
x2=xp-r;
y1=y11-r;
y2=y11-r;
}
aktualny->dane3 = x1;
aktualny->dane4 = y1;
aktualny->dane5 = x2;
aktualny->dane6 = y2;
// teraz jest to ostatni element listy
aktualny->wsk_nastepnika = NULL;
// natomiast poprzedni ostatni już nie jest ostatnim
if (poprzedni != NULL) // Zabezpieczenie na początek
poprzedni->wsk_nastepnika = aktualny;
else
glowa = aktualny;
}
}
}
drukuj_liste_rek(glowa);
zapis_list_it(glowa);
getch();
return 0;
}