C - sortowanie liczb

1

Program się kompiluje ale przy włączaniu jest: "Segmentation fault"

 #include <stdio.h>
main()
{
FILE *f;
int i,n,ilezmian=1,liczby[100];
f=fopen("dane","r");

while (!feof(f))
{
fscanf(f,"%d",&liczby[n]);
printf("%3d",liczby[n]);
n++;
}
while (ilezmian!=0)
{
ilezmian=0;
for(i=o;i<n;i++)
if (liczby[i+1]<liczby[i])
{
int tmp=liczby[i];
liczby[i]=liczby[i+1];
liczby[i+1]=tmp;
ilezmian++;
}
printf("Liczby posortowane rosnaco \n");
for (i=1;i<n;i++)
printf("%3d",liczby[i-1]);

printf("\n");
}

fclose(f);

return 0;
}
0

tam w pętli for ma być i=0 zamiast i=o

1

Zainicjalizuj zmienną n:

n = 0
0

Thx. A jak z tego zrobić sortowanie malejące?

0
Maro369 napisał(a)

Thx. A jak z tego zrobić sortowanie malejące?

gdybyś sam napisał od początku program, który tu wkleiłeś nie zadawałbyś takich pytań. W jaki sposób dokonujesz decyzji czy dany wyraz ciągu jest większy od drugiego? Zrób to samo tylko z przeciwstawnym operatorem relacji.

0

No właśnie mam z tym problem, bo zmiana znaku w tym miejscu na przeciwny

if (liczby[i+1]<liczby[i])

nie pomaga.

Nie napisałem sam tego programu, bo nie potrafię, natomiast staram się zrozumieć jego działanie, co nie jest takie łatwe dla mnie początkującego, jak mogłoby się wydawać.

0

Co nie jest latwe ? Wymysl sobie jakies liczby, zapisz na kartce i zasymuluj po kolei na kartce kolejne kroki algorytmu, a potem juz z gorki.

0

ściemniasz,

int i,n = 6,ilezmian=1,liczby[] = { 1, 2, 3, 4, 5, 6 };

    while (ilezmian!=0)
    {
        ilezmian=0;
        for(i=0;i<n-1;i++) // spojrz na warunek konca petli!
            if (liczby[i+1] > liczby[i]) // co zrobillem ze znakiem?
            {
                int tmp=liczby[i];
                liczby[i]=liczby[i+1];
                liczby[i+1]=tmp;
                ilezmian++;
            }
        printf("Liczby posortowane rosnaco \n");

        for (i=0;i<n;i++)
            printf("%3d",liczby[i]);
        printf("\n");
    }
  //  fclose(f);

mnie to działa, a zmieniłem tylko warunek... no dobra powiem szczerze jeszcze warunek pętli, dlaczego? Wychodziłeś poza zakres.

0

Ok, tylko ja chce wczytywać liczby z pliku (robie to tak jak w pierwszym poscie), więc inicjuje sobie tablicę np. liczby[100] i n=0 (tak jak przy sort. rosnącym) i wtedy dokładam do tego twój program i nie działa (tzn. znów jest sortowanie rosnące).
Poza tym na początku programu jak ma wyświetlać najpierw liczby tak jak są wpisane w pliku to samo dokłada mi na końcu jakąś liczbę.

0
Maro napisał(a)

Program się kompiluje ale przy włączaniu jest: "Segmentation fault"

 #include <stdio.h>
main()
{
FILE *f;
int i,n,ilezmian=1,liczby[100];
f=fopen("dane","r");

while (!feof(f))
{
fscanf(f,"%d",&liczby[n]);
printf("%3d",liczby[n]);
n++;
}
(...)

a ile wynosi "n" bo ja nie widzę, żebyś nadawał zmiennej n jakąś wartość początkową. Dostajesz liczbę "z kosmosu".

edit: sorry nie widziałem postu usera samadhi.

edit2: dopisałem do "twojego" kodu swoje zmiany bo aż byłem ciekaw twoich słów i mnie wszystko działa. Czyli sortuje rosnąca lub malejąco w zależności od warunku. Aha, pomyśl jeszcze nad tym:

for (i=1;i<n;i++)
printf("%3d",liczby[i-1]);
 

Ogólnie rzecz biorąc masz syf w kodzie i występują takie głupie błędy. Nie mam pojęcia dlaczego ja to w ogóle sprawdzam, powinieneś najsampierw wcięcia porobić, a potem powinniśmy porozmawiać.

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