Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Na twoim miejscu poszukałbym nowszego skryptu, albo sam pobawił się wykorzystując jQuery. Przez 7 lat trochę się zmieniło w świecie przeglądarek i internetu.

A najlepiej to w ogóle wybić sobie ten pomysł z głowy - takie efekty często tylko wkurzają, szczególnie jeśli nie można ich łatwo wyłączyć. Nie mówiąc już o tym że takie skrypty mogą zajeździć słabsze maszyny, szczególnie urządzenia mobilne.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Kolega zrobił "kółko i krzyżyk" w C. Chce by po wciśnięciu np. 5 od razu w tym polu wyskoczył mu X, albo 0 bez używania Enter. Jakich bibliotek trzeba użyć, jak to zrobić?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.12.2012 o 13:09, Dregorio napisał:

Kolega zrobił "kółko i krzyżyk" w C. Chce by po wciśnięciu np. 5 od razu w tym polu wyskoczył
mu X, albo 0 bez używania Enter. Jakich bibliotek trzeba użyć, jak to zrobić?


Hmmmm... żadnych? Pytanie brzmi - co tak naprawdę chcesz osiągnąć i jak to ma działać?

W dotychczasowej implementacji programu to dotychczas działało tak iż:
a) wpisujesz jakąś cyfrę do standardowego wejścia. Wciskasz Enter.
b) Komputer sprawdza swoje standardowe wejście.
c) Dalsza część kodu.

To co chcesz zrobić teraz to skanowanie tego wejścia cyklicznie, płynnie. Bez Entera. Czyli tak jak w sumie działa każda obecna gra na świecie.

Jeśli korzystałeś np. z biblioteki Allegro.h to tam wygląda to tak:

while( !key[ KEY_ESC ] )
{
if( key[ KEY_LEFT ] ) postac_poziom--;
if( key[ KEY_RIGHT ] ) postac_poziom++;
sleep(10);
}

Jest to po prostu nieskończona pętla. I tak długo jak nie wcisnąłeś Escape będzie się ona wykonywać. Jeśli trzymanym klawiszem będzie strzałka w lewo to poruszysz się w lewo. Jeśli ta w prawo to w prawo.
Więc możesz zrobić takie coś:
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
int znak=0;
while (znak!=27){
cout << "Wcisniety przycisk to: ";
znak=getch();
cout << znak << endl;
}

return 0;
}

Zła wiadomość - to skompiluje się tylko pod Windowsem. Wersja linuxowa wymagałaby napisania własnego getch() np. w ten sposób:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch() {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}

Ta funkcja modyfikuje sposób w jaki działa normalnie terminal wyłączając buforowanie linii, biorąc pierwszy znak ze standardowego wejścia i przywracając terminal do normalnego stanu. Pewnie jest też coś co działa poprawnie na obu systemach (w przypadku bibliotek graficznych wiem że Qt i wxWidgets na pewno mają taką funkcjonalność, w OpenGL-u też się coś takiego znajdzie) ale nie chce mi się sprawdzać jak to wygląda w środowisku tekstowym.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../
Kółko i krzyżyk to tabelka [3][3]. Więc on chce grac na numlock`u, chce by po wciśnięciu ''1'' od razu w pole ''1'' został wstawiony X, albo 0 bez używania entera.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.12.2012 o 13:09, Dregorio napisał:

Kolega zrobił "kółko i krzyżyk" w C. Chce by po wciśnięciu np. 5 od razu w tym polu wyskoczył
mu X, albo 0 bez używania Enter. Jakich bibliotek trzeba użyć, jak to zrobić?


wystarczy standardowa biblioteka stdio i funkcja getchar().

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.12.2012 o 19:51, Nufiko napisał:

> Kolega zrobił "kółko i krzyżyk" w C. Chce by po wciśnięciu np. 5 od razu w tym polu
wyskoczył
> mu X, albo 0 bez używania Enter. Jakich bibliotek trzeba użyć, jak to zrobić?


wystarczy standardowa biblioteka stdio i funkcja getchar().

Próbowaliśmy i nie da rady. Wpiszesz znak, ale musisz go potwierdzić enterem. Tak działa funkcja getchar().

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.12.2012 o 19:11, Dregorio napisał:

/.../
Kółko i krzyżyk to tabelka [3][3]. Więc on chce grac na numlock`u, chce by po wciśnięciu
''1'' od razu w pole ''1'' został wstawiony X, albo 0 bez używania entera.


Jestem głęboko przekonany że właśnie to robi mój pierwszy przykład wykorzystujący funkcję getch(). Jedyne co należy zmodyfikować w nieskończonej pętli którą przedstawiłem post wyżej to dodać coś w rodzaju systemu "tur" - ustawić jakąś zmienną która na zmianę po każdym naciśnięciu przycisku ustawia się na 0 - turę dla kółek i 1 - dla krzyżyków. I inaczej się tego zrobić chyba nie da, a przynajmniej nie w środowisku tekstowym.

