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;
}
  • infa.png (0,22 MB) - ściągnięć: 41