Tymto prosim niekoho kto to vie a ma cas ci by to mohol spravit
Spoiler
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
FILE *fl;
int x,y;
int i = 0;
int j = 0;
int k = 0;
double najkratsia = 0;
char dotaz;
int pocet = 1;
fl = fopen("vystup.txt","w");
if(fl != NULL)//kontrola ci bol subor dobre otvoreny
{
printf("Zadajte suradnice bodu: ");
scanf("%d %d",&x,&y);
fprintf(fl,"%d %d\n",x,y);
printf("Prajete si zadat suradnice dalsieho bodu (A/N)? ");
scanf(" %c",&dotaz);
while(dotaz == 'A')
{
printf("Zadajte suradnice bodu: ");
scanf("%d %d",&x,&y);
fprintf(fl,"%d %d\n",x,y);
printf("Praje si zadat suradnice dalsieho bodu (A/N)? ");
scanf(" %c",&dotaz);
pocet++;//pocita kolko je zapisanych bodov. Je to potrebne preto aby si vedel ake velke pole mas vytvorit.
}
if(dotaz != 'N')
{
//Chyba bolo zadane nieco ine ako A alebo N. Dorob chybove hlasenie
}
// Treba skontrolovat ci boli zadane aspon 2 body. DOROB !!
}
fclose(fl);
int pole[pocet*2]; //pole zo vsetkymi suradnicami bodov (napr. zadas body [1,3] a [5,8] pole bude vyzerat pole{1,3,5,8})
int body[4]; //pole kde sa zipisu suradnice najblizsich bodov
fl = fopen("vystup.txt","r");
if(fl != NULL)//kontrola ci sa subor otvoril ako ma.
{
while(fscanf(fl,"%d %d",&x,&y) != EOF)//cita prvky zo suboru az dokym nedojde na koniec suboru (EOF = end of file).
{
printf("%d %d\n",x,y);//vypisuje nacitane body. mozes potom znazat je to len pre kontrolu
pole = x;//zapis bodou do pola pole.
pole[i+1] = y;
i = i+2;
}
//teraz i ukazuje za posledny prvok v poli pole (i bude ukazovat za posledny prvok az do konca programu tak s tym pocitaj neskor!!!).
while(j <= i-4)//j nemoze ukazaovat dalej ako na x-ovu suradnicu predposledneho bodu ulozeneho v poli pole.
{
k = j + 2;//k ukazuje na nasledujuci bod za j.
while(k <= i-2)//k nemoze ukazovat dalej ako na x-ovu suradnicu posledneho bodu v poli
{
x = pole[j] - pole[k];// tieto 3 riadky su vypocet podla vzorca v zadani
y = pole[j+1] - pole[k+1];
double dlzka = sqrt((x*x) + (y*y));
printf("body su: [%d, %d] [%d, %d]\n",pole[j],pole[j+1],pole[k],pole[k+1]);//vypise suradnice bodov pre ktore sa momentalne pocita zdialenost. Je to pre kontrolu mozes potom zmazat
printf("dlzka: %f\n",dlzka);//vypise vypocitanu vzdialenost nedzi bodmi (kazdy s kazdym) mozes potom zmazat je to pre kontrolu
if((dlzka < najkratsia) || (najkratsia == 0)) //Pozor neberie do uvahy ak su 2 body zhodne !! ak chces uprav si to.
{
najkratsia = dlzka;//Zapise najkratsiu vydialenost a suradnice bodov. Ak neskor najde mensiu vzdialenost prepise sa ta povodna.
body[0] = pole[j];//x1
body[1] = pole[j+1];//y1
body[2] = pole[k];//x2
body[3] = pole[k+1];//y2
}
k = k + 2;//k ukazuje na x-ovu suradnicu nasledujuceho bodu (ak by som dal +1 ukazovalo by na y-ovu suradnicu toto isteho bodu)
}
j = j + 2;//ukaze na nasledujuci bod v poli pole
/****** VYSVETLENIE !!! pouzivam 2x while pretoze najprv j ukazuje na prvy bod a k na druhy. Vypocita sa vzdialenost(ak je mensia ako predtim ulozena vzdialenost tak ju prepise a zapise suradnice bodov (tych na ktore ukazuje j a k)).
Potom posuniem k (teraz ukazuje na 3. bod) ale j sa nezmeni (stale zostavam vo vnorenom while(k <= i-2)) takto pokracujem az dokym k neukazuje mino pola pole (za posledny jeho prvok) vtedy sa porusi podmienka (k <= i-2) a dostanem sa do
vonkajsieho while(j <= i-4). Tak sa posunie j na dalsi bod v poli (doteraz stale ukazovalo na prvy bod odteraz ukazuje na druhy) a k sa nadstavi tak aby ukazovalo na nasledujuci bod za j (k = j + 2;) a opet sa dostanem do vnoreneho while(k <= i-2).
tam sa proces opakuje preskakuje sa z jednoho while do druheho az dokedy j neukaze za predposledny prvok v poli. Po skonceni whilov je v premennej najkratsia najmensia vzdialenost medzi bodmi a v polo body su suradnice tayhto bodov. Nasleduje vypis
*******/
}
fclose(fl);
printf("Dva vzajomne najblizsie body su: [%d, %d] [%d, %d]\n",body[0],body[1],body[2],body[3]);
printf("Ich vzajomna vzdialenost je: %f\n",najkratsia);
}
return 0;
}