Wczytanie liczb z pliku, posortowanie i wyznaczenie mediany

0

Witam mam takie zadanie do napisania:

Wczytać plik "data.txt" do tablicy alokowanej dynamicznie. W pierwszym wierszu pliku jest liczba elementów N, a w kolejnych wierszach jest N liczb zmiennoprzecinkowych. Po wczytaniu, tablicę posortować, a następnie zwrócić środkowy element.

Napisałem kod, który wypisuje mi złe liczby niż mam w pliku (dodałem załącznik)

#include<stdio.h>
#include<conio.h>
float a[1000000];
void sortuj(int i_el)
{
    int zmiana=0, i;
    float temp;
    do
    {
        zmiana=0;
        for(i=1; i<i_el; i++)if(a[i-1]>a[i])
            {
                temp=a[i];
                a[i]=a[i-1];
                a[i-1]=temp;
                zmiana++;
            }
    }
    while(zmiana>0);
}
int main()
{
    FILE *plik_we;
    FILE *plik_wy;
    int p;
    plik_we=fopen("data.txt","r");
    p=0;
    printf("Tablica zaladowana:\n");
    while(!feof(plik_we))
    {
        fscanf(plik_we,"%e", &a[p]);
        printf("\n");
        printf("%f \n",a[p]);
        p++;
    }
    fclose(plik_we);
    plik_wy=fopen("wynikipos.txt","w");
    sortuj(1000000);
    printf("Tablica posortowana i zapisana do pliku \n");
    for(p=0; p<1000000; p++)fprintf(plik_wy,"%e \n",a[p]);
    fclose(plik_wy);
    getch();
}


1

Zrozumiałeś polecenie?

  1. W pierwszym wierszu w pliku masz liczbę elementów - Ty traktujesz ją jak wszystkie pozostałe;
  2. Nie alokujesz nigdzie pamięci dynamicznie;
  3. W zadaniu nie ma mowy o zapisywaniu danych do pliku;
  4. Nie używaj zmiennych globalnych;
  5. Nawet uboga biblioteka standardowa języka c oferuje funkcję qsort;

I o co chodzi z tymi liczbami? Wg mnie wartości wczytywane z pliku są poprawne, choć zaokrąglone. Potrzebujesz większej precyzji? Zamiast pracować na 100000 liczb zmniejsz rozmiar danych do 10 pozycji.

0

Zrobilem cos takiego. Pomógłby ktoś posortować te liczby i wyliczyc mediane?

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


void main()
{

    FILE *plik = fopen("data.txt","r");
    int N=1000000, Nall=0;
    int i;
    if(plik == NULL)
    {
        printf("Blad otwarcia pliku\n");
        exit(-1);
    }


    double *x1 = (double*)malloc(N*sizeof(double));


    fscanf(plik,"%d",&Nall);
    printf("Plik zawiera %d elemenow N \n", Nall);

    for (i=0; i<N; i++)
    {
        fscanf(plik,"%lf",&x1[i]);
        printf("%lf\n",x1[i]);
    }

    free(x1);
    fclose(plik);
    return 0;
}

0

Mam coś takiego, ale nie sortuje mi liczb tak jak powinno :/ Gdzie popełniam błąd? i jak potem wyliczyc mediane?

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

  void bubblesort(int table[], int size)
{
	int i, j, temp;
	for (i = 0; i<size-1; i++)
        {
		for (j=0; j<size-1-i; j++)
		{
			if (table[j] > table[j+1])
			{
				temp = table[j+1];
				table[j+1] = table[j];
				table[j] = temp;
			}
		}
        }
}

