[C] Zapisywanie znaków do tablicy?


(Pawsin) #1

Witam.

Dopiero uczę się programować i mam pewien problem. Muszę napisać program, w którym poruszam się kursorem w konsoli i wciskając spację wpisuję znak "X". Zmiany mają być wprowadzone w buforze, czyli muszę skorzystać z tablicy ? Problem w tym, że nie wiem za bardzo jak :frowning:

Dodatkowo pole "działania" tego kursora ma być ograniczone do pewnej ilości pikseli (X x Y). Bardzo byłbym wdzięczny za jakąkolwiek pomoc bądź wskazówki :frowning:

Pozdrawiam.


(system) #2

Nie jestem do końca pewien, czy rozumiem dobrze te zadanie. W każdym bądź razie :

#define ESC 27

#define UP 72

#define DOWN 80

....

  do

  {

    switch(ch=getch())

    {

      case UP:

        printf("up\n");

        break;

      case DOWN:

        printf("down\n");

        break;

    }

  }while(ch != ESC);

..........

Do zapamiętania wprowadzanych danych, jak najbardziej można użyć tablicy. Jeżeli występuje, jakiekolwiek ograniczenia to można użyć IF'a. Wracając do tablicy to na pewno to dobry pomysł.

if (ch == UP){

    tab[i] = 72; /* tab[i] = UP; */

    i++;

}

.............

oraz później daną tablice wyświetlić :

for (j = 0; j < i; j++){

      if (tab[j] == UP)

            printf("Klaiwsz ...");

}

Możesz sobie również zliczyć ile było powtórzeń naciśnięcia danego klawisza itd.

Być może na coś się to Tobie przyda. Nie uważam, że te skrawki kodu to Super optymalne rozwiązane wszystko zależy również od tego, jak dokładnie chcesz to zrobić. Na pewno pojawi się tutaj wiele przykładów

pozdrawiam


(Hixohe) #3

Jeśli ja dobrze rozumiem to chcesz poruszać się kursorem tekstowym po określonym obszarze konsoli i na życzenie postawić znak X za pomocą spacji. Będziesz potrzebował jakiejś dodatkowej biblioteki np ncurses, PDCurses, ewentualnie WinApi.


(Pawsin) #4

Do poruszania się kursorem mam coś takiego:

int horiz=20, verti=25;


	do

	{

		char key;

		key=getVKey();

		gotoXY(horiz,verti);


			switch(key)

			{

				case VK_UP: if(verti > 16) verti--; break;

				case VK_DOWN:	if(verti < SIZE_Y + 15) verti++; break;

				case VK_LEFT:	if(horiz > 11) horiz--; break;

				case VK_RIGHT:	if(horiz < SIZE_X + 10) horiz++; break;

			}



	} 

	while(1);

Problem w tym, że gdy np. przesuwam się lewo a potem próbuję przusnąć się w innym kierunku, kursor jeszcze raz przesuwa się w pierwszym kierunku a dopiero potem tam gdzie powinien... wygląda to trochę jakby był "opóźniony". Dodatkowo: czy można jakoś zrobić aby kursor po wpisaniu znaku pozostawał w miejscu (tak jakby "na" tym znaku) ? Myślę, że jest to powiązane z moim pierwszy problemem ;/ Byłbym bardzo wdzięczny za jakąkolwiek pomoc.

Pozdrawiam.


(system) #5

A tak trochę bardziej obrazowo? Jeżeli danego argumentu nie ma w switch'u kursor nie powinien się przesunąć w żadną stronę


(Grzelix) #6

co do twojego problemu z "opóźnieniem" to metodę goto(x,y) powinieneś wywkonoć po switchu

natomiast co do drugiego problemu to faktycznie mało obrazowo opsinany. Być może chodzi o ten bufor czyli zapisanie ścieżki do tablicy a po wypełnieniu tablicy uruchomienie metody która czytając wypełnioną tablicę przejdzie po ekranie według wpisanej ścieżki.


(Pawsin) #7

Wielkie dzięki za uwagę na temat goto po switchu :slight_smile:

Ogólnie chodzi o to, iż praktycznie zacząłem się uczyć programować tydzień temu... musze wprowadzić bufor ekranu tak, żeby operacje (wstawianie i usuwanie X'ów za pomocją spacji) były przeprowadzane w tym buforze a nie bezpośrednio na ekranie (+możliwość wyczyszczenia bufora). Niestety, nie za bardzo wiem od czego zacząć. Sam chcę się tego nauczyć dlatego przydałyby się jakieś wskazówki "na chłopski rozum" :slight_smile:


(system) #8

Z wyzerowaniem tablicy to nie ma problemu.

for (i = 0; i < rozmiar_tablicy;i++)

     tab[i] = 0;

Oczywiście to zależy jakiego typu jest tablica. W tym wypadku to powinno być int w przypadku char '' ---EDIT--- Korzystając z pomysłu grzelix'a można zadeklarować dodatkową zmienną int j; i przykładowo, jeżeli po 2 znakach UP, DOWN chcesz już zakończyć wczytywanie (zakładając, że jest to pętla) oraz przed tym inkrementować zmienną j, żeby wiedzieć ile jest elementów w tablicy, moim zdaniem nie ma sensu zapełniać całej tablicy, jeżeli masz przykładowo tablice o 100 elementach, ale też nie ma chyba w twoim przypadku takiej potrzeby aby deklarować tak dużą tablice. tutaj masz przykład

while((ch=getch())!='\n')

    {

        tab[i]=ch;

        j++;

    }

(Grzelix) #9

nie jestem w 100% pewien ale wyglądać według powinno to tak (pseudokod)

pobierasz kolejne znaki do tablicy.

Jeśli tablica (czyli bufor) jest pełny wywołujesz metodę która czyta tablicę wykonuje krok (i może od razu czyścić bufor).

i wracasz do kroku wczytywania znaków.

należy pamiętać o prawidłowym ustawianiu wskaźnika na numer zapisu do tablicy (po wyczyszczeniu na zero).

i to by było tyle.