Usuwanie kopca

0
#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?

1

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

0
int kopiec
kopiec[x]

Co to ma znaczyć?

0
#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.

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?

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.

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.

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