Ale proszę, gotowy kod który pozwala stawiać kółka i krzyżyki i działa bez potrzeby klikania Entera. Wybacz fatalny styl programowania ale uznałem że poświęcenie na to więcej niż 20 minut mojego życia nie wchodzi w rachubę:
http://pastebin.com/D9t3FVa0

I tak, niestety pozwala na stawianie kółek i krzyżyków na tych samych polach zastępując poprzednika. Ale jak już pisałem - to tylko szybki przykład dla ciebie ^^

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../

Dnia 12.12.2012 o 21:09, ziptofaf napisał:

I tak, niestety pozwala na stawianie kółek i krzyżyków na tych samych polach zastępując
poprzednika. Ale jak już pisałem - to tylko szybki przykład dla ciebie ^^

Wciąż w C++, a ja mówię o C... ale ok, dzięki za pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.12.2012 o 22:46, Dregorio napisał:

/.../
> I tak, niestety pozwala na stawianie kółek i krzyżyków na tych samych polach zastępując

> poprzednika. Ale jak już pisałem - to tylko szybki przykład dla ciebie ^^
Wciąż w C++, a ja mówię o C... ale ok, dzięki za pomoc.


Jestem smutny teraz bo nie czytasz ze zrozumieniem ani nawet nie sprawdzisz ;-; A to dlatego że biblioteka conio.h... wywodzi się WŁAŚNIE z C, a nie C++ (zresztą wszystkie biblioteki C kończą się na .h). Innymi słowy, kod który ci dałem jest w zasadzie kompatybilny, wystarczy zamienić cout na printf i kilka innych linii na ich odpowiedniki z C....

Mój pierwszy przykład po minimalnej modyfikacji:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int znak=0;
while (znak!=27){
printf("Wcisniety przycisk to: ");
znak=getch();
printf("%d", znak);
printf("\n");
}

return 0;
}

Działa w zwykłym C właśnie tak jak chciałeś, nie wymagając Entera. Bardziej prostacko tego nie wytłumaczę, masz gotowe rozwiązanie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../
Ale ja nie czytam tego, bo to nie mnie dotyczy i nie mam teraz czasu na zajmowanie sie tym. Pisze tylko to co kolega mi mówi. Ja sie zajmuje swoimi projektami. Choc mnie osobiscie dziwi, ze getch działa w C, bo przyznam się, ze zawsze to utożsamiałem z C++.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.12.2012 o 04:27, Dregorio napisał:

/.../
Ale ja nie czytam tego, bo to nie mnie dotyczy i nie mam teraz czasu na zajmowanie sie
tym. Pisze tylko to co kolega mi mówi. Ja sie zajmuje swoimi projektami. Choc mnie osobiscie
dziwi, ze getch działa w C, bo przyznam się, ze zawsze to utożsamiałem z C++.

To jedna z najstarszych funkcji C, która istniała już w 1971 r. (praktycznie od powstania C i napisania w nim jądra pierwszego Unixa).
Jest odwrotnie niż myślisz ponieważ getch() może nie działać właśnie w C++ ponieważ jest to razem z kbhit() trochę "przestarzała funkcja", która dzisiaj nie spełnia wymogów "czystości rasowej" C++... ;)
Żeby działała trzeba specjalnie ładować ten nagłówek (conio.h), który formalnie wcale nie jest nagłówkiem standardowym, a tylko rozszerzeniem bibliotek języka C++ dla zgodności z C (istnieją implementacje C++, które w ogóle go nie posiadają).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.12.2012 o 14:25, Olamagato napisał:

To jedna z najstarszych funkcji C, która istniała już w 1971 r. (praktycznie od powstania
C i napisania w nim jądra pierwszego Unixa).
Jest odwrotnie niż myślisz ponieważ getch() może nie działać właśnie w C++ ponieważ jest
to razem z kbhit() trochę "przestarzała funkcja", która dzisiaj nie spełnia wymogów "czystości
rasowej" C++... ;)
Żeby działała trzeba specjalnie ładować ten nagłówek (conio.h), który formalnie wcale
nie jest nagłówkiem standardowym, a tylko rozszerzeniem bibliotek języka C++ dla zgodności
z C (istnieją implementacje C++, które w ogóle go nie posiadają).

Ciekawa sprawa. Kiedyś słyszałem, że to jakieś niestandardowe rozszerzenia Borlanda. Do prostych programików w MS VC często się getch/kbhit przydają.

Z tego co piszesz - czy gcc pod Linuksem ma te dwie funkcje? Zawsze wydawało mi się, że są one windows-only, ale skoro wspominasz o Uniksach...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.12.2012 o 18:18, Vel_Grozny napisał:

