Skocz do zawartości

O co chodzi?


kt1117

Rekomendowane odpowiedzi

Witam. Próbuję posegregować tablicę znaków alfabetycznie. Wymyśliłem taki kod:

#include <iostream>
#include <string>

using namespace std;

string n[150];
int nn;
string temp;
bool zmiana;

void sort(int x=0)
{
    if (n[x]>n[x+1])
    {
        temp=n[x];
        n[x]=n[x+1];
        n[x+1]=temp;
        zmiana=true;
    }
    if (x<nn-1)
    {
        sort(x++);
    }
    else
    {
        if (zmiana==true)
        {
            zmiana=false;
            sort();
        }
    }

}

int main()
{
    cin>>nn;
    for(int x=0;x<nn;x++)
    {
        cin >> n[x];
    }
    sort();
    for (int z=0;z<nn;z++)
    {
        cout<<n[z]<<endl;
    }
    return 0;
}

Niestety program kończy działanie bez podania wyniku z kodem błędu:-1073741819

Podejrzewam, że to przez tą zagmatwaną referencję, ale nie jestem pewien. Mógłby mi ktoś powiedzieć o co chodzi?

 

Napisałem sobie ten program iteracyjnie i dostałem za niego 100 pkt, ale mimo to chciałbym się dowiedzieć, czemu ten nie działa. Czy jest to przeładowanie stosu?

Odnośnik do komentarza
Udostępnij na innych stronach

 
else
    {
        if (zmiana==true)
        {
            zmiana=false;
            sort();
        }
    }

    }

 

 

To się wykona jak x==nn-1 więc co dalej chcesz sortować?

 

temp=n[x];
        n[x]=n[x+1];
        n[x+1]=temp;
        zmiana=true;

 

Dlaczego wybierasz najwolniejszą wersję jaką zna świat?

Odnośnik do komentarza
Udostępnij na innych stronach

Całe wymyślałem sam, niczym się nie sugerowałem. Miałem taki zamysł, że jeśli po przejściu przez pętlę coś się zmieniło, to mogło zniszczyć inny układ. Chodzi o coś takiego.

5143

1534

1354

1345

Czyli jeśli coś się zmieniło, sprawdza czy już jest dobrze posegregowane. Jeśli jest dobrze posegregowane to zmienna ma wartość false i program kończy działanie.

 

Z tym drugim to da się inaczej?

 

E:W innym muszę zamienić string na float i spowrotem. Robię to za pomocą atof i sstream. Czy są szybsze metody?

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, w takim razie jaki jest warunek zakończenia tej funkcji? Nie ma go, będzie się zapętlać w nieskończoność więc jak to ma działać?

 

 

Z tym drugim to da się inaczej?

 

 

Zakładając, że:

 

for(int x=0;x<nn;x++)

{

cin >> n[x];

}

 

Wykona się maksymalną ilość 150:

150 razy malloc! i to w pętli a najważniejsza zasada to:

 

"Keep heap allocations to a minimum, and never allocate from the heap within a loop"

 

Potem przy każdym porównaniu 3 przypisania. Skorzystaj z tablic statycznych. Zrób jedną na dane a drugą dla indeksów, porównuj dane a modyfikuj tablice indeksów. Potem przy wypisywaniu: cout<<dataArray[indexArray ];

 

Wtedy zamiast 3 przypisań, które mogą składać się z setek elementów masz 3 przypisana zwykłych liczb. Nie wiem jak działa funkcja porównująca string'a ale napisz swoją dla tablicy char i sprawdzaj oczywisty wariant jak długość sekwencji czy co tam jeszcze wymyślisz żeby ograniczyć liczbę porównań.

 

E: Jeśli masz tylko liczby i mieszczą się w jakimś long long czy co tam oferuje twój kompilator o największej pojemności to oczywiście z tego skorzystaj a nie baw się w tablicę.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...