void main()
{

    FILE *plik = fopen("data.txt","r");
    int N=1000000, Nall=0;
    int i;
    if(plik == NULL)
    {
        printf("Blad otwarcia pliku\n");
        exit(-1);
    }


    double *x1 = (double*)malloc(N*sizeof(double));



    fscanf(plik,"%d",&Nall);
    printf("Plik zawiera %d elemenow N \n", Nall);


    for (i=0; i<N; i++)
    {
        fscanf(plik,"%lf",&x1[i]);

        printf("%lf\n",x1[i]);


    }
    bubblesort(x1,N);

    free(x1);
    fclose(plik);
    return 0;
0

Proszę o sprawdzenie

#include <stdio.h>
#include <stdlib.h>
void quick_sort(int *x1, int left, int right)
{
    int tmp;
  int i = left;
    int j = right;
    int x = x1[( left + right ) / 2 ];
    do
    {
        while( x1[ i ] < x )
             i++;

        while( x1[ j ] > x )
             j--;

        if( i <= j )
        {
            tmp=x1[i];
            x1[i]=x1[j];
            x1[j]=tmp;

            i++;
            j--;
        }
    } while( i <= j );

    if( left < j ) quick_sort( x1, left, j );

    if( right > i ) quick_sort( x1, i, right );
}
void srodkowa_liczba(int *x1, int n)
{
    float m;
    if(n%2==0)
    {
        m = x1[(n-1)/2]+x1[n/2];
        m = m/2;
    }
    else
    {
        m = x1[n/2];
    }
    printf("Mediana to: %e", m);
}

int main()
{

    FILE *plik = fopen("data.txt","r");
    int N=1000000, Nall=0;
    int i;

    float *x1;
    if(plik == NULL)
    {
        printf("Blad otwarcia pliku\n");
        exit(-1);
    }


    x1 = (malloc( N * sizeof( float ) ));



    fscanf(plik,"%d",&Nall);
    printf("Plik zawiera %d elemenow N \n", Nall);


    for (i=0; i<N; i++)
    {

        fscanf(plik,"%e",&x1[i]);

        printf("%e\n",x1[i]);
    }
quick_sort(x1,0,N-1);
srodkowa_liczba(x1,N);

    free(x1);
    fclose(plik);

}

0

Wyrzuć to:

int N=1000000;

i przeczytaj dokładnie tekst zadania:

W pierwszym wierszu pliku jest liczba elementów N, a w kolejnych wierszach jest N liczb zmiennoprzecinkowych

Jeżeli nadal nie wiesz co robić to chodzi o to abyś:

  1. Odczytał ilość elementów (N) z pliku (int).
  2. Stworzył dynamiczną tablicę o rozmiarze N.
  3. Odczytał N liczb zmiennoprzecinkowych.
0
atmal napisał(a):

Wyrzuć to:

int N=1000000;

i przeczytaj dokładnie tekst zadania:

W pierwszym wierszu pliku jest liczba elementów N, a w kolejnych wierszach jest N liczb zmiennoprzecinkowych

Jeżeli nadal nie wiesz co robić to chodzi o to abyś:

  1. Odczytał ilość elementów (N) z pliku (int).
  2. Stworzył dynamiczną tablicę o rozmiarze N.
  3. Odczytał N liczb zmiennoprzecinkowych.
#include <stdio.h>
#include <stdlib.h>
void quick_sort(int *x1, int left, int right)
{
    int tmp;
  int i = left;
    int j = right;
    int x = x1[( left + right ) / 2 ];
    do
    {
        while( x1[ i ] < x )
             i++;

        while( x1[ j ] > x )
             j--;

        if( i <= j )
        {
            tmp=x1[i];
            x1[i]=x1[j];
            x1[j]=tmp;

            i++;
            j--;
        }
    } while( i <= j );

    if( left < j ) quick_sort( x1, left, j );

    if( right > i ) quick_sort( x1, i, right );
}
void srodkowa_liczba(int *x1, int n)
{
    float m;
    if(n%2==0)
    {
        m = x1[(n-1)/2]+x1[n/2];
        m = m/2;
    }
    else
    {
        m = x1[n/2];
    }
    printf("Mediana to: %e", m);
}

int main()
{

    FILE *plik = fopen("data.txt","r");
    int N;
    int i;

    float *x1;
    if(plik == NULL)
    {
        printf("Blad otwarcia pliku\n");
        exit(-1);
    }


    x1 = (malloc( N * sizeof( float ) ));



    fscanf(plik,"%d",&N);
    printf("Plik zawiera %d elemenow N \n", N);


    for (i=0; i<N; i++)
    {

        fscanf(plik,"%e",&x1[i]);

        printf("%e\n",x1[i]);
    }
quick_sort(x1,0,N-1);
srodkowa_liczba(x1,N);

    free(x1);
    fclose(plik);

}

3

Dobra, ale zobacz że u ciebie jest hardcodowane N (1000000) i taką samą liczbę czytasz do Nall, potem i tak Nall jest nieużywane.
Co jeśli w pliku ilość liczb będzie wynosiła np. 200? N nadal będzie 100000 a twój program będzie się wywalał próbując czytać z pliku więcej liczb niż tam jest.

Samo wywalenie to nie wszystko bo musisz, tak jak poprzednio napisałem, wczytać N a potem tworzyć tablicę:

int N;
fscanf(plik, "%d", &N); // Wczytanie N
printf("Plik zawiera %d elemenow N \n", N);

float *x1 = (malloc(N * sizeof(float))); // Tworzenie tablicy

for (int i = 0; i < N; i++) // Pobieranie N liczb
{
	fscanf(plik, "%e", &x1[i]);
	printf("%e\n", x1[i]);
}
0

Do poprawy masz też typy zmiennych w funkcji quick_sort() - tmp oraz x powinny być typu float a nie int.

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