Ciekawa sprawa. Kiedyś słyszałem, że to jakieś niestandardowe rozszerzenia Borlanda.

Bo to i jakby prawda - jeżeli chodzi o nagłówek conio.h. Chodzi o to, że do początku lat 90-tych nie było de facto standardu języka C. Za standard przyjmowano podręcznik "Język C" Kernighana i Ritchiego.

Dnia 14.12.2012 o 18:18, Vel_Grozny napisał:

Z tego co piszesz - czy gcc pod Linuksem ma te dwie funkcje? Zawsze wydawało mi się,
że są one windows-only, ale skoro wspominasz o Uniksach...

To zależy kiedy. Linuks to stosunkowo świeża rzecz, a obie były używane przez 20 lat zanim powstało jądro Linuksa.
Po prostu warto postrzegać język C jako wysokopoziomowy assembler, w którym zestaw "makr" jest dość luźny.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam taki problem. Chciałem napisać program, który wczyta dwie podane liczby i wyświetli je na ekranie. Stworzyłem taki kod:

#include <iostream>
int main()
{
double a,b;
std::cout<<"Wprowadz a"<<std::endl;
std::cin>>a;
std::cout<<"Wprowadz b"<<std::endl;
std::cin>>b;
std::cout<<"Liczba a= "<<a<<std::endl;
std::cout<<"Liczba b= "<<b<<std::endl;
return 0;
}

Po kompilacji wyświetla mi się komunikat proszący o podanie a. Więc wprowadzam (np.) 34,5. Następnie wyskakuje mi (naraz):

Wprowadz b
Liczba a= 34
Liczba b= 0

Taki sam efekt (tzn. ucina ułamki w a i nie daje możliwości podania b) osiągnąłem kopiując przykład ze strony cpp0x.pl. Znaczy się to:

#include <iostream>
int main()
{
int a;
float b;
std::cout << "Podaj liczbe calkowita: ";
std::cin >> a;
std::cout << "Podaj liczbe rzeczywista: ";
std::cin >> b;
std::cout << "Liczba a = " << a << std::endl;
std::cout << "Liczba b = " << b << std::endl;
return 0;
}

Jakieś pomysły co jest nie tak?

Z góry dzięki za pomoc! ;)

PS. Litości, zielony w temacie jestem ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 02.01.2013 o 19:18, tylor2_AKA_Wylfryd napisał:

Jakieś pomysły co jest nie tak?

Zamiast przecinka użyj kropki (np. 34.5, a nie 34,5). W ten sposób oznacza się liczby dziesiętne.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 02.01.2013 o 19:24, Hoplita napisał:

> Jakieś pomysły co jest nie tak?
Zamiast przecinka użyj kropki (np. 34.5, a nie 34,5). W ten sposób oznacza się liczby
dziesiętne.

Dzięki wielkie. Trochę się teraz głupio czuję, że taki banalny błąd, ale jednak ;) Jeszcze raz dzięki!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam zrobić coś takiego: Napisz program który liczbę z zakresu 1 .. 7000 wprowadzoną z klawiatury wyświetli w postaci słownej.
Czyli trzeba zdefiniować nazwy od 0..9,10..19,20,30,40,50,60 itd? A potem by program je łączył, np. widząc ''21'', pobiera ''dwadzieścia'' i ''jeden''.
Zastanawiam się tylko czy nie ma prostszej metody, bo to trochę pisania jest.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../

To można zrobić dość prosto:

1 do 9 robimy ręcznie.
11 do 19 to tak naprawdę 1-9 + naście.
20 = dwa + dzieścia
30 = trzy + dzieścia
33 = trzy + dzieścia + trzy
itd.
W sumie wtedy tylko jeszcze dla setek musisz dodać końcówki sto i -set oraz dla tysięcy tysiąc i -tysięcy. Na oko z 3 minuty pisania max.
Pamiętaj o reszcie z dzielenia (%), bardzo ułatwi ci pracę nad takim programem.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Można według mnie też po prostu sprawdzić, czy pierwszy z podanych znaków to 2. Jeśli tak, to łączymy "dwadzieścia" i znak drugi. Od 30 jest łatwiej - pobierasz słowny zapis zdefiniowanych wcześniej znaków tekstowo i dodajesz "dzieści" oraz kolejne znaki słownie.
Jeśli liczba jest trzycyfrowa: jeśli pierwszy znak to 1 - sto + zapis słowny reszty znaków (które zdefiniowałeś wcześniej moim sposobem). Jeśli 2 - dwieście i reszta. 3 i 4 - słowny zapis pierwszego znaku + "sta" + reszta zdefiniowana wcześniej moim sposobem. Od 500 - pierwszy znak słownie + sta + reszta zdefiniowana wcześniej moim sposobem.
Analogicznie dla tysięcy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować