pomoc w sortowaniu przez kopcowanie(wczytywanie danych z pliku)

Odpowiedz Nowy wątek
2010-12-28 20:16
0

Witam.. mam do napisania program, który sortuje słowa wczytane z pliku ze względu na ich długość..na początku postanowiłem, ze napisze program, który sortuje liczby wczytane z pliku przez kopcowanie, a następnie przerobie go, by sortował słowa.. z samym algorytmem sobie poradziłem, wystąpił natomiast problemu w czasie wczytywania danych z pliku. Mianowicie: czy da rade wrzucic zczytywanie danych z pliku do jakiejs pętli(pogrubiony fragm. kodu, aby mozna było zczytywać dane aż do konca pliku, a nie z góry narzuconą ilość danych?po drugie, czy ktoś mogłby zaproponować jakis sposob przerobienia programu, aby sortował słowa ze względu na długośc? myslałem, aby każde słowo zczytywać do oddzielnej tablicy, a następnie porównywać tablice..ale nie wiem jak to zapisać w C. Wszystkie rady mile widziane:) oto kod:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char argv[])
{
int d[100], i, j, k, x, m,a;
FILE
pFile;
pFile = fopen ("myfile.txt","r");
{ foo fscanf (pFile, "%d", &d[1]);
fscanf (pFile, "%d", &d[2]);
fscanf (pFile, "%d", &d[3]);
fscanf (pFile, "%d", &d[4]); ->>>>
fscanf (pFile, "%d", &d[5]);
fscanf (pFile, "%d", &d[6]);
fscanf (pFile, "%d", &d[7]);
fscanf (pFile, "%d", &d[8]); foo

}
fclose (pFile);
for( i=2; i<9; i++)
{
/pozycja wstawianiego elementu/ j=i;
/poziom drzewa/ k=(j/2);
/wartośc wstawionego elementu/ x=d[i];
while((k>0) &&(d[k] < x))//d[k]-wartosc przodka, x=wartosc elementu w tablicy
{ d[j]=d[k];
j=k; k=(j/2);
}
d[j]=x;
}

for(i =1 ; i <9; i++)
printf("%d\n", d[i]);

for(i = 8; i > 0; i--)
{
x = d[1]; d[1] = d[i]; d[i] = x;
j = 1; k = 2;
while(k < i)
{
if((k + 1 < i) && (d[k + 1] > d[k]))
m = k + 1;
else
m = k;
if(d[m] <= d[j]) break;
x = d[j]; d[j] = d[m]; d[m] = x;
j = m; k = j + j;
}
}
printf("po\n");
for(i = 1; i <9; i++)
printf("%d\n", d[i]);

system("PAUSE");
return 0;
}

Pozostało 580 znaków

2010-12-28 21:37
1

Co do wczytywania danych z całego pliku:

while(!plik.eof())
      getline(plik,<string>);

Co do sortowania - przy porównywaniu, porównuj sobie długość napisu używając strcmp, a przy podmianie, podmieniaj napisy :) Nie wiem w czym tu problem.


Potrzebujesz programy do szkoły/na zaliczenie? Pomocy podczas kolosa lub egzaminu?
Zamów go!

http://proogramy.c0.pl

Pozostało 580 znaków

2010-12-28 22:24
0

hmm chyba nie do końca łapie wskazówke;/ mogłby mi ktoś pokazać, jak to ma w kodzie wyglądac? każde słowo zczytywane do oddzielnej tablicy typu char, a nastęnie porownywanie ich strcmp? bardzo proszę o pomoc, orłem jak narazie w programowaniu niestety nie jestem ;)

Pozostało 580 znaków

2010-12-28 22:32
0

Mój błąd - strcmp służy do porównywania tablicy znaków. Chodziło mi oczywiście o wczytaniu każdego wyrazu do oddzielnej tablicy charów (dwywymiarowej, żeby można było w niej od razu sortować) i przy porównywaniu długości wyrazów posługiwać się funkcją strlen

char wyrazy = new **char; // dynamiczne tworzenie tablicy
wyrazy = new *char[ilosc_wyrazow]; // ilosc wierszu (ilosc wyrazow)
for(int i = 0; i < ilosc_wyrazow; i++)
{
        wyrazy[i] = new char[dlugosc_danego_wyrazu]; // ilosc kolumn (liter w wyrazie)
        for(int j = 0; j < dlugosc_danego_wyrazu; j++)
                //wpisane wyrazy do tablicy
}
//funkcja porownujaca

To tak w skrócie. Mam nadzieję, że mnie zrozumiałaś


Potrzebujesz programy do szkoły/na zaliczenie? Pomocy podczas kolosa lub egzaminu?
Zamów go!

http://proogramy.c0.pl
edytowany 2x, ostatnio: Blood, 2010-12-28 22:37

Pozostało 580 znaków

2010-12-30 15:38
0

napisałem taki oto kod:

#include <stdio.h>
#include <string.h>
int main()
{
char tab[80][34];
int a=0,i,j,x,k,m;
FILE * pFile;
pFile = fopen ("myfile.txt","r");
{ fscanf (pFile, "%s", &tab[1]);
fscanf (pFile, "%s", &tab[2]);
} fscanf (pFile, "%s", &tab[3]);
fscanf (pFile, "%s", &tab[4]);
fscanf (pFile, "%s", &tab[5]);
fclose (pFile);

for( i=2; i<6; i++)
{
/pozycja wstawianiego elementu/ j=i;
/poziom drzewa/ k=(j/2);
/wartośc wstawionego elementu/ x=strlen(tab[i]);
while((k>0) &&(strlen(tab[k]) < x))
{ tab[j]==tab[k];
j=k; k=(j/2);
}
x=strlen(tab[j]);
}

for(i =1 ; i <6; i++)
printf("%s\n", tab[i]);

for(i = 5; i > 0; i--)
{
x = strlen(tab[1]); tab[1] == tab[i]; x=strlen(tab[i]);
j = 1; k = 2;
while(k < i)
{
if((k + 1 < i) && (strlen(tab[k + 1]) > strlen(tab[k])))
m = k + 1;
else
m = k;
if(strlen(tab[m]) <= strlen(tab[j])) break;
x = strlen(tab[j]); tab[j] == tab[m]; x=strlen(tab[m]);
j = m; k = j + j;
}
}
printf("po\n");
for(i = 1; i <6; i++)
printf("%s\n", tab[i]);

system("pause");
return 0;
}

wpisuje na sztywno wyrazy z pliku do tablicy 2-wymiarowej. następnie proboje to sortować przy użyciu funkcji srtlen(porownoje długości wyrazów(wierszy w tablicy dwuwymiarowej)), lecz niestey nie sortuje mi sie to w tablicy, tylko po przejsciu pętli tworzących i rozbierających kopiec wyświetla mi się znów kolejnośc wyrazów z pliku;/ ma ktoś jakieś pomysły jak sobie z tym poradzić, jakie zmiany w kodzie wprowadzić? z góry serdecznie dziękuje;)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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