Witam! Ostatnio dobija mnie to, że w III klasie gimnazjum mamy to zas*ane LOGO ;/ I sobie pomyślałem, że napiszę aplikację, która by wykonywała zadania takie jak LOGO tylko, że była by wzbogacona o zapisywanie do pliku i przede wszystkim "zmądrzona", bo wg. mnie polecenia typu "pw" nic nie znaczą, nawet nie można domyślić się o co chodzi. Teraz przejdę do rzeczy. Jak napisać kod, aby było możliwe wpisywanie poleceń typu właśnie "naprzód XX", gdzie XX to jednostka. Myślałem o tablicy char'ów, ale chyba odpada, bo odejmowanie działało by, gdyby liczba cyfr była zawsze jednakowa. Szukam właśnie takiego pomysłu, który rozwiąże problem komend.
PS: Nie chodzi mi tu już o pętle, bo to już pewnie bardziej skomplikowana rzecz, przecież nie tworzę języka ;p
- Rejestracja:ponad 14 lat
- Ostatnio:ponad 10 lat
Są jeszcze komendy bezargumentowe takie jak PŻ, SŻ (Pokaż/Schowaj żółwia), PP, UP (Podnieś/Upuść pisak).
No i wieloargumentowe takie jak UstawKolor.
Nie pamiętam dokładnie nazw tych komend, bo są one dość luźno tłumaczone
Ja bym to w C zrobił tak:
char polecenie[20];
int wartosc;
while(true){
scanf("%s ", polecenie); //wczytuje polecenie i znak za
if(! (strcmp(polecenie, "pz") || strcmp(polecenie, "sz") || strcmp(polecenie, "pp") || strcmp(polecenie, "up")){
scanf("%d", &wartosc);
}
//sprawdzenie jeszcze raz komend i wykonanie dla nich instrukcji
}

- Rejestracja:ponad 16 lat
- Ostatnio:ponad 8 lat
Nigdy nie tknąłem nawet LOGO (za moich czasów to szczęście, że w ogóle jakieś komputery w szkole były...), więc sorry jeżeli coś zamieszam, ale czy Ty chcesz zrobić interpreter poleceń?
Jeżeli tak, a może to być coś bardziej skomplikowanego to zainteresuj się strukturą danych "Tree" (drzewo) dla podstaw i potem "abstract syntax tree".
Jeśli to już overkill i aż takiego rozwiązania nie wymaga to co chcesz zrobić, to wczytuj polecenie (jeśli to np jedna linijka) za pomocą getline()
do std::string
.
Przykład, wpisujesz: prawo 15cm
Za pomocą getline(cin, linia)
pakujesz polecenie do stringa, ze stringa robisz stringstream
i wyciągasz pierwsze słowo: ss >> komenda;
Dostajesz "prawo", po tej komendzie spodziewasz się liczby i jednostki, więc wyciągasz ss >> liczba >> jednostka;
Możesz to robić pojedynczo żeby sprawdzać na bieżąco czy na pewno wyciągnięto liczbę, od razu wyłapując błąd składni. ;)

OK, teraz jak ze string'a zrobić stringstream? Po prostu "stringstream << string"?
@madmike:
Wiem co to LOGO ;p Chodzi oto żebym zrobił taki pierwszy prototyp LOGO, kolega powiedział, że nie napisałbym czegoś takiego, odparłem, że nie, ale same komendy na rysowanie itp. (bez pętl i procedur) to co w tym trudnego? Tylko właśnie nie miałem pomysłu na wyciągnięcie wartości.
Tiaaa. Już sobie poradziłem, po prostu nie dodałem sstream i były kwiatki, teraz działa elegancko, dzięki :D
Utknąłem przy tym, że sprawdzam dane polecenie. Działa, ale tylko za pierwszym razem, bo potem cały czas jest błędne, tak jakby coś zostało w strumieniu/zmiennej. Kod:
//......
string linia, polecenie;
int wartosc;
stringstream komenda;
int main(int argc, char *argv[])
{
input:
komenda.ignore();
linia = "";
wartosc = 0;
polecenie = "";
cin.ignore();
cout << "Wpisz komende: " << endl;
getline(cin, linia);
if (linia == "")
{
cout << "Brak komendy!" << endl;
cout << "---------------------" << endl;
cin.get();
goto input;
}
komenda << linia;
komenda >> polecenie;
if (polecenie != "biegnij")
{
cout << "Bledne polecenie!" << endl;
cout << "---------------------" << endl;
cin.get();
goto input;
}
komenda >> wartosc;
cout << "Wykonywanie " << polecenie << " o wartosci " << wartosc << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}