Proszę o pomoc z poniższym kodem. Tz. problemem jest brak porządku leksykograficznego.
Deleted code
created
last reply
- 31
replies
- 2.7k
views
- 13
users
- 9
likes
- 4
links
Proszę o pomoc z poniższym kodem. Tz. problemem jest brak porządku leksykograficznego.
Deleted code
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
Taki mały i głupi błąd, trudno wykrywalny przy małych testach
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?
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
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? 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]
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.
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
Chodziło mi o to zadanie: MWP2_3C - Permutacje19.