1 / 32
Feb 2016

Proszę o pomoc z poniższym kodem. Tz. problemem jest brak porządku leksykograficznego.

Deleted code
  • created

    Feb '16
  • last reply

    May '23
  • 31

    replies

  • 2.7k

    views

  • 13

    users

  • 9

    likes

  • 4

    links

15 days later

Fakt. A dlaczego?

Np dla:
abcd
0. wysyłasz do rekurencji:
abcd - i bardzo dobrze
1. wysyłasz do rekurencji:
bacd - i bardzo dobrze.
2. wysyłasz do rekurencji:
cbad - i bardzo nie dobrze.
powinieneś
cabd
itd
3. wysyłasz do rekurencji:
dbca - i bardzo nie dobrze
powinieneś
dabc.

Więc może: albo:
1. Zamiast wypisywać, zapisuj do tablicy, sortuj i dopiero na koniec wypisuj posortowane -ale czy to się zmieści w limicie?
2. Przemyśl rekurencję - i zrób ją inaczej
3. Jak w komentarzach - iteracyjnie - wikipedia lub main.edu.pl <- kurs algorytmiki - permutacja czy jakoś tak.

Hm. Trochę przemyślałem, trochę skorzystałem z cudzych pomysłów. Nie ukrywam, że rekurencja to nie jest moja mocna strona - jak uda mi się to zaliczyć, to zrobię sobie kurs z rekurencji ^^. Mimo poprawek niestety nadal brak AC. Co może być tym razem nie tak ?

Ps: dobro z tego zadania dla mnie: zabawa wskaźnikami ^^

DELETET CODE by nb wink

hm... mam pomyśleć samemu, tak ;> ^^ ciężka sprawa ;p

Taki mały i głupi błąd, trudno wykrywalny przy małych testach wink
Ok
1. Co robi maloc?
2. Ile potrzeba Ci miejsca? na ten nieszczęsny string?
3. Czy nie warto a nawet koniecznie trzeba dopisać na końcu zera?

PS

Inna sprawa, że można uniknąć ciągłego alokowania pamięci.
Wystarczy raz [a dobrze] tab = "abcdefghi" k <10
a do wypisywania używać pętli for( i = 0; i < r; ++i) print tab[i]


Na koniec dostajesz owrócony ciąg, więc można go "przywrócić", zamiast ciągle alokować na nowo:
for (i=0, j = k-1; i < k; i++, k--)
swap (tab[i], tab[k]);

PS 2
Jeżeli jednak zostaniesz przy swoim, to
zamiast tab [i] = 97 + i czytelniej tab [i] = 'a' + i;
no i czy nazwa sig jest adekwatna do tego co robi ta zmienna? nie wnikałem na razie, więc nie wiem. Też chyba muszę popracować nad rekurencją.

PS 3
Skasowałem, bo po poprawieniu tego drobnego, trudno zauważalnego błędu masz AC, a jak jeszcze nie wiesz, to mogę Ci powiedzieć wprost wink

Dziękuję smile Sam dojdę do tego smile Najpierw dostanę AC, a potem zabiorę się za porządkowanie kodu smiley jak już napisałem, muszę nauczyć się rekurencji ^^ Bo nie ukrywam, że ten kod, to jest łączenie kilku cudzych pomysłów, a nie o to chodzi ^^ Poza tym dziękuję za odgrzanie tego kotleta po dwóch tygodniach ^^

Więc tym bardziej, czy nie warto kliknąć w malutką orkiestrę pomocy świątecznej? wink

U Ciebie char *sig powinien nazywać się poprostu temp, tmp lub pom.
Na koniec wypisujesz odwrócony ciąg ale w pamięci jest prawidłowy, więc nawet nie trzeba go odwracać, jak napisałem wcześniej.

