Evo da stavim program koji sam uradila.
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct strTacka
{
double x;
double y;
double z;
} tipTacka;
typedef struct cvor
{
tipTacka t;
cvor * sled;
} LCVOR;
typedef struct strTackaD
{
double x;
double y;
double z;
double d;
} tipTackaD;
typedef struct cvorn
{
tipTackaD t;
cvorn * sled;
} LCVORN;
tipTacka string2brojevi (char s[])
{
tipTacka N;
char brx[20], bry[20], brz[20] ;
int i=0;
int j=0;
while(s[i]!=' ' )
{
brx[j]=s[i];
i++;
j++;
}
brx[j]='\0';
N.x=atof(brx);
i++;
j=0;
while(s[i]!=' ' )
{
bry[j]=s[i];
i++;
j++;
}
bry[j]='\0';
N.y=atof(bry);
i++;
j=0;
while(s[i]!='\n' )
{
brz[j]=s[i];
i++;
j++;
}
brz[j]='\0';
N.z=atof(brz);
return N;
}
double rastojanje2tacke (tipTacka T1, tipTacka T2)
{
return sqrt ( (T1.x-T2.x)*(T1.x-T2.x)+(T1.y-T2.y)*(T1.y-T2.y)+(T1.z-T2.z)*(T1.z-T2.z) );
}
double z_zadato (tipTacka A, tipTacka B, tipTacka C, double Xz, double Yz)
{
double a, b, c, d, e, f, g, h;
double p1, p2, p3;
a=Xz-A.x;
b=Yz-A.y;
c=B.x-A.x;
d=B.y-A.y;
e=B.z-A.z;
f=C.x-A.x;
g=C.y-A.y;
h=C.z-A.z;
p1=c*h-e*f;
p2=d*h-e*g;
p3=c*g-d*f;
return (A.z+(b*p1-a*p2)/p3);
}
LCVOR* na_pocetak (LCVOR* lst, tipTacka b)
{
LCVOR* novi;
novi=(LCVOR*)malloc(sizeof(LCVOR));
novi->t=b;
novi->sled=lst;
return novi;
}
LCVORN* na_pocetakn (LCVORN* lst, tipTackaD b)
{
LCVORN* novi;
novi=(LCVORN*)malloc(sizeof(LCVORN));
novi->t=b;
novi->sled=lst;
return novi;
}
void pisi(LCVOR* lst)
{
while(lst!=NULL)
{
printf(" %f %f %f ", lst->t.x, lst->t.y, lst->t.z);
lst=lst->sled;
}
}
void pisin(LCVORN* lst)
{
while(lst!=NULL)
{
printf(" %f %f %f %f", lst->t.x, lst->t.y, lst->t.z, lst->t.d);
lst=lst->sled;
}
}
LCVOR* formirajL1 ( )
{
char red[80],ime_dat[80];
LCVOR* prvi=NULL;
tipTacka N;
FILE *fp;
printf("Ime datoteke koju cu da citam: ");
gets(ime_dat);
fp=fopen(ime_dat,"r");
while (fgets(red, 80, fp)!=NULL)
{
printf("%s\n", red);
N=string2brojevi (red);
prvi=na_pocetak(prvi, N);
}
fclose(fp);
return prvi;
}
LCVORN* dOkolina (double Xz, double Yz, double dz, LCVOR* prvis)
{
tipTacka A, B, C, Tz, Ttek;
tipTackaD D;
LCVORN* prvin=NULL;
double zz, d;
char red[80];
FILE* fp;
//cita tacke koje odredjuju ravan
fp=fopen("granice.txt", "r");
fgets(red, 80, fp);
A=string2brojevi (red);
printf(" %f %f %f", A.x, A.y, A.z);
fgets(red, 80, fp);
B=string2brojevi (red);
printf(" %f %f %f", B.x, B.y, B.z);
fgets(red, 80, fp);
C=string2brojevi (red);
printf(" %f %f %f", C.x, C.y, C.z);
fclose(fp);
//racuna z koordinatu zadate tacke
zz=z_zadato(A, B, C, Xz, Yz);
printf("zz=%f", zz);
//formira zadatu tacku Tz
Tz.x=Xz;
Tz.y=Yz;
Tz.z=zz;
//citanje tacke iz stare liste L1 i racunanje njenog rastojanja od zadate tacke
// ako je to rastojanje <= zadato rastojanje tacka se ubacuje u novu listu L2
while(prvis)
{
Ttek=prvis->t;
d=rastojanje2tacke(Tz, Ttek);
if(d<=dz)
{
D.x=Ttek.x; D.y=Ttek.y; D.z=Ttek.z; D.d=d;
//ubaci D u novu listu
prvin=na_pocetakn (prvin, D);
}
prvis=prvis->sled;
}
return prvin;
}
int main()
{
LCVOR* glava=NULL;
LCVORN* glavan;
glava=formirajL1();
printf("\nispis liste iz glavnog programa:");
pisi(glava);
glavan=dOkolina(3, 2, 2, glava);//zadata tacka 3,2 zadata okolina dz=2
printf("\nNOVA LISTA:\n");
pisin(glavan);
return 0;
}
Imam jedno pitanje a odnosi se na konverziju stringova u brojeve prilikom citanja stringova iz txt datoteke (radim u funkciji tipTacka string2brojevi (char s[])). Zamislila sam da su mi tacke u tekstualnoj datoteci po tri broja u jednom redu. Datoteka mora da izgleda ovako (primer za 3 tacke):
broj11 prazno mesto broj12 prazno mesto broj13 enter
broj21 prazno mesto broj22 prazno mesto broj23 enter
broj31 prazno mesto broj32 prazno mesto broj33 enter
a ne moze ovako:
broj11 prazno mesto broj12 prazno mesto broj13 enter
broj21 prazno mesto broj22 prazno mesto broj23 enter
broj31 prazno mesto broj32 prazno mesto broj33
Znaci moram da imam i u poslednjem redu datoteke unet enter (novi red). To mi je nekako glupo pa da pitam da li moze da se nekako drugacije napise funkcija string2brojevi pa da radi i za taj slucaj? Mozda je problem i tamo gde radim while (fgets(red, 80, fp)!=NULL)?