Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] problem z sortowaniem liczb

Ostatnio zmodyfikowano 2018-01-16 17:29
Autor Wiadomość
kryś98
Temat założony przez niniejszego użytkownika
» 2018-01-15 00:13:48
Tak, poprawiłem to. Problem jest taki, że jeśli w pliku wejściowym są np. 3 liczby to w pliku wyjściowym pojawia się 3 razy "0.000000"
P-168742
mateczek
» 2018-01-15 01:49:16
u mnie działa ale może sprawdź gdzie się wywala może masz jakąś literówkę przy formatowaniu w funkcjach czytających i piszących do pliku ?? odpal debugger lub napisz funkcję wyświetlającą tablice na ekran i zobacz gdzie ewentualnie może być przyczyna


C/C++
#include <stdio.h>
#include <stdlib.h>
void pritTable( double a[], int size ) {
    for( int i = 0; i < size; i++ )
         printf( "%lf ", a[ i ] );
   
    printf( "\n" );
}
int compare( const void * a, const void * b )
{
    return( *( double * ) a - *( double * ) b );
}
int main()
{
    FILE * fin = fopen( "liczby.txt", "r" );
    double a[ 20 ]; //tablica na 20 liczb;
    int n = 0;
    while( fscanf( fin, "%lf", & a[ n ] ) == 1 ) n++;
   
    fclose( fin );
    pritTable( a, n );
    qsort( a, n, sizeof( double ), compare );
    pritTable( a, n );
    FILE * fout = fopen( "posortowaneLiczby.txt", "w" );
    for( int i = 0; i < n; i++ ) fprintf( fout, "%lf ", a[ i ] );
   
    fclose( fout );
    return 0;
}
P-168743
kryś98
Temat założony przez niniejszego użytkownika
» 2018-01-15 22:03:08
Problem polega na tym, że liczby całkowite sortuje bez problemu, a ułamki tylko przepisuje w tej samej kolejności
P-168776
mateczek
» 2018-01-16 03:16:54
A to już inny problem:P. Ten problem jest dość oczywisty. A prawidłowo opisany powinien brzmieć: "funkcja comare nie rozpaznaje liczb, miedzy którymi różnica jest mniejsza od 1"

C/C++
int wynik = 1.1 - 1.05 // wynikiem jest zero !!! te liczby wg funkcji compare są tekie same, bo różnica między nimi jest zero

Mając prawidłowo zdiagnozowany problem już jest z górki


może  rozwiązanie jak poniżej przejdzie. Wzorowane trochę na c++ gdzie operacja "a<b" zwraca true lub false   
C/C++
int compare( const void * a, const void * b )
{
    return( *( double * ) a < *( double * ) b );
}


ale w C chyba lepiej tak :
C/C++
int compare( const void * a, const void * b )
{
    double diff = *( double * ) a - *( double * ) b;
    if( diff < 0 ) return - 1;
    else if( diff > 0 ) return 1;
   
    return 0;
}
P-168779
kryś98
Temat założony przez niniejszego użytkownika
» 2018-01-16 17:29:05
Dzięki za pomoc
P-168783
1 « 2 »
Poprzednia strona Strona 2 z 2