Wczytanie wartości z pliku do 3 tablic dynamicznych

0

Cześć, mam problem dotyczący wczytania wartości z pliku, wygląda to w pliku tak, że jest zmienna X obok Y i Z i pod X są poszczególne wartości X np. 2,56745, pod Y i Z jest analogicznie. Wiem jak utworzyć dynamiczną tablice tylko mam problem jak program ma czytać wartości X do jednej tablicy, wartości Y do drugiej i Z do trzeciej. Z tego co wymyśliłem to program najpierw musi przejść raz przez te wartości, żeby ulokował tablicę o właściwym rozmiarze, dopiero potem ma lokować te liczby w poszczególnych miejscach w tablicy. Byłbym wdzięczny za pomoc w napisaniu tego kodu albo wyjaśnieniu jak to ma wyglądać.

 int *readX(int count) 
    {
       int *X = malloc(count * sizeof(int));
       for (i = 0; i < count; ++i) 
       {
           scanf("%f", &X[i]);
       }
       return X;
    } 
    int count;
    scanf("%d", &count);
    int *X = readX(count);```

Plik z którego program musi korzystać jest w załączniku.

1
struct MagicData
{
    double x;
    double y;
    double rho;
};

struct MagicDataArray {
    size_t reserved;
    size_t count;
    struct MagicData *data;
};

void MagicDataArrayAppend(struct MagicDataArray *arr, struct MagicData* data)
{
     if (arr->count >= arr->reserved) arr->data = realloc(arr->data, sizeof(struct MagicData) * (arr->count * 3 / 2));
     arr->data[arr->count++] = *data;
}

struct MagicDataArray MagicDataArrayCreate(size_t reserved) {
     struct MagicDataArray result = {
           reserved,
           0,
           malloc(sizeof(struct MagicData) * reserved)
     };
     return result;
}

struct MagicDataArray MagicDataArrayReadF(FILE *f)
{
     struct MagicDataArray result = MagicDataArrayCreate(10);
     struct MagicData tmp;

     fscanf(f, "LP X Y RHO"); // ignore header
     while(fscanf(f, "%*d. %lf %lf %lf", &tmp.x, &tmp.y, &tmp.rho) == 3) {
          MagicDataArrayAppend(&result, &tmp);
     }

     return result;
}

https://wandbox.org/permlink/Ha8oIvrFkWv8qAHR

0
MarekR22 napisał(a):
struct MagicData
{
    double x;
    double y;
    double rho;
};

struct MagicDataArray {
    size_t reserved;
    size_t count;
    struct MagicData *data;
};

void MagicDataArrayAppend(struct MagicDataArray *arr, struct MagicData* data)
{
     if (arr->count >= arr->reserved) arr->data = realloc(arr->data, sizeof(struct MagicData) * (arr->count * 3 / 2));
     arr->data[arr->count++] = *data;
}

struct MagicDataArray MagicDataArrayCreate(size_t reserved) {
     struct MagicDataArray result = {
           reserved,
           0,
           malloc(sizeof(struct MagicData) * reserved)
     };
     return result;
}

struct MagicDataArray MagicDataArrayReadF(FILE *f)
{
     struct MagicDataArray result = MagicDataArrayCreate(10);
     struct MagicData tmp;

     fscanf(f, "LP X Y RHO"); // ignore header
     while(fscanf(f, "%*d. %lf %lf %lf", &tmp.x, &tmp.y, &tmp.rho) == 3) {
          MagicDataArrayAppend(&result, &tmp);
     }

     return result;
}

https://wandbox.org/permlink/Ha8oIvrFkWv8qAHR

Dzięki za pomoc, tylko teraz mam kolejny problem, bo chciałbym policzyć średnią, medianę i odchylenie standardowe dla tych tabel i na koniec dopisać te wyniki do pliku, próbowałem policzyć średnią dla X i wyskakuje mi że jest błąd w nazwie funkcji

float srednia(int r.data[].x, int n)
{
        int i;
        float suma = 0;
        float sr = 0;
        for (i = 0; i <= n; i++)
        {
            suma += r.data[i].x;
        }
        sr = suma / n;
        return sr;
}
1

r.data[].x nie jest poprawną nazwą parametru.

0

Mógłby mi ktoś doradzić co może być błędem w funkcjach liczących mediany dla X, Y i RHO? Liczba, która się wyświetla na pewno medianą nie jest a gdy podam więcej wartości, z których ma być ta mediana liczona to wyskakuje że mediana wynosi 0.

#include <stdio.h>
#include <stdlib.h>

float medianaX(float *tablicaX, int wielkosc);
float medianaY(float *tablicaY, int wielkosc);
float medianaRHO(float *tablicaRHO, int wielkosc);

int main()
{
    FILE *plik;
    plik=fopen("grades.txt","r");
    int line=0;
    char input[512];
    fgets(input, 512, plik);
    line=line+1;
    printf("Linia %d: %s", line, input);
    int i=0;
    int wielkosc=0;
    int t=0;
    printf("Podaj ilosc wszystkich wartosci ktore chcesz wyswietlic (max 200): ");
    scanf("%d", &wielkosc);
    while (wielkosc>200)
    {
        printf("Sprobuj jeszcze raz podajac wartosc maksymalnie 200");
        exit(0);
    }
    float *tablicaLP;
    tablicaLP=(float *)malloc(wielkosc*sizeof(float));
    float *tablicaX;
    tablicaX=(float *)malloc(wielkosc*sizeof(float));
    float *tablicaY;
    tablicaY=(float *)malloc(wielkosc*sizeof(float));
    float *tablicaRHO;
    tablicaRHO=(float *)malloc(wielkosc*sizeof(float));
    while (i<wielkosc)
    {
        if (i%4==0)
        {
            fscanf(plik, "%f", &tablicaLP[i]);
            printf("Tablica LP (nieistotna):%f\t", tablicaLP[i]);
        }
        else if (i%4==1)
        {
            fscanf(plik, "%f", &tablicaX[i]);
            printf("Tablica X:%f\t", tablicaX[i]);
        }
        else if (i%4==2)
        {
            fscanf(plik, "%f", &tablicaY[i]);
            printf("Tablica Y:%f\t", tablicaY[i]);
        }
        else
        {
            fscanf(plik, "%f", &tablicaRHO[i]);
            printf("Tablica RHO:%f\n", tablicaRHO[i]);
        }
        i++;
    }
    printf("\nMediana dla tablicy X wynosi: %f\n", medianaX(tablicaX, wielkosc));
    printf("\nMediana dla tablicy Y wynosi: %f\n", medianaY(tablicaY, wielkosc));
    printf("\nMediana dla tablicy RHO wynosi: %f\n", medianaRHO(tablicaRHO, wielkosc));
    free(tablicaLP);
    free(tablicaX);
    free(tablicaY);
    free(tablicaRHO);
    fclose(plik);
    return 0;
}

float medianaX(float *tablicaX, int wielkosc)
{
    float medianaX=0;
    if (wielkosc%2==0)
    {
        medianaX=tablicaX[(wielkosc-1)/2]+tablicaX[wielkosc/2];
        medianaX=medianaX/2;
    }
    else
        medianaX=tablicaX[wielkosc/2];
    return medianaX;
}

float medianaY(float *tablicaY, int wielkosc)
{
    float medianaY=0;
    if (wielkosc%2==0)
    {
        medianaY=tablicaY[(wielkosc-1)/2]+tablicaY[wielkosc/2];
        medianaY=medianaY/2;
    }
    else
        medianaY=tablicaY[wielkosc/2];
    return medianaY;
}

float medianaRHO(float *tablicaRHO, int wielkosc)
{
    float medianaRHO=0;
    if (wielkosc%2==0)
    {
        medianaRHO=tablicaRHO[(wielkosc-1)/2]+tablicaRHO[wielkosc/2];
        medianaRHO=medianaRHO/2;
    }
    else
        medianaRHO=tablicaRHO[wielkosc/2];
    return medianaRHO;
}
0

Czy dane w tablicach są posortowane?
Dlaczego masz trzy funkcję robiące dokładnie to samo?
Nie lepiej użyć jednej.

float mediana( float *tablica, int wielkosc )
{
    float result=0.0;

    if( wielkosc%2==0 )
    {
        result=tablicaX[wielkosc/2-1]+tablicaX[wielkosc/2];
        result=result/2.0;
    }
    else result=tablicaX[(wielkosc-1)/2];

    return result;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1