PS
Jeżeli funkcją malloc alokujemy pamięć na string, to musimy zaalokować jej co najmniej o 1 więcej, niż długość stringa, bo przecież na końcu stringa jest jeszcze jeden znak, znak = 0. Dodatkowo, ponieważ malloc tylko przydziela obszar pamięci, ale go nie zeruje, musimy to zero wpisać ręcznie na końcu stringa. W takim razie, tylko poprawka malloc(k+1], tab[k] = 0 ... free będzie działać tak jak chciałeś. A dlaczego, w takim razie nie ma SIGABORT SIGKILL czy jakiegoś podobnego sygnału? Nie wiem, ale "normalnie" takie zdarzenia najczęściej nie są w ogóle sygnalizowane [aby program nie tracił czasu indeksy nie są sprawdzane] i dopiero doinstalowanie odpowiednij biblioteki może wymusić takie zachowanie.

PS2

Ps: Czy małe serduszko ma jakiś wpływ na statystyki ;> czy tylko na nasze samopoczucie? ^^

Hym. Nic nie wiem o statystykach, ale dobre uczynki zostaną nam policzone i nagrodzone? wink Ma to jednak dodatkowo wpływ na komunikatywność. Ty nie musisz pisać, dzięki, pomogło, tylko klikasz w serduszko, a ja wim, że byłem w jakimś stopniu pomocny i że w ogóle przeczytałeś moją podpowiedż i Cię usatysfakcjonowała, a jeżeli za mało, to pytasz dalej.

PS 3
Możesz trochę skrócić kod, np:
zamiast:
char temp;
temp = *x;
możesz
char temp = *x;

swap((a+l), (a+i)) <==> swap (a+l, a+i)
*(a+(i+1)) <==> *(a+i+1)
*(a+(r-1)) <==> *(a+r-1)

zamiast:

for(int i=0; i<k;i++)   

 {
        tab[i]= 97+i;
    }

możesz

for(int i=0; i<k;i++)
        tab[i]= 97+i; // a lepiej tab[i] = 'a' + i;

A jeżeli już to ja pewnie napisałbym to jakoś tak:

for (int i = 0; i < k; ++i) { //<-- nawias w tej linii
        tab [i] = 'a' + i; // tu może trochę zaszalałem [ze spacjami] ;-)
        /// inne operacje
    }

Chyba, że wolisz, żeby za ciebie robiło to twoje ukochane ide, ale jak kocha[ne] to powinno się dać ustawić i dostosować do Ciebie a nie Ty do niego[ej], lub trzeba zmienić na inną[go] wink

3 months later

Mam problem z sygnałem SIGXFSZ. W jaki sposób przekraczam wielkość pliku?
//tu był jakiś tam kod

Podbijam, niech ktoś chociaż przepróbuje to u siebie. Nie miałem nigdy do czynienia z takimi problemami podczas pisania, więc tym bardziej nie wiem co mam poprawić.

EDIT:
Poprawiłem wyjście tak, aby nie wypisywać znaku nowej linii po ostatnim teście, ale to wcale nie pomogło. Czekam na jakąkolwiek odpowiedź...

//tu był jakiś tam kod

EDIT2:
if (n<=0)
continue;
Nie wydawało mi się że w testach może być wypisanie 0-permutacji. A jednak.
Kody usuwam.

9 months later

Jak wejdziesz w swoje zgłoszenia, to możesz zobaczyć jaki był błąd przy konkretnej próbie.

Albo po prostu przeczytaj dokłdnie treść zadania od deski do deski, ze szczególnym zwróceniem uwagi na deski.

Okej, dzięki
Widocznie jestem za krótko na spoju bo pierwszy raz rozwiązywałem zadanie w którym nie można używać C++, kod już usuwam

1 year later

nie bardzo wiem, co odpowiedzieć - bo kod ma się nijak do treści zadania - nawet zamieszczony przez ciebie przykład jest zupełnie inny niż w treści zadania (nie tylko wartości ale i struktura danych) - więc albo to inne zadanie (dopisałeś się do innego wątku ?), albo niedokładnie przeczytałeś/zrozumiałeś zadanie

a jaka jest prawidłowa odpowiedź na przykład z poprzedniego postu ?
bo na pewno nie 6