Witam! Problem jest następujący. Otóż mam zrobić projekt na studia dotyczący punktów wczytywanych z pliku, oraz rysowania linii najlepszego dopasowania. Stworzyłam kod, program (Visual Studio Professional 2013) nie wyrzuca żadnych błędów, jednak uruchomić algorytmu nie chce. Przyznaję że nie jestem zbyt zaawansowana w technice programowania, właściwie to dopiero zaczynam z tym przygodę :D Podejrzewam że problem jest z 'fscanf', jednak nie za bardzo wiem jak to naprawić, byłabym wdzięczna za każdą dobrą sugestię. Poniżej kod, a w załącznikach wrzucę screen błędu, który się pokazuje. Z góry dziękuję :)
#include <stdio.h>
#include<stdlib.h>
#include <math.h>
#include "winbgi2.h"
double srednia(double a[], int n);
double suma(double a[], double b[], int n);
double min(double a[], int n);
double max(double a[], int n);
void main()
{
printf("Witamy w programie przyblizajacym zadany rozklad punktow na plaszczyznie prosta najlepszego dopasowania\n");
/*otwiera dwa pliki tekstowe z punktami*/
FILE *ps;
FILE *pl;
czytaj:
fopen_s(&ps, "punktyx.xlsx", "r");
if (fopen_s(&ps, "punktyx.xlsx", "r") == NULL)
{
printf("Nie udalo sie otworzyc pliku\n");
goto czytaj;
}
czytaj1:
fopen_s(&pl, "punktyy.xlsx", "r");
if (fopen_s(&pl, "punktyy.xlsx", "r") == NULL)
{
printf("Nie udalo sie otworzyc pliku\n");
goto czytaj1;
}
int i, n;
double *xx, *yy;
void *pxx, *pyy;
/*deklaracja liczby punktów*/
czytaj2:
scanf_s("%d", &n);
if (n > 200)
{
printf("Jest tylko 200 punktow, podaj mniejsza liczbe\n");
goto czytaj2;
}
/*deklaracja tablic dynamicznych*/
pxx = malloc(n*sizeof(double));
xx = (double*)pxx;
pyy = malloc(n*sizeof(double));
yy = (double*)pyy;
/*wpisuje punkty do tablic*/
for (i = 0; i < n; i++)
{
fscanf_s(ps, "%lf", &xx[i]);
fprintf(ps, "%d%lf\n", i + 1, xx[i]);
}
for (i = 0; i < n; i++)
{
fscanf_s(pl, "%lf", &yy[i]);
fprintf(pl, "%d%lf\n", i + 1, yy[i]);
}
double a, b;
/*liczenie wspolczynnikow a i b do prostej najlepszego dopasowania*/
a = (suma(xx, yy, n) - n*srednia(xx, n)*srednia(yy, n)) / (suma(xx, xx, n) - n*srednia(xx, n)*srednia(xx, n));
b = srednia(yy, n) - a*srednia(xx, n);
/*otwiera i skaluje okno graficzne*/
graphics(600, 600);
double xmin, xmax, ymin, ymax;
xmin = min(xx, n);
ymin = min(yy, n);
xmax = max(xx, n);
ymax = max(yy, n);
scale(xmin - 15, ymin - 15, xmax + 15, ymax + 15);
/*rysuje uklad wspolrzednych*/
line(xmin - 10, 0, xmax + 10, 0);
line(0, ymin - 10, 0, ymax + 10);
/*zaznacza punkty krzyzykami na ukladzie wspolrzednych*/
for (i = 0; i < n; i++)
{
line(xx[i] - 3, yy[i], xx[i] + 3, yy[i]);
line(xx[i], yy[i] - 3, xx[i], yy[i] + 3);
}
/*rysuje linie najlepszego dopasowania*/
line(xmin, a*xmin + b, xmax, a*xmax + b);
/*liczy odleglosci punktow od prostej*/
double s, d;
scanf_s("%lf", &d);
for (i = 0; i < n; i++)
{
s = fabs(a*xx[i] - yy[i] + b) / sqrt(a*a + 1);
if (s>d)
{
circle(xx[i], yy[i], 5);
}
}
wait();
}
double srednia(double a[], int n)
{
double s;
int i;
s = 0;
for (i = 0; i < n; i++)s = s + a[i];
s = s / n;
return s;
}
double suma(double a[], double b[], int n)
{
double s;
s = 0;
int i;
for (i = 0; i < n; i++)s = s + a[i] * b[i];
return s;
}
double min(double a[], int n)
{
double min;
int i = 0;
min = a[i];
for (i = 0; i < n; i++)
{
if (a[i + 1] < a[i])min = a[i + 1];
}
return min;
}
double max(double a[], int n)
{
double max;
int i = 0;
max = a[i];
for (i = 0; i<n; i++)
{
if (a[i + 1]>a[i])max = a[i + 1];
}
return max;
}