Gwóźdź w głowie

Witam Ten gwóźdź to algorytm programu w C51 z którym nie mogę sobie poradzić. To co napisałem zajmuje koszmarnie dużo pamięci a sądzę i jestem pewien, że jest prostsze rozwiązanie.(siedzi mi to w głowie jak ten gwóźdź, którego nie mogę wyciągnąć). Chodzi o to, że mam ciąg liczb naturalnych powiedzmy: 3,4,5,6,7,8,9,10,11. Jeśli je ponumerujemy od 1 to mamy ich razem 9. Do numeru liczby jest przyczepione okno o szerokości np. 5. Ilość liczb jak i szerokość okna są dowolnie wybierane(oczywiście szerokość okna nie może być większa od ilości liczb. To tytułem wprowadzenia. Załóżmy, że numer liczby jest 3 to w oknie widzimy 5,6,7,8,9. W tym momencie jest to proste, ale sytuacja komplikuje się, gdy numer liczby osiągnie np. 8. Wtedy w oknie będziemy widzieli:

10,11,3,4,5. Itd. itp. Może ktoś rozpracował podobny problem i pomoże wyciągnąć mi ten gwóźdź. Z góry dzięki za podpowiedzi.
Reply to
ZbychJ
Loading thread data ...

Użytkownik "ZbychJ" snipped-for-privacy@wp.pl napisał w wiadomości news:e685p9$nt5$ snipped-for-privacy@atlantis.news.tpi.pl...

Nie wiem w czym problem z tą pamięcią, nie piszesz jak duży jest ten ciąg, jeśli ładujesz go do jakiejś tablicy, to sprawa jest banalna, deklarujesz tablicę , a potem w pętli powtarzasz funkcję succ( ) , która poda Ci następny element ciągu. Jeśli ciąg jest za wielki na sensowną tablicę, to robisz pętlę w pętli, jedna zwiększa liczbę wynikającą z szerokości okna, a w dugiej sprawdzasz czy osiągnąłeś max liczbę w ciągu, jeśli tak to zmieniasz ją na min liczbę w ciągu i kontynuujesz .... Piotr Ps. sprawdź składnię bo succ używałem kilkanaście lat temu :)

Reply to
Piotr Pitucha

Użytkownik "ZbychJ" snipped-for-privacy@wp.pl napisał w wiadomości news:e685p9$nt5$ snipped-for-privacy@atlantis.news.tpi.pl... W tym momencie jest to proste, ale sytuacja komplikuje

Jak duża jest ta tablica? Jeśli masz miejsce w pamięci to może wpisać ją do pamięci dwa razy tzn:

3,4,....11,3,4..11 i szukać tylko do połowy.(Jesli okno bedzie max. wielkośc tablicy) pozdrawiam, Andrzej
Reply to
Andrzej

Użytkownik "ZbychJ" snipped-for-privacy@wp.pl napisał w wiadomości news:e685p9$nt5$ snipped-for-privacy@atlantis.news.tpi.pl...

Uzyj modulo;> W X masz adresa tablicy, w Y przesuniecie.

y<- numer liczby -1 (-1 bo numerujesz liczby od 1) 'wypiszujesz', dodajesz jeden, liczysz mod, 'wypisujesz'.. i tak 5 razy

pozdr bartekltg

Reply to
bartekLTG

unsigned char tab[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11 }; unsigned char okno = 5; unsigned char numElements = sizeof( tab ) / sizeof( tab[0] );

void wypisz_okno( unsigned char index ) { unsigned char i; if ( --index >= numElements ) { // Blad, index spoza dozwolonego zakresu <1, numElements>

return; }

for ( i = 0; i < okno; ++i ) { printf( "%u", tab[index] ); // wypisz wartosc elementu if ( ++index >= numElements ) index = 0; } }

zamiast kodu if ( ++index >= numElements ) index = 0; mozesz zastosowac jednolinijkowca index = ( index + 1 ) % numElements; ale tamten pierwszy nie ma dzielenia wiec wykona sie szybciej, no chyba ze masz wartosc numElements rowna potedze 2 wtedy kompilator moze zoptymalizuje to do wyrazenia AND bitowe np numElements = 4 ->

index = ( index + 1 ) & 0x03;

Mariusz

Reply to
MariuszC

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.