Usuwanie kopca

MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0
Kopiuj
#include <iostream>

using namespace std;

int MniejszeDziecko(int rodzic,int rozmiarKopca,int kopiec)
{
    int leweDziecko=2*rodzic;
    int praweDziecko=2*rodzic+1;
    if(leweDziecko>rozmiarKopca)
        return 0;
    if(praweDziecko>rozmiarKopca and kopiec[leweDziecko]<kopiec[praweDziecko])
        return leweDziecko;
    return praweDziecko;
}

void UsunKorzen(int rozmiar,int kopiec)
{
    int rozmiarKopca=rozmiar+1;
    int ostatni=kopiec[rozmiarKopca];
    rozmiarKopca--;
    int x=1;
    int c=MniejszeDziecko(1,rozmiarKopca,kopiec);
    while(c and kopiec[c]<ostatni)
    {
        kopiec[x]=kopiec[c];
        x=c;
        c=MniejszeDziecko(c,rozmiarKopca,kopiec);
    }
    kopiec[x]=ostatni;
}

int main()
{
    const int rozmiar=7;
    int kopiec[rozmiar+1]={0,2,5,3,7,6,4,5};
    int tab[rozmiar]={0};
    for(int i=0;i<rozmiar;i++)
    {
        tab[i]=kopiec[1];
        UsunKorzen(rozmiar,kopiec);
    }
    for(int i=0;i<rozmiar;i++)
        cout << tab[i] << " ";
    return 0;
}

Napisałem tu algorytm usuwanie kopca. Kopiec indeksowany od 1 zapisany jest w tablicy kopiec. Program usuwa kopiec i zapisuje już wtedy posortowane dane do tablicy tab. Program jednak nie kompiluje się. Cały czas mam błąd error invalid types of int[int] for array subscipt? Ktoś wie o co chodzi?

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około miesiąc
1

Do liczby próbujesz się dobrać jak do tablicy.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Szczecin
0
Kopiuj
int kopiec
Kopiuj
kopiec[x]

Co to ma znaczyć?


kq
pisane and i to Twoje at jest dla mnie bolesne do czytania :P
spartanPAGE
gash, zwizualizuj sobie to jako te nawiasy [``]...
Azarien
and działa? działa. jest w standardzie? jest. trochę to wbrew konwencji tylko.
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0
Kopiuj
#include <iostream>

using namespace std;

int MniejszeDziecko(int rodzic,int rozmiarKopca,int kopiec[])
{
    int leweDziecko=2*rodzic;
    int praweDziecko=2*rodzic+1;
    if(leweDziecko>rozmiarKopca)
        return 0;
    if(praweDziecko>rozmiarKopca and kopiec[leweDziecko]<kopiec[praweDziecko])
        return leweDziecko;
    return praweDziecko;
}

void UsunKorzen(int rozmiar,int kopiec[])
{
    int rozmiarKopca=rozmiar+1;
    int ostatni=kopiec[rozmiarKopca];
    rozmiarKopca--;
    int x=1;
    int c=MniejszeDziecko(1,rozmiarKopca,kopiec);
    while(c and kopiec[c]<ostatni)
    {
        kopiec[x]=kopiec[c];
        x=c;
        c=MniejszeDziecko(c,rozmiarKopca,kopiec);
    }
    kopiec[x]=ostatni;
}

int main()
{
    const int rozmiar=7;
    int kopiec[rozmiar+1]={0,2,5,3,7,6,4,5};
    int tab[rozmiar]={0};
    for(int i=0;i<rozmiar;i++)
    {
        tab[i]=kopiec[1];
        UsunKorzen(rozmiar,kopiec);
    }
    for(int i=0;i<rozmiar;i++)
        cout << tab[i] << " ";
    return 0;
}

Już poprawiłem błędy składni. Teraz program działa ale wyświetla wynik 2 2 2 2 2 2 2. Tak jakby w ogóle nie wykonywał funkcji UsunKorzen która jest w pętli. Nie wiem o co chodzi. Wydaje mi się że funkcja UsunKorzen i MniejszeDziecko jest ok.

edytowany 2x, ostatnio: Mikilll
spartanPAGE
to teraz napisz testy, żeby Ci się nie wydawało
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:243
0

Nie umiem debugowac ani pisac testow jeszcze. Najlepsze jest ze przed chwila uruchomilem program i pokazal pierwsze 3 liczby w dobrej kolejności a kolejne 4 liczby to byly jakies losowe liczby rzedu milionow tak jakbym przekroczyl zakres tablicy. Nie wiem jak to mozliwe ze teraz program co innego wyswietlił. Nic nie zmienialem. Ktos wie co chodzi?

edytowany 2x, ostatnio: Mikilll
1

Tu sie rwie do uzywania uzywania angielskiego "and" zamiast &&, a wszystkie zmienne i funkcje po polsku.

A co do problemu to debugger będzie twoim wybawicielem.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
Mikilll napisał(a):

Ktos wie co chodzi?

Ja wiem. O to:

Mikilll napisał(a):

Nie umiem debugowac ani pisac testow jeszcze.

Jak się naumiem to świat stanie się piękniejszy.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.